Routy

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:

The webhooks list: four webhooks with their status, conversion types and HTTP method

Column Meaning
Name A label you give the webhook so you recognise it.
Status Enabled — active, fires on matching conversions. Disabled — configured but not sending.
Conversion Type Which conversion events trigger it. "All" means every type, including new ones added later.
HTTP Method How the data is sent — POST or GET.

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.

A webhook's row: History, Simulate and Edit, and the … menu with Disable and Delete


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_source in your landing-page URL (e.g. outbrain, taboola) so Routy can tell custom sources apart.

Create Webhook, step 1: the traffic source is fixed and Event Source is open on its options

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.

Create Webhook, step 2: name, conversion events, a webhook URL with placeholders, and POST selected

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 & Co is sent as Acme%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, fbclid and the sub-ids are only there if the original click had them.

Conversion

Placeholder Value Example
${clickId} Routy's click id a1b2c3d4-e5f6-7890-abcd-ef1234567890
${externalClickId} The click id your traffic source passed on the tracking link abc123
${eventName} The event name — your custom name for this webhook if you set one, otherwise the conversion type's name without spaces FTD
${eventValue} The conversion's value 25.5
${currencyCode} Currency of the value EUR
${eventTime} When the conversion happened (UTC) 2026-09-11T10:30:00Z
${eventTimeStamp} The same, as Unix milliseconds 1789122600000
${conversionId} Routy's conversion id 98765
${conversionTypeId} Conversion type id 3
${conversionType} Conversion type name First Deposit
${webhookEventId} Id of this delivery — the same across its retries, so you can de-duplicate 5001

Click & attribution

Placeholder Value Example
${clickDate} When the click happened 2026-09-11T10:25:00+00:00
${clickTimeStamp} The same, as Unix milliseconds 1789122300000
${parameterA} Sub-id A from the tracking link campaign_123
${parameterB} Sub-id B from the tracking link adgroup_456
${source} GoogleAds or Facebook when the click carried a gclid or fbclid, otherwise the landing page's source. Not the UTM source. GoogleAds
${gclid} Google click id
${fbclid} Facebook click id
${fbc} Facebook _fbc value, built from the fbclid
${msclkid} Microsoft click id
${obclid} Outbrain click id
${clientUserAgent} The visitor's user agent. ${client_user_agent} works too.

Where it came from

Placeholder Value Example
${trafficSourceId} / ${trafficSource} Traffic source id / name 100 / Google Ads
${accountId} / ${account} Account id / name 10 / Acme Corp
${brandId} / ${brand} Brand id / name 3 / Acme Brand
${brandLinkId} / ${brandLink} Brand link id / name 5 / Main Landing Page
${programId} / ${program} Affiliate program id / name 7 / Affiliate Program

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.

The Send drawer with a click ID pasted in


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 webhook's delivery history, with one delivery expanded: Retry Queued after 2 attempts

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:

  1. Create a Zapier webhook — in Zapier, add a Zap with a Webhooks by Zapier → Catch Hook trigger and copy the URL it gives you.
  2. Add the webhook in Routy — paste that URL into the Create Webhook form here.
  3. 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).
  4. Connect to Zapier — map the timestamp, value, and currency fields.
  5. 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.