Background

Core concepts

A short tour of the words used everywhere else in these docs — install, click, attribution, postback, partner, fraud signal.

Why you need any of this

You launch a mobile app. You spend $500 on TikTok ads, $500 on Meta. Two weeks later you have 3,000 installs.

Question: which $500 worked?

You can't tell. The Play Store / App Store don't tell you where an install came from. TikTok says “our ad got clicked 12,000 times.” Meta says the same. Neither knows whether their click became an install. Without this connection, you're flying blind — and ad networks know this, so they all claim credit for the same install.

That's the problem an MMP solves. It's the neutral umpire that watches the click on the ad, watches the install on the device, and tells everyone who actually scored.

What an MMP does

An MMP (Mobile Measurement Partner) sits between your app, your ad networks, and your reports. It answers three questions:

  1. Where did this install come from? — was it a paid Meta ad, a TikTok creative, or organic search? This is attribution.
  2. What did the user do after installing? — sign-up, level-up, purchase, churn. This is event tracking.
  3. Tell my partner so they can claim credit / get paid. — this is postbacks.

Reflect does all three at roughly 1¢ per install at scale (vs. 6–15¢ for AppsFlyer / Adjust). Same data, same partners, same postbacks.

The attribution chain

User clicks ad      →  /l/<link_id>  →  302 to App/Play Store  →  user installs
                       (logged as a click)                          ↓
                                                          SDK sends app_install
                                                                    ↓
                                                  Server matches click → install
                                                          (deterministic OR fingerprint)
                                                                    ↓
                                                          Attribution row written
                                                                    ↓
                                                          Postback fired to partner

The matching step is the heart of an MMP. Reflect uses two strategies:

  • Deterministic — Android Play Install Referrer, iOS AdServices token. The store delivers the click_id to the SDK directly. Highest fidelity.
  • Fingerprint fallback — match by IP + device model + country within a 24-hour window. Used when the deterministic path isn’t available.

Identifiers

IdentifierLifetimeUsed for
install_uuidPer install (PlayerPrefs)Reflect’s primary key for a device. Survives app updates, not reinstalls.
user_idSet by you via SetUserIdYour domain’s identity. Used to stitch anonymous → known with _user_alias.
GAID (Android)Per device, user-resettableCross-app advertising id. Skipped if user opted out (LAT) or no advertising consent.
IDFA (iOS)Per device, user-resettableSame as GAID. Only collected after ATT prompt is Authorized.
IDFV (iOS)Per vendor (your apps)Always available. Useful as a fallback when ATT is denied.

Postbacks

A postback is an HTTP call Reflect makes to your ad partner when a tracked event fires for a user they sent. Format is partner-specific — Meta wants {"event_name": "Purchase", "value": 9.99}, Google wants a different shape, etc.

You configure a postback template per partner per event in the admin panel. Reflect handles macro substitution, deduplication (so the same install doesn’t fire app_install twice), and exponential-backoff retries.

Fraud filtering

Reflect rejects bad clicks and installs at six layers:

  1. Cloudflare WAF — datacenter ASNs, known scrapers killed at the edge before any code runs.
  2. Edge filter — UA bot patterns, missing referer, geo restrictions.
  3. Rate limiter — sliding-window limits per IP /24, auto-blocks at threshold.
  4. Honeypot links — invisible-to-humans tracking links; any hit auto-blocks the source IP for a week.
  5. CTIT analysis — Click-To-Install-Time too short (<10s) or too long (>48h) gets flagged.
  6. Partner quality scoring — auto-pause partners with abnormal install rates.

Multi-tenant

Every Reflect account is a company (tenant). Companies own apps, partners, tracking links, postback templates, and reports. The CompanyKey in your SDK config identifies the tenant; the server rejects any app/key combination that doesn’t belong together.

Pricing model

Reflect bills by attributed installs per month, with an included quota and per-install overage rates. The Free tier is intended for SDK setup and integration testing — it's hard-capped at 200 attributed installs / month and ingestion stops past that, keeping your bill at $0. Paid plans use soft caps with overage billed at fractions of a cent.

See the pricing page for current tiers.

Core concepts · Reflect Docs