General News

September 1, 2026

Stripe attribution: the cheapest trials were worth the least

Vincent Gaemers

One subscriber's 12 months of €49 Stripe payments on a timeline. €539 of the €588 lands after Meta's 7-day click window ends.

On this page

Google Ads and your Stripe balance will never report the same revenue. The pixel records a value at checkout and stops listening. Stripe keeps counting, through every refund and every renewal, for years. For subscription businesses, that gap decides budgets. Usually wrongly.

A subscription business billing through Stripe asked us a simple question: which channel brings in members who stay? They couldn't answer it. Stripe showed monthly revenue. The ad platforms showed cost per trial. Nothing connected the two.

Once payments were joined to each customer's journey, 12 months of member revenue traced back to the campaign that started each relationship. Renewals included. The result reversed the budget plan. The channel with the cheapest trials produced the lowest 12-month revenue per member. The channel marketing had been told to cut produced the highest. (Anonymised.)

If you bill through Stripe and judge channels on platform-reported conversions, some version of this reversal is sitting in your account right now. Three blind spots put it there.

The pixel stops listening at checkout

A "purchase" conversion is recorded the moment someone pays. The refund a week later never reaches the ad platform. So a campaign that attracts refund-prone customers looks identical to one that attracts keepers. Stripe knows the difference to the cent. Your ROAS column never will.

Renewals arrive with nobody to thank

For a subscription business, the first payment is the smallest number in the relationship. Months 2 through 24 land in Stripe with no click, no session, and no UTM. Nothing fires. Judged on first payments, the channel with the cheapest trials always wins. Judged on 12-month revenue, it often loses.

Every platform grades its own homework

Google, Meta, and LinkedIn each count conversions with their own tag, their own window, and their own model. Since iOS 14.5, part of each count is an estimate. Add the three numbers together and you'll report more revenue than Stripe collected. Finance notices.

One subscriber's 12 months of €49 Stripe payments on a timeline. €539 of the €588 lands after Meta's 7-day click window ends.

What changes when Stripe joins the journey

The fix isn't a better pixel. It's putting Stripe's ground truth on the same timeline as the clicks that caused it. Connecting Stripe to Spectacle takes about 5 minutes. Every successful payment and every refund lands on the journey of the customer who paid. Renewals are credited to the journey that acquired the subscriber. Payments in three currencies become one number in your reporting currency. Payments match on a spectacle_user_id you set in Stripe metadata, or on the customer's email; the full event list and matching order live in the Stripe docs.

From there, revenue per channel is net revenue. And the same payment values can flow back to Google Ads, Meta, and LinkedIn as conversion values, so Smart Bidding optimises for people who pay and stay instead of people who complete a checkout.

Five checks for any payment setup

These apply whether you bill through Stripe, Mollie, Chargebee, Lemon Squeezy, or invoices from your ERP. Hold any tool, ours included, to all 5:

  1. Revenue is net. Refunds subtract from the campaign that got the credit. A report that can't go down isn't reporting revenue.
  2. Renewals credit the journey that acquired the customer. Otherwise your channel comparison rewards cheap trials.
  3. One currency, one number. A campaign selling into 3 markets gets 1 return figure.
  4. Cost per paying customer, not per conversion. Ad spend joined to real payments, so a channel that produces trials that never convert shows up as what it is.
  5. The number reconciles. Marketing's revenue figure should tie back to the Stripe balance finance already trusts. If it can't, the budget conversation runs on the wrong number.

On Mollie or Chargebee instead?

The blind spots are identical on every processor. Mollie's dashboard knows your revenue and nothing about the clicks behind it. Chargebee will give you MRR and churn, but no marketing dimensions and no ad cost. Today Spectacle ships the Stripe integration, with Lemon Squeezy available on request. Revenue from any other biller can reach the journey through spectacle.track() or the REST API. Want Mollie or Chargebee native? Tell us. Payment integrations get built with the customers who need them.

FAQ

How do I attribute Stripe revenue to marketing campaigns?

Connect Stripe to a tool that tracks your website first-party. Spectacle listens to successful payments and refunds, matches each one to the customer's journey by metadata or email, and reports net revenue by channel, campaign, and keyword. Setup takes about 5 minutes; details on the Stripe integration page.

Why doesn't my Stripe revenue match Google Ads conversion value?

Google Ads records a pixel value at the moment of conversion, inside its own window and model. It never sees refunds or renewals. A payment-based report subtracts refunds, credits renewals to the acquiring campaign, and applies one journey window across every channel. That's why it reconciles with your Stripe balance and the pixel number never will.

Can I attribute subscription renewals to the original campaign?

Yes. Each Stripe renewal arrives as a new successful payment and is credited to the journey that acquired the customer. 12-month revenue per channel becomes a report instead of a spreadsheet.

Does this work with Mollie or Chargebee?

The approach works on any processor. Spectacle's native payment integrations today are Stripe, and Lemon Squeezy on request. Revenue from Mollie, Chargebee, or any other biller can be sent with spectacle.track() or the REST API, and native integrations are built on customer request.

Start the free trial with Stripe connected →

Or book a demo and bring one month of Stripe revenue you want explained →