All posts
AttributionApril 15, 20267 min read

MMP API Integrations: Cohorts, Ad Revenue, and the End of CSV Reconciliation

AdsAgent ingests MMP data natively from AppsFlyer, Adjust, Singular, Branch, Kochava, GameAnalytics, and TenjinIO — API + postback, not nightly CSV dumps. The result is cohort tables, ad revenue attribution, and channel ROAS that all reconcile in one screen.

Mingxuan Liang (Kim)
Mingxuan Liang (Kim)
Founder, AdsAgent

Platform dashboards tell you one thing about your paid media. Stripe tells you a different thing. Your MMP tells you a third thing. For most operators the three numbers never agree, and the resolution ritual — export CSVs, paste into Sheets, reconcile at the end of each month — eats more hours than most people admit. We shipped direct API integrations to the major MMPs so that reconciliation stops being a weekly human job.

AdsAgent ingests MMP data natively from AppsFlyer, Adjust, Singular, Branch, Kochava, GameAnalytics, and TenjinIO. The integration is real API + postback, not nightly CSV dumps, so cohort cuts stay current and channel-level truth stays a single click away instead of a separate export.

Why MMP data matters more than platform data

Platform-reported conversions are useful for intraday pacing. They are useless for cohort economics. Three specific failure modes, all of which MMPs fix:

  • Cross-platform double counting. Meta and TikTok both claim 7-day view-through credit; platform totals sum to 200-300% of true installs. MMPs enforce last-touch attribution across channels with deterministic device graphs, which deduplicates natively. (Web purchase flows have a parallel double-counting trap inside Meta itself — see Meta CAPI and iOS in 2026 for the event_id dedup mechanics.)
  • Post-install engagement. Platforms see the install event. MMPs see day-1 retention, day-7 retention, day-30 ARPU, purchase cohorts, and feature-level engagement. The channel with the highest install count often has the worst cohort quality, and you cannot see that from any ad manager.
  • Ad revenue attribution. For publishers running ad-monetized apps, rewarded-video and interstitial revenue is the actual ROAS numerator. Platforms do not see this at all. MMPs that wire AdMob, AppLovin MAX, ironSource, and Unity mediation back through their own SDKs do, and AdsAgent surfaces it alongside IAP revenue in the same channel breakdown.

What AdsAgent surfaces via MMP

Once an MMP is connected — one OAuth or API-key step per provider — AdsAgent ingests and presents the following without any CSV work:

  • Cohort tables cut by install date, campaign, ad set, creative, country, placement, or any combination. Each row shows installs, d1/d7/d30 retention, ARPU, LTV prediction, and ROAS against spend pulled from the matching ad platform.
  • Per-product revenue depth. A saved product maps to one or more MMP events (signup, first purchase, key level reached). Each event has its own count, unique-user count, and revenue stream, with breakdown by country or placement.
  • Channel-level ROAS that uses MMP-attributed revenue as the numerator and platform-reported spend as the denominator. This is the only ROAS number that treats cross-platform double-counting and post-install behavior correctly at the same time.
  • Ad revenue integration for apps. For titles with ad monetization, AdsAgent layers rewarded/interstitial revenue data from MMP ad-revenue tracking into the same per-cohort table as IAP revenue. You see the full LTV picture on one screen.
  • Freshness signals. Every MMP pull is background-synced; reads tell you whether the cohort you are looking at is fresh, syncing, stale, or missing. You never guess whether the number you are looking at is from two minutes ago or two days ago.

How the integration works

For each MMP we run a native connection flow:

  • AppsFlyer: API V2 authentication against the master API token; we pull Pull API reports, cohort reports, and ad revenue reports on a scheduled cycle plus on-demand fetch.
  • Adjust: Adjust Report Service API + deliverable-level push. Cohort reports arrive via scheduled Pull; SKAN attribution is handled through Adjust's server-side bundle.
  • Singular: REST API for cohort reports and server-to-server postback validation. Custom cohort metrics map cleanly into the same AdsAgent cohort table.
  • Branch and Kochava: similar shape — REST pulls for cohort tables plus event postbacks for near-real-time install + event attribution.
  • GameAnalytics and TenjinIO: primarily read-side pulls for cohort cuts and revenue tables, biased toward game publishers.

Every connection is scoped per AdsAgent workspace. One workspace can host multiple MMP connections — separate AppsFlyer app tokens, multiple Adjust trackers — and cohort metadata stays isolated per connection_id. Switching MMPs mid-year is not a full data migration; it is adding a second connection and flipping the default source.

What this means for a marketing team

The concrete change: the weekly reconciliation meeting, the one where someone pulls ads-manager CSVs and the finance person pulls the MMP CSV and they argue about why numbers disagree by 18%, does not need to happen anymore. Both numbers live in the same dashboard, against the same spend denominator, with the same attribution policy.

The second-order change is that operators start asking better questions. When cohort ARPU is one click away from campaign spend, people stop optimizing for CPI and start optimizing for d30 ROAS, which is the number that actually decides whether the account lives or dies. The tooling you use shapes the decisions you can make — and for most ad accounts, the rate-limit on better decisions has been how hard it is to get MMP data next to platform data in the same frame. That is the rate limit we built against.

More from the blog