Attribution reports
How to read Ordinary's attribution report, switch between models, and interpret the UTM breakdown to understand which channels drive revenue.
Attribution reports
The attribution report answers one question: which channels and campaigns actually drive your revenue? Open it from the left nav under Reports → Attribution.
Choose your date range
The header has a date picker. Pick any start and end date. Default is the last 30 days.
Your plan determines how far back you can look:
- Free: 30 days maximum.
- Starter, Advanced, Enterprise: unlimited. All history back to when you installed Ordinary.
If your date range reaches further back than your plan allows, Ordinary silently clamps it and shows a partial data badge next to the affected metrics.
See Why do I see “partial data”? for the full explanation.
Pick an attribution model
The model dropdown sits next to the date range. Your options:
- Last-click (default, all plans) — credit the last touch before the order. Best for measuring channels that close sales (paid search, retargeting).
- First-click (all plans) — credit the first touch the customer made. Best for measuring channels that introduce new customers (organic content, influencer).
- Linear (Starter and higher) — spread credit evenly across every touchpoint. Best when you have many touches per order and don’t want to over-value any one of them.
- Time-decay (Starter and higher) — weight recent touches higher than older ones. Best for fast-moving categories where older sessions are less relevant.
On Free, the Linear and Time-decay options appear locked in the model selector with an “Upgrade for multi-touch” hint — First-click and Last-click stay fully available. Upgrade any time from Settings → Billing to unlock the multi-touch models.
See Attribution models explained for worked examples of each.
Read the UTM breakdown
The table below the funnel shows revenue broken down by UTM source, medium, and campaign. Click a column header to sort.
Rows reflect the model you’ve selected:
- With Last-click, a row for
source=facebook, medium=paidshows revenue from orders where the last pre-purchase touch had those UTMs. - With Linear, the same row shows the sum of fractional credit across orders that had any Facebook paid touch, weighted evenly across all their touches.
Rows without any UTM parameters fall under (direct/none). This usually means customers who came in without a tracked source — direct URL visits, app opens, or email clients that strip UTMs.
Custom channel taxonomy
If you’ve configured custom mappings in
Settings → Channel Taxonomy, Ordinary uses your canonical names in
the breakdown instead of raw UTM values. So if you mapped
fb → facebook and facebook_ads → facebook, both raw sources
appear as facebook in the report.
See Custom channel taxonomy (Starter and higher).
Revenue is net of refunds
All revenue figures in the attribution report — last-click, multi-touch weighted, channel breakdown, and the funnel — are net of refunds. A $100 order that was later refunded $20 contributes $80 to its attributed channel’s revenue. Refunds reduce the original-period revenue (the period the purchase was placed in), not the period the refund was issued — this matches Shopify’s own Sales report methodology and ensures the ROAS figure reflects realized payback.
Cleaner Meta attribution with the URL-tag template
Meta’s auto-generated UTMs aren’t always reliable — utm_campaign
in particular can collapse to the campaign objective rather than
the campaign name, and individual ad / ad-set identity gets lost
on the way to the storefront. To fix this at the source, the
Meta CAPI card on Settings shows a recommended URL-tag
template that includes both the standard utm_* parameters
and direct identifiers for the campaign, ad set, and ad
(fb_campaign_id={{campaign.id}} and friends).
When a merchant pastes this template into Meta’s “URL parameters” field on each ad — or applies it at the ad-account level — every click that lands on the storefront carries enough information for Ordinary to attribute the resulting order back to the exact ad, even if the visitor’s UTMs get mangled by a meta-redirect or a mobile-browser stripping. The Meta CAPI card surfaces a per-token audit so you can see how much of your ad inventory currently matches the template.
Early-funnel session stitching
Customers don’t always buy in the same session they first land in. Ordinary stitches a shopper’s first session to their later converting session via a stable browser-side identifier the pixel emits on every event — so a shopper who clicks a Meta ad on Tuesday, browses, leaves, and returns on Friday to buy is still credited to the original Meta touch instead of falling into the “Direct” bucket on Friday. This stitch is automatic and merchants don’t need to configure anything.
Orders from blocked-browser shoppers
For a small slice of shoppers (typically Brave with default shields, Safari with strict tracking protection, iOS content blockers), our pixel doesn’t run on their device. Their orders still arrive — Shopify sends them to us via a server-side webhook that browser blocking doesn’t affect — and channel attribution for these orders is derived from Shopify’s own customer-journey data (the same source Shopify uses for its native attribution reporting in the Shopify Admin). These orders show up in your channel breakdowns alongside pixel-tracked orders.
The funnel at the top
Above the UTM breakdown, the funnel shows your 5-step conversion path:
- Sessions — unique visitors to your storefront.
- Product views — sessions that viewed at least one product.
- Add to cart — sessions that added at least one product to cart.
- Checkout started — sessions that reached the checkout page.
- Orders — sessions that completed an order.
Hover each bar for the drop-off rate from the previous step.
Subscription reorders (when a Recharge subscription auto-renews) are split out as a lighter-blue segment on the Orders bar so you can see how much revenue is renewal vs. new-acquisition. This split is available on Starter and higher.
Date coverage nuances
Attribution relies on our first-party pixel being live. The very first day after install may show 0 sessions even if you have orders — the pixel has to observe a session to attribute it. By day two, the numbers align.
If you installed Ordinary mid-month and asked for the whole month, expect sessions/ATC to be lower than orders for the pre-install days.
Click-through vs view-through (the conversion gap)
Ad platforms count two kinds of conversions, and they aren’t the same:
- Click-through — someone clicked your ad and bought. Ordinary confirms these against your own store, so the campaigns you see driving revenue are ones you can verify.
- View-through — someone saw your ad, didn’t click, and bought later. Only the platform can see these, so Ordinary reports the platform’s figure.
On Campaigns → Meta and on the Meta scorecard on your home dashboard, the Click-through / View-through toggle switches between the two: Click-through is what your store can verify; View-through adds the platform’s view-attributed sales on top. View-through is the default, because it’s the figure the platforms and most agencies quote.
They almost never match — and the gap is where the real decision lives. View-through might be genuinely driving demand, or it might be sales you’d have made anyway. The only way to know is to test it, and Ordinary measures the true incremental lift of your spend — so “is view-through worth it?” stops being a guess.
When you click into a campaign, the conversion-gap chart at the top of the campaign detail page plots the same two numbers day-by-day, so you can watch the trend over time.
Cohort and lifetime-value view (per campaign)
Below the conversion-gap chart, each Meta campaign now has a cohort + LTV view that groups customers by the month they first purchased and tracks their cumulative revenue forward. Useful for answering “did this campaign acquire customers who come back, or one-and-done buyers?” without leaving the campaign detail.
Troubleshooting
- Attribution numbers don’t match Shopify’s totals — see Attribution numbers don’t match Shopify.
- Partial data badge showing — see Why do I see “partial data”?.
- Pixel showing 0 sessions — check the pixel is Connected in Shopify admin → Settings → Customer events → App pixels. See Pixel says “Disconnected”.