Attribution Model Calculator

One journey through five attribution models side by side, so the swing between last-click and first-click is visible before anybody picks a favourite.

Enable JavaScript to customise; default output below.

One touch a line, oldest first, as "channel: days before the conversion". The days are only used by the time-decay model.

Optional. With it the credit is shown in money as well as as a share.

A touch one half life earlier gets half the credit. Set it shorter than your sales cycle, not longer.

Live preview attribution.txt
Touches                     4
Channels                    4
Conversion value            $480.00

The journey
  1. Google Ads             21 days before
  2. Blog post              14 days before
  3. Email                  3 days before
  4. Brand search           0 days before

last-click                  all credit to the last touch
  Google Ads                $0.00  ·  0%
  Blog post                 $0.00  ·  0%
  Email                     $0.00  ·  0%
  Brand search              $480.00  ·  100%

first-click                 all credit to the first touch
  Google Ads                $480.00  ·  100%
  Blog post                 $0.00  ·  0%
  Email                     $0.00  ·  0%
  Brand search              $0.00  ·  0%

linear                      split evenly across every touch
  Google Ads                $120.00  ·  25%
  Blog post                 $120.00  ·  25%
  Email                     $120.00  ·  25%
  Brand search              $120.00  ·  25%

time-decay                  weighted towards the touches nearest the conversion
  Google Ads                $28.33  ·  5.9%
  Blog post                 $56.66  ·  11.8%
  Email                     $168.38  ·  35.1%
  Brand search              $226.63  ·  47.2%

position-based              40% first, 40% last, 20% split across the middle
  Google Ads                $192.00  ·  40%
  Blog post                 $48.00  ·  10%
  Email                     $48.00  ·  10%
  Brand search              $192.00  ·  40%

How much the model decides
  Google Ads                0% to 100%, a swing of $480.00
  Blog post                 0% to 25%, a swing of $120.00
  Email                     0% to 35.1%, a swing of $168.38
  Brand search              0% to 100%, a swing of $480.00

Every model above describes the same single conversion. "Google Ads"
takes between 0% and 100% of the credit depending on which one you pick,
a swing of $480.00 on one sale. None of them is a measurement: they are
conventions for dividing up credit for something that already happened.

Last-click is the default in most reporting and it systematically
flatters the bottom of the funnel. Brand search, retargeting and email
get credit for conversions that awareness channels created, which is how
a channel that only reaches people who already decided comes to look
like the best performer.

First-click has the mirror problem: it gives everything to the touch
that started the journey and nothing to whatever closed it, so it
flatters discovery and undervalues the work of converting.

Linear is the most honest about its own ignorance. It makes no claim
about which touch mattered, which is often the right posture and is
rarely the answer people want.

Time-decay with a 7 day half life assumes influence fades, which it
does, and that it fades exponentially, which is an assumption. Set the
half life shorter than your sales cycle: a seven-day half life on a
six-month enterprise cycle throws away the touches that did the
persuading.

Position-based, 40/20/40, hard-codes the belief that the first and last
touches matter most. It is a reasonable prior and it is a prior, not a
finding.

None of these is incrementality. The only way to know whether a channel
caused conversions is to turn it off for a random share of the audience
and measure the difference, which is a geo holdout or a conversion lift
test. Attribution splits credit; an experiment establishes cause.

Attribution breaks before the model does. Cookie lifetimes, cross-device
journeys, consent refusals, in-app browsers, dark social and people
typing your name into a search box all mean the journey you can see is
not the journey that happened, and every model above is applied to that
partial record.

Output is valid and updates as you type.

One customer. Four touches: a Google ad three weeks ago, a blog post two weeks ago, an email three days ago, and a brand search on the day they bought. One $480 order.

Under last-click, Google Ads earned nothing. Under first-click, it earned all $480. Nothing about the customer changed between those two sentences; only the accounting did.

That is what attribution models are: conventions for dividing credit for something that already happened. Running five of them at once makes the size of the convention visible, which is the point. A channel that looks like your best performer under one model and your worst under another has not been measured at all.

How to use

  1. Write the journey, one touch a line, oldest first: Google Ads: 21 means a touch 21 days before the conversion.
  2. Add the conversion value to see the credit in money.
  3. Set the time-decay half life to something shorter than your sales cycle.

Example

last-click                  all credit to the last touch
  Google Ads                $0.00  ·  0%
  Brand search              $480.00  ·  100%

first-click                 all credit to the first touch
  Google Ads                $480.00  ·  100%
  Brand search              $0.00  ·  0%

linear                      split evenly across every touch
  Google Ads                $120.00  ·  25%
  Blog post                 $120.00  ·  25%
  Email                     $120.00  ·  25%
  Brand search              $120.00  ·  25%

time-decay                  weighted towards the touches nearest the conversion
  Google Ads                $28.33  ·  5.9%
  Blog post                 $56.66  ·  11.8%
  Email                     $168.38  ·  35.1%
  Brand search              $226.63  ·  47.2%

position-based              40% first, 40% last, 20% split across the middle
  Google Ads                $192.00  ·  40%
  Blog post                 $48.00  ·  10%
  Email                     $48.00  ·  10%
  Brand search              $192.00  ·  40%

How much the model decides
  Google Ads                0% to 100%, a swing of $480.00
  Blog post                 0% to 25%, a swing of $120.00
  Email                     0% to 35.1%, a swing of $168.38
  Brand search              0% to 100%, a swing of $480.00

A $480 swing on one order, from a choice nobody wrote down.

Pitfalls

Last-click flatters the bottom of the funnel. Brand search, retargeting and email get the credit for conversions that awareness created. A channel that only reaches people who have already decided will always look efficient, and cutting the channels that created the demand is the predictable consequence.

First-click has the mirror problem. It gives everything to whatever started the journey and nothing to whatever closed it, which flatters discovery and makes conversion work look worthless.

Time-decay’s half life is doing the work. A seven-day half life on a six-month enterprise sales cycle discards the touches that did the persuading. Set it against your own cycle length and be aware you are choosing the answer when you set it.

Position-based is a prior, not a finding. 40/20/40 encodes the belief that the ends matter most. That is a reasonable belief and it is not evidence.

None of this is incrementality. Attribution divides credit; only an experiment establishes cause. Turn a channel off for a random share of the audience, or hold out a set of regions, and measure the difference in total conversions. That is the only method that answers “would this have happened anyway”.

GA4’s data-driven model is not a way out. It allocates credit using a model you cannot inspect, trained on your data, and it changes when the data changes. It is often more reasonable than last-click and it is still an allocation rather than a measurement.

Attribution breaks before the model does. Cookie lifetimes of seven days or less, cross-device journeys, consent refusals, in-app browsers, dark social and people typing your name into a search box all mean the journey you can see is not the journey that happened. Every model is applied to that partial record.

Compatibility

Arithmetic in the browser: nothing is uploaded and nothing is stored.

All five models are computed from the same journey every time, so the comparison is arithmetic rather than a claim. The weights sum to exactly one conversion under each model, which is checked in the test suite: credit is divided, never created.

Time-decay uses 2^(−days/half life), so a touch one half life earlier is worth half as much, and the result is normalised so the total is still one conversion. The test suite checks that a touch three half lives out is worth an eighth of the touch at day zero.

A channel appearing more than once in a journey has its credit added up, which is how a retargeting channel that appears four times comes to dominate a linear model. Position-based with two touches splits evenly, because there is no middle to share the 20 percent.

Frequently asked questions

Which attribution model should I use?
For reporting, one you do not change: consistency matters more than the choice, and switching model mid-year creates a trend that is entirely artificial. For decisions about where the next pound goes, use an experiment rather than any model.
Why do my channel reports add up to more than my orders?
Because each platform claims the conversions it can see, with its own lookback window, and the same order is claimed by several. Compare the total orders in your own system against the sum of the platform claims, and treat the difference as the size of the double counting.
What is a good lookback window?
Long enough to cover your actual sales cycle and no longer. A 90-day window on a same-day purchase credits touches that cannot have mattered; a 7-day window on a three-month cycle credits almost nothing correctly.
Is linear attribution lazy?
It is the most honest about not knowing which touch mattered, which is a defensible position. It is lazy when it is chosen to avoid an argument rather than because the evidence is genuinely absent.
How do I run an incrementality test?
Split by geography or by a random audience hold-out, keep everything else the same, run it long enough to cover the sales cycle, and compare total conversions rather than attributed ones. The A/B significance calculator on this site handles the arithmetic once you have the two numbers.
Weekly drops

New tools, when there are new tools

One email when something worth using ships. No schedule to fill, so no filler.

Your address goes nowhere else, and one click unsubscribes.