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.paidwherebilling_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:
signuportrial_startedas leading indicator.checkout.session.completedor 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
| Row | Event filter |
|---|---|
| New self-serve revenue | First paid checkout per customer |
| Expansion revenue | Upgrades after day 30 |
| Renewal revenue | subscription_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 event | Usually means | Marketing row? |
|---|---|---|
checkout.session.completed | First payment or setup | Yes, if new customer |
customer.subscription.created | Sub exists | Sometimes duplicate of checkout |
invoice.paid + subscription_create | First invoice | Yes |
invoice.paid + subscription_cycle | Renewal | No |
invoice.paid + manual | Founder invoice | Only 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)
- New customers count (Stripe filter: created in pin).
- First cash by
utm_source(metadata filter). - Plan mix by
price_id. - One sentence: “Channel X drove annual-heavy buyers” or not.
- Action on traffic or offer, not on blended “revenue up.”
Trial conversion lag table (illustrative)
| Day after trial start | % of eventual conversions (example) |
|---|---|
| 0–1 | 15% |
| 7 | 45% |
| 14 | 80% |
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