PruuvDocs

Attribution

Pruuv links every conversion event to the ad that drove it. That linkage powers cost-per-lead reporting, AI agent recommendations, and conversion sending back to Meta, Google, and TikTok.

Attribution works in three tiers — each progressively more robust. Most clients start at Tier 1 and upgrade as their setup matures.

The three attribution tiers

1UTM content matchingAvailable now

Set utm_content to the platform's ad ID macro in your URL templates. Pruuv joins funnel events to ad performance data on that field. Fast to set up; breaks if the URL template is misconfigured.

2UTM pattern configComing soon

If your URL structure doesn't use utm_content for the ad ID — or uses a compound value — configure a custom mapping per connection: which UTM param to read, and an optional regex to extract the ad ID from it.

3Pruuv native attributionAvailable now

Pruuv scans your connected ad accounts, assigns every ad a pruuv_aid, and generates URL templates with that ID baked in. The Pruuv Pixel captures it on landing. No platform macro dependency. Works even if platform creative IDs are inconsistent.

Tier 1 — UTM content matching

The join is: funnel_events.utm_content = ad_performance_cache.ad_id. For this to work, your ad URL templates must include the platform's ad ID macro in theutm_content parameter.

URL template setup

PlatformURL template snippetNotes
Google Adsutm_content={creative}&utm_term={keyword}Add to the account-level Tracking Template. {creative} = ad ID; {keyword} = matched keyword (see Google nuance below).
Meta Adsutm_content={{ad.id}}Dynamic URL parameter. Set in the ad's Website URL field or campaign-level URL parameters.
TikTok Adsutm_content=__AID__TikTok macro. Set in the ad's Landing Page URL field.

Google Ads — search term nuance

Google Search campaigns have a dimension below the ad: the search term that triggered the ad. The same responsive search ad (RSA) can show for hundreds of different queries depending on your match type settings. Pruuv captures this via two ValueTrack parameters:

ParameterWhat it capturesMatch type behaviour
{creative}The ad's unique ID — used for the spend attribution joinSame ad ID regardless of which search term triggered it
{keyword}The keyword from your keyword list that matched the queryFor broad match: your keyword, not the user's actual query. For exact match: identical.
{matchtype}Match type: b (broad), p (phrase), e (exact)Useful for segmenting performance by match type in reporting
{network}Traffic source: g (Google search), s (search partners), d (display)Helps filter out partner traffic that converts differently

Recommended Google tracking template:

{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}&utm_term={keyword}&utm_matchtype={matchtype}

This gives Pruuv the ad ID (for spend join), the matched keyword, and the match type — enough to power keyword-level performance breakdowns in the Data tab alongside conversion data.

Broad match and actual search queries: For broad match keywords, {keyword} captures your keyword — not the actual search query the user typed. To see actual search queries alongside conversions, the Pruuv AI agent cross-references the Google Ads search term report (available in the agent context) with your funnel data. This is surfaced in recommendations when broad match keywords are driving low-quality or off-topic traffic.
Known Google creative ID inconsistency: In some campaign types, {creative}returns a creative ID that does not exactly match the ad ID returned by the Google Ads API. If you see a high unmatched rate despite correct template setup, this is the likely cause. Pruuv native attribution (Tier 3) eliminates this by using a Pruuv-owned ID that does not depend on the platform's creative ID format.

Attribution match rate

In the client's Data tab, the Attribution section shows:

  • Matched events — funnel events where utm_content matched an ad in the performance cache
  • Unmatched (have content) — utm_content was present but no ad match was found. Usually means the URL template macro is wrong, or the ad is not yet synced.
  • No content — utm_content was empty. Organic traffic, email, or paid traffic without the macro configured.
A high "Unmatched (have content)" count means the macro is firing but the value doesn't map to a known ad — check the URL template on the platform. A high "No content" count means the macro is missing entirely.

Tier 2 — UTM pattern config Coming soon

If your clients have non-standard URL structures — e.g. the ad ID is embedded in utm_campaign, or utm_content contains a compound value like brand_12345 — you can configure a custom attribution mapping per connection.

Config options

SettingDescriptionExample
Source parameterWhich UTM param holds the ad IDutm_campaign instead of utm_content
Extraction patternOptional regex with a named group to extract the ID from a compound value(?<ad_id>[0-9]+) extracts 12345 from brand_12345

This config is stored per connection and applied automatically in attribution queries. The Connections page will show a live preview of matches against your last 7 days of events.

Tier 3 — Pruuv native attribution

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.

How it works

  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. The Pruuv Pixel reads pruuv_aid from the URL on page load and stores it in a first-party cookie for 90 days. On conversion, pruuv_aid is included in the webhook payload.
  4. Attribution match. Pruuv joins funnel_events.pruuv_aid to its internal ad catalogue — a direct, exact match with no platform API ambiguity.
Why this is 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. These are required for conversion sending (sending matched conversions back to ad platforms) and provide a secondary attribution signal.

PlatformClick ID parameterCookieUsed for
Google Adsgclid_pruuv_sessionConversion Upload API. Primary Google match signal.
Google Adswbraid_pruuv_sessionWeb-to-app campaigns (privacy-preserving).
Google Adsgbraid_pruuv_sessionApp-to-web campaigns (privacy-preserving).
Meta Adsfbclid → _fbc_fbcMeta CAPI matching. Required alongside _fbp.
Meta Ads(browser ID)_fbpBrowser-level Meta matching. Generated on first visit.
TikTok Adsttclid_pruuv_sessionTikTok Events API matching.
Microsoft Adsmsclkid_pruuv_sessionBing/Microsoft Ads conversion upload.

First touch vs last touch

Pruuv stores both first-touch and last-touch attribution:

ModelCookieBehaviour
First touch_pruuv_first_touchWritten once on the visitor's first tracked visit. Never overwritten. Captures the campaign that originally introduced the lead.
Last touch_pruuv_sessionUpdated on each visit where a click ID or UTM is present. Reflects the most recent campaign before conversion.

Pruuv uses last-touch by default for conversion sending — this aligns with the attribution models used by Meta, Google, and TikTok for their own reporting. First-touch data is stored and available for AI agent context and custom reporting.

The identify() method lets you associate a known identity (email, phone) with a visitor profile before they convert. This enables cross-device attribution: if the same person clicks an ad on mobile and converts on desktop, Pruuv can merge their sessions. See the Pixel SDK docs for details.

Attribution window

All cookies set by the Pruuv Pixel have a 90-day expiry. A visitor who clicks an ad and converts more than 90 days later will not have a click ID available, but their first-touch UTM data will still be present if it was captured within the window. The 90-day window aligns with the maximum attribution window supported by Meta and Google.