Skip to content
All articles
7 min read

Postback Not Working? Diagnose Click IDs, Macros, Statuses and Duplicates

A diagnostic rig checks every stage of a postback from click to conversion

A postback can return 200 OK and still fail to create a conversion. It can appear in a tracker but never reach the advertising platform. A retried callback can also look like another sale when it is only a delivery retry.

That is why “did the postback arrive?” is the wrong diagnostic question. Test four independent layers: request delivery, click lookup, event interpretation and final persistence. This checklist isolates the broken segment instead of rebuilding the URL blindly.

For parameter ownership, read Click ID, Sub ID and postback macros. Use the Postback URL Builder to assemble a controlled test.

The working chain

  1. The tracker creates a unique internal click ID.
  2. It passes that value into an offer through an agreed sub field.
  3. The affiliate system stores the value unchanged.
  4. On conversion, the system expands its postback macro.
  5. The tracker receives the callback, finds the click and normalizes the status.
  6. A stable transaction ID prevents a retry from adding revenue twice.
  7. An approved event can then be forwarded to Meta, TikTok or another platform.

Pass/fail checklist

SegmentExpected resultEvidencePass?
Incoming clickOne unique click ID is createdRaw click record
Offer URLThe ID reaches the agreed sub fieldFinal URL after redirects
StorageThe network preserves it byte for byteNetwork click/conversion log
Callback URLEvery macro is expandedRaw request URL
TransportRequest reaches the correct endpointCode, timestamp and body
Click lookupTracker finds the original clickIngress processing result
StatusRaw value maps to the intended eventStatus mapping
MoneyPayout and currency have the agreed meaningNetwork record
DeduplicationA retry does not add another conversionRepeat the same transaction
FeedbackThe correct event reaches the ad platformCAPI/Events API delivery log

1. Capture one control click

Do not debug inside thousands of live events. Generate one control click and record its exact timestamp and timezone, internal click ID, campaign, stream, offer, final outbound URL and the network field expected to store the ID.

Treat the identifier as an opaque string. Do not trim it, cast it to a number, change case or reconstruct it between systems. One changed character means a different lookup key.

2. Verify the forward path

If a network accepts an arbitrary value in aff_sub, the template may be:

https://network.example/offer?aff_sub={click_id}

After the redirect, the real URL must contain the actual value:

https://network.example/offer?aff_sub=dc_01K2A7M9X4

Literal braces or %7Bclick_id%7D mean the macro was not expanded. An empty value means you must determine where templating should occur: tracker, PWA, landing page or redirect service. If the value disappears at an intermediate redirect, fix that forward path before investigating the callback.

3. Inspect the raw callback

A saved template is not evidence of the request that was actually sent. Compare the template:

https://track.example/p?click_id={aff_sub}&status={status}&payout={payout}

with the raw request:

https://track.example/p?click_id=dc_01K2A7M9X4&status=dep&payout=45.00&txid=7719

Confirm that macros are expanded, the click ID matches exactly, special characters are URL-encoded, and the endpoint belongs to the intended workspace and environment. A practical Adset diagnostic guide highlights the same recurring failures: literal macros, modified IDs, incorrect status mapping and authentication errors.

4. Do not treat 200 OK as a recorded conversion

HTTP success only proves that an endpoint handled the transport. Some systems deliberately return a generic response for an unknown click, duplicate, or ignored status. The ingress log needs a useful processing result such as:

  • accepted
  • duplicate
  • click_not_found
  • status_unmapped
  • invalid_payout
  • unauthorized

If the product has no raw log, use a request catcher for a controlled test only. Never expose production tokens or personal data to a third-party catcher.

5. Map status separately from click lookup

Finding the click does not guarantee the correct business event. Networks may send lead, reg, dep, ftd, approved or rejected. Write an explicit contract:

Raw statusInternal statusSend to platform?Count revenue?
regRegistrationAccording to optimization policyNo
depFirst depositYesYes
approvedApproved saleAvoid a second purchase eventYes
rejectedRejectedNo or correctionNo

DarkCore keeps this mapping in Conversion Statuses. Avoid collapsing registration and deposit into the same generic Lead; it weakens both reporting and platform feedback.

6. Validate payout, currency and corrections

payout=45 can mean affiliate commission, advertiser revenue or order value. Agree on the semantics before implementation and carry currency separately. Test decimal separators and missing values.

When a status or amount changes later, update the existing transaction rather than creating an unrelated sale. A stable transaction ID and an event history make that correction auditable.

7. Run the duplicate test

Send the exact callback twice. The first request should create the event; the second should be marked duplicate; conversion count, revenue and downstream platform events must remain unchanged.

Deduplicate with a transaction identifier plus event type. A click ID alone is insufficient when one click can produce a registration, first deposit and later deposits.

8. Tracker has the event, but Meta or TikTok does not

That is a different segment of the chain. Check whether the internal status is eligible for forwarding, the platform click context (fbclid/fbc or ttclid) survived, the access token is valid, the API accepted the payload, and Browser Pixel plus server events share the intended event_id.

The roles of these channels are compared in Pixel vs CAPI vs Postback. TikTok’s official documentation confirms that TTCLID is appended to landing URLs and supports attribution and measurement (TikTok Ads Help).

Symptom map

SymptomCheck first
{...} remains in the requestSender’s exact macro syntax
click_not_foundForward parameter and click ID value
Conversion lands on another campaignSub field overwritten or reused
Registration exists, deposit does notSeparate callback and dep/ftd mapping
Revenue doublesTransaction ID and idempotency
Tracker has it, Meta does notPlatform ID, token, policy and API log
Meta reports moreWindow, view-through/modeling and Pixel+CAPI dedup
Tracker reports moreOrganic traffic, status filters or duplicate callbacks

Evidence package for support

Send a timestamp with timezone, control click ID, sanitized outbound URL, raw callback with secrets masked, response code/body, ingress result, expected versus actual status, transaction ID and one exported conversion row. That package lets support inspect a specific boundary instead of repeating setup questions.

FAQ

Why does a manual postback work while the real one fails?

The manual test often contains a correctly substituted ID while the production template sends an empty value or a literal macro. Compare the raw production URL byte for byte.

Can I test a postback in a browser?

You can test a GET endpoint’s reachability. A browser does not prove that the network can expand macros, apply authentication and follow its retry policy.

Which fields are essential?

A stable click ID is essential for attribution. A transaction ID is also needed to distinguish legitimate multiple events from retries. Status and payout are required whenever they affect optimization or finance.

When is the issue actually closed?

After an end-to-end test: control click, offer handoff, first callback, exact retry, status or amount correction, and downstream feedback. The output should be a completed pass/fail table, not “it seems to work.”

  • postback not working
  • postback troubleshooting
  • click id error
  • postback macros
  • s2s tracking