Skip to content
Documentation

Documentation

Testing a mobile integration

Prove that a click becomes an attributed sale, on a real device, before an ad ever runs. The Testing tab is built for exactly this afternoon.

What you are proving

One afternoon, one device, one journey, in this order:

  1. A fresh install arrives, signed, reporting the SDK version you shipped.
  2. The install is attributed to the link or campaign you tapped.
  3. Backgrounding and reopening the app arrives as a session.
  4. On iOS, the tracking prompt was shown and accepted (the advertising id is bound).
  5. Signing in arrives as identify().
  6. A funnel step arrives as an event.
  7. A test purchase arrives within seconds of the store's notification, flagged as a test.
  8. That purchase is attributed to the install from step 2.

The app's Testing tab shows each of these as it happens, and judges the whole list for the device in your hand. Nothing here needs an engineer on our side.

The Testing tab

Four panels, top to bottom:

  • Test device. Paste the visitor id (from any row in the stream) or the phone's advertising id (Android: Settings → Google → Ads; iOS: the IDFA once ATT is accepted) and look it up. You get one record for that device, grouped as *Attribution* (click time and install time, source, match method), *Activity* (sessions, each event with its last time, purchases) and *Identity & signing* (identity keys, advertising id, signed share, the SDK builds this device has run) — and a checklist of the eight steps above judged only from that device's own data. Devices seen in the last day are offered as chips, so you pick the phone off a list.
  • Live device stream. Every install, session, click, impression, event and purchase the app delivers, as it arrives, for the last six hours, polled every three seconds. Expand a row for every field it carried; *Inspect this device* sends its visitor id up to the inspector.
  • Sandbox purchases. The last 50 test-mode purchases — StoreKit testers, Play licence testers — with whether and to what each attributed. Every report leaves them out, which is right; this is the one place you can see them land without finding the device first.
  • Link debugger. Paste a tracking URL exactly as it sits in the ad platform, macros and all, and see what one click on it would record, where each device would be sent, and which parameters would be ignored. Nothing is recorded.

The device rule

The same applies, less strictly, to iOS: a first install on a device is the clean case.

Also: a build installed with adb, Android Studio, Xcode or react-native run-android carries no referrer at all. It proves the SDK sends, and nothing about attribution. The attribution test needs an install from the store.

Android, step by step

  1. Upload the build to an internal testing track and add the tester's Google account. The tester must open the opt-in link and accept, and that account must be the *active* one in the Play Store app.
  2. Add the same account as a licence tester (Play Console → Setup → Licence testing). Purchases then show *"Test card, always approves"* and charge nothing. This setting is account-wide.
  3. Create an install link on the app's Install links tab, pointing at the Play listing. Add campaign parameters when you use it: ?utm_source=facebook&utm_campaign=my_test. One link serves every campaign. The QR button on the link row is the quickest way to get it onto the phone.
  4. On the device: make sure the app is not installed. Scan or open the link. It must land in the Play Store app, not a web page; a browser that falls back to play.google.com produces a web install with no referrer.
  5. Install from that Play page and open the app. Within seconds the Testing tab's stream shows an install carrying rsclid=… and your utm_campaign, signed, and the expected SDK version. Look the device up: *Install received* and *Install attributed* are ticked.
  6. Leave the app closed for 30 minutes, then open it again. A session row arrives and *A session after the install* ticks. A quicker reopen is the same session by design (30 idle minutes), so it adds nothing to the stream; do this step last, while the purchase settles.
  7. Sign in and walk the funnel. identify() and an event row; both tick.
  8. Make a purchase. Within seconds of Play's notification a purchase row arrives, test, attributed to your campaign; the last two checks tick. If it is a subscription, leave it running: licence-tester plans renew every few minutes, and each renewal must book as its own conversion. That is the failure that looks fine on day one.

iOS, step by step

  1. Ship a TestFlight build, or run a development build with a Sandbox Apple ID signed in under Settings → App Store → Sandbox Account.
  2. Create an install link on the Install links tab, pointing at the App Store listing. iOS has no install referrer: a first install attributes deterministically only from an Apple Ads campaign (Apple Search Ads attribution), and from other channels only through the opt-in matching on the Attribution tab. What the link proves deterministically on iOS is re-engagement: a tap that opens the already-installed app through a universal link.
  3. Open the app once. The stream shows an install, signed. Look the device up.
  4. Accept the tracking prompt. *Tracking permission granted (IDFA)* ticks. If the prompt never appears, NSUserTrackingUsageDescription is missing from Info.plist; the SDK tab's integration checks say the same.
  5. Sign in and walk the funnel. Identify and event tick. The session step needs the app closed for 30 minutes first, so leave it for last.
  6. Make a sandbox purchase. App Store Server Notifications fire for sandbox purchases too; the conversion arrives flagged as a test and carries the buyer via appAccountToken. Sandbox subscriptions renew on an accelerated clock, so renewals can be checked the same afternoon.

Reading the result

You seeIt means
Install with rsclid in the referrer, campaign filled inAttribution is wired end to end. This is the goal.
Install with utm_source=google-play&utm_medium=organicInstalled from the store, but not from your link. The tester searched for the app instead of tapping.
Install with utm_source=(not set)A reinstall on a device that had the app before, or an install from the Play *website*. See the device rule above.
Install with an empty referrerInstalled with adb or from the IDE. Not a store install.
unsigned on the rowThe app secret did not reach the build. Each SDK page's secret section says why.
*identify() called* never ticksSign-in does not call identify(). Nothing else breaks, which is why the check exists: a reinstall or a second device can never be tied back to the campaign.
Purchase booked, UNATTRIBUTEDThe buyer field was not set on the purchase, or the install itself was unattributed (see above). The revenue is real; the link to the campaign is missing.
Purchase made, no row at allThe store's notification never arrived or could not be resolved. Google Play revenue and App Store revenue each end with a checklist.