Measured on our own account
We pointed our own reporting at our own ad account. It was wrong in five ways.
Every reporting tool says it is accurate. Almost none publish the check. We held ours back from anyone else until it could reproduce, channel by channel, what Apple and Meta themselves report for our own spend — and until it would say stopped when nothing was delivering. It took five fixes to get there. All five are below, with what each one would mean for your account.
Window 2026-07-23 to 2026-08-20 · reconciled 2026-08-21 · figures are ours, in JPY. They are small: ¥51,689 of spend across two channels. The point of this page is not the size of the spend, it is the class of error — every one of these scales.
What the platforms say, and what we now say
Spend is exact. Install counts are not: each number below is the count of a specific system, labelled with how it counted. We no longer collapse them into one.
The last two rows are the same money. Two systems, two counts, 2.0x apart — and both of those CPIs are correct for what they measure. On Search Ads the equivalent gap was 1.04x. Averaging them would produce a number that is neither measurement, and adding them would double-count events that happened once.
The five defects
1. Another product's ad spend was sitting inside this product's report — ¥6,411 of it.
Why: The daily figures were read from the ad account total. One ad account can carry campaigns for several products, and the account total does not know which is which.
Fixed by: Read the per-campaign rows and keep only the campaigns belonging to the product being reported on.
On your account: If you run more than one app or brand out of one ad account, check whether your reporting splits by campaign or by account. The account total is the number most tools reach for first, because it is the one the API hands you.
2. Deduplication ran backwards, so the oldest report won. Meta spend read ¥6,121 instead of ¥7,307.
Why: Reports arrive repeatedly for the same day and get better as the platform settles. We iterated newest-first and overwrote each day as we went, which leaves the last write — the oldest file — in place.
Fixed by: Let the newest report win. Fixing only this brought the total onto the platform's own figure.
On your account: Ad platforms restate recent days. Any pipeline that stores dailies has to decide which restatement wins, and the wrong answer here is silent: the totals stay plausible, they are just stale.
3. Search Ads installs were parsed and then thrown away. The count shown was modelled, not measured.
Why: The parser read the install figure and stored only the spend. Installs were then apportioned across channels using the channel mix from a single, most recent report — one report's mix, applied to every day in the window.
Fixed by: Store the measured per-channel installs and stop apportioning for channels that report their own.
On your account: A borrowed ratio applied across a window looks like data. Ask of any per-channel install count whether it was measured on that day or spread from somewhere else.
4. With zero campaigns delivering, the dashboard headline still read "Running automatically across channels, inside the guardrails."
Why: The headline was chosen from spend inside the window. Spend inside a 30-day window says nothing about whether anything is delivering today — every campaign had been paused and the window still held their spend.
Fixed by: Carry delivery state into the dataset and say it plainly when nothing is live.
On your account: This is the failure worth checking for in whatever you use. A dashboard that cannot say 'stopped' will keep reassuring you for as long as the window holds old spend.
5. For one and the same ¥7,307, two systems reported 8 installs and 16 installs.
Why: Neither is a bug. The platform reports its own SKAN/modelled count; the MMP reports click attribution. They are different measurements of the same events.
Fixed by: Stop collapsing a channel into one CPI. Print every authority that has an install count, side by side, and label how each was counted.
On your account: The size of that gap is not a constant. On our Search Ads spend the two counts sat 1.04x apart; on Meta, 2.0x. If you only ever look at one of the two systems, this difference is structurally invisible to you.
The one that would have cost us money
Defect four is the one to take away. At the moment we measured, the number of campaigns actually delivering was 0 — everything was paused. The dashboard still opened with a sentence about campaigns running inside their guardrails, because that sentence was chosen from spend inside the window, and the window still contained the spend from before the pause. Nothing about it was a lie anyone wrote; it was a lie the window told. A reporting tool that structurally cannot say nothing is running will keep reassuring you for exactly as long as its window holds old spend. That is the check we would run first on whatever you use today: pause everything, and see how long it takes the dashboard to admit it.
What is still not fixed
Our engine totalled ¥50,300 for this window against ¥51,689 from the platforms — ¥1,389 short, or 2.7% . That gap is inside our reconciliation tolerance, which is exactly the problem: we can tell you it is small, and we cannot yet tell you what it is made of.
- · Our reconciliation tolerance is still loose: the command-line report prints money in compact form, so it cannot resolve a difference under a thousand yen. Until that is exact, we cannot name what the remaining gap is made of.
- · Delivery state is checked against the ad platforms directly, not carried by the reporting engine itself. The headline is right today because the check is external to it.
- · This audit covers the two channels we actually spent on. It says nothing about connectors we have not run our own money through.
We publish this list because a page of fixed defects with no open ones is not a report, it is a brochure.
Run the same check on your own numbers
You do not need an account to start. Our CSV check reads an Ads Manager export in the browser you already have open and sends it nowhere. If your export and your app store disagree about installs — the disagreement defect five is about — that is the guide on which count belongs in the denominator, and if you are not sure your export even has the columns to check, start here.
Or connect the accounts and have the reconciliation run continuously — start a free trial. No credit card to begin.