Test the whole journey before you spend.
Click, install, open, right screen. Run the full loop on a real device and check the audit log says the match was deterministic, before a penny goes on ads.
- Who runs it
- Developers, paid ads
- Time to set up
- An hour per platform
- Plan
- Free, Growth for the audit log
A test link per platform.
Make one test link per platform, tagged so the test installs are easy to spot and leave out of reports later.
- Point it at a screen you'd notice if it went wrong.
- Keep the tag the same for every run.
Tap, install, open: the right screen.
On a real device, tap the link, install from the store, and open the app. It should open on the screen the link points at, not home.
- resetForTesting in the SDK clears the install flag, so you can run it again.
- Do it on both platforms.
Deterministic, on both platforms.
There's one number: the match type on the test install, on each platform, the day before spend starts. Deterministic on both is the green light. Anything else is a bug you found for free.
- The audit log (Growth) shows how each install was matched.
- Re-run after every SDK or app release.
One-time setup, then it's all yours.
Your developer runs this once per release. resetForTesting clears the SDK's install state so the same device can go through the journey again.
LinkTrail.onLink(link => {
// link.customData = { cmp: "qa-attribution-check", run: "2026-09-03-a" }
router.navigate(link.path, link.customData);
});The full walkthrough: Verify attribution before you spend: proving the funnel works in staging, not in a campaign report
Attribution is the kind of system that fails silently. A missing Android fingerprint, an AASA file served with the wrong content type, a consent gate that never opens — none of these throw an error. They produce a campaign report a month later with 'organic' where the paid installs should be, and a launch retrospective about why the numbers don't add up. The whole thing is testable before launch. Most teams don't.
What problem does this solve?
Before spend goes out, you want proof that a click on a link produces an install that attributes deterministically to that link, on both platforms, with consent handled. The proof is a row in the match audit log. Getting that row in staging costs an afternoon. Getting it from a live campaign costs the campaign.
How do you set the test up?
One test link per platform, tagged so the test installs are unmistakable and can be excluded later. Then the full loop on a real device: tap the link, install from the store, open, and read the audit log for that install.
{
"deepLinkPath": "/",
"customData": {"cmp": "qa-attribution-check", "env": "staging", "run": "2026-09-03-a"}
}What does a passing run look like?
| Step | Android | iOS |
|---|---|---|
| Click | Recorded against the link | Recorded against the link |
| Install | Play Install Referrer carries the click token | Click token read via the paste control on first open |
| First open | Deferred link routes to the right screen | Deferred link routes to the right screen |
| Consent | setConsent(true) called after your prompt | setConsent(true) called after your prompt |
| Audit log | Match type: deterministic | Match type: deterministic |
Anything other than deterministic on this run is a finding. 'None' usually means the click token didn't survive — the Referrer on Android, the paste control on iOS. 'Probabilistic' means matching is on for the workspace and the deterministic path failed, which is worth knowing before you rely on it.
How do you run it more than once?
- resetForTesting in the SDK clears the install flag, cached attribution and device ID, so the next open behaves like a genuine first launch without an uninstall cycle. It's for testing only; it must not ship.
- The link validator checks the AASA and assetlinks.json files the whole thing depends on. Run it against the link domain before the device test, not after.
- Register every Android signing fingerprint you'll install from — Play, upload key, and each developer's debug key. A missing one is the most common reason the Android run fails.
- Test with consent declined too. The correct result is an install with no attribution and events queued; if attribution appears, the gate isn't gating.
Which metric should you watch?
There's only one: the match type on the test install, on each platform, on the day before spend starts. Deterministic on both is the green light. Anything else is a bug you just found for free.
Which teams own pre-spend attribution testing?
- Engineers
- Performance & paid
Which LinkTrail features does pre-spend attribution testing need?
- resetForTesting in the SDK
- Match audit log (deterministic vs probabilistic)
- Managed AASA and assetlinks.json
- Google Play Install Referrer
- Consent gating (on by default)
Testing questions.
How do you test attribution before a campaign launches?
Create one tagged test link per platform, then run the full loop on a real device: tap the link, install from the store, open the app, and read the match audit log for that install.
What does a passing attribution test look like?
On both Android and iOS: the click is recorded against the link, the deferred link routes to the right screen, consent is granted after your prompt, and the audit log shows the match type as deterministic. 'None' usually means the click token didn't survive.
How do you repeat the test without reinstalling?
Call resetForTesting in the SDK, which clears the install flag, cached attribution and device ID so the next open behaves like a first launch. It is for testing only and must not ship.
If you're doing this, you'll probably want these.
Measuring iPhone campaigns
Apple limits what you can see per user. The iOS SDK registers for SKAdNetwork and sets conversion values, so ad networks still report by campaign.
One cost per install
Meta says 900, TikTok says 1,100, your dashboard says 1,400. One cost per install for each campaign, from your imported spend and the installs LinkTrail counted.
Launch day
Turn a waitlist into installs that land on the right first screen, not a generic welcome.
Test your first link.
Free for your first 5,000 users. No card, no sales call.