Why This Surface Exists

Performance teams running ten affiliate networks end up with ten different reporting formats, ten different attribution models, and a spreadsheet that gets reconciled by hand on Mondays. Postbacks close the loop server-to-server — but every network calls its parameters something different (clickid vs sub1 vs aff_sub), and the macro syntax for each is its own little dialect.

A postback source in 301.st is one network's worth of that translation: which incoming parameter is the click ID, which is the event type, what wrapping the network uses for macros. Configure it once, paste the per-event URL into the network's panel, and conversions land in the live dashboard with attribution to the originating click — no codebase changes, no per-network CSV.

Quick Path: Three Ways to Add a Source

The Add source button in the page header opens a wizard with three tabs. Pick whichever you can get the data for fastest — the result is the same.

Auto-detect

When you have docs in front of you

Paste any sample postback URL the network's docs show — with their macros intact ({clickid}, {sum}, etc.) — and click Detect. If we recognise the platform, the save button creates the source with the right field mapping pre-filled.

Three outcomes: recognised (save and you're done), ambiguous (use Manual to disambiguate), or unknown (we open a support ticket and you switch to Capture or Manual).

Capture

When you have access to the network panel

Name the source, click Generate learn URL. We give you a one-time URL to paste into the network's postback field. Ask the network to fire a single test postback. As soon as it arrives we list the parameter names we saw. Click Finalize.

Useful when docs don't exist or are wrong. The captured keys are stored, but you'll still need to tell us which captured key is the click ID, which is the amount, etc. — see Field mapping below.

Manual

When you already know exactly what the network sends

Fill the form yourself. Required: name. Optional but recommended: platform (just a label that shows up in the Conversions table), outbound target URL (re-deliver each conversion to your platform with an X-301-Signature header), rate limit, attribution window, and the two map sections below.

Field Mapping (the part that actually does the work)

Networks invent their own parameter names. Your field map tells 301.st how to translate them into our canonical schema. Open the Edit drawer, switch to the Mapping tab — one row per canonical field. Type the network's parameter name in the input.

click_id
The token we sent out in the redirect's _cid. Often the network calls it clickid, cid, sub1, or subid.
event_type
Which kind of conversion fired. Networks usually call it event, action, or type — and they have their own vocabulary, so see Event mapping below.
transaction_id
Unique conversion ID on the network's side. Used for deduplication — re-firing the same postback with the same transaction_id doesn't double-count.
gross_amount / gross_currency
What the user paid the operator (registration fee, deposit, purchase price). Currency is usually a separate field.
payout_amount / payout_currency
What the operator pays you for the conversion — your revenue.
external_user_id
Optional. The user's ID inside the network — useful for cross-referencing during disputes.

Leave a row blank to skip it — the field stays null on incoming conversions. Sources created via Capture currently start with an empty field map — fill it in the Edit drawer before the source is useful.

Event Mapping

Networks send their own event labels (NEW, FTD, QFTD, reg_confirmed, …) and we report on a fixed set. The event map translates one to the other. Same Mapping tab as the field map — scroll past Field mapping to find it.

Click Add mapping, type the operator's value on the left, pick our canonical event on the right. The seven canonical types are:

  • registration — user signed up.
  • ftd — first-time deposit.
  • qftd — qualified FTD (network's threshold met).
  • ngr — net gaming revenue (gambling).
  • deposit — any deposit beyond the first.
  • cpa — cost-per-action conversion under a flat-rate deal.
  • unknown — the catch-all for anything you didn't map.

Anything the network sends that isn't in your event map lands as unknown in the conversions table. That's fine for a few days while you tune the map, but conversions stuck on unknown don't contribute to per-event-type stats.

Macro Syntax

Networks wrap macros differently in their postback URLs. Most modern platforms use lowercase curly ({event_id}); legacy and traditional networks use uppercase canonical ({TRANSACTION_ID}), square brackets, or percent. The Macro syntax dropdown in the Settings tab picks which wrapping our generated URLs use — pick what matches the network's docs so the URL pastes plug-and-play, no manual macro rewriting.

  • {event_id} — Curly lowercase. Default. Works for 1Win, RedTrack, Keitaro, Binom, FuckingScripts, NetRefer, and most modern affiliate platforms.
  • {EVENT_ID} — Curly UPPERCASE. Income Access, MyAffiliates, many legacy traditional networks.
  • [EVENT_ID] — Square brackets. Cake, HasOffers, Affise (some configurations).
  • %EVENT_ID% — Percent wrapping. AdsBridge.
  • {{EVENT_ID}} — Double curly. Rare — check the network's macros list to be sure.

If the URL we generate gets rejected by the operator's postback form (with a message like "Enter the correct link" — that's 1Win's), switching macro syntax is usually the fix.

After Save: One-Time Reveal

Saving a source — or rotating one of its secrets — opens a one-time reveal modal. Copy what you need before closing the modal; we never show secret values again from the list. After closing, the Edit drawer's URLs tab still shows the postback URL templates (with the inbound token replaced by a {TOKEN} placeholder you substitute yourself from the value you copied).

Inbound token
The shared secret the network includes when calling us. Paste it into the network's authentication header / query string field. Rotate if you suspect a leak.
Outbound HMAC
Only present if you set Outbound target URL. We sign every re-delivery with this secret in the X-301-Signature header — your platform validates it.
Postback URL
The endpoint to paste into the network's postback / S2S configuration. Includes the inbound token inline (modal only) or as a {TOKEN} placeholder (URLs tab) — substitute the real token from the value above.
Track URL
What the edge Worker uses internally when redirecting users. Kept for reference; you don't paste this anywhere yourself.

Reading the Live Dashboard

The top card on /postbacks shows what's happening right now. Pick a window — 15m / 1h / 24h / 7d — and watch five cards plus a per-event breakdown. The card auto-refreshes every 45 seconds while the tab is visible; switching tabs pauses it.

Clicks
Outgoing redirects we sent in the window. This is the denominator for EPC.
Conversions
Postbacks accepted in the window — already deduped by transaction_id.
Gross
Sum of gross_amount across accepted conversions — what the user paid the operator.
Payout
Sum of payout_amount — what the operator owes you.
EPC
Earnings per click — Payout / Clicks. Goes to 0 if Clicks is 0; otherwise it's the headline metric for how productive your traffic is.

The per-event-type breakdown below the cards lists each canonical event type from your map and how many fired in the window. Useful for spotting an unexpected jump in unknown — that usually means a new event label slipped past your map.

Conversions Table

Each row is a single postback we accepted. The Attribution column tells you what the platform did with it:

matched
We found the originating click via _cid and the conversion is fully attached. This is the normal happy state.
unmatched
We accepted the postback (valid token, valid signature) but couldn't find the click. Usually means the network didn't echo our _cid back in the field your map points at — fix the click_id row in field map and reproduce.
duplicate
Same transaction_id as an earlier conversion — we kept the first one and dropped this. Expected when a network retries.
expired
Postback arrived after the source's attribution_window_days. The default is 30 days — bump it on the source's Edit drawer if your offers convert later.

Click any row to expand the details drawer — canonical fields on top, raw row JSON at the bottom for debugging.

Two filter chips above the table — Attribution and Event — narrow the view. The page paginates 50 conversions at a time; the prev/next pair sits at the bottom.

Editing a Source

Open the Edit drawer from any source in the Postback sources list. It opens with three tabs that group what you'll do most often.

Settings
Name, Platform, Outbound target URL, Rate limit (RPS), Attribution window (days), and the Macro syntax dropdown. The slow-changing knobs — you'll touch this tab once at setup and rarely after.
Mapping
Field map (canonical → operator parameter name) and Event map (operator label → canonical event type) side by side. The two definitions that interpret every incoming postback.
URLs
One ready-to-paste Postback URL per canonical event in your event map, the Track URL for reference, and the Secrets section with Rotate buttons. The drawer opens here by default because grabbing a URL is the most common reason to re-open an existing source.

Per-event URLs. The URLs tab generates one URL for each canonical event in your event map — Registration, FTD, Deposit, etc. — with the event type hardcoded in the URL. Just after Save or Rotate the URL is fully paste-ready (the inbound token is inlined). On a reopened drawer the URL carries a literal {TOKEN} placeholder instead, because we only show the secret once — substitute the value you saved earlier, or click Rotate token on the warning panel to get a fresh URL with the new token inlined.

For networks that route every event type to its own dedicated URL (1Win is the canonical example — Registration / Revenue / All deposits / First deposit / Recurring deposit / Application launch each get separate slots), the generated URL already includes event_type=registration / =ftd / etc. so our processor can classify the event without it being in the payload.

Save persists all three tabs at once. The single Save button at the bottom of the drawer commits any changes you've made across Settings, Mapping, and URLs (the Rotate buttons are immediate — they don't wait for Save).

The two Rotate buttons in the Secrets section issue a fresh secret and surface it once via the reveal modal — same flow as during create. Update the network before the old secret expires; old and new run concurrently for a short grace period.

Troubleshooting

All my conversions land as unmatched
Most common: the network isn't echoing _cid in the parameter your map's click_id row points at. Open the conversion-details drawer on any unmatched row, inspect the raw JSON, find the parameter that carries the long base64 token, and update the field map.
No conversions at all, but the network says it's firing
Two suspects: wrong postback URL in the network panel (compare it byte-for-byte with what's in the reveal modal — the inbound token has to match), or the network is hitting a different URL than ours. Check your network's outgoing log if it has one.
Conversions show event_type: unknown
Two possible causes. (1) The network is sending a new event label you haven't mapped — open the source's Edit drawer, switch to Mapping tab, add a row for the new label. (2) The network doesn't transmit event_type at all (1Win-class — each event has its own URL slot) and you didn't paste the URL from our URLs tab — copy each per-event URL from the URLs tab and paste it into the matching network slot. We hardcode event_type=registration / =ftd / etc. into each URL so the processor classifies correctly.
The operator's postback form rejects our URL ("Enter the correct link" or similar)
Macro syntax mismatch — the network expects a different macro wrapping (curly UPPERCASE / square / percent) than what we generated. Open the Edit drawer, Settings tab, change the Macro syntax dropdown to match the network's docs, Save, then re-copy the URL from the URLs tab.
My EPC is suspiciously high or low after a window change
EPC is Payout / Clicks within the selected window. A short window can be dominated by a single large conversion; a long window evens out. Compare 24h and 7d to spot true trends.
I see tds_db_not_configured errors
The 301_tds storage isn't enabled for your region yet. The dashboard renders empty rather than blocking — usually transient during a rollout. Contact support if it persists past a day.

For Admins Only

Two extra sections appear at the bottom of /postbacks when you're signed in as an admin user — Platform signatures and Open support tickets. These let you teach Auto-detect about a new network.

Signatures are the recipes Auto-detect matches against. When an operator pastes an unrecognised URL, a ticket lands here with the URL and the parameter keys we extracted — that's your starting material for writing a new signature.

The Add signature drawer asks for an ID, a display name, the click-ID parameter list, the event/amount/currency parameter names, and two JSON-paste fields for the default field map and event map operators will get out of the box. Spend a minute looking at an existing signature's row to understand the shape before writing your first one.

Glossary

_cid
The click ID token we attach to every outbound redirect. The affiliate network has to round-trip it in their postback for attribution to work.
Attribution window
How far after the click we still accept a conversion. Default 30 days; configurable per source.
Canonical field
One of 301.st's fixed schema fields (click_id, event_type, etc.). The field map binds these to whatever names the network uses.
EPC
Earnings per click. Payout / Clicks over the selected window.
HMAC signature
Cryptographic seal we put on outbound deliveries (X-301-Signature header) so your platform can verify each conversion really came from us.
Inbound token
Per-source shared secret. The network sends it back to us so we can prove a postback is theirs.
Macro syntax
How a network wraps macros in postback URLs: curly lowercase {event_id}, curly UPPERCASE {EVENT_ID}, square [EVENT_ID], percent %EVENT_ID%, or double curly {{EVENT_ID}}. Per-source setting; default is curly lowercase.
Per-event URL
One Postback URL per canonical event type in your event map, generated automatically by the URLs tab with event_type=registration / =ftd / etc. hardcoded. Required for networks that don't transmit event_type in the payload (e.g. 1Win) — they have a separate URL slot per event type.
Postback
Server-to-server HTTP call from the affiliate network telling us a user converted.
Signature
Admin-level recipe that lets Auto-detect recognise a new network's postback URL shape.

Related