PostbackX Docs

Conversions are missing

A diagnostic order for when your offer source shows conversions and PostbackX does not.

Updated 2026-07-30 Use with AI Markdown source

Your offer source reports conversions. PostbackX shows fewer, or none. This is the most common support question, and it has a small number of causes — worth working through in this order, because it goes cheapest-first and each step rules out a whole class of problem.

1. Are postbacks arriving at all?#

Open Conversions and look at the window where you expect them.

Nothing at all, ever. The postback is not reaching PostbackX. Skip to step 2.

Some conversions, fewer than expected. Postbacks work; something is wrong with specific ones. Skip to step 4.

2. Send one by hand#

This separates "your offer source is not calling us" from "the call is failing". Take a real click id from your Clicks report and fire a postback yourself:

bash
curl -i "https://postbacks.postbackx.com/postback?click_id=REAL_CLICK_ID&payout=1.00&event_name=lead&transaction_id=manual-test-1"

A 200 with a conversion_id. PostbackX is working and the problem is on your offer source's side — its postback URL is wrong, or it is not firing. Go to step 3.

A 400. The click id was empty. Check for a stray space or an unsubstituted macro in what you sent.

A 404. That click id does not exist. Copy it again from the Clicks report.

A 410. The click is over 90 days old. Use a recent one.

3. Check the postback URL in your offer source#

Two things go wrong here, and they look identical from the outside.

The URL is wrong. Compare it character by character against what Offer Source shows for that source. A URL copied out of a tutorial or an old email is the usual culprit.

The click id macro is wrong. This is the more common one. Your offer source substitutes its own macros — if it stored your click id in sub5, the postback must send click_id={sub5}. Pointing it at {sub1} when the value is in sub5 sends an empty click id, and PostbackX answers 400.

So check where the click id actually lands. Look at your offer URL in Create Offers: whichever parameter carries {click_id} there is the one the postback must read back.

4. Check the click id is reaching the offer#

If postbacks arrive but many carry no click id, the chain broke a step earlier: the click id is not getting into the offer URL, so your offer source has nothing to give back.

Your offer URL needs the macro. Not this:

https://track.yoursource.com/click?offer=123

But this:

https://track.yoursource.com/click?offer=123&sub5={click_id}

PostbackX substitutes {click_id} at redirect time. Without it, every conversion arrives orphaned no matter how well the postback is configured.

The quickest check: click your own tracking link and look at the URL you land on. If the click id is not visible in it, the macro is missing.

5. Conversions counted once that should be twice#

Two genuine conversions on the same click, same event, collapse into one when no transaction_id is sent — PostbackX cannot distinguish them from one conversion delivered twice.

Add transaction_id={transaction_id} to your postback URL, using your offer source's own macro. Repeat deliveries then dedupe correctly and genuine repeats stay separate. See attribution.

6. Timing#

Two effects that look like missing data but are not.

Conversions lag clicks. Someone clicks today and converts tomorrow. The conversion is attributed to the click, so it appears in the report for the day of the click, not the day of the sale. A report on today's traffic will keep filling in for days.

Time zones. Your offer source reports in its zone, PostbackX in the one you select. A day boundary shifted by a few hours moves conversions between days and looks like a shortfall at the edges. Compare a whole week before concluding anything from a single day.

Still missing#

Collect these before asking for help, since they are the first things anyone will want:

  • One click id you expect a conversion for
  • The exact postback URL configured in your offer source, macros included
  • What the curl in step 2 returned
  • The window and time zone you are comparing