← All articles
7 min read

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.