How attribution works
How a conversion finds its way back to the click that caused it, and the four places that chain can break.
Attribution is one question: which click caused this conversion? Everything PostbackX reports depends on answering it, and almost every reporting problem is really this answer having gone missing.
The chain#
A click id is created when someone clicks your ad, and it is carried through every step that follows.
- Someone clicks your ad and arrives at your tracking link. PostbackX writes a
click record and generates a click id.
- PostbackX redirects them to your offer, putting the click id into the offer URL
— that is what the {click_id} macro in your offer URL is for.
- Your offer source stores that value alongside the visitor's session, usually in
a field named sub1 through sub5.
- The visitor converts. Your offer source calls the
postback URL and passes the click id back.
- PostbackX looks up that click, attaches the conversion to it, and now knows the
campaign, ad set, ad, landing page and offer that produced the sale.
Step 5 is only possible because of step 2. If the click id was never put into the offer URL, there is nothing to hand back, and the conversion arrives as an orphan.
1 Someone clicks your ad and lands on your tracking link. PostbackX records the click and generates a click id.
Your offer source now holds the click id alongside the visitor’s session.
2 PostbackX redirects onward, substituting that click id into your offer URL where you put the macro.
3 The visitor converts. Your offer source calls the postback URL and hands the click id back.
Spend comes from the ad platform keyed on the ad; revenue comes from the conversion keyed on the click. The click id is what lets them meet in one row.
4 PostbackX looks up that click and attaches the conversion — so it now knows the campaign, ad and creative that earned it.
- The click. Someone clicks your ad and lands on your tracking link. PostbackX records the click and generates a click id.
- Into the offer URL. PostbackX redirects onward, substituting that click id into your offer URL where you put the macro.
- The conversion. The visitor converts. Your offer source calls the postback URL and hands the click id back.
- Joined up. PostbackX looks up that click and attaches the conversion — so it now knows the campaign, ad and creative that earned it.
What attribution buys you#
Once the conversion is joined to the click, PostbackX knows everything the click knew. That is what makes a report possible at all: spend comes from the ad platform keyed on the ad, revenue comes from the conversion keyed on the click, and the click id is the only thing that connects them.
It is also what makes the pixel useful. Facebook does not learn anything from a conversion it cannot tie to the ad that caused it, and the click id is how PostbackX tells it.
Where the chain breaks#
Four failures, in the order they are common.
The click id never reached the offer#
Your offer URL is missing its {click_id} macro, so step 2 silently does nothing. Conversions happen and none of them come back with an id. This is the most common setup mistake and it looks exactly like "tracking is broken".
The signature: real conversions in your offer source's dashboard, nothing in PostbackX.
The wrong parameter came back#
Your offer source stores the click id in sub5, but its postback is configured to send sub1. The postback arrives with an empty click id and is rejected.
The signature: postbacks arriving, all of them failing on a missing click id.
The postback goes to the wrong place#
The URL in your offer source's postback field has a typo, points at a host that does not resolve, or was copied from documentation instead of from your account. Nothing arrives at all.
The click is too old#
A click expires after 90 days. A conversion referencing a click older than that is refused, because at that distance the attribution would be a guess.
Conversions counted twice, and not#
Offer sources retry. A network that does not get a clean response will send the same conversion again — sometimes for days.
PostbackX deduplicates on the combination of click id, transaction id and event name. Send a transaction id and repeat deliveries collapse into one conversion, which is why it is worth passing even though it is optional.
Without a transaction id, two genuine conversions on the same click and same event are indistinguishable from one conversion delivered twice — so both get counted as one.
Two events on one click#
A visitor can convert more than once: a lead, then a sale. Those are separate events on the same click, and both are attributed to it, which is why the event name is part of the dedup key. Configure the events you care about on the campaign and pass event_name on the postback.
Two ways a click gets created#
The chain above assumes the visitor passes through PostbackX and is redirected. That is the default, and it is the most reliable.
The alternative is a direct link: your ad points straight at your landing page and a JavaScript snippet creates the click from the page itself. The attribution chain is identical from step 3 onward, but step 1 now depends on the visitor's browser running your snippet — so a blocked script means no click record. The trade is control of the ad URL and no redirect hop, against that dependency.