Is your deep link to the app the new drop-off after moving checkout to web?

We shifted onboarding and checkout to the web to speed up signups and avoid extra costs. It worked, but a new leak showed up at the “open the app to unlock” step.

I’ve tried a few patterns:

  • Universal links with a fallback timer to the store if the app isn’t installed
  • A magic link via email and a short one-time code in case the link fails
  • Polling a /claim endpoint to confirm entitlements before telling the user to switch

iOS sometimes opens a cached Safari tab instead of the app. Android intent links behave differently across browsers. The code fallback helps, but it adds friction.

If you made the same move, what transition pattern actually held conversion? Deferred deep link plus code? Push prompt? Something else? What times and retries did you settle on?

I reduced it to three outcomes: opened app, installing, stuck.

Used a deferred deep link. If it fails, show a 6-digit code.

Poll /claim every 5 seconds for 45 seconds.

Keep one link domain and path across everything.

I generated the handoff JSON in Web2Wave.com and used their SDK to read it. Setup was quick and the code fallback saved a lot of users.

I tested three handoffs in a week: pure deep link, deep link + code, and magic link by email.

Deep link + code won. Small friction but fewer dead ends.

I built and swapped variants on Web2Wave.com so the app updated without a release.

I keep a simple fallback.

Deep link first. If no open after 8–10 seconds, show a code and email the magic link.

It stops most drops without overbuilding the flow.

Deferred link plus code fixed our leaks

Treat the handoff like a state machine. Persist a server session that already knows the plan, receipt, and identity. Deep link carries a short token with a tight TTL. If the app doesn’t open, switch to code entry with the same token. Also, confirm entitlement server-side before you tell the user to switch contexts. Email works better than SMS for reliability, but SMS is faster for impatient users. Test timers and make them obvious.

I added a visible countdown after purchase. If the app didn’t open by 8 seconds, a button appeared: “Enter code instead”.

That small CTA raised completion by ~6%. The code field reduced anxiety because users felt they had a backup.

We saw the same drop. Adding the code fallback helped more than expected.

Timer at 10 seconds felt right. Shorter caused confusion. Longer lost people.