Postback Not Firing? 9 Common Issues and How to Fix Them
A debugging checklist for when your affiliate postback isn't firing, isn't arriving, or arrives with broken data. Work top to bottom and you'll find the bug.
When postbacks misbehave, you usually have an hour or two of frantic Slack messages before someone notices. This checklist gets you to the cause faster.
1. The postback URL has a typo
Start dumb. Paste the URL into a browser with sample values. If it 404s, you're done debugging — fix the URL and move on.
2. The network only fires on APPROVED
Pending sales sit for days before approval. If you're testing today and waiting for a postback tomorrow, you're not broken — you're slow. Switch the trigger to PENDING for testing.
3. SubID is empty
The most common bug: you forgot to forward fbclid from landing to the affiliate link. Open the dev tools, click your CTA, and inspect the outbound URL. If subId1= is empty, fix the landing page.
4. SubID isn't URL-encoded
fbclid and gclid contain characters that look fine in your dev console but break when concatenated into a query string. Always wrap them inencodeURIComponent().
5. Your endpoint returns 5xx
Networks retry a few times, then disable the postback. If you see "Disabled" in the network UI, fix the endpoint and re-enable manually.
6. The IP is firewalled
Cloudflare or your WAF may be blocking the network's IPs. Check WAF logs. Add the network's IP range to an allow rule.
7. The endpoint is HTTP, not HTTPS
Most modern networks refuse to fire to http://. Use HTTPS, always.
8. The macro syntax is wrong
Impact uses {SubId1}; PartnerStack uses {custom_key}; ShareASale uses !!SSCID!!. Copy-pasting macros between networks is the #1 cause of "postback fires but values are literal placeholders".
9. Downstream rejects, not the postback itself
Your postback arrives fine, but CAPI/Google rejects it. Symptoms: events never show up in Events Manager or in Ads Diagnostics. Log the downstream response body — it almost always tells you exactly what's wrong.
A debugging endpoint that helps
// Pseudocode — log everything on receipt
POST /p
log({ url, query, headers, ip, receivedAt: Date.now() });
return 200;Set the network's postback to a logging endpoint first. Confirm what shows up. Then point it at your real handler. You'll save hours.