How to receive data from Expedify webhooks
Anyone setting up Expedify webhooks for the first time. You do not need to be a developer. If you are using Lovable, Bubble, Make.com, Zapier, n8n, or any other tool — this guide works for you.
What this is, in one paragraph
When something happens in Expedify (a new contact is created, a deal is updated, etc.), Expedify can automatically send that data to a website address (URL) of your choosing. That URL is called a webhook. Your job is to give Expedify a URL that can receive a POST request and reply with "OK". That's it.
What you need
- A URL on your side that can receive a
POSTrequest with JSON. - That URL must reply with status code
200(which just means "OK, I got it") within 30 seconds. - The URL must be HTTPS (starts with
https://, nothttp://).
That's the whole list. Nothing else is required.
What we send you
Every time an event happens, we send a POST request to your URL with a JSON body that looks like this:
{
"event": "contact.created",
"entity_type": "contact",
"entity_id": "8b3d6f80-9a4c-4d12-9c0a-2f5e1b7d4a99",
"timestamp": "2026-05-20T14:32:11.123456",
"data": {
"id": "8b3d6f80-9a4c-4d12-9c0a-2f5e1b7d4a99",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane.doe@example.com",
"phone": "+1-415-555-0100"
}
}
eventtells you what happened (contact.created,contact.updated,deal.created, etc.)datais the full record — that's the part you'll usually want to read.
Test it in 2 minutes, no code required
Before you build anything, prove that Expedify can talk to a URL. We'll use a free service called webhook.site:
- Open webhook.site in a new tab.
- The page instantly gives you a unique URL at the top (looks like
https://webhook.site/abc-123-def). Copy it. - In Expedify, go to Settings → Webhooks → Create Webhook.
- Paste the webhook.site URL.
- Choose at least one event (e.g.,
contact.created). - Save.
- In Expedify, create a test contact.
- Switch back to webhook.site — you'll see the request appear in real-time, with the exact JSON body and headers we sent.
If this works, Expedify is talking to the outside world correctly. Now it's just a matter of pointing the webhook at your URL instead.
Building your endpoint
Pick the section that matches what you're using.
Option A — Lovable (or any tool that uses Supabase)
Lovable apps usually have a Supabase backend. The easiest way to receive a webhook is a Supabase Edge Function. Copy-paste this prompt into Lovable:
Create a Supabase Edge Function called
expedify-webhookthat:
- Accepts a POST request with a JSON body
- Logs the body so I can see it
- Responds with status 200 and
{ "ok": true }- Does not require any authentication
Once Lovable creates and deploys it, it will give you a URL like:
https://<your-project>.supabase.co/functions/v1/expedify-webhook
Paste that URL into Expedify's webhook setup. Done.
If you want to actually do something with the data (save it to a table, send an email, etc.), tell Lovable:
Update the
expedify-webhookfunction so that wheneventiscontact.created, it inserts the contact'sfirst_name,last_name,phonefromdatainto thecontactstable.
Option B — Make.com, Zapier, n8n, Pabbly (no-code tools)
All of these have a "Webhook" trigger that gives you a URL.
- Create a new scenario / zap / workflow.
- Add a Webhook module as the trigger.
- Choose "Custom webhook" or "Catch hook".
- Copy the URL it gives you.
- Paste it into Expedify's webhook setup.
- Trigger one test event from Expedify (e.g., create a contact) so the tool can "learn" the data shape.
- Now you can drag the fields (
data.email,data.first_name, etc.) into whatever action you want — add to Google Sheets, send a Slack message, create a Mailchimp subscriber, etc.
Option C — Your own server (Node, Python, PHP, etc.)
You need a route that handles POST, ignores any extra headers, and returns status 200.
Node.js (Express):
app.post("/expedify-webhook", express.json(), (req, res) => {
console.log("Received:", req.body);
res.sendStatus(200);
});
Python (Flask):
@app.route("/expedify-webhook", methods=["POST"])
def receive_webhook():
print("Received:", request.get_json())
return "OK", 200
PHP:
<?php
$body = file_get_contents("php://input");
error_log("Received: " . $body);
http_response_code(200);
echo "OK";
That's the minimum. You can read the JSON body and do whatever you want with it.
Putting your URL into Expedify
- Log into Expedify.
- Go to Settings → Webhooks.
- Click Create Webhook.
- Fill in:
- Name: Anything memorable (e.g., "Our CRM Sync")
- URL: The URL you built in the section above.
- Events: Check the boxes for events you care about (
contact.created,deal.updated, etc.)
- Save.
- After saving, Expedify will show a secret key that starts with
whsec_.... Copy it and store it somewhere safe. You don't need it to receive webhooks, but if you ever want to verify that requests are really from Expedify (recommended for production), you'll need this secret. Expedify will not show it to you again — you'd have to regenerate it. - Click the Test button next to your webhook to send a sample event to your URL right now. If your URL is set up correctly, you'll see a green success indicator and a 200 response.
Why isn't it working? (Common issues, plain English)
Run through this list in order. Most of the time, the problem is one of the first three.
1. Your URL uses http:// instead of https://
Symptom: Nothing arrives. Expedify shows delivery errors.
Fix: We only call https:// URLs. Make sure your URL starts with https://.
2. Your URL is a "localhost" address or behind a VPN
Symptom: Nothing arrives.
Fix: Your URL must be reachable from the public internet. localhost:3000 or addresses on your office network will not work. Deploy your code to a hosted service (Vercel, Netlify, Render, Supabase, etc.) or use a tunneling tool like ngrok during development.
3. Your server is returning an error code instead of 200
Symptom: Expedify's delivery log shows status 401, 403, 404, 405, 500, etc.
| Status | What it means | Fix |
|---|---|---|
404 | URL is wrong | Typo, or the route doesn't exist. |
401 / 403 | Your server requires authentication | Remove the auth requirement from this specific URL — Expedify doesn't send a login. |
405 | Your URL only accepts GET | Change it to accept POST. |
500 | Your code crashed | Check your server logs for the actual error. |
4. Your server is too slow
Symptom: Delivery log shows "timeout".
Fix: Your server must respond with 200 within 30 seconds. If you do heavy work (sending emails, calling other APIs), do it in the background and return 200 immediately.
5. A firewall / WAF / Cloudflare is blocking us
Symptom: Nothing arrives, and the webhook.site test works fine — but your real server gets nothing.
Fix: Ask your IT person or hosting provider to allow incoming POST requests from Expedify. If they need IP addresses to allow-list, contact Expedify support for the current outbound IP range.
6. You're checking signatures incorrectly
Symptom: Requests arrive but your code rejects them with "invalid signature". Fix: Signature verification is optional. If you're not sure how to do it correctly, turn that check off — the data still arrives. Only add signature checking once everything else works.
Self-check before contacting support
Please go through this list and have the answers ready when you reach out:
- My URL starts with
https://(nothttp://). - My URL is reachable from the public internet (not localhost, not behind a VPN).
- When I clicked the Test button in Expedify, the delivery log showed status ___ (write the actual number).
- When I open my URL in a browser, it does not show a login page or "access denied".
- I tried pointing the webhook at
https://webhook.site/...and that did / did not receive the test. - My server logs show ___ requests arrived from Expedify in the last hour (or "none").
If you can answer all of these, Expedify support can usually fix the issue within one reply.
Related
- Webhooks settings — where you configure webhook URLs and events
- Webhooks API reference — the full technical reference with all event types, headers, and signature format