# Attribution models: mechanics, implementation choices and where each still exists

Every model below distributes credit for an outcome that already happened across interactions that were observed. None of them recovers interactions that were never collected, and none of them says what would have happened without a channel. Platform availability was checked on 2026-10-17; re-check it before telling a user a model can be selected somewhere.

## Contents

- The worked path used throughout
- First observed touch
- Last touch and last non-direct touch
- Linear
- Position based
- Time decay
- Data driven
- Where each model is available today
- Implementation choices that change the numbers

## The worked path used throughout

Fictional. One Acme customer, first paid order worth $1,200 (net of discounts, before tax and shipping). Same person identified across all visits, 30-day lookback covering the whole path, four interactions eligible for credit:

- Day 0: organic search visit.
- Day 7: paid social ad click.
- Day 14: lifecycle email click.
- Day 21: paid brand search ad click.
- Day 22: direct visit, order placed.

The outcome stays $1,200 under every model. Only the credit moves.

## First observed touch

- Credit: organic search $1,200.
- Question it answers: where measurable demand first entered the journey. Useful for acquisition-origin questions and for content and SEO programmes that rarely close.
- Label it "first observed", never "first touch". A podcast, a colleague's recommendation, an AI assistant answer or a visit before the data history began is invisible to it.
- Record the history start date and the identity rule. A cookie reset, a new device or a consent-denied first visit makes a later interaction look like the first.
- Built-in equivalents: GA4 First user dimensions (Google documents user-scoped dimensions as using the paid and organic last-click model, unaffected by the reporting model setting); HubSpot Original Traffic Source and the First interaction report model; a warehouse view.

## Last touch and last non-direct touch

- Last touch, literally: the day 22 direct visit gets $1,200.
- Last non-direct: skip direct, paid brand search gets $1,200.
- These are different definitions. Never write "last click" on a dashboard without stating how direct is handled and which interactions qualify.
- Question it answers: the last measurable route into conversion. It systematically under-credits whatever created the demand that brand search then captured.
- GA4: all three GA4 models exclude direct from credit unless the whole path is direct. Paid and organic last click is GA4's last non-direct view. Google paid channels last click credits the last Google Ads click and falls back to paid and organic last click when the path has none.

## Linear

- Credit: $300 each to organic search, paid social, email and paid brand search.
- Equal weight is an assumption, not a finding.
- Decide per interaction or per channel and write it down. A path of three email clicks and one search click gives email 75% per interaction but 50% per channel.
- Decide how repeated touches collapse (two clicks on the same ad in one session are one touch, or two).

## Position based

- Illustrative 40/20/40: first and last eligible touches get 40% each, the middle touches share 20%. Credit: organic search $480, paid social $120, email $120, paid brand search $480.
- The weights express a preference for discovery and closing. They are not measured.
- Write rules for short paths before running anything. Default rule for this skill: one touch gets 100%; two touches get 50% each; three touches get 40/20/40 with the middle touch taking the full 20%. Without written rules a position-based view loses or duplicates credit on real data.
- CRM variants anchor on milestones, not positions. HubSpot (knowledge base, updated 21 June 2026) documents U-shaped as 40% to the first interaction and 40% to the lead conversion interaction with 20% across the rest; W-shaped as 30% first, 30% lead creation, 30% deal creation, 10% across the rest (deal create and revenue reports only); Full path as 22.5% each to the first interaction, lead creation, deal creation and the last interaction with 10% across the rest (revenue reports only); J-shaped and inverse J-shaped as 60/20/20 splits weighted to the conversion or the first interaction. Re-read the article before quoting these weights to a user.

## Time decay

- Formula: weight of a touch = 2 ^ (minus days from touch to outcome divided by the half-life), then normalise so weights sum to 1.
- With a 7-day half-life the four touches are 22, 15, 8 and 1 days before the order. Each touch is one half-life later than the previous one, so relative weights are 1, 2, 4, 8. Credit: $80, $160, $320, $640.
- With a 30-day half-life on the same path, relative weights are about 0.60, 0.71, 0.83, 0.98. Credit: about $232, $272, $320, $376. Same customer, same order, organic search credit nearly triples.
- The half-life is a modelling choice, not the length of the buying cycle. Default rule for this skill: set it to the median observed touch-to-outcome lag (computed as in SKILL.md step 4), and report the view again at half and at double that value. If the recommended action changes between the three, the half-life is driving the answer; say so. HubSpot's time decay model uses a fixed 7-day half-life, which heavily discounts early education in a sales cycle measured in months.

## Data driven

- Cannot be calculated from one path. Never invent percentages and label them data driven.
- GA4: Google describes a counterfactual model trained per advertiser and per key event, evaluating converting and non-converting paths, using factors such as time from key event, device type, number of ad interactions, exposure order and creative type, and using data from randomised controlled trials in its methodology. Conversions can be re-attributed for up to 7 days after the conversion, and Google's modelled key events page says attributed channel data can update for up to 12 days. Treat the most recent 12 days as provisional.
- Google Ads: set per conversion action. Read the status from `conversion_action.attribution_model_settings.data_driven_model_status` (values include `AVAILABLE`, `STALE`, `EXPIRED`, `NEVER_GENERATED`). Eligibility guidance conflicts between two help pages; see `platform-attribution.md`.
- Meta: Meta offers an incremental attribution setting. It is Meta's model, not an experiment on your decision. Record in the inventory whether it is on for the ad sets in scope.
- When GA4 data driven fits a cross-channel question: only when the outcome is a GA4 web key event and every in-scope channel reaches the site through tagged clicks. It never sees Meta or LinkedIn impressions or views, so for a mix with material view-through or offline influence, use a rule-based warehouse view under a contract and keep GA4 data driven as one reference.
- What you can do with a data-driven result: compare it with transparent rule-based views on the same outcome population, and treat large disagreements as hypotheses. What you cannot do: audit its weights, reproduce it in the warehouse, or call it causal evidence for a budget move.

## Where each model is available today

Checked 2026-10-17. Re-check before stating.

- GA4 reporting attribution model: paid and organic data driven, paid and organic last click, Google paid channels last click. First click, linear, time decay and position based were removed in November 2023. The Admin API v1alpha `AttributionSettings` resource lists the same three as `PAID_AND_ORGANIC_CHANNELS_DATA_DRIVEN`, `PAID_AND_ORGANIC_CHANNELS_LAST_CLICK` and `GOOGLE_PAID_CHANNELS_LAST_CLICK`.
- Google Ads conversion actions: data driven and last click. Google says first click, linear, time decay and position based are no longer supported and actions that used them were upgraded to data driven. The API enum still lists the legacy values; if a read returns one, confirm the setting in the Google Ads interface before reporting it.
- Meta: attribution is set as windows (click-through, view-through, engage-through) plus the incremental attribution option. There are no position or decay models.
- LinkedIn: last touch for most conversion types, either each ad set or the last ad set.
- HubSpot attribution reports: first interaction, last interaction, linear, U-shaped, W-shaped, full path, time decay, J-shaped and inverse J-shaped, with some limited to deal create or revenue reports.
- Salesforce: Customizable Campaign Influence. Primary Campaign Source is the default model (100% to the campaign in the opportunity's Primary Campaign Source field, auto-associated). First touch, last touch and even distribution are for orgs using Account Engagement, turned on with the Additional Campaign Influence Models setting. Auto-association needs a campaign member with a contact role on an open opportunity and stops when the opportunity closes. Read 2026-10-20; confirm the enabled models in the org's Setup before stating them.
- Warehouse: any rule-based model, provided the contract in `mta-contract.md` is written first.

## Implementation choices that change the numbers

Write each one into the contract. Two analysts making different silent choices will produce different "linear" reports from the same data.

- Eligible interactions: clicks only, or clicks plus impressions, engaged views, email opens, sales activities. Opens and impressions inflate the touch count of whatever channel logs them.
- Direct handling: excluded, included, or included only when the path is all direct.
- Collapse rule: how many touches one session, one day or one campaign can contribute.
- Per interaction or per channel credit.
- Lookback: from the outcome back N days, and whether a touch on day N counts.
- Short paths: explicit rules for one and two touches.
- Touch ordering: timestamp precision per source, a tie rule (for example source priority, then touch ID) and where date-only CRM touches sit in the day. Without it, first, last and position-based credit changes between runs.
- Rounding: store unrounded weights and values, round only for display, and assign any display residual to a stated touch.
- Half-life and its unit.
- Unattributed outcomes: kept as an explicit row with count and value.
- Identity: which links between anonymous and known IDs are allowed, and whether account membership is as of the touch date or today.
