Guide

How to reconcile AppsFlyer and ad-platform spend (and why they never match)

A practical, no-fluff guide for performance teams and agencies.

Meta says 1,400 conversions; AppsFlyer says 900. Neither is lying — they're answering different questions — but a report that shows only one of them will eventually mislead someone with budget authority. This guide is the mechanics of reconciliation: why the gaps exist, how to build the comparison so it's automatic, and how to read variance as a monitoring signal instead of a weekly mystery.

The five mechanical causes

  1. Attribution windows — Meta's 7-day-click/1-day-view credits users the MMP's configured windows don't, and vice versa
  2. Credit dates — Meta books conversions to the impression date; Google models conversions onto the click date and restates recent days; the MMP uses event time
  3. Multi-touch double-claims — a user who clicked Meta Tuesday and TikTok Thursday is claimed by both platforms; the MMP awards one
  4. SKAN — iOS postbacks arrive delayed, coarse and capped; each platform models around them differently
  5. Timezones and currency — account timezone vs app timezone, and FX on multi-currency accounts

Sum the platforms' claimed conversions and you'll exceed the MMP's total by 30–80% on a normal week. That's arithmetic, not fraud.

Building the reconciliation tab

Per channel, per period, four columns: spend, platform-claimed conversions, MMP-attributed conversions, variance % — plus a flag column against a threshold. The non-negotiables:

  • One period definition for both sides, resolved in the app's timezone
  • Platform pulls with pinned settings (the same attribution setting every week, stated in the header)
  • MMP events deduplicated per user before counting
  • SKAN held out in its own columns

Example

Channel Spend Platform conv. AF attributed Variance
Meta $13,900 1,388 1,012 +37%
Google $17,800 1,205 998 +21%
TikTok $9,400 833 571 +46% ⚠
Snap $7,100 512 376 +36%

How to read variance

The level is mostly physics — windows, mix, iOS share — and differs per channel. What matters is movement against each channel's own baseline. TikTok at +46% is only a finding if TikTok normally runs +30%: then something changed — a postback broke, a window setting moved, a campaign type shifted. Stable variance is context; jumping variance is a same-week alarm, which is the entire monitoring value of reconciling weekly instead of quarterly.

The manual version, and why it decays

Pull each platform, pull the MMP, align dates, divide, eyeball — an hour of careful work that gets skipped on busy weeks, which are precisely the weeks tracking breaks go unnoticed. Reconciliation only protects you if it runs every period, which is the argument for scheduling it.

QA checklist

  • ✓ Baselines recorded per channel before alerting on anything
  • ✓ One week recomputed by hand from raw pulls
  • ✓ Attribution settings stated in the tab header and pinned in the pulls
  • ✓ A deliberate test: change a window setting in a sandbox pull and confirm the variance flag fires

When not to bother

Single-channel accounts with trivial spend, or web-only funnels where the platform pixel is the source of truth. Reconciliation earns its tab when channels compete for budget based on these numbers.

How Opera runs it

Marketing data reconciliation runs this as part of every scheduled report: both sides pulled with pinned settings, variance computed per channel, thresholds flagged in the summary.

"Reconcile platform spend against AppsFlyer for last week and flag gaps over 10%."

See this running on your own reports.A 45-minute workflow audit maps your current process and shows exactly what Opera automates — step by step.

Frequently asked questions

Which number do I report to leadership?
MMP-attributed for outcomes and CAC, platform-claimed as the optimization signal each platform acts on — labeled, side by side. Choosing one and hiding the other is how trust gets lost later.
What's a 'normal' variance percentage?
There isn't a universal one — it depends on windows, channel mix and iOS share. Establish each channel's baseline over a few weeks, then alert on movement against it.
Does SKAN make reconciliation pointless on iOS?
It makes it coarser, not pointless: keep SKAN in separate columns, reconcile Android/web normally, and watch iOS variance for directional breaks.

See exactly what Opera would automate in your workflow.

A 45-minute teardown of how you report today: we map every step, mark what Opera automates, and send you the written spec — useful whether or not you buy.