How to Set Up End-to-End Analytics: s2s Postbacks in Keitaro and Binom
End-to-end analytics without s2s postbacks is a fiction: when the tracker pulls numbers only from the landing page or call tracking, a dead zone opens up between the click and the conversion. An s2s postback (server-to-server) sends the conversion event from the advertiser's or network's server straight to the tracker, bypassing the browser entirely, and that's the only way to see the real CPL, CPC, and ROI at the level of creative and source. The setup covers two trackers, Keitaro and Binom.
01What You Need Before You Start
Before touching postbacks, three things need to be in place: a tracker (Keitaro or Binom, already installed and taking traffic), an ad account - TikTok Ads, Meta, Google Ads, whichever is running the spend - and an offer that supports postbacks. Working through a CPA network means asking the manager for the postback link, usually a URL carrying macros like {clickid}.
Keitaro asks for an API token and a flow (offer) ID; Binom wants a campaign ID and an auth token; both accept postbacks as a GET request. If the offer doesn't support s2s, a pixel postback is the fallback, and it's less reliable - up to 15% of conversions get lost to ad blockers.
The tracker has to pass a unique click identifier (clickid) into the offer link correctly, or the postback won't tie back to its source. Check that the offer link carries the {subid} macro for Keitaro or {clickid} for Binom.
- Admin access to the tracker
- An ad account with an active campaign
- An offer that supports s2s postbacks, or at least a CPA link with macros
- A Keitaro API token or a Binom token
02Step 1. Create a Flow (Offer) in Keitaro
A new flow gets created in the 'Offers' section. The 'Destination URL' field takes the offer link with the {subid} macro in whichever parameter the network expects for its postback - for most networks that's subid={subid} or click_id={subid}. If the network uses a different parameter, aff_sub say, it's worth confirming with the manager.
In the flow settings, check the 'Accept postbacks' box - that lets Keitaro take postbacks from outside systems. If the offer only supports a pixel postback, Keitaro will generate a pixel URL, but s2s is more reliable, and that's the one worth setting up.
Once the flow is saved, Keitaro will display a unique postback URL - something like https://your-tracker.com/postback?subid={subid}&payout={payout}. Copy it - the network or the advertiser will need it on their end.
Setting Conversion Statuses
Keitaro recognizes three conversion types - sale, lead, reject - and one has to be chosen to pass to the tracker. 'Sale' is the usual choice for confirmed leads. Holds (pending) from the network are better left out of the conversion count, or ROI ends up inflated.
03Step 2. Set Up the Postback in Binom
In Binom, that's 'Campaigns' -> the campaign -> 'Edit campaign.' The 'Postback URL' field takes the link Binom generated for that campaign - usually something like https://your-binom.com/postback?clickid={clickid}&payout={payout}&status={status}.
The {clickid} macro has to match what's passed in the offer link - Binom carries the click identifier through {clickid} specifically. In the campaign settings, in the 'Offer URL' field, {clickid} needs to sit exactly where the network expects click_id.
Binom works with three conversion statuses: 1 (approved), 0 (pending), -1 (rejected). If the network sends status in a different format, a small PHP converter script becomes unavoidable, though in practice, approved is usually all that gets used.
Setting Up Conversion Notifications
Binom can send an email notification for every conversion - handy early on, just to confirm the postback works at all. Past 100 conversions a day, the notifications are worth switching off, or the inbox drowns.
04Step 3. Integrating with the Affiliate Network or Advertiser
The postback URL then goes to the network - inside its dashboard, that's the 'Postback' or 'Callback URL' section. The copied URL from Keitaro or Binom goes in there, with {clickid} swapped for the network's own macro: in most cases that's also {clickid}, but {sub_id}, {aff_sub}, and {transaction_id} show up too - check the network's documentation for the exact one.
At the CPA network KMA.biz, for instance, the postback link looks like this: https://your-tracker.com/postback?clickid={clickid}&payout={payout}, and in the network's settings, {clickid} gets marked as the parameter the network will fill with the real click identifier.
After saving, it's worth running a test pass: click through the ad link and complete the target action - a registration, a purchase. If the postback is set up correctly, the tracker will show a conversion with its traffic source attached.
05Step 4. Checking the Postback: Catching Errors
The tracker logs come first: in Keitaro, that's 'Logs' -> 'Postback logs'; in Binom, 'Logs' -> 'Callback logs.' The response status reads plainly: 200 means success, 404 means the URL wasn't found, 500 means a server error.
A 200 status with no conversion showing in the tracker is almost always a clickid mapping problem: the click identifier coming from the network has to match what the tracker already holds. The usual culprit is {clickid} sitting in the offer link while the network is actually sending {subid}.
A postback delayed more than 30 seconds can just get rejected by the tracker - the fix is raising the timeout in settings: up to 60 seconds in Keitaro, 120 in Binom.
- Status 200 - all good
- Status 404 - check the postback URL
- Status 500 - an error on the tracker's or network's side
- Conversion visible in the logs but not in the stats - wrong clickid mapping
06Step 5. Setting Up Payout Transmission
For the tracker to calculate ROI, the {payout} macro gets added to the postback URL - the network needs to support it and pass the actual payout amount for the conversion. If the network doesn't send payout, a fixed amount can be set instead, in the flow settings (Keitaro) or the campaign settings (Binom).
It looks like https://your-tracker.com/postback?clickid={clickid}&payout={payout}, with the network's settings marking {payout} to be replaced by the conversion amount. If the network doesn't support that, set it to 0 and work out ROI by hand in Excel - unwieldy over time, at which point switching networks makes more sense.
For offers with different payouts - registration at $2, deposit at $10, say - different conversion statuses or different postback links get used: in Keitaro, that means setting up several flows for one offer; in Binom, it's handled with multi-postbacks.
07Step 6. Integrating with Ad Accounts (TikTok, Meta, Google)
Running traffic straight to the offer, with no network in between, means setting up the postback right in the ad account. In Facebook Ads, that's 'Settings' -> 'Conversions' -> 'Events' -> 'Web Conversion': the postback URL goes there, with clickid swapped for the URL parameter - fbclid.
In TikTok Ads, the path runs 'Events' -> 'Web events' -> 'Create event,' type 'Postback URL,' with the {clickid} macro inserted into the link. TikTok calls this parameter ttclid - worth checking the platform's own documentation for the current name.
Google Ads works through Google Tag Manager or the site's global tag - GTM can send the event straight to the tracker's server. Budget allowing, a third-party connector like Hyros or Triple Whale is the easier route, but a plain postback is enough to get started.
08Common Mistakes Setting Up s2s Postbacks
Mistake 1 - clickid never gets passed: the offer link is missing {subid} (Keitaro) or {clickid} (Binom), the tracker gets no identifier, and the postback doesn't attach to anything. The usual cause is a beginner copying the link straight from the network and forgetting to append clickid.
Mistake 2 - mismatched statuses: the network sends 'approved,' the tracker is waiting for 'sale.' In Keitaro, status mapping gets configured in the 'Conversion types' section; in Binom, that takes a handler script.
Mistake 3 - the postback goes to the wrong URL: the tracker's address gets confused with the landing page's. The correct destination is the tracker's server, not the offer page - check the domain in the logs to confirm.
Mistake 4 - duplicate conversions: the network sends the postback more than once, on a repeat visit, say, and the tracker counts each one separately. In Keitaro, deduplication by clickid gets switched on in the flow settings; in Binom it's off by default and needs enabling in the config.
09What You Get: Real Numbers and Metrics
Once the postbacks are set up, the tracker shows CPL for every creative and source: on TikTok that's ₽120-250, on Facebook ₽150-300, on Google ₽200-400. The range depends on geo and vertical, and on Tier-1 (USA, UK) CPL runs 3-5 times higher.
ROI turns transparent after that: with a ₽500 payout per lead and a ₽200 CPL, ROI = (500-200)/200 = 150%. Without postbacks, only CPC would be visible - how much was actually being made stayed a mystery.
Optimization speeds up too: unprofitable creatives with CPL above the break-even line get switched off within an hour of launch, not a week later the way it goes without postbacks. Over time, that saves upward of 30% of the testing budget.
10FAQ
Why doesn't the postback show up when the logs say status 200?
Most likely the clickid doesn't match: the offer link needs the same macro the network expects - {subid} in Keitaro, {clickid} in Binom. If the network uses a different parameter, aff_sub say, it's worth requesting its documentation.
Can one postback serve several offers?
In Keitaro, yes: one flow with a postback takes conversions from every click routed to it. In Binom, the postback is tied to the campaign, so each offer gets its own campaign, or {clickid} gets used with different prefixes.
How do you confirm a postback works without a test conversion?
Services like webhook.site help: the postback URL goes in as the endpoint, and a GET request with clickid=test123 gets sent manually. If the tracker accepted it, a conversion marked type 'test' shows up in the logs. Binom also has a built-in 'Test postback' function in the campaign settings.
How long does setting up s2s postbacks take?
The first time, 30-60 minutes, with the network's documentation on hand. After that, a new offer takes 10-15 minutes. If the network doesn't provide macros, a proxy script has to be written, and that's a day's work.
- S2s postbacks pass conversions straight from the server to the tracker, bypassing the browser, and that's the only reliable way to calculate ROI by source.
- In Keitaro, the postback gets configured through the flow (offer); in Binom, through the campaign - the key macro is subid for Keitaro and clickid for Binom.
- Once it's set up, the real CPL becomes visible - ₽120-400, say, depending on the channel - and unprofitable creatives can be switched off within the hour.
- The usual mistakes - mismatched clickid, the wrong conversion status, duplicated conversions - get solved through the tracker logs and the mapping settings.
Read next: How to Run Google Ads for a SaaS Without Burning the Budget · Adult traffic in 2026: channels, compliance and what actually scales · Fractional CMO, Marketing Consultant, or Agency: Which Does Your Product Need?