← All articles

Why your RevenueCat revenue doesn't match Meta Ads Manager

You open RevenueCat and it says you made 10,000 dollars this month. You open Meta Ads Manager and it says your ads drove 3,000. Same business, same month, two numbers that are nowhere near each other. So which one is lying to you?

Here is the short version. Neither is exactly lying, but RevenueCat is closer to the truth. RevenueCat sees every dollar your subscribers actually pay you. Meta only sees the dollars you tell it about, and by default you are telling it about a tiny slice. The gap between those two numbers is not a mystery, it is a measurement setup problem, and it is quietly costing you money because Meta spends your budget based on the smaller number it can see.

What each tool is actually counting

The mismatch makes a lot more sense once you know what each number really means.

RevenueCat is your source of truth for revenue. It sits at the store level and records every trial, conversion, renewal, upgrade, and refund across iOS and Android. When a subscriber renews three weeks after install, RevenueCat knows. That is why its number is the big one.

Meta Ads Manager is not counting your revenue. It is counting the revenue it can both see and attribute to an ad it served. Those are two different jobs, and Meta is bad at both by default. It only hears about the purchase events you send it, and it only claims the ones it can tie back to a click or view inside its attribution window. Everything else falls off the report.

So you are not comparing two revenue numbers. You are comparing your real revenue against the sliver of it that Meta happened to witness and take credit for.

The four reasons the numbers never line up

1. Most of your revenue happens where Meta cannot see it. Renewals and trial conversions fire server side, weeks after the install, long after the phone stopped talking to the Meta SDK. If you are only sending installs and trial starts, Meta never hears about the money that actually matters. This is the single biggest cause, and it is exactly what a proper RevenueCat to Meta Conversions API setup fixes.

2. The two tools count on different days. RevenueCat books revenue when the cash actually lands. Meta credits a conversion back to the day of the click or view that drove it, inside a set attribution window. A renewal that happens today gets credited by Meta to an ad someone tapped six days ago. Same dollar, different date, so any given day will look mismatched even when the totals are close.

3. iOS attribution is broken by design now. After ATT, most iOS users do not grant tracking, so Meta cannot deterministically match them to an ad. It leans on SKAdNetwork, which is delayed, aggregated, and modeled. RevenueCat still sees every one of those purchases because it works at the store level. Meta sees a blurry, estimated version. That alone opens a permanent gap on iOS that no setup fully closes.

4. Double counting and dedup problems. If your web pixel and your Conversions API are both firing without shared event IDs, Meta double counts. Refunds, currency conversion, and tax handled differently between the two tools widen the gap further. These are smaller, but they are real, and they are why even a good setup rarely matches to the dollar.

Which number should you actually trust

For “how much money did my business make,” trust RevenueCat. It is the closest thing you have to ground truth on subscription revenue.

But here is the part people miss. The Meta number is not just a report, it is the thing Meta optimises your budget against. Meta buys more of whatever events you feed it. So the goal is not to make the two numbers match on a dashboard. The goal is to get RevenueCat’s truth, the real paid events, flowing into Meta so it optimises on actual revenue instead of on the cheap, meaningless events it sees by default.

Why this gap is costing you money, not just confusing you

This is the part that turns a reporting annoyance into a real problem.

Meta optimises toward the events it can see. If the only things you send it are installs and trial starts, Meta gets very good at buying cheap installs and trials, because that is the target you gave it. The trouble is that cheap trials are often the ones that never convert to paying subscribers. You end up with a great looking cost per trial and a business that is not growing, because Meta was optimising for the wrong finish line.

Feed Meta the real paid events out of RevenueCat and everything changes. Now it is hunting for people who actually subscribe and renew, not people who tap install and vanish. The gap in your reports is a symptom. The disease is that Meta has been spending your money chasing the smaller number this whole time.

How to close the gap

You will never get the two numbers to match exactly, and you should stop trying. What you want is for the trend to track and for the paid events to reach Meta. Here is the checklist:

  1. Send your real revenue events from RevenueCat to Meta through the Conversions API: trial conversions, initial purchases, and renewals, not just installs. The setup guide walks through this.
  2. Optimise your campaigns on the paid events, not on installs or trial starts.
  3. Deduplicate your pixel and Conversions API events with shared event IDs so nothing gets counted twice.
  4. Accept that iOS will always undercount inside Meta because of SKAdNetwork. Judge iOS on trend and on your RevenueCat truth, not on Ads Manager’s exact figure.
  5. Check that refunds and currency are handled consistently, so a big refund month does not look like a tracking bug.

What “matching” realistically looks like

Done right, RevenueCat will still show more total revenue than Meta claims, especially on iOS. That is expected and fine. What you are looking for is that the two move together, that Meta is now seeing your paid events, and that your cost to acquire a real paying subscriber sits comfortably below what that subscriber is worth. If you are not sure where that line is, you can sanity check it in a couple of minutes with the breakeven ROAS and LTV to CAC calculators. A healthy gap there matters far more than making two dashboards agree.

Bottom line

RevenueCat and Meta Ads Manager will never show the same number, because they are answering different questions. RevenueCat tells you what you earned. Meta tells you what it saw and can take credit for. The dangerous part is not the mismatch itself, it is that Meta spends your budget based on the smaller number, so if you are only feeding it installs and trials, it is optimising for the wrong outcome. Get your real RevenueCat revenue flowing into Meta and the gap shrinks to something you can explain, while your ads finally start chasing customers who actually pay.

If your RevenueCat and Meta numbers are miles apart and you cannot tell how much of that is normal and how much is broken, that is exactly what I untangle on a teardown call. I will look at what events you are actually sending Meta, where the revenue is leaking out of the report, and whether your ads are optimising for real subscribers or just cheap trials.

Ads live but the numbers do not make sense? That is what I fix.

Request a teardown call → Apply for done-for-you