Skip to main content

How to send data into Expedify with a webhook

Who this is for

Anyone who wants an outside system — a form tool, Zapier/Make/n8n, a payment provider, or their own app — to push data into Expedify and kick off a workflow. You do not need to be a developer. If you can paste a URL into a settings box, you can do this.

This is the opposite direction from receiving webhooks. Here, you are the one sending data to Expedify.

What this is, in one paragraph

Expedify gives you a unique web address (a webhook URL). When any outside system sends data to that URL, Expedify catches it and runs the workflow(s) you've connected to it — create a contact, send an email, notify your team, whatever you've built. Your job is just to copy that URL and paste it into the tool that has your data.

The three steps

①  Create the webhook in Expedify  →  copy its URL
② Connect a workflow to it → (Webhook Trigger node)
③ Send your data to the URL → the workflow runs

Step 1 — Create the webhook and copy the URL

  1. Log into Expedify.
  2. Go to Settings → Webhooks and click the Incoming tab.
  3. Click + New Webhook and fill in:
    • Webhook Identifier (slug) — a short name used in the URL. Lowercase letters, numbers, and hyphens only; at least 3 characters (e.g. lead-form). Spaces become hyphens automatically.
    • Display Name (optional) — a friendly label like "Typeform Leads".
    • Description (optional) — what it's for.
  4. Click Save. Expedify gives you:
    • A Webhook URL that looks like https://app.expedify.ai/api/hooks/your-org-id/your-slug
    • A secret key starting with whsec_in_...
  5. In the Incoming list, click the copy button next to your webhook. Expedify copies the full URL with the secret already attached, which is the easiest way to stay authenticated:
    https://app.expedify.ai/api/hooks/your-org-id/your-slug?secret=whsec_in_xxxxxxxx
Always copy the URL from the UI

Don't type it by hand — the copied URL already contains your real org ID, slug, and secret. Click the eye icon to reveal the secret, then the copy icon.


Step 2 — Connect a workflow

A webhook on its own just logs what arrives. To do something with the data, point a workflow at it:

  1. Open the Workflow Builder and create or edit a workflow.
  2. Add a Webhook Trigger node as the first node (Triggers → Webhook Trigger).
  3. In the node, select the webhook you created in Step 1.
  4. Build the rest of your workflow (create a contact, send an email, call an AI agent…).
  5. Activate the workflow.
One webhook can run many workflows

Point as many active workflows at the same webhook as you like. When a request arrives, all of them run. The HTTP response tells you how many fired (workflows_triggered).

Using the data inside the workflow

Whatever you send becomes available to later nodes as variables. If your trigger node is named webhook_trigger_1:

What you sentHow to reference it
A field in the JSON body{{webhook_trigger_1.payload.email}}, {{webhook_trigger_1.payload.name}}
A query-string value (?source=...){{webhook_trigger_1.params.source}}
A request header{{webhook_trigger_1.headers.user-agent}}
The caller's IP{{webhook_trigger_1.source_ip}}

(The node name is shown on the node in the builder.)


Step 3 — Send your data to the URL

Pick the section that matches the tool that has your data. No code is needed for the first three.

Option A — A form tool (Typeform, Jotform, Google Forms, etc.)

In the form's "send to a URL on submit" / "webhook" setting, paste your Expedify webhook URL (the one with ?secret=...). When someone submits the form, the answers arrive in payload — e.g. {{webhook_trigger_1.payload.email}}.

Option B — A no-code automation tool (Zapier, Make.com, n8n, Pabbly)

Add a Webhook / HTTP action step and set:

  • Method: POST
  • URL: your Expedify webhook URL (include ?secret=...)
  • Body: JSON — map in the fields you want to send.

That's it. Each time the step runs, your workflow in Expedify fires.

Option C — A payment or SaaS provider (Stripe, Razorpay, etc.)

Register your Expedify webhook URL in the provider's webhook/notifications settings. Their event JSON arrives in payload (e.g. {{webhook_trigger_1.payload.event}}).

Third-party providers sign their own way

Stripe, Razorpay and similar providers won't add Expedify's secret to their calls. For those, keep the secret in the URL you register with them (the ?secret=... part), so the request still authenticates.

Option D — Your own code

Send a POST with a JSON body. The secret can go in the URL, a header, or the body — whichever is easiest.

Node.js:

await fetch("https://app.expedify.ai/api/hooks/your-org/your-slug?secret=whsec_in_xxxx", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email: "jane@example.com", name: "Jane Doe" })
});

Python:

import requests

requests.post(
"https://app.expedify.ai/api/hooks/your-org/your-slug",
params={"secret": "whsec_in_xxxx"},
json={"email": "jane@example.com", "name": "Jane Doe"},
timeout=30,
)

PHP:

$ch = curl_init("https://app.expedify.ai/api/hooks/your-org/your-slug?secret=whsec_in_xxxx");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode(["email" => "jane@example.com", "name" => "Jane Doe"]),
CURLOPT_RETURNTRANSFER => true,
]);
curl_exec($ch);

Test it in 2 minutes with curl

The fastest way to prove it works — paste this into a terminal with your real URL and secret:

curl -i -X POST \
"https://app.expedify.ai/api/hooks/your-org/your-slug?secret=whsec_in_xxxx" \
-H "Content-Type: application/json" \
--data '{
"name": "Jane Doe",
"email": "jane.doe@example.com",
"source": "test"
}'

A successful call returns 200 with:

{ "status": true, "message": "success", "workflows_triggered": 1 }

Inside your workflow, {{webhook_trigger_1.payload.email}} now equals jane.doe@example.com.

No terminal? Use Postman: set the method to POST, paste the URL, add the secret as a query param (or a header), put your JSON under Body → raw → JSON, and click Send.


The three ways to send the secret

Every incoming webhook is created with a secret (whsec_in_...). Include it one of these ways — pick whatever your sending tool supports:

MethodHowBest for
Query parameter (easiest)Add ?secret=whsec_in_xxxx to the URLcurl, no-code tools, anything where you set the URL
HTTP headerSend X-Webhook-Secret: whsec_in_xxxxApps where you don't want the secret in the URL
Body fieldAdd "webhook_secret": "whsec_in_xxxx" to your JSONTools that only let you control the JSON body
Keep the secret private

Treat it like a password. If it leaks, use Regenerate Secret in the Incoming list — but note any integration still using the old secret will stop working until you update it.


What you can send

ItemValue
MethodsPOST (recommended), PUT, PATCHnot GET or DELETE
BodyJSON (recommended), form-encoded, or raw text
Content-Typeapplication/json for JSON bodies
URLAlways use the https:// URL copied from the UI

Why isn't it working? (plain English)

Run through this in order — most problems are one of the first three.

1. The response says "no workflows connected"

A 200 with "workflows_triggered": 0 or a "no workflows connected" message means your data reached Expedify fine — you just need an active workflow with a Webhook Trigger node pointing at this webhook (Step 2).

2. You get 401 Unauthorized

The secret is missing or wrong. Re-copy the URL from the UI (with the secret revealed), or send the X-Webhook-Secret header. If you regenerated the secret, update your sender.

3. You get 404 Not Found

The org ID or slug in the URL is wrong — usually a typo. Re-copy the exact URL from Settings → Webhooks → Incoming.

4. You get 403 Forbidden

The webhook is switched off (toggle it Active), or your organization is suspended for billing. Bring billing current and it resumes automatically.

5. You get 405 Method Not Allowed

You're sending GET (or DELETE). Switch the request to POST.

6. The workflow ran but did the wrong thing

Delivery worked; the issue is inside the workflow. Open the workflow's execution history, replay the run, and check your field references — they must match the exact field names you sent, e.g. {{webhook_trigger_1.payload.email}}.


Where to look after sending

  1. Webhook delivery log — Settings → Webhooks → Incoming → your webhook → Logs. Records every request: method, payload, query params, source IP, status (received / processed / ignored / failed), and duration.
  2. Workflow execution history — open the connected workflow; each triggering request creates a replayable execution showing the exact input on the Webhook Trigger node.

Quick reference

URL          https://app.expedify.ai/api/hooks/{org-id}/{slug}
Methods POST (recommended), PUT, PATCH
Auth ?secret=whsec_in_... (or X-Webhook-Secret header, or "webhook_secret" body field)
Body JSON (recommended), form-encoded, or raw text
Success 200 { "status": true, "message": "success", "workflows_triggered": N }
In workflow {{webhook_trigger_1.payload.<field>}} {{...params.<x>}} {{...headers.<x>}}