If you run a subscription brand on Shopify, you’ve probably seen email campaigns “take credit” for revenue spikes on renewal days—or worse, renewals show up as Direct/None with no marketing source at all. This guide shows you exactly how to attribute email-driven revenue correctly for both initial subscription purchases and recurring renewals, using Shopify, Klaviyo, and common subscription apps (Recharge/Skio), with practical verification at every step.
Estimated time: 90–150 minutes (including test flow and a renewal simulation)
Difficulty: Intermediate (no engineering required; optional light API/webhook for best results)
You’ll need: Shopify Admin access, Klaviyo admin access, your subscription app (Recharge or Skio), ability to send test emails, and permission to create test orders
What you’ll accomplish:
Clean, consistent UTM governance for all email links
Accurate views of email-attributed revenue in Shopify reports
Klaviyo reporting that doesn’t inflate campaign revenue with renewals
Durable acquisition source stored and propagated to renewal orders
A full-path test and a reconciliation routine you can reuse monthly
Step 1 — Lock down UTM governance for email links
Why this matters: Shopify relies on link parameters and session data to recognize marketing sources. If your email links aren’t consistently tagged—or if redirects strip parameters—your email revenue may be misattributed.
Do this:
Standardize your UTM taxonomy (lowercase, no spaces):
utm_source=email (or your ESP name)
utm_medium=email
utm_campaign=clear_human_readable_name
Optional: utm_content=link_variant or message_name
Disable or reconcile auto-tagging in your ESP so it doesn’t overwrite your UTMs.
Click through and confirm the landing URL still contains your UTMs.
In Shopify Admin, open Live View or the current day’s sessions and watch the source/medium appear as email.
Verify it:
After a real test order from an email click, check Shopify Reports for sales attributed to “Email” or your chosen source.
If UTMs disappear after a redirect, replace long tracking URLs with a branded short link that preserves parameters, or update redirect rules.
If X then Y:
If you see mixed casing (Email vs email) splitting your reports, normalize to lowercase in your templates and retro-tag any evergreen links.
If links work in browsers but not in iOS Mail/Safari, test again in normal and Private modes; avoid reliance on click IDs that may be stripped, and keep standard UTMs intact.
Evidence to ground your approach: Shopify’s documentation and education materials emphasize the role of attribution models and tagged campaigns in reporting; see the high-level explanation in the Shopify marketing attribution overview (Shopify, 2024–2025).
Step 2 — View and verify email attribution inside Shopify
Where to look:
Shopify Admin > Analytics > Reports > Marketing/Channel Performance (names can vary by plan). Here you can see sales attributed to marketing channels and, in newer reporting packs, select from multiple models.
Shopify’s educational content explains attribution concepts and how revenue attribution works across channels; see Shopify’s revenue attribution explainer (2024–2025). Exact model availability and defaults can differ by report type and plan, so check the model selector in your store’s UI when verifying results.
Quick validation routine:
Send a test email with your standardized UTMs.
Click through and complete a test subscription checkout.
In Reports, confirm sales attributed to the Email channel (or your source label) within the selected attribution model.
If X then Y:
If you can’t see an attribution model selector, document which report you’re using and its default behavior; consider ShopifyQL Notebooks or third-party tools if you need side-by-side model comparisons.
Why this matters: Subscription renewals often happen without a fresh email click. If Klaviyo attributes those renewal orders to a past email touch, your campaign revenue will be overstated.
Do this:
Confirm and, if necessary, narrow your attribution windows in Klaviyo.
In flows/campaign reports, segment out orders where is_renewal=true (from your subscription app or a custom property) to avoid counting renewals as campaign conversions.
Verify it:
Run a controlled test: send yourself a campaign, click, complete a test subscription. When the renewal fires, verify that Klaviyo does NOT add renewal revenue to that campaign.
If X then Y:
If renewals still credit to campaigns, shorten your click windows around renewal cycles and confirm the custom conversion metric is used for campaign revenue.
If you can’t emit a custom event, create reporting segments that exclude orders flagged as renewals and use those segments in performance views.
Step 4 — Persist acquisition source across renewals (Recharge/Skio)
Why this matters: Renewal orders are usually created as separate Shopify orders by your subscription app. They rarely carry the original UTMs, so source is lost unless you persist it yourself.
The pattern that works:
On the initial subscription checkout, capture acquisition data (UTMs, campaign) and save it to Shopify metafields on the order and/or customer.
On each renewal, copy those fields to the new order’s metafields via webhook automation.
Use these fields to segment reports, reconcile revenue, and control attribution in your ESP.
Official technical docs on renewal metadata propagation are limited publicly. Contact Skio support for their webhook topics and recommended mapping for renewal orders; implement the same persistence pattern (initial capture → write to customer/order metafields → copy forward on renewal).
Verify it:
Place a test subscription, then trigger a renewal. Inspect the renewal order in Shopify Admin and confirm the acquisition metafields match the initial order.
If X then Y:
If renewal orders lack your copied fields, confirm your webhook or automation runs on the correct topic (e.g., orders/create or the subscription app’s renewal event), and that your API user has write permissions for order metafields.
Safari Link Tracking Protection (LTP) tends to strip user-identifiable click IDs (e.g., gclid/fbclid) in certain contexts, while standard UTMs are generally preserved. Verify behavior in your own tests on current iOS/Safari builds. See a practical ecommerce view in the Elevar iOS17 LTP overview (2023).
Action: favor standard UTMs and server-side/on-site events over opaque click IDs; regularly test email link behavior on iOS Mail and Safari (normal vs Private mode).
Step 6 — Run a full-path test and reconcile across systems
Run this once now and quarterly thereafter:
Send a test campaign email to your seed address with proper UTMs.
Click, subscribe to a test plan, and complete checkout.
Confirm Shopify records the order with email source and that your acquisition metafields are written.
When the renewal fires, confirm the renewal order inherits the acquisition fields.
In Klaviyo, confirm the renewal did not credit the original campaign.
Optionally, compare against a secondary system (GA4 or your attribution platform) for directional agreement.
Reconciliation norms:
Expect some variance (returns/refunds timing, tax/shipping inclusion, attribution windows, bot filtering, and cross-device journeys). Define a tolerance band internally after a month of clean data (many teams operate in a ±10–20% range depending on catalog and campaign mix). Investigate deltas outside your norm.
In a typical workflow, you’ll combine Shopify’s reports, Klaviyo’s attribution settings, and a dedicated attribution layer to reconcile multi-touch journeys—especially when a subscriber engages across email, paid social, and organic before subscribing and later renews.
Here’s a neutral example setup:
Shopify holds your orders and subscription renewals; acquisition source is saved to order/customer metafields.
Klaviyo powers campaigns and flows; a custom non-renewal conversion event prevents renewal revenue from being counted in campaign performance.
A multi-touch attribution layer stitches identity across devices, de-duplicates conversions, and keeps renewal revenue separate from initial conversions.
First mention and disclosure:
Many teams use Attribuly to consolidate multi-touch journeys across email and ads, enrich Shopify orders with identity, and keep renewal revenue separate from first-purchase attribution. Disclosure: Attribuly is our product.
How it looks in practice:
Use a multi-touch view to see the final email click that closed the initial subscription, plus the paid/organic touches that opened the journey. Keep renewals visible for LTV analysis but excluded from campaign conversion credit.
After your full-path test, confirm that your attribution layer shows the initial subscription conversion attached to the email touch (if applicable), while renewals appear as recurring revenue events that don’t back-credit the campaign.
Troubleshooting playbooks (subscription-specific)
Campaign revenue looks inflated on billing dates
Symptom: Klaviyo campaign revenue jumps when subscriptions renew.
Fix: Use a custom non-renewal conversion event for campaign reporting, shorten click windows around renewal cycles, and exclude is_renewal=true orders in reporting. See the community guidance in the Klaviyo thread about renewals being falsely attributed (2024–2025).
Renewals appear as Direct/None in Shopify
Symptom: Renewal orders lack UTMs and show Direct.
Fix: Persist acquisition source from the initial order/customer via metafields and copy to renewals using webhooks. Use Recharge identifiers to link renewals to subscriptions; see Recharge’s Shopify order flow guide (2024–2025).
Shopify vs. Klaviyo revenue doesn’t match
Symptom: Reported revenue differs notably.
Fix: Align attribution windows, exclude renewals from campaign credit, confirm how returns/refunds, tax/shipping are counted, and ensure bot filtering and integration sync health are in place. For general model context, review Shopify’s marketing attribution primer (2024–2025) alongside your Klaviyo settings.
UTMs are missing after redirects
Symptom: Clicking from an email lands on a URL without UTMs.
Fix: Replace complex redirects with branded short links that preserve parameters, remove conflicting ESP auto-tagging, and test iOS Mail/Safari behavior. If click IDs are being stripped, rely on standard UTMs and server-side/on-site events.
Next steps and hardening your measurement
Document your UTM taxonomy, Klaviyo attribution windows, and renewal-exclusion rules. Revisit quarterly.
Schedule a monthly QA: test an email click, confirm UTMs in Shopify, and spot-check one renewal.
Consider server-side augmentation and ecosystem integrations if you need stronger identity stitching or ad platform conversion sharing. Browse the Attribuly integrations list; if you’re working on paid social, you can also review the Meta Ads CAPI integration option.
Keep the mindset that attribution is a workflow, not a one-time setup. With consistent UTMs, renewal-aware conversion logic, and durable source persistence, you’ll trust your email revenue reporting even on busy renewal days.