Documentation
Testing it before you ship
Prove a deferred install is matched to the right link BEFORE your app reaches the App Store — through TestFlight and through a local build — with a live view of every click and match as it happens.
The problem with testing this
An installed app opening a link is easy to test: tap, watch it open. A deferred install is not, because the real journey runs through the App Store — and your app is not on the App Store yet, which is the whole reason you are testing.
The good news is that the App Store is not actually part of the mechanism. What matters is: a click was recorded, then a fresh install of your app started and asked us whether it matched one. Any install that is genuinely fresh will do.
Open the live view first
Everything below is easier with Apps → your app → Debug → Live view open on a laptop. It shows each click arriving, which route resolved it, and whether the install was matched or refused, with the confidence. It refreshes every few seconds.
Check the environment selector matches the link you are tapping. Looking at live while tapping a test link is the commonest reason people think nothing happened.
Method 1 — TestFlight
The closest thing to the real journey, and what we would use.
- Upload a build and add yourself as an internal tester. Install it from TestFlight once, then delete it from the phone.
- On the phone, tap one of your links. Let it go through to the App Store page (or the TestFlight page — the destination does not matter here). The click is now recorded. Confirm it in the live view.
- Install from TestFlight again.
- Open the app. Watch the live view: an install should appear within a second or two, attributed or refused, with a reason either way.
What this proves: the whole deferred path — click recorded, fresh install, matched, parameters delivered. What it does not prove: anything about the App Store page itself, or about install referrer behaviour on Android.
Method 2 — a local build
Faster, and it works without uploading anything. An install from Xcode is a real fresh install as far as the SDK is concerned, because deleting the app deletes its storage — and that storage is the only thing that tells us this launch is not the first.
- Delete the app from the phone. Not “stop and re-run” — delete it. This is the step people miss, and skipping it makes every launch look like an ordinary one.
- Tap your link on the phone. Confirm the click in the live view.
- Build and run to the device from Xcode.
- Watch the live view for the install.
qr.onLink(link => {
console.log(link.source) // 'deferred'
console.log(link.confidence) // below 1 — see the deferred matching page
console.log(link.alias) // the link you tapped
console.log(link.params) // your own fields from the URL
})The step-by-step plan
Work down it. Tick each one. Anything that does not match, stop there.
- An installed app opens a link. Tap a link with the app installed. It should open, and
onLinkshould fire withsource: 'opened'andconfidence: 1. - The click appears in the live view — unless the app opened directly, in which case it will not, and that is correct. A working universal link never reaches our servers.
- Your own fields arrive. Add
?visitor_id=TEST1to a link. Tap it. Checklink.params.visitor_idisTEST1. - A deferred install attributes. Method 1 or 2 above.
- The fields survive the deferred path too. The same
visitor_id, on the install rather than the click. This is the one to check if you pay affiliates. - A refusal is legible. Delete the app, install it without tapping any link first, and open it. The live view should show an install that was not attributed, and say why. A blank is a bug; a clear “no clicks to match against” is the system working.
- An event lands. Call
qr.track('purchase', { value: 1, currency: 'GBP' })and check it appears in your report.
If nothing appears at all
In the order each is actually the cause:
- The environment selector does not match the link. By a distance the commonest.
- The universal link worked, so nothing reached us. Your app opened — that is success.
- The app was not really deleted, so this is not a first launch.
- Apple has cached an old association file. It can take up to 24 hours, and the troubleshooting page explains how to tell.
Ask the documentation
It answers from these pages only, and links what it used. If the answer is not here it says so rather than guessing — then email [email protected].