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 |
|---|---|---|
| Internal UUID of the click (generated by the tracker) | Postback URL, statistics, conversion deduplication |
| Click ID of the traffic source (fbclid, gclid, etc.) | Passed to FB CAPI / TikTok Events API for reverse attribution |
| Sub-parameters from the ad network | UTM tags, buyer subid, adset_id, campaign_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 |
|---|---|---|
| Registration on the affiliate's site |
|
| First deposit (FTD) |
|
| Repeat deposit |
|
| Declined conversion | Does not affect subscription |
| 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:
Check the affiliate's documentation to find out which parameter to pass the click_id (usually
sub1,click_id,aff_sub,cid)In the CPA network settings, specify
paramTemplate:?sub1={event.event_click_id}(replacesub1with the required parameter)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}¤cy={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 |
|---|---|---|
| Returns click_id back to the tracker |
|
| Conversion status |
|
| Payout amount |
|
| Currency |
|
| Internal conversion ID in the affiliate |
|
Where to Insert the Postback URL
Copy the Postback URL from the CPA network settings in Adset.Pro (Tracker → Affiliate Networks → Postback tab)
Open the affiliate network cabinet → section Postback / S2S / Tracking
Paste the URL into the Global Postback URL (or Server-to-Server URL) field
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 |
|---|---|---|
|
| Registration |
|
| First deposit |
|
| Repeat deposit |
|
| Declined conversion |
|
| Trash lead |
How It Works Technically:
In the CPA network, statuses (comma-separated lists) are specified for each type:
accept,hold,decline,trash,redepThe postback can also accept mappings through query parameters:
?accept_status=sale,ftd&hold_status=lead,regIf 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 toCPA_ACCEPT
Deduplication of Conversions
Adset.Pro automatically checks for duplicates:
For each
clickId+event type, it looks for an already processed conversionIf a duplicate is found — the new conversion is marked as
ERRORwith an indication of the existing oneDuplicates can be allowed for specific types in the CPA network settings (
acceptDuplicates+acceptDuplicatesFor)When
external_idis present, deduplication also takes it into account
PWA Attribution
For the PWA funnel, click_id goes through additional steps:
Click →
event_click_idis generated and remembered in the trackerUser opens PWA →
PWA_VIEWevent (click_id is passed through the URL as/:clickId/app)Installs PWA →
PWA_INSTALLevent (click_id is saved in the subscription and cookie)Opens the installed PWA later →
PWA_OPEN(click_id is restored from cookie/localStorage)Goes to the offer → click_id is passed to the affiliate through paramTemplate
iOS Features:
On iOS, there is no native
beforeinstallprompt— the tracker recordsIOS_INSTALLthrough Redis deduplication (once per clickId)A separate event type
IOS_INSTALLis used for iOS installationsFor iOS, there is support for the
ios26query 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):
User clicks on the push →
event_click_idof the push click is recorded (eventPUSH_CLICK)User registers/makes a deposit within N hours → conversion is attributed to the push
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 asLAND_VIEW,LAND_CLICK,PWA_VIEW,PWA_INSTALL,NOTIFICATION_SUBSCRIBEext_click_id(fbclid/gclid) is passed to the pixel for reverse attribution by the ad networkPixels 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:
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
Postback URL not configured in the affiliate's cabinet (or configured not for all statuses)
Status not specified in the mapping — the affiliate sends
status=deposit, but onlyacceptis specified in the CPA network mappingClick 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
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?
Check the
paramTemplate— open the offer URL manually with the substituted click_id and ensure the parameter is reachingCheck that the affiliate is sending postbacks (ask the manager for the log of the latest postbacks)
Look at the
SOURCE_FILTERstatistics — perhaps the campaign filters are dropping all traffic to the White PageCheck 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?
Create a test click on the tracking link
Check the offer URL — ensure that the click_id is substituted correctly
Register on the affiliate's site
Check in Adset.Pro → Conversions — whether there is a CPA_HOLD with your clickId
Make a deposit (or ask for a test) — check CPA_ACCEPT
