Skip to content

Position-based attribution from a GA4 export, step by step

GA4 and Google Ads dropped position-based attribution, and Shopify does not offer it. Build it from GA4's Attribution paths export: 40% of each path's revenue to the first and last touch, 20% across the middle, totalled by channel.

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free attribution window calculator.

Position-based attribution is usually a spreadsheet job now: GA4 and Google Ads dropped the model in 2023, and Shopify does not offer it. Export GA4's Attribution paths report, give each path's first and last touch 40% of its revenue, share 20% across the middle and total by channel.

Step by step

Pick the last full month and use the same dates in every tool. Changing GA4's attribution settings needs the Marketer role or above on the property.

  1. Write your rules at the top of the sheet. Google's legacy help defines the model as 40% to the first interaction, 40% to the last and 20% spread evenly across the middle. Its pages give no rule for a path of two touches, so choose one. Half each is the plain choice, since there is no middle to pay. Then decide whether a direct visit counts as a touch, and write that down too. Menu path: none yet, just the first rows of a blank sheet.
  2. Check the lookback window, because it decides who comes first. Google says this window sets how far back in time a touchpoint is eligible for credit. For purchases it defaults to 90 days, and you can choose 30 or 60 days instead. A shorter window drops older touches, so the opener's share goes to whatever came next. Changes apply going forward only. Menu path: Admin > Data display > Events > Attribution settings > Key event lookback window.
  3. Export the purchase paths. In GA4, click Advertising, then Attribution paths under Attribution. Google's page for the report itself names it Key event attribution paths, under Key events; your menu will show one of the two names. Select the purchase key event and your month, and keep the default Primary channel group dimension. Click Share this report in the top right and download the data. Menu path: Advertising > Attribution > Attribution paths > Share this report.
  4. Split every path into opener, middle and closer. Each row of the file is one path, with its Purchase revenue and its Touchpoints to key event. Put each touch of the path in a cell of its own. The first cell is the opener, the last is the closer, and everything between is middle. If a row's cell count differs from its Touchpoints to key event, check how that row writes repeated channels before you go on. Menu path: none, this happens in the downloaded file.
  5. Apply the weights row by row. A row with 1 touch gives all of its revenue to that touch. A row with 2 touches gives half to each, under your rule from step 1. From 3 touches up, the opener and the closer each take 40% of the row's revenue, and the middle touches split 20% equally. A channel that sits in the middle twice takes two middle shares. Menu path: none, this happens in the downloaded file.
  6. Total by channel and balance the sheet. Sum each channel's shares with a pivot table or a sum column. The channel totals must add up to the file's purchase revenue, to the cent. If they do not, the checks below find the usual culprits. Menu path: none, this happens in the downloaded file.
  7. Bracket it with Shopify's first and last click. In your Shopify admin, go to Analytics > Reports, click the Category filter, choose Marketing and open Performance by referring channel. An Attribution menu appears in the configuration panel when a report has a sales metric and a marketing dimension. Include First click and Last click, then set them beside your sheet. Menu path: Shopify admin > Analytics > Reports > Category: Marketing > Performance by referring channel > Attribution.
  8. Hold your weights up to GA4's own model. Back in Attribution paths, set the chart's attribution model drop-down to data-driven. The chart cuts each path into early, mid and late touchpoints: roughly the first quarter, the middle half and the last quarter of its touches. If data-driven credits a channel mostly in Mid, your fixed middle share probably underpays it. Menu path: Advertising > Attribution > Attribution paths > attribution model drop-down above the chart.

A worked example

For illustration, say your file holds three rows for last month, worth €10,000 in all. In this worked example, row one runs Paid Social, Email, Email, Direct, with €5,000 over 4 touches. Say the second row is Organic Search, then Paid Search, with €2,000 over 2 touches. Say the third row is Direct alone, with €3,000 on 1 touch.

If you count direct visits as touches, row one gives Paid Social and Direct €2,000 each. In this worked example, the two Email touches split the middle €1,000, so Email takes €1,000. If the second row splits in half, Organic Search and Paid Search get €1,000 each. If a row has one touch, like row three, it keeps all €3,000 on Direct.

The illustrative totals are Direct €5,000, Paid Social €2,000, and Email, Organic Search and Paid Search €1,000 each. In this worked example that adds back to €10,000, so the sheet balances.

Now drop direct visits from mixed paths, as GA4's own models do. For illustration, row one becomes Paid Social, Email, Email: Paid Social keeps €2,000, the closing Email takes €2,000 and the middle Email €1,000. In this worked example, Email climbs from €1,000 to €3,000 and Direct falls from €5,000 to €3,000. Same file, same weights, and one rule about Direct moved a fifth of the money.

Step 7's bracket shows the other blind spot. Run first click and last click on these rows, direct visits counted, and Email gets nothing in either. It never opens or closes a path. Position-based still pays it for the middle. That gap is the whole point of the U, so look at it before you trust the sheet.

Now one store's real export, to see where the rules bite. On its Journeys sheet, journeys with 1 touch are 14 distinct paths holding 79.5% of revenue, so no weighting ever reaches that money. On the Journeys sheet, journeys with 2 to 3 touches are 296 distinct paths with 12.2% of revenue. That row is where your two-touch rule earns its keep. Give two-touch rows the long-path weights and a fifth of each one vanishes from your totals. Counts on the Journeys sheet are distinct path sequences, never purchases.

What should you check when the sheet looks wrong?

  • The totals come up short. You probably gave two-touch rows the long-path weights, so a fifth of each vanished into a middle that does not exist. Or you split the middle share across every touch instead of only the middle ones.
  • Direct towers over everything. Your rule counts direct visits, as Shopify's First click and Last click do. GA4's models give direct visits credit only when the whole path is direct, so expect its numbers to differ.
  • The opener is nearly always Organic Search or Direct. A buyer who heard about you elsewhere and then searched your name opens the path with that search. Read the opener as first recorded, not first heard.
  • Shopify and your sheet disagree. Shopify resets a visitor's first interaction referrer if they buy nothing within 30 days of a session. After an order, it treats the next referrer as a new first interaction. Set the channels' shares of the total side by side, not the euros.
  • Long journeys look thin. Touches older than the lookback window drop out of a path, and the report displays paths up to 20 touchpoints long. Check both before you blame the formulas.

What to do this week

  1. Run the sheet on last month's purchases. Work through steps 3 to 6. Pass: the channel totals match the file's purchase revenue. Fail: they come up short, so check the two-touch rows and the middle split first.
  2. Turn the dial on the weights. Copy the sheet and re-run it with other weights, for example 30% to each end and 40% to the middle. Pass: your top three channels keep their order, so the decision does not hang on the weights. Fail: the order changes, so the weights are choosing for you, and no budget should move on them alone.
  3. Set your sheet beside data-driven. In GA4, click Advertising, then Attribution models under Attribution. Use the drop-down in an Attribution model (non-direct) column to show data-driven for the same month. Pass: it agrees with your sheet on your top two channels. Fail: it disagrees, so run a holdout test on the channel in dispute before you move money.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: Overview of Attribution modeling in MCF (legacy) (Google); About the default MCF attribution models (legacy) (Google); About the MCF Model Comparison Tool (legacy) (Google); First click, linear, time decay, and position-based attribution models are going away (Google); Select attribution settings (Google); Get started with attribution (Google); Key events attribution paths report (Google); Key event attribution models report (Google); Marketing reports (Shopify)

Frequently asked questions

  • How do I handle a path with only two touches?
    Give each touch half. Google's legacy definition pays the first and last interaction 40% each and spreads 20% across the middle, and a two-touch path has no middle. Whatever rule you pick, write it at the top of the sheet and use it on every row.
  • Can I change the 40/40/20 weights in my own sheet?
    Yes, they are inputs, not facts. Google's legacy help called 40/40/20 one common scenario, and its old tool let users build custom models on a Position Based baseline. Try a second set of weights and trust the result only if your channel order survives.
  • Why does my position-based sheet disagree with Shopify?
    Because the two count journeys differently. Shopify resets a visitor's first interaction referrer if they buy nothing within 30 days of a session, while GA4's paths follow its own lookback window. Compare each channel's share of the total rather than the money.

Go deeper: Incrementality testing, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.