S2S (server to server) postback tracking is how an ad network learns which clicks turned into a lead or a sale. The network puts a click id in your landing URL, your tracker or server stores it, and when the visitor converts, your server calls the network's postback URL with that click id. No pixel and no third-party cookie: one server talks to another.
We run an adult ad network that reports campaigns on the conversions advertisers send back this way. This guide walks through the flow with the exact macros and parameters we document on our developers page, so you can copy them as they are.
How does the flow work, from click id in to postback out?
- The click. A visitor clicks your ad. The network creates a click id and replaces a macro in your landing URL with it.
- The landing. The visitor arrives on your tracker or your page with the click id in the URL. Your tracker stores it next to the visit.
- The conversion. The visitor signs up or pays. Your tracker or server knows which stored click id belongs to that visitor.
- The postback. Your server sends one GET request to the network, with the click id and the event. The network matches it to the click and counts the conversion.
Why it matters in adult advertising: many visitors browse in private mode, on mobile, with cookies blocked. A browser pixel can miss them; a server call does not depend on the browser at all.
Which macros go in the landing URL?
On Lana Network you write macros in the landing URL of your campaign, and we replace each one with the real value on every click, URL-encoded. Any other {...} is refused when you save the URL.
The landing URL must be https and carry these four parameters, once each:
https://example.com/landing?ocid={click_id}&occ={campaign_id}&osrc={zone_id}&osite={src_hostname}
{click_id}: our click id, 35 characters. This is the one you send back.{campaign_id}: the public key of your campaign.{zone_id}: the public key of the zone that showed your ad.{src_hostname}: the domain of the site, never taken from the Referer.
You can add more, each under a parameter name that is not reserved: {site_id}, {creative_id} (none for a popunder), {format}, {country}, {device}, {os}, {browser} and {lang}. When a value is not known for a visit, we put a neutral placeholder such as other or xx, never the raw macro.
What does the postback URL look like?
One GET request per event:
https://postback.lananetwork.com/v1/postback?token=YOUR_TOKEN&click_id={ocid}&event=purchase&payout={amount}
| Parameter | Meaning |
|---|---|
token | Required. Your secret postback token, given by your account manager. |
click_id | Required. The value received in ocid on the landing URL. |
event | Required. lead, purchase or purchase_recurring (each rebill). |
payout | Optional. Amount in USD, dot as decimal separator. |
tx | Optional. Your transaction id, 1 to 64 letters, digits, dots, underscores or hyphens. |
In that URL, {ocid} and {amount} are placeholders for your own system's values, not our macros. If you use a tracker, it has its own macro names. Two examples from the tracker guides on our developers page (macro names from each tracker's documentation):
- Voluum: the click id is stored as the External ID, so the postback uses
click_id={externalid}&payout={payout}, andtx={transaction.id}for rebills. - Keitaro:
click_id={external_id}&payout={revenue}, andtx={tid}for rebills.
The same page has guides for Binom, RedTrack and a generic server setup.
How should you store the click id?
Treat it as an opaque string and send it back unchanged.
- Keep it whole. Our click id is 35 characters. A database column or a form field that cuts it short makes every postback fail as an unknown click.
- Store it as text. Do not convert it to a number, change its case or strip characters.
- Read it from the URL, decoded once. The macro value is URL-encoded in the landing URL. Your tracker decodes it on arrival; do not encode it twice when you send it back.
- Carry it through your funnel. If the visitor moves from a landing page to a checkout on another domain, pass the click id along, or the conversion has nothing to attach to.
How are conversion windows and duplicates handled?
- Leads and purchases count once per click. A second
purchaseon the same click answersOK: duplicateand is not counted again. - Rebills use their own event. Send each subscription renewal as
purchase_recurring. Withtx, each rebill is unique per click and transaction id, so a retry with the sametxcounts once. - Without `tx`, two
purchase_recurringwith the same click and the same amount within 60 minutes are treated as one. Sendtxwhenever your system has one: it avoids both false duplicates and double counts after a retry. - The window. A click older than 90 days answers
ERROR: click expired.
The answer is plain text, so your server can act on it:
200 OKor200 OK: duplicate: success, nothing more to do.200 ERROR: unknown click_idor200 ERROR: click expired: do not retry.400 ERROR: bad request: a parameter is missing or malformed.401 ERROR: bad token: the token is wrong.503 ERROR: retry: a temporary problem on our side, retry later.
How do you test a postback end to end?
- Check the URL without recording anything. In your advertiser space, open Postback, paste the URL exactly as saved in your tracker, with your token, and press Check URL. It tells you if the token is accepted and which parameter is missing, and it never records a conversion.
- Check from a terminal. A request with a made-up click id should answer
200 ERROR: unknown click_id. That proves the token and the format are right. - Run one real conversion. Send one test click to your campaign, convert it yourself, then open Reports in your advertiser space. The lead or purchase shows up within a few minutes.
If step 3 fails while steps 1 and 2 pass, the problem is almost always the click id: not stored, cut short, or lost between your landing and your checkout. For the wider picture of testing a new traffic source, see our guide to buying adult traffic.
What Lana Network does
Lana Network sells placements on adult publishers' sites, today mostly United States mobile traffic, and reports each campaign on the leads and purchases you send back by S2S postback. Impressions found invalid are credited back to your balance at settlement. Every site must prove ownership before it serves. To start, create an advertiser account or use Contact support in our guides with what you sell and how you track it.
Frequently asked questions
What is an S2S postback?
A request your server sends to the ad network when a visitor converts, carrying the click id the network gave you on the click. It does not depend on cookies or the visitor's browser.
Which macro carries the click id on Lana Network?
{click_id}, placed in the ocid parameter of your landing URL. Send the value back unchanged as click_id in the postback.
How do I report rebills and subscriptions?
Use event=purchase_recurring for each renewal, with your transaction id in tx. A plain purchase counts only once per click.
Should I retry a postback that fails?
Only on 503 ERROR: retry. Do not retry unknown click_id or click expired, and fix the URL on 400 or 401.