How it works
From a visit on your site to revenue you can trust.
Eight steps, run the same way for every store. Here is what each one does, and what it means for the numbers you make budget calls on.
Shopify
Meta
Google Ads
TikTok
YouTube
Instagram
Snapchat
Pinterest
Microsoft Advertising
Amazon Ads
AppLovin
Reddit
LinkedIn
X
The Trade Desk
Vibe
MNTN
OpenAI Ads
Klaviyo
Every figure traces back to a visit, an order or a platform's spend.
Open any order in the dashboard and you can see the ads and visits behind it, and the credit each one got.
Step by step
Eight steps from visit to report.
1. The pixel records visits
POST https://mta.growthdept.ai/e { "key": "pk_...", "src": "web_pixel", "consent": "y", "events": [{ "id": "5f0c...", "type": "page_viewed", "ts": 1762437722000, "vid": "shopify client id", "url": "https://store.example/socks?utm_source=meta&fbclid=...", "ref": "https://l.facebook.com/" }] }A small pixel on your Shopify store, and a short script for landing pages you host elsewhere, record each visit from your own domain: the page, the site it came from, and the ad click or campaign tag that brought the shopper.
Because it runs on your site, it sees every channel the same way, whichever platform paid for the click.
What it means for your numbers
- Visits are recorded only when the shopper's consent allows it
- Bots and repeated events are dropped on arrival
- No IP address, email, name or device fingerprint is kept
2. Visits become sessions
One visitor's day, in sessions
- 09:02Lands from a Meta adSession 1
- 09:05Views a productSession 1
- 09:11Adds to cartSession 1
- 13:40Returns by typing the addressSession 2
- 13:52Clicks an email linkSession 3
Session 2 starts after 30 quiet minutes. Session 3 starts because the email link carries new campaign tags. Three sessions, three touches.
Illustrative. Moving between pages of your site is not a new touch.
Page views are grouped into visits. Thirty quiet minutes, or a new ad click or campaign tag, starts a new one.
Each visit counts as one touch with one source, however many pages the shopper reads.
What it means for your numbers
- A shopper who browses for an hour is one touch, not twenty
- An email click mid-visit counts as its own touch
- A touch means the same thing for every channel
3. Sessions are tied to orders
Links from a visit to an order
- Landing page visit via first-party visitor id
- Store visit via Shopify client id
- Checkout completed via the order
- Order via customer id, hashed with your brand's key
- Earlier orders via the visits behind them
Every link stays inside one brand. No IP matching, no fingerprints, no matching across brands.
Visits are linked to the order they led to, inside your store's data only: from the landing page into the store, from the store to checkout, and from the order to a coded customer id that only your store can match.
That last link finds the visits behind a customer's earlier orders, so a returning buyer's journey isn't cut short.
What it means for your numbers
- No matching across brands, by IP address or by device fingerprint
- A shopper can never be linked between two stores
- Returning customers keep their earlier touches
4. Orders arrive from your store
How orders reach MTA
- WebhookOrder createdCredited under every model you use
- WebhookRefundRefunds column; revenue unchanged
- Hourly pullOrder the webhook missedFilled in
- WebhookTest or $0 orderKept, left out of credit
Shopify connects directly. Other stores send orders to the orders API.
Shopify sends each order, change, cancellation and refund to MTA, and a regular check catches anything missed. Stores not on Shopify can send orders through the API.
Revenue is what the customer paid for products, shipping and tax, after discounts. Refunds are shown on their own.
What it means for your numbers
- Test orders and $0 orders stay out of attribution
- Only the money is stored: no names, emails or addresses
- Days follow your store's time zone
5. Spend arrives from each platform
Spend, converted once
- Meta AdsAd, day and hourBilled in the ad account's currency
- Google AdsAd, day and hourPerformance Max at campaign level
- TikTok AdsAd, day and hourBilled in the ad account's currency
- Spend API or uploadAny platform, by daySent in that platform's currency
Into your store's currency, on arrival1 rate per dayEach row keeps the platform's own amount and the converted one, with the day's ECB rate.
Spend, impressions and clicks arrive from each connected ad platform for every ad, along with the campaign and ad set it belongs to. Platforms without a connector can send spend by API or spreadsheet.
Spend in another currency is converted to yours once, at that day's European Central Bank rate.
What it means for your numbers
- Days a platform restates are replaced, not added
- ROAS never divides one currency by another
- Connections only read: MTA never changes your ad accounts
6. Each order is credited under every model
One order, five click models
Touch Clicks only First touch Last touch Last non-direct Linear Meta ad click 50% 100% 0% 0% 25% TikTok ad click 50% 0% 0% 0% 25% Google brand search 0% 0% 0% 100% 25% Direct visit 0% 0% 100% 0% 25% Illustrative journey. Each column adds up to 100% of the order.
Each new or changed order is shared out under every attribution model you have switched on, and the last 90 days are recalculated every night.
However an order is shared, its credit adds up to exactly one order and its revenue.
What it means for your numbers
- Sales with no tracked ad go to an Unattributed row
- Every model adds up to the same store total
- Run it twice on the same data and nothing changes
7. Windows and accounting views are applied
Same order, two ways to date it
Accrual performance
On the day of the click: judge the week's ads by what they went on to sell.
Cash snapshot
On the day of the order: adds up to what Shopify recorded that day.
Illustrative: an ad click on Monday, the order on Thursday.
A window sets how long an ad keeps credit: 1, 3, 7, 14, 30, 60 or 90 days after the click, or for good. A shorter window never shows more than a longer one.
Accrual performance puts revenue on the day of the click, to judge which days' ads earned it. Cash snapshot puts it on the day of the order, and adds up to Shopify.
What it means for your numbers
- Accrual tells you which days' ads earned the revenue
- Cash tells you what landed on which day
- Recent accrual days rise as late orders come in
8. Reports and exports read one table
One table behind every report
date level model window accounting spend revenue Nov 3 campaign Clicks only 7 day Accrual $412.10 $1,288.40 Nov 3 campaign Linear 7 day Accrual $412.10 $1,104.95 Nov 3 campaign Clicks only lifetime Cash $412.10 $1,342.00 Illustrative rows. Spend is the same on every row; only the credit changes.
All of this lands in one table, with each day's spend on the same row as the revenue it earned.
The dashboard, the export API and the Growth Dept warehouse loader all read that table, so the same question gets the same answer wherever you ask it.
What it means for your numbers
- A dashboard figure and an exported figure agree
- Ratios come from summed totals, never averaged
- Saved views and shared links open on the same numbers
The difference
MTA beside each platform's own reporting.
Ads Manager and its peers report on their own ads, with their own pixel and their own rules. MTA reports on your store.
| What you get | Growth Dept MTA | A platform's own reports |
|---|---|---|
| Every ad platform in one view | ||
| Each order counted once across platforms | ||
| Revenue from your own store's orders | ||
| Email, SMS, organic and direct visits credited too | ||
| Seven attribution models to compare side by side | ||
| Totals that add up to your Shopify revenue | ||
| View-through credit for video and reach ads |
Seven models
How each model shares a sale.
| Model | Who gets the credit | Counts ad views |
|---|---|---|
| Clicks only | An equal share for each touch that creates demand, such as prospecting ads, non-brand search, social and referrals. With none of those, brand search, email, SMS and retargeting share it; direct visits get it only when they are all there is. | No |
| Clicks + Deterministic Views | Clicks only, plus credit for ads the platforms or a partner recorded as seen, taken only from sales that went to unpaid touches. | Recorded views |
| Clicks + Modeled Views | Clicks only, plus credit for ads estimated from each platform's impressions, fitted to your store and taken only from sales that went to unpaid touches. | Estimated views |
| First touch | All of the order to the first touch. | No |
| Last touch | All of the order to the last touch, including a direct visit. | No |
| Last non-direct touch | All of the order to the last touch that wasn't a direct visit. | No |
| Linear | An equal share for every touch. | No |
Ask it
Answers to the questions you ask every week.
Each card opens the report that answers it.
Would this campaign still look good if we judged it differently?
See the same channels and dates under every attribution model, side by side.
Model comparisonOpen itDid this week's ads earn their spend, or is revenue just landing this week?
One view dates revenue to the ad click, to judge the ads. The other dates it to the order and matches Shopify.
Accounting viewsOpen itWhat did this buyer see before they ordered?
Every order lists the ads and visits that led to it, in order, and the credit each one got.
OrdersOpen itAre our video ads behind sales that show up as direct traffic?
Switch on a views model and see which ads earn credit from people who watched and bought later.
Clicks + viewsOpen itHow many touches does a purchase usually take?
The most common routes to a purchase, with the orders and revenue that followed each.
Customer pathsOpen itCan we put these numbers next to the rest of our data?
Pull any report as CSV files into your own warehouse, on your schedule.
Export APIOpen it
Find out which ads really sell.
Book a 45-minute call with the Growth Dept team. We look at how you measure sales today and show you what MTA would add.