# Attribution reports

> How to read Ordinary's attribution report, switch between models, and interpret the UTM breakdown to understand which channels drive revenue.

Source: https://help.tryordinary.com/features/attribution

---

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"?](https://help.tryordinary.com/troubleshooting/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](https://help.tryordinary.com/concepts/attribution-models)
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=paid` shows
  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](https://help.tryordinary.com/integrations/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:

1. **Sessions** — unique visitors to your storefront.
2. **Product views** — sessions that viewed at least one product.
3. **Add to cart** — sessions that added at least one product to cart.
4. **Checkout started** — sessions that reached the checkout page.
5. **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](https://help.tryordinary.com/troubleshooting/attribution-mismatch).
- **Partial data badge showing** —
  see [Why do I see "partial data"?](https://help.tryordinary.com/troubleshooting/partial-data).
- **Pixel showing 0 sessions** — check the pixel is Connected in
  Shopify admin → Settings → Customer events → App pixels. See
  [Pixel says "Disconnected"](https://help.tryordinary.com/troubleshooting/pixel-disconnected).
