Routy

Traffic Source — 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.


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:

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.


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 — where the conversions come from. Pick All, Google Ads, Facebook Ads, or Custom.
    • 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.

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.

Save 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

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.

Delivery history

Click History on a webhook's row to open its Logs — every delivery attempt for that webhook, with status (success / failed / pending), retry/attempt info, and the ability to resend failed deliveries.


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"

Check its Status is Enabled, and that the Conversion Events you selected actually match the conversions coming in (or leave events empty to catch all). Then use Simulate to confirm the URL itself is reachable.

"How do I know if deliveries are failing?"

Open History on the webhook's row — failed attempts are listed there and can be resent. 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.