Webhooks
The Webhooks tab is the default view when you open a traffic source. This is where you push conversion events from Routy out to your other tools.
Watch this video on its own page →
Transcript
A webhook sends every conversion on a traffic source to a tool of your choice, as it happens. Open the traffic source. Its Webhooks tab lists the ones it has. Each row shows whether it is enabled, which conversion types it sends, and how. Click Add. Event Source decides which clicks count. All sends every conversion. Pick an ad platform, and only conversions whose click came from it are sent.
Give it a name you will recognise. Conversion Events picks which types it sends. Leave it empty to send them all, including types added later. Paste the address that receives it. Type a dollar sign to add details of the conversion, like the click ID. Click Submit, and it starts sending with the next conversion.
To test it, click Simulate on its row. Routy sends a test conversion to its address. Check that your tool received it.
History lists everything a webhook sent in the last seven days. Expand a delivery to see its status and attempts. A failed one is retried by itself.
Send runs real clicks through your webhooks again. Paste their click IDs. Use it after fixing a webhook. One that already sent a conversion won't send it twice. If a conversion didn't reach your webhook, open it under Events, Conversions, and click Why didn't this fire.
What a webhook is
A webhook is an automatic message Routy sends to a URL you choose, every time a conversion happens on this traffic source. Instead of you logging in somewhere to check results, Routy delivers each conversion in real time to wherever you need it — Zapier, Google Ads, Facebook Ads, a custom endpoint, an analytics tool, and so on.
In short: conversion happens in Routy → Routy calls your webhook URL → your tool receives the data.
The webhooks list
Each row is one webhook configured for this traffic source:

Use search, the status / conversion-type filters, and column settings to manage a long list. Each row also has a ⚠ issue indicator if Routy has detected a delivery problem — click it to see the details.

Adding a webhook
Click Add to open the Create Webhook form. It has two steps.
Step 1 — Source
- Traffic Source — fixed to the source you're on.
- Event Source — which clicks' conversions this webhook sends. Pick All, Google Ads, Facebook Ads, Microsoft (Bing) Ads, or Custom. With an ad platform picked, only conversions whose click came from that platform are sent (for Google Ads, a click that carried a
gclid).- If you choose Custom, enter your own source value. Tip: put
utm_sourcein your landing-page URL (e.g.outbrain,taboola) so Routy can tell custom sources apart.
- If you choose Custom, enter your own source value. Tip: put

Step 2 — Details
- Name — something recognisable, e.g.
Google Ads – FTD(2–100 characters). - Conversion Events — pick one or more conversion types. Leave it empty to fire on all events (including conversion types added in the future).
- Webhook URL — the endpoint that receives the call. You can put placeholders in the URL to pass details of each conversion — type
$and pick from the list. See Webhook URL placeholders. - HTTP Method — POST for most services (recommended), or GET.

Click Submit and the webhook appears in the list. You can Edit it any time from its row.
Webhook URL placeholders
A placeholder is a name wrapped in ${…}. On every conversion Routy swaps it for that conversion's value before calling your URL, so the receiving tool can attribute the conversion from the URL alone. For example:
https://tracker.example.com/pb?cid=${externalClickId}&event=${eventName}&payout=${eventValue}
is called as
https://tracker.example.com/pb?cid=abc123&event=FTD&payout=25.5
Good to know:
- Values are URL-encoded for you.
Acme & Cois sent asAcme%20%26%20Co. Don't encode or quote the placeholder yourself. - Names aren't case-sensitive.
${clickId}and${ClickID}are the same. - They work with every HTTP method, and anywhere in the URL — not only after the
?. With POST, the request body is sent as usual. - A misspelt name is sent empty, without an error. The form warns you when a name isn't on the list below.
- Some values are empty when the click didn't carry them —
externalClickId,gclid,fbclidand the sub-ids are only there if the original click had them.
Conversion
Click & attribution
Where it came from
Placeholders that only work in a test
${medium}, ${campaign}, ${term}, ${content}, ${creative}, ${location}, ${locationPath} and ${documentTitle} are filled when you Simulate, but a real conversion never carries them — so they arrive empty in production. Don't rely on them.
Testing a webhook
You have two ways to check a webhook works before relying on it:
- Simulate (on the webhook's row) — sends a test conversion event straight to that webhook's URL, so you can confirm the receiving tool gets it.
- Send (top of the page) — manually trigger a webhook delivery using one or more real Click IDs (UUIDs, comma-separated). Useful for pushing a specific click through on demand.

Delivery history
Click History on a webhook's row to open its Logs — every delivery attempt for that webhook. Expand a delivery to see its status (for example Success, Retry Queued or Failed) and how many attempts it took. To resend a failed delivery, find it on Events → Webhooks — see Webhooks event log.

A Simulate delivery shows up in the history too, marked Test, so you can confirm it arrived. It has no account, conversion or click behind it, so those fields show N/A.
Setup Guide (new to webhooks?)
If you're setting webhooks up for the first time, Add can open a 5-step Setup Guide that walks you through a typical Zapier + Google Ads flow:
- Create a Zapier webhook — in Zapier, add a Zap with a Webhooks by Zapier → Catch Hook trigger and copy the URL it gives you.
- Add the webhook in Routy — paste that URL into the Create Webhook form here.
- Simulate a conversion — send a test event and continue the Zap setup in Zapier (Send Offline Conversion → connect Google Ads, map GCLID, pick the conversion action).
- Connect to Zapier — map the timestamp, value, and currency fields.
- Turn on & verify — switch the Zap on. Real conversions can take 24 hours or more to appear; check Zap History for successes.
Common questions
"My webhook isn't sending anything"
Find a conversion it should have sent on Events → Conversions and click Why didn't this fire? on its row. Routy checks every webhook against that conversion and tells you which would send it and why the others don't: disabled, a conversion type not in Conversion Events, or an Event Source that doesn't match where the click came from. See Why didn't my webhook fire?.
If the check says it would be sent, use Simulate to confirm the URL itself is reachable.
"I fixed a webhook. How do I send the conversions it missed?"
Click Send and paste the click IDs of those conversions. Routy runs them through your webhooks again; a webhook that already sent a conversion doesn't send it twice.
"How do I know if deliveries are failing?"
Open History on the webhook's row — failed attempts are listed there, and you can resend them from Events → Webhooks. A ⚠ indicator on the row also flags detected problems.
"Should I use POST or GET?"
POST for most services — it's the default and what tools like Zapier expect. Use GET only if the receiving endpoint specifically requires it.
"What's the difference between Simulate and Send?"
Simulate sends fake test data to one webhook. Send triggers delivery using real Click IDs you provide.
"A placeholder arrives empty"
Check the name is in Webhook URL placeholders — a misspelt name is sent empty. If it's there, the conversion may simply not carry that value: externalClickId, gclid and the sub-ids are only present when the original click had them. In a Simulate test, conversionId, conversionTypeId and conversionType are always empty.
"The delivery history shows ${clickId}, not the real value"
That's expected. History shows the URL as you configured it, with the placeholders still in it — not the filled-in URL that was called. To see the real values, check the request at the receiving end.