Use case

Marketing data reconciliation

Make your numbers tie out. Opera reconciles MMP attribution against ad-platform claims on every run — variance visible, thresholds flagged, in the report you already use.

Every performance team has lived the meeting where Meta says 1,400 conversions, AppsFlyer says 900, and someone asks which is 'right'. The honest answer is that they measure different things — and a report that doesn't show both, with the gap, will eventually mislead someone with budget authority.

Why the numbers never match

  • Attribution windows — Meta's 7-day-click/1-day-view vs the MMP's configured windows credit different sets of users
  • Credit date — Meta books conversions to the impression date; Google models them onto the click date and restates
  • Multi-touch double-claims — two platforms each claim the same install; the MMP gives it to one
  • SKAN — iOS postbacks are delayed, coarse and capped; platforms model around them differently
  • Timezones and currency — account timezone vs app timezone vs report timezone, plus FX on multi-currency accounts

None of this is fraud; all of it is mechanics. Reconciliation makes the mechanics visible.

The manual version (and why it dies)

Pull each platform's claimed results, pull the MMP, align dates, divide, eyeball percentages — for every channel, every week. It's an hour of careful work that gets skipped the week you're busy, which is precisely the week a tracking break goes unnoticed.

What Opera does

  1. Pulls platform-side spend and claimed conversions with pinned settings for the period
  2. Pulls MMP-attributed installs and events for the same window, app timezone respected
  3. Aligns grain (channel/campaign/day) and currency
  4. Computes variance per channel: platform-claimed vs attributed
  5. Writes both series side by side with the variance column — append-only, previewed
  6. Flags any gap beyond your threshold in the summary

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

What the output looks like

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% ⚠

Stable variance is just attribution physics. A jump in variance is a broken postback, a changed window, or a tracking gap — caught the week it happens, not at the quarterly business review.

When the referee itself changes

Reconciliation assumes a stable MMP baseline — so MMP-side changes need the same announcement discipline as definition changes. An SDK upgrade, a changed attribution window, a privacy-setting shift or an MMP migration will move the attributed series for measurement reasons, and every channel's variance will jump together — which is itself the diagnostic signature (one channel jumping is a channel problem; all channels jumping is a referee change). The playbook: annotate the week in the report, re-baseline each channel's variance band over the following month, and never trend attributed numbers across the change without the annotation attached. Opera carries the annotation in the rows and the summary, so the discontinuity stays explained long after everyone has forgotten the SDK version that caused it. The same discipline covers planned window changes: announce, annotate, re-baseline — three steps that turn a measurement migration from a quarter of confused trend lines into one documented week.

Reconciling spend itself, not just conversions

Conversions get the attention, but spend has its own gaps: API-reported spend vs the invoice (fees, adjustments, coupons), multi-currency accounts converted at different rates by different people, and timezone edges moving a day of spend between weeks. The reconciliation view treats spend as a first-class column: API spend per platform tied out against the UI on every run, one FX policy applied at pull time, and a monthly invoice check where finance cares. Most weeks it's a silent ✓ — which is exactly what makes the one week it isn't visible.

Reporting the gap to clients without drama

Sophisticated clients ask why Meta's number and the report's number differ; unsophisticated ones assume someone's wrong. The reconciliation view answers both without a meeting: both series labeled, the variance explained once in the definitions block ("platforms claim under their own attribution; outcomes are MMP-attributed"), and movement flagged when it matters. Showing the gap deliberately reads as competence; having it discovered reads as concealment — the column is cheap insurance on trust.

Setting thresholds that earn attention

Alert design decides whether the variance column gets read or muted:

  1. Baseline first — record 4 weeks of variance per channel before flagging anything; Meta might live at +35%, TikTok at +45%, and both are fine
  2. Flag movement, not level — alert when a channel leaves its own band (±10–12pts is a sane start), because the level is physics and the move is information
  3. One flag, one cell, one suspect — every alert names the channel, the week and the likely cause class (window change, postback gap, mix shift), so the next action is obvious
  4. Quarterly recalibration — iOS share and channel mix drift; bands should too, as announced changes

The investigation playbook when a flag fires

Variance jumped — the fifteen-minute triage, in order:

  1. Settings diff — did an attribution setting or window change on either side this week? (Commonest cause, fastest fix)
  2. Postback health — did the MMP receive events normally? A platform-side rise with an MMP-side flat line is a tracking gap
  3. Mix shift — did spend move toward iOS or view-heavy placements? Expected variance moves with mix
  4. Campaign-type change — new retargeting or re-engagement spend claims conversions the MMP assigns elsewhere
  5. Then, and only then, the boring answer — a genuine performance change both systems will agree on within their own logic

The playbook's value is sequence: teams that start at #5 spend a week debating performance before finding the changed window setting from #1.

Safety and rollout

Reconciliation rows follow the same write rules as everything else: schema re-validated, previewed, append-only, logged. Start with one channel pair (AppsFlyer + your biggest platform), confirm the variance matches your manual calc once, then add channels and set the threshold.

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

Does it replace my MMP?
No — it reads from your MMP and your ad platforms and reconciles them. The MMP stays the attribution source of truth; Opera makes the comparison automatic.
What's a 'normal' variance?
It depends on windows, mix and iOS share — which is why Opera tracks *your* baseline per channel and flags movement against it, rather than against a universal number.
Can it flag large discrepancies automatically?
Yes — set a threshold per channel or globally and breaches are called out in the Slack/email summary with the affected rows.
Does it reconcile spend as well as conversions?
Yes — API spend is tied out per platform every run, one FX policy applies at pull time, and invoice-level checks can run monthly where finance needs them.
Which sources are supported?
AppsFlyer and Adjust on the attribution side; Meta, Google, TikTok and Snapchat on the platform side.

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.