PruuvDocs

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

1Standard URL tagsAvailable now

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.

2Custom UTM mappingAvailable now

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.

3Pruuv native attributionComing soon

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).

Leads your CRM sends need these tags too. The Pruuv Pixel does not add UTM tags to the leads your CRM sends, so your CRM must pass them on (see Pixel SDK → What the pixel saves from the URL). A lead with no matching tags is not attributed, and Pruuv sends no conversion for it.

Google Ads notes

ValueTrack parameterTagWhat 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_termThe ad ID. Stored with the lead, but not used to match Search leads.
{keyword} is your keyword, not the search query. For broad match, it is the keyword from your list, not what the person typed. Pruuv pulls Google’s search term report into the AI agent’s context, so the agent can flag spend on off-topic searches. Search terms are not linked to individual 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:

StatusWhat it meansWhat to check
MatchedPruuv found the platform and the campaign.Nothing.
UnattributedPruuv 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.
UnmatchedThe 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.

SettingWhat it does
Load presetFills in the standard mapping for the platform. Pruuv applies it for you when you connect an ad account.
Source identificationThe utm_source values that mean this platform.
Mapping rowsEach 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.

Not live yet. The Pruuv Pixel already saves 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

  1. 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.
  2. URL template generation. Pruuv generates a URL template per ad with pruuv_aid baked in as a static query parameter. You copy this into the platform once (or download a CSV for bulk upload).
  3. Pixel capture (live today). The Pruuv Pixel reads pruuv_aid from the URL on page load and saves it in the _pruuv_session cookie. page(), identify() and track() all send it to Pruuv, which stores it with the event.
  4. Attribution match (not live yet). Pruuv will join funnel_events.pruuv_aid to its internal ad catalogue — a direct, exact match with no platform API ambiguity.
Why this will be the strongest option: Platform creative IDs can be inconsistent across API versions and campaign types. Pruuv native attribution uses an ID you set once that never changes — even if Google or Meta rename their ad ID fields in a future API version.

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 parameterPlatformSaved inWhat Pruuv uses it for
gclid, wbraid, gbraidGoogle Ads_pruuv_sessionMatching the conversions Pruuv sends to Google Ads.
fbclidMeta_fbc, as fb.1.<time>.<fbclid>Matching the conversions Pruuv sends to Meta’s Conversions API.
— (no URL parameter)Meta_fbpMeta’s browser ID, used for matching. The pixel creates it, or reuses one that Meta’s own pixel set.
ttclidTikTok_pruuv_sessionMatching the conversions Pruuv sends to TikTok’s Events API.
li_fat_idLinkedIn_pruuv_sessionStored only. Sending conversions to LinkedIn is not available yet.
msclkidMicrosoft Ads_pruuv_sessionStored only. Pruuv does not send conversions to Microsoft Ads.
pruuv_aidPruuv_pruuv_sessionStored 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:

SignalCookieHow it behaves
Last touch_pruuv_sessionReplaced 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_touchThe 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:

RuleWho gets the creditThe 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 clickThe earliest visit that is not direct, up to 90 days before the lead.Which ads start relationships?
Last clickThe latest visit before the lead, a direct visit included.What came right before the lead?
Last non-direct clickThe latest visit that is not direct.Which source closed it?
Last paid clickThe latest ad click.Which ad closed it?
LinearEvery visit that is not direct, in equal shares.Which ads helped along the way?
Time decayEvery 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-based40% to the first visit, 40% to the last, 20% shared by the visits between.Which ads opened and closed it?
J-shaped20% to the first visit, 60% to the last, 20% shared by the visits between.Which ads closed it, and what opened it?
Inverse-J60% 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.