Skip to content
Reflect
Get started
Run beside your current MMP

Mobile attribution that shows its work.

Replay any attribution decision, see where each postback stands, and run Reflect beside your current MMP before you switch.

Read the docs

No credit card. No sales call.

Attribution replaySample data
Credited to
Mintegral
Decision
deterministic
Click to install
1m 37s
Postback
Delivered
  1. ClickMintegralclick_id 3b7e91c4…Recorded
  2. InstallFirst open reportedinstall referrerReceived
  3. DecisionCredited to MintegraldeterministicCTIT 1m 37s
  4. PostbackMintegralDelivered
Decision explaineddeterministic matchinstall 0a2b8e…7890

Postback templates for the major ad networks

  • Meta
  • TikTok
  • Google Ads
  • Snap
  • AppLovin
  • Unity Ads
  • Mintegral
  • Liftoff
  • Moloco
  • ironSource
  • + more

Attribution you can check for yourself.

The numbers come with the evidence behind them.

Replay any attribution decision.

Open an install and see why it was credited: the stored decision and the winning click.

  1. The stored decision
  2. The winning click
  3. The credit
Attribution replayinstall 0a2b8e…7890Sample data
Stored decision
{
  "ctit_ms": 97000,
  "attribution_window_h": 168,
  "is_organic": false
}
Winning click
  • MintegralWinnerclick_id 3b7e91c4…clicked_at_ms 1791295331000
Credit
Credited toMintegral
Decisiondeterministic

Run beside your current MMP.

Install Reflect alongside your current MMP and compare installs network by network, with campaign traffic sent through Reflect tracking links. Your current MMP keeps running as it is.

Read the SDK quickstart
Installs by networkCurrent MMP vs Reflect · last 7 daysIllustration
Installs per network over the last 7 days, your current MMP against Reflect (illustration)
NetworkCurrent MMPReflectDifference
Mintegral4,1284,131+0.07%
AppLovin2,9042,897−0.24%
Unity Ads3,6153,622+0.19%
Liftoff1,2081,205−0.25%
Organic594612+3.03%
Your current MMP keeps running as it is.

See where each postback stands.

Follow each postback from queued to delivered, retrying or dropped, install by install, with delivery totals on the Postbacks page.

Admin panel walkthrough
Postback statusA row for each installSample data
  • 0a2b8e…7890Delivered
  • 5d41c7…e3a1Retrying · 2 attempts
  • 91f0ab…2c64Dropped · 1 attempt
Partner
Mintegral
Event
app_install
State
Retrying
Attempts
2

One integration model, every SDK.

Unity, Unreal Engine, Flutter, React Native, iOS, Android, Web and a server-to-server API.

QuickstartPick your platform
Choose a platform
GameBootstrap.cs
Initialize once
var config = new ReflectConfig {
  CompanyKey = "co_live_…",
  AppKey = "app_live_…",
  SigningSecret = "YOUR_SECRET",
  BaseUrl =
    "https://api.reflect.cloud"
};
ReflectSDK.Initialize(config);
Track an event
ReflectSDK.TrackEvent("login");

Events receivedSample data

  • 14:05:12loginReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
MyGameInstance.cpp
Initialize once
// Bind OnDeepLink first.
FReflectConfig Config;
Config.AppKey =
  TEXT("YOUR_KEY");
Config.SigningSecret =
  TEXT("YOUR_SECRET");
FReflect::Initialize(Config);
Track an event
// After Initialize finishes.
FReflect::TrackEvent(
  TEXT("level_up"));

Events receivedSample data

  • 14:05:12level_upReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
main.dart
Initialize once
WidgetsFlutterBinding
  .ensureInitialized();
final cfg = ReflectConfig(
  appKey: 'YOUR_KEY',
  signingSecret: 'YOUR_SECRET',
);
await Reflect.initialize(cfg);
Track an event
Reflect.trackEvent('level_up');

Events receivedSample data

  • 14:05:12level_upReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
App.tsx
Initialize once
import { Reflect } from
  "@reflect-sdk/react-native";

Reflect.initialize({
  appKey: "YOUR_KEY",
  signingSecret: "YOUR_SECRET",
});
Track an event
Reflect.trackEvent("sign_up");

Events receivedSample data

  • 14:05:12sign_upReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
AppDelegate.swift
Initialize once
import ReflectSDK

let config = ReflectConfig(
  appKey: "YOUR_KEY",
  signingSecret: "YOUR_SECRET"
)
// Register listeners first.
Reflect.initialize(config)
Track an event
Reflect.trackEvent(.purchase)

Events receivedSample data

  • 14:05:12purchaseReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
MyApp.kt
Initialize once
// In Application.onCreate
val config = ReflectConfig(
  appKey = "YOUR_KEY",
  signingSecret = "YOUR_SECRET",
)
Reflect.initialize(this, config)
Track an event
Reflect.trackEvent("level_up")

Events receivedSample data

  • 14:05:12level_upReceived
  • 14:03:48app_openReceived
  • 14:03:48app_installReceived
main.js
Initialize once
import { ReflectWeb } from
  "@reflect-sdk/web";

// Needs a browser-enabled app.
ReflectWeb.initialize({
  appKey: "YOUR_KEY",
  autoPageView: true,
});
Track an event
ReflectWeb.trackEvent(
  "sign_up");

Events receivedSample data

  • 14:05:12sign_upReceived
  • 14:03:48page_viewReceived
  • 14:03:48session_startReceived
POST /s2s/event
Send an event
POST /s2s/event HTTP/1.1
Host: api.reflect.cloud
Authorization: Bearer srv_…
Content-Type: application/json

{
  "event_name": "purchase",
  "event_ts_ms": 1793422821890,
  "install_uuid":
    "0a2b8e5c91d34f7890"
}
Response
{
  "accepted": 1,
  "event_id": "9c1d4e7a…",
  "audit_key": "s2s/…"
}
Quickstart

Snippets are trimmed for the page. Keys come from your dashboard: app keys for the SDKs and a separate server key for server-to-server.

Live in three steps.

  1. Send the form

    Once it is approved you get an invite email, and after that you sign in with a magic link. No password needed.

  2. Add the SDK

    Pick the SDK for your platform and initialize it with your app keys.

  3. Turn on your networks

    Pick a postback template for each network and switch it on.

Security and privacy, built in.

Controls for your data, your requests and your team’s access.

Privacy controls

Postbacks withhold raw advertising IDs and the device IP by default. Deletion, opt-out and data-export requests run from the console, and a DPA is available.

Postback macrosSample data
  • {idfa} Withheld
  • {ip} Withheld
  • {idfa_sha256}Allowed

Signed SDK requests

Requests from the mobile SDKs are signed with your app’s signing secret.

SDK requestSample data
  • POST /event
  • X-Reflect-App-Key: app_live_…
  • X-Reflect-Signature: 64-char hex

Audit log

Changes to apps, partners, tracking links and team access are recorded with who made them and when.

Recent changesSample data
  • 14:05 Link created Dana
  • 13:48 Partner updated Sam
  • 13:12 Role changed Dana

Access control

Magic-link sign-in, optional two-factor authentication that each user can turn on, and Google SSO that your company can require once we set up its email domain.

Security settingsSample data
  • Magic-link sign-in Enabled
  • Two-factor authentication Optional
  • Google SSO On request

Switching MMPs shouldn’t be a leap.

Install Reflect alongside your current MMP and compare results before you cut over. Your current MMP keeps running as it is.

Illustration

Switch when you are ready.

Questions, answered.

Still unsure? Talk to support.

What is Reflect, and who is it for?

Reflect is a mobile measurement partner (MMP). It attributes installs to the campaigns behind them and sends postbacks to your ad networks. It is built for app and game teams who want to see why each install was credited.

Can I run Reflect beside my current MMP?

Yes. Install the Reflect SDK beside your current MMP, such as Adjust, AppsFlyer, Singular or Branch. Your MMP keeps running as it is. To compare installs by network, send campaign traffic through Reflect tracking links. Parallel traffic is metered like any other traffic.

Which ad networks have postback templates?

The catalog has postback templates for the major ad networks, including Meta, TikTok, Google Ads, Snap, AppLovin, Unity Ads, Mintegral and Liftoff. They are starting points: check one against the network’s current postback spec, then switch it on.

Which SDKs and platforms are supported?

Unity, Unreal Engine, Flutter, React Native, iOS (Swift and Objective-C), Android (Kotlin and Java) and Web, plus a server-to-server API for events your backend owns. They all follow the same integration model.

How is user data handled?

Postbacks withhold raw advertising IDs and the device IP by default. Deletion, opt-out and data-export requests run from the console, and a DPA is available. Changes to apps, partners, tracking links and team access are recorded in an audit log.

Do I need to talk to sales?

No. Request access and, once it is approved, you can start sending events yourself. Support is there if you want help.

Request access

Here is what happens after you send the form.

  1. You send the formTell us about your app and the networks you run.
  2. We review itIf it’s a fit, we email you an invite.
  3. You set up your workspaceOpen the invite, add your app and get its keys. After that you sign in with a magic link.

No credit card. No sales call.

I’m signing up as

I have, or am launching, an app. Approved requests get an invite email.

Verifying you’re human…

You’ll only hear from us about your request. No marketing, no newsletter.

Already have an account? Sign in

Running campaigns for clients? For agencies