Adset.ProAdset.ProKnowledge base
Home/Training Materials/How Click Attribution Works in Adset.Pro

How Click Attribution Works in Adset.Pro

What is Attribution and Why is it Needed

Attribution is a mechanism that links a conversion (registration or deposit) to a specific ad click.

For an arbitrageur, attribution answers the main question: which clicks brought in money? Imagine: you drove 1,000 clicks from Facebook, and received 10 deposits. Without attribution, you only see the overall numbers — spent $500, received $800. With attribution, you know that the deposits came from clicks with a specific ad set, creative, and audience — and you can scale that.

Without click_id, it is impossible:

  • To optimize the campaign (it’s unclear which source gives ROI)

  • To link the conversion to the ad account (FB CAPI / TikTok Events API)

  • To track the quality of traffic by sub-accounts and buyers (via ext_sub1..10)


How the Attribution Chain Works

Each click in Adset.Pro receives a unique identifier — event_click_id (UUID). This ID is passed through the entire funnel and returned by the affiliate network in the postback.

Ad (FB/TikTok/Push)
    ↓
Tracking link Adset.Pro
    ↓  event_click_id is generated (UUID)
    ↓  Parameters are determined: country, device, IP, ASN, user-agent
    ↓  Campaign filters are applied (Stream Sets)
    ↓
Landing / PWA (click_id is passed to the affiliate through paramTemplate)
    ↓
Registration on the affiliate's site
    ↓
The affiliate sends a postback to Adset.Pro:
    https://adset.pro/postback?clickid={click_id}&status=hold&payout=0
    ↓
The tracker finds the click by click_id → creates CPA_HOLD event (registration)
    ↓  user makes a deposit
The affiliate sends a postback:
    https://adset.pro/postback?clickid={click_id}&status=accept&payout=50
    ↓
Tracker → CPA_ACCEPT event (FTD), revenue = $50
    ↓  repeat deposit
The affiliate → CPA_REDEP, revenue = $30

Key Identifiers

Field

Description

Where Used

event_click_id

Internal UUID of the click (generated by the tracker)

Postback URL, statistics, conversion deduplication

ext_click_id

Click ID of the traffic source (fbclid, gclid, etc.)

Passed to FB CAPI / TikTok Events API for reverse attribution

ext_sub1..10

Sub-parameters from the ad network

UTM tags, buyer subid, adset_id, campaign_id

external_id

Internal conversion ID from the affiliate network

Deduplication and data reconciliation with the affiliate's account

Full Conversion Lifecycle

Internal Type

What It Means

Impact on Subscription

CPA_HOLD

Registration on the affiliate's site

registered = true

CPA_ACCEPT

First deposit (FTD)

deposited = true, triggers pixels and push triggers

CPA_REDEP

Repeat deposit

redeposited = true, counted in LTV

CPA_DECLINE

Declined conversion

Does not affect subscription

CPA_TRASH

Trash lead (fraud)

Does not affect subscription


How to Pass click_id to the Affiliate

In the settings of the CPA network (Tracker → Affiliate Networks), there is a field Param Template — a string of GET parameters that is automatically added to the offer URL.

Example paramTemplate:

?sub1={event.event_click_id}

When creating a Link to the offer, the tracker substitutes the actual click_id:

https://partner.com/offer?sub1=35d542f6-56ec-4858-8031-38bbb820c075

How to Set It Up Correctly:

  1. Check the affiliate's documentation to find out which parameter to pass the click_id (usually sub1, click_id, aff_sub, cid)

  2. In the CPA network settings, specify paramTemplate: ?sub1={event.event_click_id} (replace sub1 with the required parameter)

  3. Make sure that the Click ID mapping (postbackMacros.clickId) field has the correct return macro specified

Tip: In Adset.Pro there are CPA templates (Tracker → CPA Templates) — ready presets for popular affiliates with pre-filled paramTemplate and status mappings. When creating a CPA network, you can select a template and not set it up manually.


Postback: How the Affiliate Returns click_id

After the user registers or makes a deposit, the affiliate sends a postback (HTTP GET request) to the URL Adset.Pro.

The postback URL is automatically generated in the CPA network settings and looks like this:

https://adset.pro/postback?clickid={click_id}&status={status}&payout={payout}&currency={currency}

Where {click_id}, {status}, {payout}, {currency} — affiliate macros (placeholders that the affiliate replaces with real values).

The Postback URL consists of 5 customizable macros:

Macro

Purpose

Example Value from the Affiliate

clickId

Returns click_id back to the tracker

{sub1}, {click_id}, {cid}

status

Conversion status

{status}, {event}, {type}

revenue

Payout amount

{payout}, {revenue}, {amount}

currency

Currency

{currency} (usually USD/EUR)

external_id

Internal conversion ID in the affiliate

{conversion_id}, {order_id}

Where to Insert the Postback URL

  1. Copy the Postback URL from the CPA network settings in Adset.Pro (Tracker → Affiliate Networks → Postback tab)

  2. Open the affiliate network cabinet → section Postback / S2S / Tracking

  3. Paste the URL into the Global Postback URL (or Server-to-Server URL) field

  4. Make sure that the macros in the URL match those supported by the affiliate (each uses its own placeholders)

Status Mapping

Each affiliate uses its own status names. The tracker translates them into internal event types through status settings in the CPA network:

Internal Type

Examples of Affiliate Statuses

What It Means

CPA_HOLD

lead, reg, hold, registration

Registration

CPA_ACCEPT

sale, approved, ftd, dep, accept

First deposit

CPA_REDEP

rebill, redep, redeposit

Repeat deposit

CPA_DECLINE

declined, rejected, decline

Declined conversion

CPA_TRASH

trash, fraud

Trash lead

How It Works Technically:

  • In the CPA network, statuses (comma-separated lists) are specified for each type: accept, hold, decline, trash, redep

  • The postback can also accept mappings through query parameters: ?accept_status=sale,ftd&hold_status=lead,reg

  • If mappings are not passed in the URL — the settings from the CPA network are used

  • Statuses support comma-separated format: accept_status=sale,approved,ftd — any of these statuses from the affiliate will be mapped to CPA_ACCEPT

Deduplication of Conversions

Adset.Pro automatically checks for duplicates:

  • For each clickId + event type, it looks for an already processed conversion

  • If a duplicate is found — the new conversion is marked as ERROR with an indication of the existing one

  • Duplicates can be allowed for specific types in the CPA network settings (acceptDuplicates + acceptDuplicatesFor)

  • When external_id is present, deduplication also takes it into account


PWA Attribution

For the PWA funnel, click_id goes through additional steps:

  1. Click → event_click_id is generated and remembered in the tracker

  2. User opens PWA → PWA_VIEW event (click_id is passed through the URL as /:clickId/app)

  3. Installs PWA → PWA_INSTALL event (click_id is saved in the subscription and cookie)

  4. Opens the installed PWA later → PWA_OPEN (click_id is restored from cookie/localStorage)

  5. Goes to the offer → click_id is passed to the affiliate through paramTemplate

iOS Features:

  • On iOS, there is no native beforeinstallprompt — the tracker records IOS_INSTALL through Redis deduplication (once per clickId)

  • A separate event type IOS_INSTALL is used for iOS installations

  • For iOS, there is support for the ios26 query parameter for specific processing

Important Point with Repeat Visits: If a user installed the PWA, closed the browser, and opened it again after a week — attribution depends on the Sticky Flow settings. If stickyFlowKeepClickId = true, the same clickId is restored from cookie sf_{campaignId} (format: setId:rotationId:clickId), and the deposit is attributed to the original click. If turned off — a new clickId is generated upon re-entry through the tracker.


Push Notification Attribution

Clicks on push notifications are attributed through the attribution window (default 72 hours):

  1. User clicks on the push → event_click_id of the push click is recorded (event PUSH_CLICK)

  2. User registers/makes a deposit within N hours → conversion is attributed to the push

  3. The subscription is marked with flags: registered, deposited, redeposited — this allows targeting subsequent pushes

Statistics on push attribution is available in the Push Analytics → Post-Click Attribution section.

When This is Important for the Arbitrageur:

  • User clicked the push in the morning → did not register → returned after 2 days → attribution counts to the push (if the window is 72 hours)

  • This allows assessing the real impact of push campaigns on conversions, even if the user does not convert immediately

  • Push attribution works in parallel with ad click attribution: one deposit can be attributed to both the ad click (in main statistics) and the push (in Post-Click Attribution)


Pixels and Attribution

After processing a conversion, the tracker automatically sends events to linked pixels (Facebook CAPI, TikTok Events API, HTTP Postback):

  • The pixel triggers on events: CPA_HOLD, CPA_ACCEPT, CPA_REDEP, CPA_DECLINE, CPA_TRASH, as well as LAND_VIEW, LAND_CLICK, PWA_VIEW, PWA_INSTALL, NOTIFICATION_SUBSCRIBE

  • ext_click_id (fbclid/gclid) is passed to the pixel for reverse attribution by the ad network

  • Pixels are linked at the Stream Set level or passed through ?pixel= in the tracking link (override)


Frequently Asked Questions

Q: Why did the affiliate send a deposit, but it is not in the statistics?

Typical reasons:

  1. Incorrect click_id macro in paramTemplate — the affiliate received the click_id in the wrong parameter, and the postback comes with an empty or foreign clickId

  2. Postback URL not configured in the affiliate's cabinet (or configured not for all statuses)

  3. Status not specified in the mapping — the affiliate sends status=deposit, but only accept is specified in the CPA network mapping

  4. Click ID mapping is empty — the macro for returning clickId is not specified in the CPA network settings. Adset.Pro will show a warning if this field is empty

  5. Conversion is duplicated — if there has already been a conversion of this type for the same clickId, the new one will be rejected (unless duplicates are enabled)

Q: There are clicks, but no registrations at all — what could be the problem?

  1. Check the paramTemplate — open the offer URL manually with the substituted click_id and ensure the parameter is reaching

  2. Check that the affiliate is sending postbacks (ask the manager for the log of the latest postbacks)

  3. Look at the SOURCE_FILTER statistics — perhaps the campaign filters are dropping all traffic to the White Page

  4. Check the Bridge Page — if the traffic comes from in-app WebView (FB/Instagram/TikTok), the tracker automatically kicks to the external browser. If the bridge page does not work — the user may not reach the PWA

Q: There are conversions in the statistics without click_id — what does this mean?

Affiliates sometimes send conversions with an empty click_id (or the click_id did not pass through paramTemplate). Such conversions are not attributed to a specific click and do not enter the funnel. Options:

  • The affiliate sends "general" conversions without binding — need to check paramTemplate

  • The click_id was lost (the user cleared cookies, went through another link)

  • If conversions without click_id make up a significant percentage — this is a signal of a problem in the setup of the "tracker ↔ affiliate" link

Q: How to check that the entire chain works?

  1. Create a test click on the tracking link

  2. Check the offer URL — ensure that the click_id is substituted correctly

  3. Register on the affiliate's site

  4. Check in Adset.Pro → Conversions — whether there is a CPA_HOLD with your clickId

  5. Make a deposit (or ask for a test) — check CPA_ACCEPT