A postback is a message from the affiliate network to your tracker saying that a specific click produced a conversion. Without it you see spend in the ad account and payouts in the network, but you don’t know which creative, which ad and which audience segment made the money. This guide explains postbacks and S2S tracking in plain language: how subids and macros work, how to wire the chain “source → tracker → network → back to source”, and why you need Meta Conversions API even when the pixel is already installed.
What a postback is and how S2S differs from a pixel
There are two ways to pass conversion data. The pixel (client-side) is JavaScript on the thank-you page that fires in the user’s browser. It depends on the browser: ad blockers, iOS tracking restrictions, disabled JS — and the conversion is lost. Estimates put pixel under-reporting at 15–40% of events.
An S2S postback (server-to-server) is an HTTP request from the network’s server to the tracker’s or ad network’s server. The user’s browser is not involved, so blockers and iOS restrictions don’t matter. The conversion is sent when the network confirms it — so delayed events can be passed too: approval after three days, a redeposit after a week.
In affiliate marketing S2S is the standard. The pixel remains for ad-network optimisation (Facebook and Google learn on events); S2S is for counting money.
How the tracking chain works
- The user clicks an ad. The ad network inserts its macros into the link: ad ID, campaign ID, placement, its own clickid.
- The tracker receives the click, generates its own clickid (subid in Keitaro, clickid in Binom), stores all source parameters and redirects to the offer.
- In the offer link the tracker inserts its clickid into a parameter the network understands (usually
sub1,aff_sub,s2s). - The user performs the action. The network calls the tracker’s postback URL, returning the same clickid, status and payout amount.
- The tracker matches the conversion to the click — now you see which creative and placement produced it.
- Optionally the tracker sends the conversion back to the ad network (source S2S postback) so Facebook, TikTok or a push network optimises on real conversions rather than clicks.
Subid, macros and tokens: keeping them straight
The same entity has different names in different systems, and that is the main source of errors.
| What it is | In the tracker | In the network | In the source |
|---|---|---|---|
| Unique click ID | subid / clickid / {subid} | sub1, aff_sub, clickid, s2s | {click_id}, {cid}, fbclid |
| Creative ID | sub_id_1… / t1… | sub2…sub5 | {ad.id}, {creative_id}, {banner_id} |
| Payout amount | {payout} / {revenue} | {payout}, {amount}, {sum} | value, {revenue} |
| Status | lead / sale / rejected | {status}, approved / hold / reject | Event: Lead, Purchase |
The rule: one clickid travels through the whole chain unchanged. Tracker created it — network stored it — network returned it — tracker found it. If at any step the parameter is truncated, renamed or lost in a redirect, the conversion hangs unattached to a click.
Setting up a postback: Keitaro example
The scheme is identical for any tracker; parameter names differ.
1. Offer link
In the tracker’s offer settings: https://track.network.com/click?offer_id=123&aff_id=456&sub1={subid}&sub2={sub_id_1}&sub3={sub_id_2}. Here {subid} is the tracker’s clickid, and sub2/sub3 carry creative and placement IDs so you see them in the network’s stats too.
2. Postback URL in the network
The tracker gives a template like https://your-tracker.com/postback?subid={sub1}&status={status}&payout={payout}. Note: {sub1}, {status}, {payout} here are the network’s macros; it fills them in when calling. Every network has its own macro list — check its docs or ask your manager.
3. Status mapping
The network sends its statuses (pending, approved, rejected, trash); the tracker expects its own (lead, sale, rejected). The mapping is set in postback settings. A typical error: all conversions land in “lead” and never move to “sale” because the approval status isn’t mapped.
4. Testing
Most networks have a “test postback” button. Send it, check the tracker logs that the request arrived, the clickid was found and the status recognised. If not, 90% of problems are: wrong clickid parameter, HTTP instead of HTTPS, or the network’s IP blocked by the tracker server’s firewall.
Postback back to the source: why and how
Ad networks optimise on the events they see. If Facebook only sees clicks, it brings you clickers. If it sees deposits, it starts looking for people like depositors. So conversions from the tracker must be sent back.
Push, popunder and native networks accept a simple S2S postback: https://network.com/postback?cid={external_id}&payout={payout}, where {external_id} is the network’s clickid passed to the tracker in step one.
Meta uses the Conversions API (CAPI): a server request to the Graph API with the event, value, time and hashed user data. The key requirement is passing fbclid/fbc and fbp stored by the tracker at click time — otherwise Meta can’t match the event to an impression. Deduplication with the pixel is via an identical event_id. Modern trackers (Keitaro, Binom, Voluum, RedTrack) support CAPI out of the box.
TikTok — Events API; Google — offline conversions by gclid. Same logic: a server event with the source’s click ID.
Delayed and multiple conversions
In nutra an order is first “on hold”, then after 1–3 days “confirmed” or “rejected”. In gambling registration is followed by a deposit, then redeposits. All of these are postbacks with one clickid and different statuses. The tracker must update the conversion, not create a duplicate. In Keitaro this is lead → sale statuses with payout update; in Binom, events of different types. Make sure update-by-existing-clickid is enabled, or your stats will double.
Common mistakes
- Clickid doesn’t reach the offer. A prelander that doesn’t pass parameters: the user clicks from the prelander to the offer and the subid stays on the first link. Pass parameters through the prelander button or use the tracker’s direct redirects.
- One sub for everything. Creative, placement and campaign stuffed into one parameter with underscores. Reports become impossible. Use separate sub2–sub5.
- Payout not passed. The tracker has a fixed payout while the network cuts rates by GEO or KPI — tracker ROI lies. Pass the amount from the postback.
- Time zones. Tracker in UTC, network in GMT+3, you compare “yesterday” and see a 20% gap. Align zones in settings.
- Unprotected postback. A postback URL is public by nature. Enable network IP whitelisting or a secret key, or conversions can be “drawn” from outside.
FAQ
What is a postback in simple terms?
An automatic notification from the network to your tracker: “click number X produced a conversion worth Y”. It lets you attribute revenue to a specific ad.
Do I need a postback if the pixel is installed?
Yes. The pixel loses events to blockers and browser restrictions and can’t pass delayed statuses (approval, redeposit). Pixel for ad-network learning, S2S for accounting.
What is the difference between subid and clickid?
Essentially none — it is the unique click identifier. Systems name it differently: subid in Keitaro, clickid in Binom and Voluum, aff_sub in networks.
Which tracker for S2S?
Any modern one: Keitaro and Binom are self-hosted with full control; Voluum and RedTrack are cloud, easier to start. Comparison and promo codes in the tracker catalog and the Keitaro vs Binom breakdown.
Numbers don’t match between tracker and network? We dissect such cases on the forum.



