One-time checkout vs subscription_started in marketing attribution

Do not mix first payment with renewals in the same column, how to read Stripe events for launch reviews.

All guides on this topic: Stripe checkout tied to traffic

Founders add a monthly plan, watch “revenue” jump, and think the blog post worked, when half the cash was annual prepay and the other half was renewals from customers who found them in 2024.

Marketing attribution should focus on first cash from a new payer unless you explicitly run a renewal campaign. Part of the Stripe revenue guides.

Define “new revenue” for marketing

Pick one:

  • First `checkout.session.completed` per customer (simplest for self-serve).
  • `customer.subscription.created` with first invoice paid (subscription-native).
  • Exclude invoice.paid where billing_reason=subscription_cycle.

Write the definition in your metrics doc. Changing it retroactively rewrites history.

One-time products

Single payment checkouts map cleanly: one event, one amount, one UTM snapshot in metadata. RPV by source for launch week is readable within days if traffic is tagged.

Bundles and lifetime deals behave like one-time even if you grant 12 months access, still one event.

Subscriptions: trial vs no trial

Trials delay cash. Marketing spike on signup week may show traffic without revenue until trial converts. Track:

  • signup or trial_started as leading indicator.
  • checkout.session.completed or first paid invoice as lagging revenue.

Do not compare trial launches to no-trial launches using only week-one RPV.

Annual vs monthly at checkout

Annual plans inflate week-one cash RPV vs monthly. Segment by price_id in webhook payload when reviewing creative. A tweet that attracts annual buyers looks like magic on cash RPV while MRR story is quieter.

Upgrades and cross-sells

Existing customer upgrades pollute acquisition metrics if you count every invoice.paid. Filter customer.created date within attribution window or use metadata acquisition_campaign frozen at first touch.

Table stakes dashboard rows

RowEvent filter
New self-serve revenueFirst paid checkout per customer
Expansion revenueUpgrades after day 30
Renewal revenuesubscription_cycle invoices

Marketing weekly: row one only.

Comparing channels on subscriptions

Newsletter may drive fewer checkouts but higher annual share. Twitter may drive monthly tire-kickers. Slice plan type × source when sample allows; otherwise note ambiguity in decisions.

Gumroad / Lemon overlap

If you sell on Gumroad and Stripe, unify new revenue definitions across webhooks, same approach as digital product guides.

Worked example

Launch week:

  • 40 new Stripe customers, 30 monthly $19, 10 annual $190.
  • Cash RPV looks stellar; new MRR is modest.

Action: keep annual-heavy email angle; change Twitter CTA to monthly-friendly trial page, not “Twitter bad.”

Honest limits

Stripe events do not tell you why someone chose annual. Qual interviews still matter.

Cross-links

Split events before you split hairs about copy. Acquisition metrics should hurt a little, that means they are not padded with renewals.

Cohort chart without a warehouse

Export first-payment dates by week from Stripe; overlay traffic by week from analytics. Rough visual correlation beats pretending one dashboard metric explains LTV.

Pause and resume subscriptions

Paused subs should not count as churn in marketing reviews nor as new revenue when resumed, filter status transitions in webhook handlers.

Coupons and attribution

Heavy coupon weeks inflate conversion rate while cutting RPV. Store coupon_id on revenue row to explain dips that are pricing strategy, not channel failure.

Partner stacks (Rewardful, etc.)

Affiliate plugins may fire parallel webhooks, dedupe revenue or affiliate share double-counts in “new revenue.”

Free plan → paid upgrade path

If free tier lives on same domain, upgrade revenue should carry UTMs captured at original signup stored on user row, metadata on upgrade alone is too late.

Board metrics vs marketing metrics

Board wants MRR; marketing wants first-touch RPV. Present both with definitions on slide one, mixing them in one number creates bad strategy.

Event cheat sheet for webhook handlers

Stripe eventUsually meansMarketing row?
checkout.session.completedFirst payment or setupYes, if new customer
customer.subscription.createdSub existsSometimes duplicate of checkout
invoice.paid + subscription_createFirst invoiceYes
invoice.paid + subscription_cycleRenewalNo
invoice.paid + manualFounder invoiceOnly if tagged

Implement filters in code, not in spreadsheet pivots each Sunday.

Lifetime deals vs MRR narrative

Lifetime SKUs behave like one-time in event terms but behave like “bad MRR” in board slides. Tag price_id or product_metadata=lifetime on revenue rows so launch reviews do not compare LTD week to subscription week without a comment. Cash RPV spikes; retention metrics do not apply the same way.

Churn and attribution (do not mix)

Cancellation webhooks are retention, not acquisition. A spike in customer.subscription.deleted after a pricing change belongs next to reading RPV after pricing moves, not in utm_source tables.

Hybrid Gumroad + Stripe sellers

Course on Lemon, SaaS on Stripe, use separate new revenue definitions per provider but the same window when comparing launch weeks. See traffic-to-sales ratio for digital products and Stripe guide for SaaS; never sum ratios without labeling.

Launch postmortem script (15 minutes)

  1. New customers count (Stripe filter: created in pin).
  2. First cash by utm_source (metadata filter).
  3. Plan mix by price_id.
  4. One sentence: “Channel X drove annual-heavy buyers” or not.
  5. Action on traffic or offer, not on blended “revenue up.”

Trial conversion lag table (illustrative)

Day after trial start% of eventual conversions (example)
0–115%
745%
1480%

Your product differs, track once, then stop comparing trial launches to no-trial launches on day-three RPV.

Metadata freeze at first touch

On first successful checkout, copy UTMs to Customer metadata and never update on renewal. Upgrades without new campaigns should not refresh utm_campaign to direct. See metadata guide.

Dunning and failed payments

invoice.payment_failed is not negative marketing RPV, it is billing ops. Do not subtract failed attempts from channel tables unless you enjoy arguing with yourself. Successful retry days later may lack fresh UTMs; attribute to original customer metadata.

Seat expansion and team plans

Adding seats mid-contract inflates cash without a new campaign. Tag expansion=true in webhook handler when quantity increases on existing subscription. Marketing weekly reviews exclude expansion unless you ran a dedicated seat-growth email with UTMs.

Export sanity check

Stripe Dashboard “export customers” vs analytics “new revenue rows” should match within a few percent each month. Large gaps mean webhook filters are wrong, often counting renewals as new or dropping checkout.session.completed on trials.

Board slide footnote

Paste under MRR chart: “Marketing table uses first paid checkout per customer; renewals excluded.” One footnote prevents a quarter of strategic arguments.

Webhook ordering and trial starts

Fast Apple Pay on trial signup can reorder client events relative to webhooks, same class of bug as pageview after webhook. Metadata on Session create attributes trial starts even when success pageview fires late.

Annual planning note

When you set next year’s marketing goals, write the revenue event name beside the goal (“new checkout completed only”) so finance and growth slides use the same Stripe filter.

Hub

Stripe guides · Gumroad guides for hybrid sellers

More on this topic