Server-to-server postback reference
Every parameter, response body and HTTP status of the /pb conversion endpoint, with working examples.
Last updated 6 min read
On this page
The server-to-server (S2S) postback is the most reliable way to report a conversion: the advertiser's server calls TrackCrown directly, so no browser, cookie or ad blocker is involved.
https://trackcrown.com/pb? click_id=0192f3c1a2b4e1f0c9d84b2a7e6f5d3c &event=sale &amount=49.90 &txid=ORDER-1001 &token=YOUR_TOKENEndpoint#
Where to find the URL#
- Open the offer → Tracking tab → Advertiser conversion tracking.
- Choose the Event, tick Sale amount and Order ID (dedupe) if the advertiser can send them.
- Copy Server-to-server postback URL. It contains
{click_id},{amount}and{order_id}placeholders for the advertiser's platform to fill, and the right token: the advertiser's token when the offer has an advertiser, otherwise the workspace token. Only managers and above see the token.
Tokens live under Settings → Postback tokens. Regenerating a token stops every integration that uses the old one immediately (401).
Parameters#
Identification#
Conversion data#
Money format: a plain decimal with . as decimal separator, rounded to 4 decimals. Comma thousands separators
(1,234.50) are accepted; a decimal comma (49,90), a negative value or a value above 9,999,999,999.9999 is
400.
Responses#
Every answer is JSON (Content-Type: application/json; charset=utf-8, Cache-Control: no-store).
New conversion:
{"ok":true,"conversion_id":"5f0c2a8e-1d3b-4c6e-9f7a-2b8d4e6f1a3c","status":"approved"}Stored but not payable (the reason explains why):
{"ok":true,"conversion_id":"7a1d…","status":"rejected","reason":"outside_window"}Duplicate (stored as a rejected row, no postbacks):
{"ok":true,"conversion_id":"9c2e…","status":"rejected","reason":"duplicate","duplicate":true}Existing conversion changed by a reversal or status update:
{"ok":true,"conversion_id":"5f0c…","status":"rejected","reason":"postback_reversal","updated":true}Business error (nothing stored):
{"ok":false,"error":"unknown click_id"}HTTP status codes#
The full list is in Error and reason codes.
Test mode#
Add test=1 to see what would happen. Nothing is stored and no cap counter moves:
curl -s "https://trackcrown.com/pb?click_id=0192f3c1a2b4e1f0c9d84b2a7e6f5d3c&event=sale&amount=49.90&token=YOUR_TOKEN&test=1"{"ok":true,"status":"approved","test":true,"details":{"click_id":"0192f3c1a2b4e1f0c9d84b2a7e6f5d3c",
"click_ts":"2026-10-12T09:14:03.512Z","offer_id":12,"offer_code":"SHOP01","affiliate_id":7,"event":"sale",
"event_name":"Sale","revenue":"10.00","payout":"6.00","sale_amount":"49.90","currency":"USD",
"payout_source":"offer","revenue_source":"offer","caps_checked":true,"token":"workspace",
"postbacks":[{"postback_id":31,"affiliate_id":7,"kind":"s2s","method":"GET","url":"https://tracker.example/pb?cid=abc&payout=6.00"}]}}payout, payout_source and postbacks are shown only to the workspace token. *_source names the level that set
the amount: override_event, override_offer, event, offer, param, amount or dynamic_none.
Examples#
POST with a JSON body:
curl -s https://trackcrown.com/pb -H 'Content-Type: application/json' \
-d '{"click_id":"0192f3c1a2b4e1f0c9d84b2a7e6f5d3c","event":"sale","amount":"49.90","txid":"ORDER-1001","token":"YOUR_TOKEN"}'Click-less conversion for a partner (for example a phone order):
curl -s "https://trackcrown.com/pb?offer_id=SHOP01&aff_id=partner7&amount=120&txid=PHONE-88&token=YOUR_TOKEN"Google Ads parallel tracking, where the advertiser only has the gclid:
curl -s "https://trackcrown.com/pb?gclid=EAIaIQobChMI8x&offer_id=SHOP01&amount=49.90&token=YOUR_TOKEN"Cancellation of an earlier order (see Reversals):
curl -s "https://trackcrown.com/pb?txid=ORDER-1001&offer_id=SHOP01&status=rejected&token=YOUR_TOKEN"Every request — including refused ones — appears in the inbound postback log.