Skip to content
Store slow, dated, or hard to edit? Request a Store Diagnostic
Running B2B on spreadsheets or email? Plan Your B2B Project
Subscriptions

Shopify Subscription Analytics: Tracking LTV and Cohort Retention Beyond the Default Reports

If you’ve been running a Shopify subscription programme for more than six months, you’ve probably already hit the ceiling of your subscription app’s built-in analytics. You can see monthly recurring revenue. You can see churn rate for last month. What you usually can’t see is whether customers acquired through Meta ads in March are retaining better than the ones acquired through Klaviyo flows in April, or what a subscriber is actually worth over their full lifecycle once you account for pauses, downgrades, and win-backs.

That gap matters because subscription businesses live and die by LTV:CAC, not by monthly churn in isolation. A dashboard that only shows you “this month’s numbers” can’t tell you whether your acquisition spend is sustainable.

This post walks through why the default reporting falls short, what LTV and cohort retention actually mean in a subscription context, and a practical approach to building this out properly in Google Analytics 4 (GA4), including the event structure, custom dimensions, and reporting views you need.

Why subscription app dashboards hit a ceiling

Apps like Recharge, Skio, Bold Subscriptions, and Shopify’s own native subscriptions API are built to manage the mechanics of recurring billing, scheduling, retries, dunning, pausing. Their reporting is a secondary feature, and it shows in three consistent ways.

Cohort views are shallow or missing. Most subscription app dashboards give you a single retention curve for “all subscribers,” sometimes filterable by plan. They rarely let you slice retention by acquisition month and then track that specific cohort’s behaviour over 6, 12, or 18 months against a different cohort acquired under different conditions (a new offer, a different landing page, a different ad channel).

There’s no cross-channel attribution. The subscription app knows a customer subscribed. It generally doesn’t know whether that customer arrived via a Google Ads click, an Instagram post, an email flow, or organic search, because that’s not its job. Without that link, you can measure retention, but you can’t connect retention back to acquisition cost per channel, which is the whole point of an LTV:CAC calculation.

Data retention windows are short. Many apps roll up or purge granular event-level data after a period (commonly somewhere in the 12-24 month range, depending on the app and plan tier), which is a real problem for subscription businesses where meaningful LTV often only becomes clear after 18-24 months of customer history.

None of this makes the apps bad, they’re doing what they’re built for. But if you need to answer “what’s our true 24-month LTV by acquisition channel,” you need a system built specifically to answer that question, and GA4 (paired with your own data warehouse or BI layer, for stores with enough volume to justify it) is the most accessible way to do that on Shopify.

What LTV and cohort retention actually mean for a subscription business

It’s worth being precise here, because these terms get used loosely.

Lifetime value (LTV), for a subscription business, is the total revenue (or gross margin, if you’re calculating it properly) a customer generates across their entire relationship with you, not just their first order, and not just one arbitrary window like “90-day LTV” unless you’re explicit that’s what you mean. A subscriber who pays for 14 months, pauses for two, then resumes for another six has a materially different LTV profile than one who churns after month two, even if their average order value is identical.

Cohort retention groups customers by a shared starting point, usually their signup month, and tracks what percentage of that specific group is still active at each subsequent interval. This is different from a blended churn rate, which averages everyone together and can hide real problems. If your February cohort retains at 40% by month six but your March cohort (acquired after you changed your welcome offer) retains at 25%, a blended monthly churn number won’t show you that, a cohort table will.

The reason this matters commercially: acquisition channels and offers often produce customers who behave completely differently after signup. A discount-heavy paid social campaign might hit your subscriber count quickly but produce a cohort that churns hard by month three. Organic and referral-driven signups often retain longer but arrive more slowly. Without cohort-level LTV, you can’t tell these apart, you just see “subscribers,” which flattens two very different businesses into one number.

Structuring GA4 to capture the subscription lifecycle

To get this right, you need to treat a subscription as a lifecycle with distinct events, not a single “purchase” transaction. Here’s the event structure we typically recommend building out.

Core lifecycle events to track

  • subscription_signup, fired when a customer starts a new subscription. Parameters should include plan/product, billing frequency, discount or offer code applied, and acquisition source if available at that point.
  • subscription_renewal, fired on each successful recurring charge. This is what lets you build a true retention curve rather than relying on “active subscriber count” snapshots.
  • subscription_payment_failed, fired when a renewal charge fails, before dunning kicks in. Useful for separating “failed payment churn” from genuine cancellations, since these need very different fixes.
  • subscription_paused and subscription_resumed, critical for subscription businesses with a pause feature, because paused customers aren’t churned, but they also aren’t generating revenue. Treating them as either “active” or “churned” both distort your numbers.
  • subscription_upgraded / subscription_downgraded, plan or frequency changes, with old and new plan values as parameters so you can track net revenue movement within your existing base, not just gross new signups.
  • subscription_cancelled, with a cancellation reason parameter if your subscription app captures one (most do via a cancellation flow survey), since reason-coded churn is far more actionable than a raw churn percentage.

Custom dimensions to configure

In GA4, set these up as user-scoped custom dimensions where possible (so they persist across sessions), rather than event-scoped only:

  1. subscriber_id, a stable identifier matching your subscription app’s customer/subscription ID, used to stitch GA4 behavioural data back to billing data later.
  2. acquisition_channel, captured at signup and held constant afterwards, so a customer’s original acquisition source doesn’t get overwritten by later sessions from other channels.
  3. cohort_month, the month the subscription started, formatted consistently (e.g. 2026-03), which becomes the grouping field for every retention view you build.
  4. plan_tier and billing_frequency, needed to segment LTV by plan, since a monthly $40 plan and an annual $400 plan behave very differently even if the average revenue per customer looks similar at a glance.
  5. subscriber_status, current state (active, paused, cancelled), updated via server-side event or a scheduled sync from your subscription app’s webhook data, since GA4 itself has no concept of subscription state on its own.

Getting this event and dimension structure right is largely a server-side and webhook implementation job, most of it can’t be captured from on-page Shopify Analytics tracking alone, because renewals, pauses, and cancellations happen via the subscription app’s backend, not through a storefront page view. This typically means piping subscription app webhooks into GA4 via Measurement Protocol, or through a middleware layer if you’re also feeding a data warehouse.

Building cohort retention views

Once the events and dimensions are flowing, GA4’s Explore section is where you build the actual reporting.

A cohort exploration in GA4 lets you group users by the month they triggered a chosen “inclusion event” (subscription_signup) and then track a “return criteria” event (subscription_renewal) across subsequent weeks or months. This is the closest native equivalent to a classic SaaS-style cohort retention table, and it’s the view that reveals whether retention is improving or degrading cohort over cohort, something a single blended churn percentage can never show you.

For LTV specifically, you’ll usually want to go beyond GA4’s native reporting and either:

  • Use GA4’s BigQuery export (available even on the free tier, and worth setting up early precisely because of the short native GA4 data retention window) to run cohort LTV calculations in SQL, joining subscription revenue events against acquisition_channel and cohort_month, or
  • Build a lighter-weight version using GA4 Explore’s “User Lifetime” report combined with your custom dimensions, which works reasonably well for smaller subscriber bases but gets clunky once you need blended-revenue LTV across many segments.

The BigQuery route is more setup work upfront but solves the data retention problem completely, since exported data lives in your own warehouse indefinitely rather than being capped by GA4’s UI retention window.

Connecting subscription data to CAC for a full LTV:CAC picture

None of the cohort or LTV work above matters commercially until it’s compared against what it cost to acquire each cohort. This is the step most Shopify subscription merchants skip, not because it’s conceptually hard, but because the data lives in three different places: ad platform spend, GA4 attribution, and subscription billing data.

A practical framework:

  1. Pull acquisition spend by channel and month from your ad platforms (Google Ads, Meta Ads) and any other paid channels, matched to the same monthly buckets as your cohort_month dimension.
  2. Divide spend by new subscribers acquired in that channel and month (using your acquisition_channel custom dimension) to get blended CAC per channel per cohort.
  3. Calculate cumulative LTV per cohort at fixed intervals, 3, 6, 12, 24 months, using the renewal and revenue events flowing into GA4 or BigQuery.
  4. Plot LTV:CAC ratio over time per channel, not just as a single blended number. A channel with CAC of $60 and 12-month LTV of $180 (3:1) is healthy; a different channel at $60 CAC and $90 LTV (1.5:1) may not be, even if both channels show similar “subscriber count acquired” in your ad platform’s own reporting.

This is also where you’ll often discover that your highest-volume acquisition channel isn’t your most profitable one once real retention is accounted for, a pattern that’s common enough in subscription businesses that it’s worth checking for specifically, rather than assuming your biggest channel is automatically your best one.

A practical checklist for getting this set up

  • Audit what your current subscription app dashboard actually shows, and write down the specific questions it can’t answer (usually: cohort-by-channel LTV, and retention beyond its data retention window).
  • Confirm your subscription app has webhooks for signup, renewal, pause, resume, upgrade/downgrade, and cancellation events.
  • Set up GA4 Measurement Protocol (or a middleware tool) to push those webhook events into GA4 as server-side events.
  • Configure the five core custom dimensions: subscriber_id, acquisition_channel, cohort_month, plan_tier, subscriber_status.
  • Enable GA4’s BigQuery export before you need it, the value compounds the longer it’s been running, since you can’t backfill history retroactively.
  • Build a cohort exploration in GA4 Explore as your first retention view, then layer in blended CAC data monthly.
  • Review cohort LTV:CAC quarterly at minimum, not just monthly churn, the meaningful signal in subscription data takes months to surface, not weeks.

When to bring in a specialist

Some of this, installing GA4, adding basic ecommerce tracking, is well within reach for a technically comfortable in-house marketer. Where it usually gets genuinely difficult is the webhook-to-GA4 pipeline for subscription lifecycle events, getting user-scoped custom dimensions to persist correctly across sessions and devices, and structuring the BigQuery layer so cohort LTV calculations are accurate rather than quietly double-counting or misattributing renewals.

If your current subscription reporting stops at “this month’s MRR and churn rate” and you need a real cohort-by-channel LTV picture to make acquisition spend decisions with confidence, that’s exactly the kind of gap a Shopify GA4 and analytics setup is built to close, configuring the event structure, custom dimensions, and reporting views specifically for subscription lifecycle data, not just standard ecommerce purchases.

FAQ

Does Shopify’s native subscriptions feature track LTV and cohort retention on its own?
No. Shopify’s native subscription contracts API handles billing and scheduling, but the Shopify admin doesn’t provide cohort retention tables or channel-level LTV reporting out of the box. That reporting layer needs to be built separately, typically in GA4 or a BI tool fed by subscription and analytics data.

How long does it take to see useful cohort data after setting this up?
You’ll get directional signal within one to two billing cycles, but genuinely reliable cohort LTV comparisons, especially across acquisition channels, typically need several months of renewal data per cohort before the patterns are stable enough to act on with confidence.

Can I do this with GA4’s free tier, or do I need GA4 360?
The free tier of GA4 is sufficient for most Shopify subscription merchants, including BigQuery export, which is available on the free tier with daily export limits that are rarely a constraint at typical subscription store volumes. GA4 360 is only relevant at large enterprise scale.

What’s the difference between churn rate and cohort retention?
Churn rate is usually a blended, single-period figure (e.g. “8% monthly churn”) that averages every active subscriber together. Cohort retention tracks a specific group of customers acquired in the same period and shows how that group’s retention curve looks over time, which reveals differences between cohorts that a blended rate hides.

Do I need a data warehouse, or is GA4 alone enough?
For smaller subscriber bases, GA4’s native Explore reports (including cohort exploration) can get you most of the way. Once you need blended-revenue LTV calculations across multiple segments, or retention history beyond GA4’s UI retention window, exporting to BigQuery becomes worthwhile, and it’s much easier to enable early than to backfill later.

Ready to see your real subscription LTV?

If your subscription analytics currently stop at what your app’s dashboard shows you, a proper GA4 setup can give you the cohort and channel-level LTV picture you need to make confident acquisition decisions. Book a call with our team to talk through what that would look like for your store, or start with a Shopify audit to see where your current tracking has gaps.

Niraj Raut
Written by Niraj Raut SEO Manager

Niraj Raut is the SEO Manager and co-founder at Nexly. He helps Australian Shopify and Shopify Plus brands earn durable organic growth through technical SEO, search-led store architecture and content that ranks. He writes about what actually moves rankings for ecommerce.

Connect on LinkedIn
Have a Shopify project? Chat with us, takes 30 seconds.