Last updated October 25, 2026
Webhooks let JourneyFuse push data to other tools the moment something happens — a new lead comes in, a payment is received, a trip status changes. Instead of manually copying data between systems, webhooks do it automatically in real time.
Think of it as JourneyFuse tapping another tool on the shoulder and saying "hey, this just happened" — along with all the details.
When an event occurs in JourneyFuse, a webhook sends an HTTP POST request with a JSON payload to a URL you specify. That URL can be:
Each delivery includes:
lead.created)| Event | Fires When |
|---|---|
| Lead Created | A new lead is added — manually or from a website form |
| Client Created | A new client is added to your CRM |
| Trip Created | A new trip is created for a client |
| Trip Status Changed | A trip moves between stages (lead → booked → completed → closed) |
| Booking Created | A reservation is added to a trip (flight, hotel, cruise, etc.) |
Authorization Submitted (authorization.submitted) | A card authorization submission has been saved successfully. This does not mean the card was charged. |
Document Created (document.created) | A generated invoice, paid payment receipt, or signed client agreement becomes available. Includes a resource ID/type and authenticated download path. |
Proposal Sent (proposal.sent) | A proposal is emailed to the client. Resends fire it too, with first_send set to false. Includes the client's proposal link. Publishing a link without emailing it does not fire |
| Payment Received | A payment lands as paid — recorded by hand, marked paid, charged on a card authorization or installment, or paid online by the client. Advisor-level webhooks receive payments on their own trips |
| Commission Updated | A commission entry is modified (amount, status, dates) |
| Task Completed | A task is marked as completed |
| Travel Insurance Answered | A client answers the travel insurance question — declined, requested a quote, or reported existing coverage |
You can register a receiver without Zapier using POST /api/v1/webhooks, list subscriptions with GET /api/v1/webhooks, and remove one with DELETE /api/v1/webhooks/:id. Use a public HTTPS URL and your JourneyFuse API key. The signing secret is returned once when creating the subscription. See the API reference for request and response examples.
The new document event covers generated invoice, payment_receipt, and signed_agreement resources, not arbitrary file uploads. Follow data.download_url using your API key to download the document. The authorization event contains status and record IDs, never full card credentials. Delivery can be retried; make your receiver idempotent and reconcile through the read API.
Api-Token for ActiveCampaign)Your webhook is now active. Use the Send test payload button to verify your endpoint is receiving data correctly.
Custom headers are sent with every delivery and every test, alongside JourneyFuse's own signature headers. Header values are treated like passwords: once saved, Settings shows only the last four characters. To keep a value when editing, leave its field blank; to change it, type the new value. Content-Type, User-Agent and any X-JourneyFuse- header are set by JourneyFuse and cannot be overridden.
In a team workspace, advisors can create their own webhooks and API keys, which only ever see their own clients, leads and trips. An owner or admin can turn this off under Settings → API Keys → Advisor integrations. While it is off, advisors cannot create new ones, their API keys are refused, and their webhooks receive nothing. Nothing is deleted, so turning it back on restores them as they were.
Scope follows whoever created the webhook, which matters most at a host agency where many advisors share one workspace.
| Who created it | What it receives |
|---|---|
| An advisor on a team | Events for that advisor's own clients, leads, and trips |
| An agency owner or admin | Every event in the workspace |
| A solo agency | Everything, since it is all yours anyway |
So an advisor's Slack channel or Zap never sees a colleague's leads, and the agency's own reporting webhook still sees the full picture. Owners and admins see every webhook in the workspace on this page; advisors see only their own.
Easier with the Zapier app. The JourneyFuse Zapier app has a New Lead trigger built in, so you can skip the Catch Hook setup below. The webhook route still works and is handy for events the app doesn't offer.
Want a Slack message every time a new lead comes in from your website?
New lead: {{data__first_name}} {{data__last_name}} ({{data__email}}) — Source: {{data__source}}Now every website form submission instantly notifies your team in Slack.
Track every payment in a shared spreadsheet automatically:
Every time a payment is marked as paid, a new row appears in your spreadsheet — no manual entry.
Automatically create draft invoices when bookings are added:
Keep your project management in sync — when a task is completed in JourneyFuse, automatically update ClickUp:
Your ClickUp board stays up-to-date without anyone switching between apps.
Automatically move deals through your CRM pipeline when trip stages change:
Your sales pipeline stays accurate with zero manual entry.
If your client agreements require a signed waiver whenever someone declines travel insurance, this fires the moment they decline so you are not watching for it by hand:
declined being true (or response equal to declined)signer_emailsigner_name, trip_id, and responded_at onto the documentThe payload carries the whole answer:
{
"event": "insurance.responded",
"data": {
"acknowledgment_id": "a1b2c3d4-...",
"trip_id": "c3d4e5f6-...",
"client_id": "b2c3d4e5-...",
"response": "declined",
"declined": true,
"signer_name": "Jamie Rivera",
"signer_email": "jamie@example.com",
"responded_at": "2026-09-01T18:22:10.000Z",
"source": "proposal",
"coverage_carrier": null,
"coverage_policy_number": null,
"coverage_expiration": null
}
}
response is one of declined, quote_requested, or has_coverage. The three coverage_* fields carry the client's existing policy details on has_coverage and are null otherwise, so you can map them once and they will be there whichever answer comes through. source tells you where it was captured: proposal, invoice, or waiver_link for a waiver you sent directly.
JourneyFuse keeps its own signed record of the declination either way — name, timestamp, IP address, and a hash of the exact wording the client saw — on the trip and the client. The webhook is for driving your own paperwork on top of it.
Form Submitted fires each time a client submits one of your forms, so promo codes, referral codes and every other answer reach your other tools without a CSV export:
form_id (or form_name) to the one form you care aboutsubmitter.email, submitter.name, submitted_at, and the answers you need{
"event": "form.submitted",
"data": {
"id": "d4e5f6a7-...",
"form_id": "bdefdd50-...",
"form_name": "Extra Perks",
"submitted_at": "2026-10-03T18:22:10.000Z",
"status": "new",
"submitter": { "name": "Jamie Rivera", "first_name": "Jamie", "last_name": "Rivera", "email": "jamie@example.com", "phone": "+15555550100" },
"answers": [
{ "field_id": "f1", "label": "Promo code", "type": "text", "value": "SPRING10" }
],
"lead_id": null,
"client_id": "b2c3d4e5-...",
"trip_id": null,
"source_tag": null
}
}
Every question on the form appears in answers with its label, even when left blank (value is ""), so a mapping built from one submission holds for the next. Passport-style numbers are masked and a signature reads Signed. Submissions caught as spam never fire. To pull past submissions, use GET /api/v1/form-submissions (see the API article); it returns the same record.
Every webhook delivery includes an X-JourneyFuse-Signature header containing an HMAC-SHA256 hash of the request body, signed with your webhook's secret key. If you're building a custom integration, you should verify this signature to ensure the request actually came from JourneyFuse.
Your webhook secret is generated automatically when you create a webhook and is visible in the webhook settings.
Every delivery also carries:
event_id in the body and an X-JourneyFuse-Event-Id header — one id per event, the same on every webhook that receives it and on any resend. If your receiver might see the same event twice, skip any event_id it has already handled.X-JourneyFuse-Timestamp — when the event happened. Rejecting deliveries older than a few minutes protects a custom receiver against a replayed request.X-JourneyFuse-Redelivery: true when the delivery was sent again with Resend.Each webhook shows its recent delivery history — you can see:
If a delivery fails (your endpoint returns a non-2xx status or times out), JourneyFuse records the failure. Each delivery is retried up to 3 times immediately for temporary problems — a timeout, a network error, or a 5xx from your endpoint.
Once you have fixed the receiving end, click Resend on any delivery in the history to send that exact event again. It keeps its original event_id, so a receiver that skips duplicates will not create a second record.
A webhook is never switched off because it failed. If your endpoint rejects 15 deliveries in a row — usually because the Zap was turned off, or the URL was deleted or changed — the webhook stays on but goes into a cooldown, and you'll see a red Retrying badge with the time of the next attempt.
While it's in cooldown we keep trying on a widening schedule (starting a minute out, up to once an hour). The moment one delivery succeeds, everything resets and normal delivery resumes on its own — there's nothing to switch back on. If you've just fixed your endpoint and don't want to wait, hit Send test: a successful test clears the cooldown immediately.
Events that occur while a webhook is in cooldown are not queued or replayed. If your endpoint was down for a while, check the delivery history to see what you missed.
A burst of events is the usual culprit. A large import or bulk update can fire hundreds of events at once, and Zapier and Make.com will throttle or switch off a hook that gets flooded — that's the most common reason a working webhook suddenly starts failing. If one goes into cooldown right after a big change on your side, check whether the Zap itself is still turned on.
This is part of JourneyFuse’s travel agency software: team roles, permissions and agency-wide settings.
Ask Claude, ChatGPT or Gemini what's due and what's on your plate, plus advisor status, commissions, group requests and suppliers. Read only, signed in as yourself, and client names stay hidden unless you turn them on.
Connect JourneyFuse to 6,000+ apps with the JourneyFuse Zapier app: start Zaps from new leads, bookings, payments and proposals, and create clients, leads and trips from other tools.
Read and write your leads, clients, trips, bookings, and quotes from your own scripts or no-code tools like Make.com and Zapier using the JourneyFuse REST API.