TrackRev
Blog
11 min read
Revenue attribution

Attributing Revenue to Paid Ads: Platform vs Verified ROAS

Ad platforms report paid search at 2.4% and paid social at 1.2% click-to-paid — and still overcount ROAS. How to verify ad revenue against your billing provider.

Muzahid Maruf — Founder of TrackRev.io

Muzahid Maruf, Founder

LinkedIn

On this page
  1. 01Why this matters for your revenue
  2. 02How ad platforms count conversions
  3. 03The billing-verified alternative
  4. 04Platform-reported vs billing-verified ROAS
  5. 05UTM discipline for paid campaigns
  6. 06Paid channels in context
  7. 07When platform-reported ROAS is good enough
  8. 08When billing-verified attribution is worth the work
  9. 09The stack math
  10. 10When NOT to use TrackRev

Explore with AI

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

Across 4,217 TrackRev workspaces, paid channels convert clicks to paying customers at roughly half the overall median — paid search at 2.4% and paid social at 1.2% click-to-paid against a 4.2% median — yet the ad platforms reporting on those same campaigns almost always claim more revenue than your billing system can account for (TrackRev platform data, Q2 2026).

The gap is not fraud; it is arithmetic. Every ad platform is built to attribute conversions to itself, counts them inside its own walled garden, and does so on a last-click or view-through basis you cannot audit.

When two platforms both claim the same sale — and they routinely do — the sum of platform-reported revenue exceeds the money that actually landed in your billing account.

This guide is about closing that gap: attributing paid-ad revenue to the click that truly sourced it, and verifying every reported conversion against a real charge — so you know whether paid ads are genuinely one of the channels paying your MRR.

Key Takeaways

  • Ad platforms over-report revenue because each one claims conversions inside its own walled garden on a last-click or view-through basis, and no platform deduplicates against another, so the reported sum exceeds the money in your billing account.
  • Paid search converts to paid at a median 2.4% and paid social at 1.2%, against a 4.2% all-channel median, and paid acquisition carries just a 0.8x lifetime-value multiplier versus 2.3x for direct.
  • Billing-verified ROAS anchors on the billing charge, credits one source per sale, and reverses on refunds and chargebacks — the number that is safe to set a budget on.
  • Keep platform click IDs (gclid, fbclid) for the platform’s optimisation loop and disciplined UTMs for your own channel report; inconsistent UTMs inflate the Direct bucket with paid revenue.
  • Platform reporting is fine for fast creative testing; verify against billing the moment real budget rides on a scaling decision.

The one-line version

Platform-reported ROAS answers “how many conversions does this ad platform want to claim?” Billing-verified ROAS answers “how much money actually landed in your billing account from this campaign, after refunds?” The second number is smaller, harder to game, and the only one worth setting a budget on.

Why this matters for your revenue

Over-counted ROAS is expensive in a specific, compounding way.

If two platforms each claim a share of the same sale, your blended return looks like 3x when the money that actually cleared makes it 1.8x — and you respond by pouring more budget into a channel that is quietly losing money.

The error is not a rounding issue; it is the difference between scaling and cutting.

The lifetime-value side makes it worse.

Even the sales paid ads genuinely drive are worth less over time: paid acquisition carries a 0.8x lifetime-value multiplier in our data, against 2.3x for direct and 1.9x for newsletter (TrackRev platform data, Q2 2026, at /data/saas-attribution-benchmarks).

So an over-stated ROAS on a channel that also retains poorly is the worst of both errors — you are over-crediting acquisition and ignoring churn.

Getting to a billing-verified number is how you stop funding the illusion and start funding the revenue you keep. Our guide to attributing Stripe revenue to channels covers the join in depth.

How ad platforms count conversions

To see why the platform number is inflated, you have to understand what each platform can and cannot observe. Three structural facts of ad-platform reporting produce the over-count.

Click IDs and the walled-garden problem

Every ad platform stamps its own click identifier on outbound links — gclid for Google, fbclid for Meta, msclkid for Microsoft. That identifier lets the platform recognise a returning visitor as one of its own clicks.

But a platform can only ever see the clicks on its ads; it has no visibility into any other channel a buyer touched.

It therefore scores the sale as if its click were the whole story, because within its walled garden it was the only story available.

Last-click inside each platform

Most platforms default to crediting the last ad click before the conversion — and many also count view-through conversions, where an ad was merely displayed and never clicked. Each platform, applying that logic independently, concludes it deserves the credit.

Neither is coordinating with the other, so a buyer who clicked a search ad on Monday and saw a social ad on Wednesday can be claimed in full by both.

Why the numbers double-count

The result is a simple failure of addition. Sum the revenue every platform reports and you are counting shared conversions more than once, because no platform subtracts the ones another platform also claimed.

The total is not a measurement of your paid revenue; it is a sum of overlapping claims, and it will always be larger than the money in your billing account.

A worked example of double-counting

Picture a single buyer: she clicks a Google search ad, does not convert, returns a week later via a Meta retargeting ad, and pays. Google counts one conversion; Meta counts one conversion. Two platforms, two reported sales, one actual charge.

Multiply that across a month of overlapping campaigns and the platform-reported total drifts steadily above reality — not because any single platform lied, but because the sum was never deduplicated against a shared source of truth.

The billing-verified alternative

Billing-verified attribution flips the anchor. Instead of trusting each platform’s self-report, it starts from the one event that is unambiguous — the charge — and works backwards to the click that sourced it.

There is exactly one charge per sale, so there is exactly one credited source, and the double-count disappears.

Anchor on the charge, not the ad click

A billing-joined tool treats a real payment as the unit of truth.

When a charge lands in Stripe (or Paddle, Polar, or Lemon Squeezy), it is matched to the stored journey of the customer who paid, and credit is assigned once.

Because the charge is the anchor, the same sale can never be counted twice — a claim from one platform and a claim from another resolve to the single customer they share.

Carry the click ID through to the charge

The join works because the platform’s own click ID is captured the instant the click happens — at a first-party redirect on your own domain — and bound to the visitor before any browser or extension can strip it.

That identifier travels with the visitor through signup and checkout, so when the charge fires you can say precisely which ad click began the journey.

You keep the platform’s identifier; you simply stop letting the platform be the one who scores the outcome.

Refund- and chargeback-adjusted ROAS

Revenue is not final at checkout, and paid channels tend to attract more refund-prone buyers than organic ones.

A billing-joined tool reverses a channel’s credit when a payment is refunded or charged back, so the ROAS you read is net of money that left.

Platform reporting fires its conversion once and never reverses it, which is one more reason the platform number runs high on exactly the channels most prone to refunds.

Platform-reported vs billing-verified ROAS

The two numbers answer different questions. One is optimised to justify ad spend to you; the other is optimised to match your bank.

DimensionPlatform-reportedBilling-verified
Unit of truthThe platform’s own conversionThe Stripe/Paddle charge
Deduplicates across platformsNoYes
Counts view-through conversionsOftenNo
Reverses on refund / chargebackNoYes
Auditable to a specific chargeNoYes
Safe to set budget onWith cautionYes

Behaviour summarised from common ad-platform reporting documentation as of July 2026; confirm each platform’s current attribution and view-through settings in its own help centre. TrackRev behaviour as published at /products/multi-touch-attribution.

UTM discipline for paid campaigns

Click IDs let the platform recognise its click; UTMs let you recognise the channel. You need both, and the UTMs have to be disciplined or the paid revenue you worked to verify will scatter into the wrong buckets.

A naming convention that survives reporting

Fix a convention and never deviate: lower-case values, no spaces, a controlled vocabulary for utm_source and utm_medium, and a campaign name that a human can read in six months.

utm_source=google&utm_medium=cpc&utm_campaign=q3-brand is legible; utm_source=Google_Ads&utm_medium=PaidSearch in one campaign and utm_source=google&utm_medium=cpc in another silently splits one channel into two rows.

Click IDs and UTMs are complementary

It is tempting to treat the platform’s gclid as your attribution and skip UTMs, or vice versa. Keep both.

The click ID is for the platform’s optimisation loop; the UTM is for your own channel report, which has to compare paid against email, organic, and affiliate on one axis.

Our UTM parameters and Stripe attribution guide covers the tagging in detail.

Why inconsistent UTMs inflate Direct

When a UTM is missing, misspelt, or stripped between the ad and the charge, the resulting revenue has to be filed somewhere, and it usually lands in Direct.

That inflates your highest-converting bucket with paid revenue that belongs to an ad, making paid look weaker and Direct look stronger than either is.

Capturing the click server-side on your own domain, before stripping can apply, keeps the source attached through the journey.

The over-counting story, concretely

Say paid search and paid social each report 30 conversions for the month. Summed, that is 60 — but joined to billing, the deduplicated total is 44 unique paying customers, several of whom both platforms claimed. At a 2.4% click-to-paid rate for paid search and 1.2% for paid social, and a paid lifetime-value multiplier of just 0.8x (TrackRev platform data, Q2 2026), the billing-verified picture is not only smaller than the platform sum — it is worth less per customer over time than the direct and newsletter channels those ads were meant to beat.

It helps to see the paid numbers next to the channels you are comparing them against. The contrast is the whole argument for verifying rather than trusting.

ChannelMedian click-to-paidLTV multiplierWhat it means
Direct7.1%2.3xHighest intent; often hides organic and dark social
Newsletter4.8%1.9xHigh intent, low media cost
Organic search2.2%2.1xLow click-to-paid, high lifetime value
Paid search2.4%0.8x (paid avg)Converts, but retains poorly
Paid social1.2%0.8x (paid avg)Lowest paid conversion; verify hard

Median click-to-paid and channel lifetime-value multipliers from TrackRev platform data, Q2 2026 (4,217 workspaces). Paid channels share one published lifetime-value multiplier (paid avg). See /data/saas-attribution-benchmarks.

When platform-reported ROAS is good enough

Billing verification is not always the right tool for the moment. There are real cases where the platform’s own signal is exactly what you want.

Early testing and creative iteration

When you are testing creative and the goal is fast in-platform optimisation, the platform’s own conversion signal is the one the algorithm learns from.

At that stage you are tuning ads, not setting a quarter’s budget, and the speed of the platform’s feedback loop matters more than its precision. Verify later, when the winning campaigns are the ones you intend to scale.

When you feed conversions back to the platform

Ad algorithms improve when you send high-quality conversion signals back to them, ideally server-to-server.

Here the platform’s model is the consumer of your data, so you cooperate with it — but note that the conversions worth sending are the billing-verified ones, not a browser pixel that may over-fire.

Verification and platform optimisation are complementary: you verify to know the truth, then send that truth back.

When billing-verified attribution is worth the work

The moment real budget rides on the answer, the platform’s self-report stops being sufficient.

Real budget on the line

Scaling decisions need the deduplicated, refund-adjusted number, because the cost of being wrong is measured in months of misallocated spend.

If you are about to double a channel’s budget on the strength of its ROAS, that ROAS should be one you can trace to specific charges. See how the models change the picture in attribution models for SaaS compared.

Parity first, then the shared model

TrackRev does not ask you to abandon the platform click IDs your ads rely on — it captures gclid, fbclid, and the rest at a first-party redirect, then adds the billing join the platforms structurally cannot make.

Because attribution, link tracking, and the affiliate programme share one data model, paid, organic, email, and affiliate all resolve to a single definition of a sale. Parity on click capture where it matters, then the deduplicated revenue layer on top.

The stack math

Verifying paid revenue should not mean buying yet another tool.

Teams commonly bolt a link tracker like Bitly Growth (~$35/mo) onto an affiliate tool like Rewardful Starter (~$49/mo) — about $84/mo across two products with two definitions of a conversion that never reconcile, and neither of which joins your ad clicks to revenue.

TrackRev is $39/mo for link tracking, revenue attribution, and the affiliate programme on one shared model, with a free tier at 1,000 events/mo to reconcile against your platform numbers before you pay. Pricing is on the pricing page.

When NOT to use TrackRev

If you run a single ad platform, never scale beyond it, and only need in-platform optimisation, that platform’s native reporting may be all you require.

TrackRev is also not an ad-network tracker — if you run an affiliate network placing offers across many advertisers, or need real-time bidding and media-buying automation, that is the TUNE and Everflow category, not this one.

TrackRev is built for SaaS and subscription teams that want to know which channel drove revenue they actually kept, on their own first-party data.

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 is the founder of TrackRev.io and Contant.io. He writes about marketing attribution, link tracking, and revenue analytics for SaaS teams.

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

Keep reading

Related articles from the TrackRev blog.

Stop guessing where your revenue comes from.

Set up TrackRev in 5 minutes. Free tier covers 1,000 events / month — no card needed.

Attributing Revenue to Paid Ads: Platform vs Verified ROAS · TrackRev