Skip to main content

How to receive data from Expedify webhooks

Who this is for

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

  1. A URL on your side that can receive a POST request with JSON.
  2. That URL must reply with status code 200 (which just means "OK, I got it") within 30 seconds.
  3. The URL must be HTTPS (starts with https://, not http://).

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"
}
}
  • event tells you what happened (contact.created, contact.updated, deal.created, etc.)
  • data is 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:

  1. Open webhook.site in a new tab.
  2. The page instantly gives you a unique URL at the top (looks like https://webhook.site/abc-123-def). Copy it.
  3. In Expedify, go to Settings → Webhooks → Create Webhook.
  4. Paste the webhook.site URL.
  5. Choose at least one event (e.g., contact.created).
  6. Save.
  7. In Expedify, create a test contact.
  8. 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-webhook that:

  • 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-webhook function so that when event is contact.created, it inserts the contact's first_name, last_name, email, and phone from data into the contacts table.

Option B — Make.com, Zapier, n8n, Pabbly (no-code tools)

All of these have a "Webhook" trigger that gives you a URL.

  1. Create a new scenario / zap / workflow.
  2. Add a Webhook module as the trigger.
  3. Choose "Custom webhook" or "Catch hook".
  4. Copy the URL it gives you.
  5. Paste it into Expedify's webhook setup.
  6. Trigger one test event from Expedify (e.g., create a contact) so the tool can "learn" the data shape.
  7. 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

  1. Log into Expedify.
  2. Go to Settings → Webhooks.
  3. Click Create Webhook.
  4. 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.)
  5. Save.
  6. 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.
  7. 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.

StatusWhat it meansFix
404URL is wrongTypo, or the route doesn't exist.
401 / 403Your server requires authenticationRemove the auth requirement from this specific URL — Expedify doesn't send a login.
405Your URL only accepts GETChange it to accept POST.
500Your code crashedCheck 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:// (not http://).
  • 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.