Guide

The ecommerce attribution playbook

A practical guide to measuring what your ads actually earn: why the numbers never match, what first-party attribution fixes, and how to set it up without a data team.

Why Google, Meta, and your bank never agree

Every platform counts conversions in its own window, with its own credit rules, using a pixel the browser is actively fighting. Google claims a sale on the click date with data-driven fractional credit; Meta claims the same sale on a seven-day view; your store records it on the day the money landed. Three systems, three answers, none of them wrong exactly, and none of them the truth.

  • Different attribution windows count the same sale on different days
  • Each platform takes 100% credit for conversions it assisted
  • Browser pixels miss a third or more of orders to ad blockers and cookie loss
  • Refunds are rarely reversed, so ROAS reads high

The fix

Measure from your store, not the browser

The only source of truth for a sale is the order in your store. First-party attribution starts there: capture the ad click on your own domain, tie it to the order server-side, and report that conversion back to the platforms yourself. Now the number the algorithm optimises on is the number that actually happened.

1. Capture the click first-party

A pixel on your own domain records the click id the moment a visitor lands, where ad blockers and Safari cannot strip it.

2. Join the order server-side

The order arrives straight from Shopify or WooCommerce and is matched to the session that earned it, not the browser that may have dropped the thank-you page.

3. Push the conversion back

Report the recovered sale to Google and Meta from your server, with the click id attached, so Smart Bidding sees your whole revenue.

4. Keep it honest

Reverse refunds against the right campaign and keep first and last touch apart, so retargeting cannot claim credit for the whole funnel.

Before you switch anything

Reconcile in shadow mode first

Do not trust a new attribution number on faith. Run it in shadow mode: let the system build the conversions it would send without sending them, then compare against your ad account and your store. When you understand exactly why the numbers differ, turn the push on. Attribution is a trust-me category, so insist on being able to check the work.

What good looks like

When it is working, you have one number per channel you can defend, refund-adjusted ROAS you act on, a clear split between the campaigns that carry themselves and the ones that bleed budget, and an ad account whose bidding is fed by every order rather than the fraction the browser reported.

Put the playbook to work.

Connect a store, run Trakt in shadow mode, and see the gap between your pixel and your real orders.