---
title: How attribution works
description: How a conversion finds its way back to the click that caused it, and the four places that chain can break.
updated: 2026-07-30
order: 2
related: [/concepts/vocabulary, /guides/missing-conversions, /reference/postback]
---

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.

1. Someone clicks your ad and arrives at your tracking link. PostbackX writes a
   click record and generates a click id.
2. 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.
3. Your offer source stores that value alongside the visitor's session, usually in
   a field named `sub1` through `sub5`.
4. The visitor converts. Your offer source calls the
   [postback URL](/reference/postback) and passes the click id back.
5. 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.

**How a conversion finds its click** — The click id is the thread the whole system pulls on. Here is where it travels.

1. **The click.** Someone clicks your ad and lands on your tracking link. PostbackX records the click and generates a click id.
2. **Into the offer URL.** PostbackX redirects onward, substituting that click id into your offer URL where you put the macro.
3. **The conversion.** The visitor converts. Your offer source calls the postback URL and hands the click id back.
4. **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](/guides/pixels) 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](/reference/snippets): 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.
