Install free

Blog

Email attribution for Shopify: how to actually know what your campaigns made

attribution · playbook · analytics
Laptop screen displaying analytical charts and graphs — the kind of report that closes the loop between campaign sends and revenue.
Photo via Unsplash

TL;DR. For Shopify stores under $1M ARR, last-touch attribution with a 5-day click window and 1-day open window is the right model 99% of the time. It maps cleanly to Shopify’s order data, doesn’t require multi-touch math, and matches what Klaviyo, Omnisend, and Kovyo use by default. Set four UTM parameters on every send (utm_source, utm_medium, utm_campaign, utm_content) and the loop closes itself in Shopify Admin → Analytics → Reports → Sales attributed to marketing.


The most common email-marketing question that doesn’t get answered honestly: what did this campaign actually make me? Stores send weekly newsletters, watch the open rate, and call it a day — without ever crossing the bridge between “people opened” and “people bought.”

That bridge is attribution. This post walks through:

  1. Which attribution model to use (and why last-touch beats the alternatives for small Shopify stores)
  2. The four UTM parameters every email send needs
  3. How to read Shopify’s built-in attribution report
  4. What attribution windows to set and why the defaults are good

What attribution models exist, and which one to pick

There are three you’ll encounter:

  • First-touch: credits the first email/popup that interacted with the customer. Useful when the goal is acquisition channel ROI.
  • Last-touch: credits the most recent email/popup before the purchase. Useful when the goal is “which campaign drove the sale.”
  • Multi-touch (or fractional): splits credit across all touches. Useful when you have weeks-long sales cycles with many touches.

For sub-$1M Shopify stores, last-touch is the right answer 99% of the time. Three reasons:

  1. Sales cycles are short. Most ecommerce purchases happen within 1-2 days of the qualifying email click. With cycles that short, first-touch and multi-touch produce nearly identical credit distributions to last-touch.
  2. It’s what Shopify already gives you. Shopify Admin → Analytics → Reports → Sales attributed to marketing uses last-touch attribution out of the box, on data Shopify already collects.
  3. Multi-touch math is overkill at this scale. Multi-touch is built for B2B SaaS with 90-day sales cycles where 5+ touches typically precede a deal. For $30 AOV impulse purchases, the incremental insight is rounding error.

Use first-touch if you’re explicitly trying to evaluate acquisition channel ROI (“which popups drive subscribers who eventually buy?”). Use multi-touch only if you’re doing six-figure consideration cycles (furniture, jewelry, custom B2B) where multiple emails genuinely preceded the purchase.

For the rest, last-touch wins by being right and being simple.

The four UTM parameters every send needs

Every email send (campaign, automation, broadcast) should include these four UTM parameters on every link in the email:

ParameterWhat it capturesExample
utm_sourceThe platform sending itkovyo, klaviyo, mailchimp
utm_mediumThe channelemail
utm_campaignThe specific sendwelcome-day-1, 2026-05-newsletter
utm_contentThe link varianthero-cta, product-grid-1, footer-link

A complete URL example:

https://yourstore.com/products/leather-wallet
  ?utm_source=kovyo
  &utm_medium=email
  &utm_campaign=welcome-day-1
  &utm_content=hero-cta

What each parameter unlocks in Shopify reports:

  • utm_source lets you compare email tools (if you ever migrate or A/B test platforms)
  • utm_medium=email separates email-driven sales from social, paid ads, organic search, direct
  • utm_campaign lets you compare specific sends — “which welcome email drove more revenue, day 1 or day 3?”
  • utm_content is the inside-the-email A/B variable — “which CTA position got clicked more, hero or footer?”

Tools like Kovyo auto-set the first three and let you choose utm_content per link. Klaviyo and Omnisend are similar. If you’re hand-rolling it, be consistentutm_campaign=welcome in one send and utm_campaign=welcome-flow in another are different campaigns to Shopify.

How to read Shopify’s attribution report

Shopify Admin → Analytics → Reports → “Sales attributed to marketing” is the canonical attribution report — and it’s free.

What you see by default:

  • A list of every traffic source that sent visitors, broken down by utm_source and utm_medium
  • For each row: visits, conversion rate, total sales, AOV
  • A 30-day default window (configurable)

What to look for, in priority order:

  1. Sales by source. Is kovyo, klaviyo, etc. showing up? If not, your UTMs aren’t set or not being captured. Check by clicking one of your email links and watching the URL — the parameters should be present.

  2. Sales per visitor by source. If your email source has 200 visits and $400 in sales, that’s $2 per visitor — strong. If it has 200 visits and $20 in sales, the conversion is broken. Either the email landed someone who wasn’t ready to buy, or the landing page isn’t matching the email’s promise.

  3. Sales by campaign (utm_campaign). Click into your email source — Shopify breaks down by campaign within. This is where you see “welcome-day-1 drove $1,847 across 47 orders.” That’s the loop closed.

  4. Sales by content (utm_content). This is the one most stores ignore. It tells you which link in the email drove the sale — hero CTA vs product grid item vs footer. If 80% of revenue is from the hero CTA and 5% from the product grid, you can drop the product grid in next month’s send and gain real estate.

The report has a 7-day click window by default — visits attributed to email if the click happened within the past 7 days. That’s longer than the typical Shopify ecommerce sales cycle, so it captures most attributed revenue. Shorter windows (1-3 days) miss 10-20% of genuinely email-driven revenue. Longer windows (14+ days) start attributing to email things that would have happened anyway.

Attribution windows: what to set and why

Most email tools let you configure the attribution windows. The sensible defaults that Klaviyo, Omnisend, and Kovyo all use:

  • Click window: 5 days. A click on an email link, then a purchase within 5 days, gets attributed to that email send. Reasonable for ecommerce sales cycles.
  • Open window: 1 day. An open (without click), then a purchase within 24 hours, gets attributed. Tighter than the click window because opens are weaker intent signals.
  • Popup conversion window: 7 days. A popup signup, then a purchase within 7 days, gets attributed to the popup. Wider than email because the welcome flow typically takes 3-7 days to finish converting first-time buyers.

The reason these specific numbers — they’re conservative enough to avoid over-attributing (which would inflate email revenue and lead to over-investment) and generous enough to capture the actual sales-cycle window (which would otherwise under-attribute and lead to under-investment).

If you want to tighten or stretch these, the rule of thumb: shorten windows when you’re seeing implausibly high attribution numbers (open window > 24h on impulse-buy categories is suspect); lengthen windows when you suspect under-attribution (long consideration products at $200+ AOV often warrant a 14-day click window).

What about Shopify’s UTM-stripping problem

A real wrinkle: Shopify Checkout strips UTM parameters from the final order record by default. So if a customer clicks an email link, lands on a product page, adds to cart, goes through checkout, and orders — the UTMs are visible in the session analytics but not on the order itself.

Two implications:

  • The Shopify “Sales attributed to marketing” report works because it’s based on session data, not order data.
  • Your email tool’s per-send revenue attribution depends on how it ties session UTMs back to orders. Better tools (Klaviyo, Kovyo) do this server-side via Shopify webhooks; weaker ones rely on cookie-based browser-side stitching that breaks in cross-device flows.

If revenue attribution feels lower than expected, this stitching gap is usually the cause. Check your email tool’s docs for “how do you attribute orders to email sends” — the right answer is “via the Shopify orders/create webhook with the most recent qualifying click in the past 5 days.”

A 15-minute attribution audit

If you’re wondering whether your attribution is set up correctly:

  1. Open one of your sent emails. Click any link. Look at the URL — utm_source, utm_medium, utm_campaign, utm_content all present?
  2. Make a test purchase using that link. Use a real test card (Shopify accepts a Bogus Gateway test mode if you want).
  3. Check Shopify Admin → Analytics → Reports → Sales attributed to marketing the next day. Your test purchase should show up under your email source, with the campaign name visible.
  4. Cross-check your email tool’s reporting. It should show the same revenue attributed to that send.

If steps 1-4 work cleanly, attribution is wired. If step 3 is empty but step 4 isn’t (or vice versa), there’s a stitching gap that’s silently miscounting. If neither is showing the test purchase, the UTMs aren’t on the link or aren’t being captured.

The 15-minute audit pays for itself the first time you discover your highest-ROI campaign isn’t the one your gut said it was.

For the full picture of how attribution wires into the rest of the email automation graph, see the email automation feature page. For how the per-email-sent pricing model treats attribution as a first-class metric (rather than an add-on for premium tiers), the Klaviyo savings calculator walks through the cost-per-attributed-dollar math.

— The Kovyo team