Attribution
Pruuv links each lead to the ad account, campaign and ad that brought it, using the UTM tags on the lead. That link powers cost-per-lead reporting, AI agent recommendations, and conversion sending back to Meta, Google, and TikTok. How deep the link goes depends on the platform: for Google Search it reaches the ad group, and for Performance Max the campaign.
There are three ways to set it up. Most clients only need Tier 1.
The three attribution tiers
Add the standard UTM tags below to your ads’ URLs. When you connect an ad account, Pruuv sets up the matching rules for its platform, so these tags work with no other setup.
If your URL tags are different, change which UTM tag holds which ID for each ad account, with an optional pattern to pull the ID out of a longer value.
Pruuv gives every ad its own pruuv_aid for your URL templates, with no platform macro needed. The Pruuv Pixel already saves pruuv_aid from the landing URL and Pruuv stores it with each event, but attribution does not use it yet. Use Tier 1 for now.
Tier 1 — Standard URL tags
Pruuv reads the lead’s own UTM tags. utm_source names the platform. Then one ID picks the ad account, campaign and ad: the ad ID for Meta and TikTok, the ad group ID for Google Search and Microsoft Ads, and the campaign ID for Performance Max and other campaign-level Google types. The ID must belong to an ad that Pruuv has synced from your connected ad account.
Add these tags to your ads. They match the standard mapping Pruuv sets up when you connect an ad account.
Meta
Where: Each ad’s URL parameters field, under Tracking.
utm_source=facebook&utm_medium={{site_source_name}}&utm_campaign={{placement}}&utm_content={{ad.id}}&utm_term={{adset.id}}Pruuv matches on the ad ID ({{ad.id}}) in utm_content.
Google Ads — Search
Where: The account-level Final URL suffix. Google adds it to the end of your landing page URL.
utm_source=google&utm_medium={adgroupid}&utm_campaign={matchtype}&utm_content={keyword}&utm_term={creative}Pruuv matches on the ad group ID ({adgroupid}) in utm_medium.
Google Ads — Performance Max
Where: The Final URL suffix of each Performance Max campaign. It replaces the account-level suffix for that campaign.
utm_source=google&utm_medium=pmax&utm_campaign={campaignid}Pruuv matches on the campaign ID ({campaignid}) in utm_campaign, together with utm_medium=pmax.
For Display, Video and Shopping campaigns, use the same tags with utm_medium=display, video or shopping. Write the value exactly like this, in lowercase.
Google Ads — Demand Gen
Where: The Final URL suffix of each Demand Gen campaign.
utm_source=google&utm_medium=demand_gen&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={creative}Pruuv matches on the campaign ID ({campaignid}) in utm_campaign, together with utm_medium=demand_gen.
TikTok
Where: Each ad’s URL parameters.
utm_source=tiktok&utm_medium=__AID__&utm_campaign=__PLACEMENT__&utm_content=__CID__
Pruuv matches on the ad ID in utm_content.
In TikTok, __AID__ is the ad group ID and __CID__ is the creative ID, which is the ad ID on standard campaigns. On upgraded Smart+ campaigns, use utm_content=__ADID_V2__ (the ad ID) instead.
Microsoft Ads
Where: The account-level Final URL suffix.
utm_source=bing&utm_medium={AdGroupId}&utm_campaign={MatchType}&utm_content={keyword:default}&utm_term={AdId}Pruuv matches on the ad group ID ({AdGroupId}) in utm_medium.
For reporting only. Pruuv does not send conversions to Microsoft Ads.
utm_source must name the platform: facebook, fb, meta, instagram or ig for Meta; google for Google Ads; tiktok for TikTok; bing or microsoft for Microsoft Ads. Presets for LinkedIn and Customer.io are in each ad account’s Matching tab (see Tier 2).
Google Ads notes
| ValueTrack parameter | Tag | What Pruuv does with it |
|---|---|---|
| {adgroupid} | utm_medium (Search), utm_content (Demand Gen) | The ad group ID. Pruuv matches Search leads on it. |
| {campaignid} | utm_campaign (Performance Max, Demand Gen) | The campaign ID. Pruuv matches Performance Max and Demand Gen leads on it. |
| {matchtype} | utm_campaign (Search) | b (broad), p (phrase), e (exact) or a (AI Max). Used for the match type and AI Max breakdowns. |
| {keyword} | utm_content (Search) | The keyword from your list that matched, not the search query. Pruuv looks it up within the ad group for keyword reports. |
| {creative} | utm_term | The ad ID. Stored with the lead, but not used to match Search leads. |
Check your match rate
Open the client’s Data Health page. On Overview, the Attributable to paid tile shows the share of leads that came from your paid platforms, and below it how many of them Pruuv matched. On CRM Logs, you can filter leads by status:
| Status | What it means | What to check |
|---|---|---|
| Matched | Pruuv found the platform and the campaign. | Nothing. |
| Unattributed | Pruuv found the platform, but not the campaign. | The ID tag is missing or wrong in the ad’s URL, or Pruuv has not synced that ad yet. |
| Unmatched | The lead’s utm_source names no connected platform. | The lead’s utm_source, and the ad account’s Source identification list. |
Tier 2 — Custom UTM mapping
Use this when your URL tags differ from the standard ones — for example, the ad ID sits in utm_campaign, or inside a longer value like brand_12345. Open Settings → Paid Media, click the ad account, then open the Matching tab and its UTM Matching card. Agency owners and admins can change it; other users can view it.
| Setting | What it does |
|---|---|
| Load preset | Fills in the standard mapping for the platform. Pruuv applies it for you when you connect an ad account. |
| Source identification | The utm_source values that mean this platform. |
| Mapping rows | Each row links a platform field (Campaign ID, Ad Set ID, Ad ID, Keyword and so on) to the UTM tag that carries it: utm_campaign, utm_content, utm_medium or utm_term. |
| Extractor (optional) | A pattern that pulls the ID out of a longer value. Pruuv uses the first group in the pattern: (?<id>[0-9]+) takes 12345 from brand_12345. If the pattern does not match, Pruuv ignores the value. |
The row that matters depends on the platform: Ad ID for Meta, TikTok and LinkedIn; Ad Set ID (the ad group) for Google Search and Microsoft Ads; Campaign ID for Performance Max. When you save, Pruuv re-checks the leads it has not matched yet.
Tier 3 — Pruuv native attribution Coming soon
Pruuv native attribution removes all dependency on platform macro configuration. Instead of relying on the platform to inject an ad ID into the URL, Pruuv builds a first-party ID layer it fully controls.
pruuv_aid from the landing URL, and Pruuv stores it with each event. But attribution does not read it yet, so an event that carries a pruuv_aid and no UTM tags is not attributed to an ad. Keep your Tier 1 URL tags in place.How it will work
- Ad scan. Pruuv scans your connected ad account (daily, or on demand from the Connections page) and catalogues all active and paused ads. Each ad is assigned a
pruuv_aid— a UUID that Pruuv owns and controls. - URL template generation. Pruuv generates a URL template per ad with
pruuv_aidbaked in as a static query parameter. You copy this into the platform once (or download a CSV for bulk upload). - Pixel capture (live today). The Pruuv Pixel reads
pruuv_aidfrom the URL on page load and saves it in the_pruuv_sessioncookie.page(),identify()andtrack()all send it to Pruuv, which stores it with the event. - Attribution match (not live yet). Pruuv will join
funnel_events.pruuv_aidto its internal ad catalogue — a direct, exact match with no platform API ambiguity.
Click ID capture
In addition to UTM attribution, the Pruuv Pixel captures platform click IDs from the URL. Pruuv uses them to match the conversions it sends back to the ad platforms. A click ID improves the match; the UTM tags above decide where a conversion goes. See the Pixel SDK docs for how they are saved.
| URL parameter | Platform | Saved in | What Pruuv uses it for |
|---|---|---|---|
| gclid, wbraid, gbraid | Google Ads | _pruuv_session | Matching the conversions Pruuv sends to Google Ads. |
| fbclid | Meta | _fbc, as fb.1.<time>.<fbclid> | Matching the conversions Pruuv sends to Meta’s Conversions API. |
| — (no URL parameter) | Meta | _fbp | Meta’s browser ID, used for matching. The pixel creates it, or reuses one that Meta’s own pixel set. |
| ttclid | TikTok | _pruuv_session | Matching the conversions Pruuv sends to TikTok’s Events API. |
| li_fat_id | _pruuv_session | Stored only. Sending conversions to LinkedIn is not available yet. | |
| msclkid | Microsoft Ads | _pruuv_session | Stored only. Pruuv does not send conversions to Microsoft Ads. |
| pruuv_aid | Pruuv | _pruuv_session | Stored only. Attribution does not use it yet. Use only a pruuv_aid that Pruuv gave you. Any other value makes that visitor’s track() calls fail, and stops Pruuv adding their click IDs and browser details to your leads. |
Attribution rules
Pruuv stores both the first and the last touch of a visitor:
| Signal | Cookie | How it behaves |
|---|---|---|
| Last touch | _pruuv_session | Replaced by the newest landing URL that carries any UTM tag or click ID. Values the new URL does not carry are dropped. Sent with every track() call. |
| First touch | _pruuv_first_touch | The first landing that carried a UTM tag or click ID. Written once and never changed. Sent as first_touch with track() and identify() when it differs from the last touch. |
Reports default to Last click (CRM): a lead is credited to the UTMs your CRM recorded, which is also what conversion sending uses. This matches how Meta, Google and TikTok credit leads in their own reports. Agency users can switch the campaign drill to another attribution rule:
| Rule | Who gets the credit | The question it answers |
|---|---|---|
| Last click (CRM) | The UTMs your CRM recorded on the lead. The default in every report. | Which ad did the CRM record for this lead? |
| First click | The earliest visit that is not direct, up to 90 days before the lead. | Which ads start relationships? |
| Last click | The latest visit before the lead, a direct visit included. | What came right before the lead? |
| Last non-direct click | The latest visit that is not direct. | Which source closed it? |
| Last paid click | The latest ad click. | Which ad closed it? |
| Linear | Every visit that is not direct, in equal shares. | Which ads helped along the way? |
| Time decay | Every visit that is not direct; a visit 7 days before the lead counts half as much as one on the day. | Which ads helped most just before the lead? |
| Position-based | 40% to the first visit, 40% to the last, 20% shared by the visits between. | Which ads opened and closed it? |
| J-shaped | 20% to the first visit, 60% to the last, 20% shared by the visits between. | Which ads closed it, and what opened it? |
| Inverse-J | 60% to the first visit, 20% to the last, 20% shared by the visits between. | Which ads opened it, and what closed it? |
A visit counts when the Pruuv pixel saw it at most 90 days before the lead. The last five rules share a lead between visits, so a count can show one decimal, such as 0.3 of a lead, and a count under 0.05 shows as 0. A lead with no paid touch stays Unattributed under every rule, and conversion sending never follows the rule you pick.
Pruuv.identify(email, { reference }) links a visitor to their email when they fill in a form, and sends the click IDs saved in their browser to Pruuv. When your CRM later sends the lead with the same email or reference, Pruuv adds those click IDs to it. This also works across devices: if the person clicked the ad on their phone and identify()ran there, a lead with the same email gets the phone's click ID. See the Pixel SDK docs.Attribution window
The Pruuv Pixel asks the browser to keep its cookies for 90 days. Browsers can shorten this: Safari keeps them for at most 7 days, and for 24 hours in some cases (see Pixel SDK → Cookies). The pixel restores them from a copy in localStorage, which Safari keeps until 7 days pass with no visit to the site. A visitor who converts after both are gone has no click ID or UTM data left in the browser.
Click IDs that identify()already sent to Pruuv are kept on Pruuv's side, so a lead your CRM sends later can still get them. Each ad platform also has its own limit on how old a click or conversion may be.