Subscription LTV attribution: credit every renewal to its channel

Subscription LTV attribution credits every renewal, upgrade and refund to the channel that won the customer. See the Stripe join, the math and where it breaks.

Muzahid Maruf — Founder of TrackRev.io

Muzahid MarufUpdated

Revenue attribution · 10 min read
On this page
  1. 01What does the first invoice leave out?
  2. 02How does subscription LTV attribution work in Stripe?
  3. 03Which Stripe events change a channel's lifetime revenue?
  4. 04Which 3 rules credit renewals?
  5. 05How do upgrades, refunds and trials change the credit?
  6. 06How do you compare channels by lifetime value?
  7. 07What does TrackRev do with a renewal?
  8. 08Which cases can the join not see?

Explore with AI

Opens this article inside the chosen assistant with a ready-made prompt.

Subscription LTV attribution is the practice of crediting every renewal, upgrade and refund on a subscription to the channel that won the customer.

A $49 plan that renews for 12 months produces $588, and a first-invoice report credits the channel with $49 of it.

In Stripe Billing the fix takes one join and one rule: tie the first charge to a click, then let every later invoice on the same subscription ID inherit that channel.

Below are the churn math, the join in 4 links, 6 revenue events and 3 crediting rules for 2026.

For example, a $49 plan at 5% monthly churn is expected to bring $980 over its lifetime, per the arithmetic in Paddle's CLV guide.

Key takeaways

  • At constant monthly churn, the first invoice equals the churn rate as a share of lifetime revenue: $49 of an expected $980 on a $49 plan at 5% churn.
  • Every later invoice inherits the channel of the subscription's first charge, keyed by subscription ID, so renewals and upgrades credit the channel that won the customer.
  • Count revenue from invoice.paid, and treat customer.subscription.updated as state, since it also fires on renewals, coupons and plan changes.
  • A 14-day trial plus a 20-day gap between click and signup puts the first charge outside a 30-day attribution window, and every renewal then inherits no channel.
  • Compare channels on cohorts of equal age and the same plan, because all-time revenue per customer favors older channels.

What does the first invoice leave out?

A first invoice equals one month of revenue and ignores the remaining lifetime. Assume a customer pays the same price every month and each month carries the same chance of ending the subscription.

Lifetime revenue is then the price divided by the monthly churn rate, the arithmetic Paddle's CLV guide gives as average revenue per user divided by churn.

The first invoice is one month of that lifetime, so its share equals the churn rate.

Monthly churnExpected lifetimeLifetime revenue at $49First invoice as a shareStill subscribed after 12 months
1%100 months$4,9001%89%
2%50 months$2,4502%78%
3%33.3 months$1,6333%69%
5%20 months$9805%54%
8%12.5 months$612.508%37%
12%8.3 months$40812%22%
20%5 months$24520%7%

Constant-churn model on a $49 monthly plan, with no expansion, discounts or margin. Arithmetic, not customer data.

For example, take two channels that both deliver $49 on the first invoice, with newsletter readers churning at 3% a month and cold paid social at 8%. A first-invoice report calls the channels equal.

Over a lifetime the newsletter customer is worth $1,633 and the paid-social customer $612.50, a 2.7x gap. Both churn rates are assumptions.

Real churn is not constant.

David Skok's SaaS metrics essay uses cohort analysis to check whether a business loses most of its customers in the first couple of months, so use actual paid invoices for any cohort old enough to have them.

How does subscription LTV attribution work in Stripe?

Subscription LTV attribution in Stripe is a chain of 4 links between an ad click and the ninth invoice of a subscription.

Each link lives in a different system, and a break at any one of them orphans every invoice after the break.

LinkWhat holds itWhere it lives
1. Click to visitorA first-party visitor IDYour tracking script and cookie
2. Visitor to first chargeclient_reference_id, metadata or the buyer's emailCheckout Session, PaymentIntent or Customer
3. First charge to subscriptionThe subscription ID on the invoiceInvoice parent.subscription_details.subscription
4. Subscription to each renewalThe same subscription IDEvery later invoice, with billing_reason subscription_cycle

The first 2 links are identity problems. If the visitor ID never reaches Stripe Checkout, nothing downstream can recover the channel, and Stripe metadata attribution setup covers the write side.

Links 3 and 4 depend on your Stripe API version when you start from a charge, as a refund event does.

Stripe's subscription webhook documentation moves the subscription ID at 2025-03-31.basil, and a handler written for one version reads an empty field on the other.

Stripe API versionCharge to invoiceInvoice to subscription
Before 2025-03-31.basilcharge.invoiceinvoice.subscription
2025-03-31.basil and laterNo invoice field: take the PaymentIntent and list its invoice paymentsinvoice.parent.subscription_details.subscription

Field paths from Stripe's subscription webhook documentation, October 2026.

You can also stamp the source on the subscription once. Stripe's metadata guide says each invoice a subscription creates gets a one-time snapshot of its metadata under parent.subscription_details.metadata, so every invoice.paid event carries the channel without a lookup.

Fixing a typo after month 3 leaves invoices 1 to 3 as they were.

Which Stripe events change a channel's lifetime revenue?

EventWhat Stripe says it meansWhat to do with it
invoice.paidThe invoice was successfully paidAdd amount_paid to the subscription's channel. billing_reason separates the first invoice (subscription_create), a renewal (subscription_cycle) and a plan change (subscription_update).
customer.subscription.updatedA subscription starts or changes, including renewals, coupons and plan changesTrack MRR movement. Add no revenue from it.
invoice.payment_failedA payment for an invoice failedAdd nothing. Smart Retries can still turn the invoice into invoice.paid later.
charge.refundedA subscription charge received a full or partial refundSubtract the refunded amount from the same channel.
charge.dispute.createdA customer or their bank disputed a chargeFlag the revenue as at risk and subtract it if the dispute is lost.
customer.subscription.deletedA customer's subscription endsStop accruing revenue and record the churn date for cohorts.

Event descriptions from Stripe's subscription webhook documentation, October 2026. The right-hand column is a recommendation.

A revenue event is a Stripe webhook that adds to or subtracts from a channel's lifetime total, and the table lists 6 of them. Per Stripe's Invoice object reference, the billing_reason field separates subscription_create, subscription_cycle and subscription_update.

Only invoice.paid, charge.refunded and charge.dispute.created change the dollar amount. Stripe retries a failed live-mode webhook delivery for up to 3 days with exponential backoff, so key each revenue row by invoice ID and a replayed event changes nothing.

For example, a replayed invoice.paid event for a $49 invoice adds $49 once, not twice. Read customer.subscription.updated as a state change only, because renewals, coupons and plan changes all trigger the event.

Finally, record customer.subscription.deleted as the churn date, so cohorts of equal age can be compared later (October 2026).

Which 3 rules credit renewals?

Renewal credit is the share of a subscription's later invoices that the winning channel books, and 3 rules set the share.

A customer who pays $49 for 12 months produces $588, and the credit rule decides how much of the $588 the channel books: all of it, 70% of it, or a forecast made on day one.

First, carry the first credit forward. Second, decay the credit over time. Third, book a projected lifetime value at signup. The table compares the 3 rules on the same $49 plan.

The rules answer different questions, so pick the rule that matches the decision in front of you.

RuleCredit to the channelShare of the $588 paid in 12 monthsNeeds
Carry forward$588100%One lookup per invoice
Decay$411.6070%A schedule and a retention owner
Projected value$980 at 5% churnNot applicableA churn estimate per channel

Same $49 plan under each rule. Illustrative arithmetic, October 2026.

How does carrying the first credit forward work?

Carrying the first credit forward is the rule that gives the channel which won the customer all 12 invoices, $588 on a $49 plan. The rule answers which channel pays your MRR directly and costs one lookup per invoice.

The trade-off is over-crediting acquisition when a lifecycle email sequence or an onboarding call is what keeps people subscribed. I would start here and add complexity only when a budget decision demands it.

For example, a customer who stays 12 months from a newsletter click books $588 to the newsletter, with no later adjustment. The subscription ID is the only key the lookup needs.

How does a decaying credit work?

A decay rule is a schedule that gives the acquisition channel a falling share and moves the remainder to a retention bucket.

With 100% for months 1 to 3, 80% for months 4 to 6, 60% for months 7 to 9 and 40% for months 10 to 12, a $49 plan credits the channel 49 x (3 x 1.0 + 3 x 0.8 + 3 x 0.6 + 3 x 0.4) = $411.60 of the $588 paid that year, or 70%.

The remaining $176.40 goes to the retention bucket. The schedule is arbitrary and earns its place only when someone owns retention spend. Without an owner, the decay only moves dollars between 2 rows.

When does a projected lifetime value make sense?

A projected lifetime value is the expected lifetime revenue booked to the channel at the first payment: $980 for a $49 plan at 5% churn. A team can judge a campaign in its first week instead of its twelfth month.

The cost is a churn estimate per channel, and an estimate from a 3-month-old cohort is mostly noise, so keep actual paid revenue beside the projection.

For example, a newsletter booked at $1,633 per customer needs real invoices to confirm the 3% churn assumption.

How do upgrades, refunds and trials change the credit?

Upgrades, refunds and trials are the 3 events that move a subscription away from a flat $49 a month.

Take a newsletter subscriber on the $49 plan who upgrades to $99 at the month 6 renewal, cancels after month 9 and gets the last invoice refunded.

MonthsStripe activityInvoicesChannel total after
1subscription_create$49$49
2 to 54 subscription_cycle invoices4 x $49 = $196$245
6Plan change to $99, billed at renewal$99$344
7 to 93 subscription_cycle invoices3 x $99 = $297$641
9charge.refunded on the month 9 invoice-$99$542

Worked example with round numbers.

The newsletter ends with $542 credited, and the opening $49 is 9% of it. First-invoice attribution would hold $49 and never see the upgrade or the refund.

A mid-cycle upgrade lands differently.

Stripe's proration documentation works through a customer who upgrades from a $10 plan to $20 halfway through the period: a $5 credit for unused time plus $10 for the rest of the period on the new plan, so $5 more is billed.

The default create_prorations creates those items without invoicing them at once, so they usually land on the next invoice.

Expansion revenue then arrives one cycle late, and a daily MRR chart disagrees with an invoice-based table until the invoice is paid. Upgrades made through the billing portal are covered in Stripe Customer Portal attribution.

How does a free trial affect the attribution window?

A trial gap is the time between the click that won the customer and the first payment, and a trial lengthens the gap.

A free-trial subscription sits in trialing status, which Stripe's free trial documentation describes, and becomes active when the first payment arrives, so nothing earns credit before the first payment.

A 14-day trial and a visitor who clicked 20 days before signing up put the first charge 34 days after the click, outside a 30-day window. The charge receives no channel, and every renewal after the charge inherits none either.

Set the window to cover the trial plus a normal consideration period, such as 14 + 30 = 44 days in 2026.

How do you compare channels by lifetime value?

A fair lifetime comparison is a comparison of cohorts with equal age.

All-time revenue per customer rewards age, so compare cohorts of equal age, or fix one window, such as the first 6 months, and apply the window to every channel.

A 12-month cohort on a $49 plan holds at most 12 invoices, or $588.

Cohort ageInvoices at $49Most one customer can have paid
3 months3$147
6 months6$294
12 months12$588
24 months24$1,176

Ceiling for a customer who never churns or changes plan.

Plan mix distorts the comparison too.

ChartMogul's SaaS Retention Report, covering more than 2,100 SaaS businesses, found net revenue retention above 100% at 2.7% of companies with ARPA under $10 a month and at 41.1% of those with ARPA over $500.

A channel that sells your top plan will retain better for reasons unrelated to the channel, so split by plan before crediting the channel with the difference.

What do benchmarks say about lifetime value by channel?

In our attribution benchmark data, built from Q2 2026 workspace data, the median 12-month LTV multiplier is 2.1x for organic search and 0.8x for paid social, measured against each workspace's average customer.

Organic search customers reach first churn at a median of 12.4 months, against 6.2 for paid social.

Lifetime revenue becomes a budget signal once the revenue meets cost.

Paddle puts the SaaS benchmark for CLV to CAC above 3:1, and Skok adds that many of the best businesses recover CAC in 5 to 7 months, with profitability turning anemic past 12.

In the illustrative table, paid social recovers its cost a month sooner and still fails the 3:1 test, while the newsletter passes it and takes a month longer.

ChannelCACMonthly churnLifetime revenueLTV:CACMonths to recover CAC
Newsletter sponsorships$3003%$1,6335.4:16.1
Paid social$2508%$612.502.45:15.1

Illustrative numbers. Recovery time is CAC divided by the $49 monthly price, before churn and gross margin.

What does TrackRev do with a renewal?

TrackRev is SaaS affiliate software with revenue attribution built in, and we built it to read Stripe with a read-only restricted key and sync charges hourly, with instant syncs from a Stripe webhook when the key allows it.

The first charge for a subscription finds its visitor from metadata.vid, then the Checkout Session's client_reference_id, then the buyer's email.

The charge earns credit from clicks inside the attribution window under your model: last touch (the default), first touch or linear, as the attribution model comparison lays out. The window defaults to 30 days and accepts 1 to 365.

Every later charge whose invoice carries the same subscription ID copies the first order's channel and link split, rescaled to the renewal amount. A $49 plan that becomes $99 credits $99 to the same channel from then on.

The same carry-forward runs for Paddle, Polar and Lemon Squeezy subscriptions, keyed on each provider's own subscription ID.

TrackRev settingValue for renewals
Stripe syncHourly, 24 times a day, plus instant syncs from a webhook
Attribution window30 days by default, 1 to 365 allowed
First syncReaches back 30 days
Credit ruleLast touch by default, with first touch and linear
Paid plansIndie $29 a month, Growth $299 a year
Free plan50 links and 1,000 tracked events a month, no revenue figures

Settings from TrackRev's pricing, sync and attribution code, October 2026.

How does TrackRev treat refunds and reporting?

A refunded Stripe charge drops out of the lifetime table, and a partly refunded charge loses its whole credit instead of only the refunded portion.

The Channels page lists customers, orders including renewals, lifetime revenue and average LTV per customer for each channel, as described on the channel analytics page. The page sums all time with no cohort-age cut, so apply the comparison rules above.

Revenue figures need a paid plan: Indie at $29 a month or Growth at $299 a year (pricing). The free plan tracks links only. Setup steps sit on our own Stripe integration page.

A renewal whose first order earned no credit earns none either, and the first sync reaches back 30 days, so subscriptions that began before you connected arrive without their original click. Changing the attribution model affects new orders only.

Which cases can the join not see?

A blind case is a payment with no browser session behind the payment. A hand-sent invoice from a sales rep carries no visitor session, so credit has no click to land on.

Billing in Chargebee or Recurly sits outside the 6 processors TrackRev reads: Stripe, Paddle Billing, Polar, Lemon Squeezy, Creem and Dodo Payments. A Salesforce or HubSpot record can hold the source field for such a deal.

For example, an annual contract of $2,400 signed after a call has no click to match, and the contract equals about 49 months of a $49 plan.

In our experience building TrackRev, the CRM field is the better record for those deals. The click-to-charge walkthrough is in attributing Stripe revenue to marketing channels.

Found this useful? Share it.

PostLinkedIn

Frequently asked questions

Muzahid Maruf — Founder of TrackRev.io

Written by

Muzahid Maruf

Founder, TrackRev.io & Contant.io

Muzahid Maruf founded TrackRev.io, SaaS affiliate software with no limit on tracked revenue, and Contant.io. He writes about affiliate programs.

Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth

Run your affiliate program without a revenue cap.

Affiliate software for indie hackers and small SaaS teams: $29 a month flat, 0% fees, link tracking and revenue attribution built in. Free to start, no card.