Documentation
Quick start: mobile app
The five stages of a mobile integration, who does each one, and what proves it worked.
The shape of it
A website integration is one snippet and one webhook. A mobile one has five stages, and only the first two are code. Most stalled integrations we have seen stalled on stages three to five, because nobody had told the marketer that a developer alone cannot finish them.
| Stage | Who does it | What it buys |
|---|---|---|
| 1. Create the app in the panel | Marketer | The public key, app secret and every snippet, filled in for this app. |
| 2. Add the SDK and initialise it | App developer | Installs, opens, sessions, funnel events and identity start arriving. |
| 3. Put the visitor id on the purchase | App developer | The one field that lets a store purchase find the install that earned it. |
| 4. Connect store revenue | Whoever owns the Play Console / App Store Connect | Purchases, renewals and refunds arrive from the store itself, signed. |
| 5. Test on a real device | Marketer + developer, one afternoon | Proof, before an ad runs, that a click becomes an attributed sale. |
1. Create the app
Apps → Add app → choose Android or iOS and enter the package name (com.example.app) or bundle id. Both must match the store listing exactly: a store notification whose package does not match this app is refused, by design.
That gives you three things, all on the app's tabs:
- Public key (App details) -- names the app in every beacon. Safe to ship.
- App secret (Protection → Beacon signing) -- signs beacons. Ships inside the build, never in source control.
- Snippets (SDK integration) -- the dependency line, initialise call and purchase code, per framework, with your key and host already filled in.
The Keys & credentials page explains what each one can and cannot do.
2. Add the SDK
Pick your framework and follow its page end to end. Each is written to be handed to a developer as-is.
Every one of them ends with the same check: open the app once, and the install row appears on the app's Overview tab within seconds, with signed = true.
3. Put the visitor id on the purchase
A store notification names the purchase and the amount, but not the buyer. The only thing that links a sale back to the install that earned it is a field you set when launching the purchase: obfuscatedAccountId on Android, appAccountToken on iOS.
Skip it and every sale still books -- as unattributed. Ad spend still counts, so ROAS reads low and a working campaign looks dead. It is one line per platform, and each SDK page shows it in that platform's billing library.
4. Connect store revenue
Revenue never comes from the app; anything an app can send, anyone can forge. It comes from the store's own server-to-server notifications, which need setting up in the store console.
- Google Play -- Real-time developer notifications through Pub/Sub, plus a service account so we can read each purchase's amount.
- App Store -- App Store Server Notifications V2, one URL, no secret.
- RevenueCat -- one webhook, if you already use it. Then neither store setup is needed.
5. Test on a real device
Follow Testing a mobile integration. In short: a tracking link, a device that has never had the app, an install from the store, and a licence-tester or sandbox purchase. It takes an afternoon and it settles every question before an ad runs.
Then connect ad accounts under Ad accounts, exactly as for a website. Nothing about that step is mobile-specific.

