WarpLink
SDKsReact Native

Deferred Deep Links

Preserve link context through App Store and Play Store installs.

Deferred deep links let you route users to specific content even when they don't have your app installed. The user clicks a link, installs from the App Store or Play Store, and on first launch the SDK matches them back to the original link.

How It Works

  1. User taps a WarpLink URL in a browser
  2. WarpLink captures browser signals via a JavaScript interstitial
  3. User is redirected to the App Store (iOS) or Play Store (Android)
  4. User installs and opens the app
  5. SDK detects first launch (UserDefaults on iOS, SharedPreferences on Android)
  6. SDK collects device signals and sends them to the attribution API
  7. Server matches against stored click data
  8. Deep link returned with isDeferred: true
import { useEffect, useState } from 'react';
import { WarpLink, type WarpLinkDeepLink } from '@warplink/react-native';

function App() {
  const [isReady, setIsReady] = useState(false);

  useEffect(() => {
    WarpLink.checkDeferredDeepLink()
      .then((link) => {
        if (link?.isDeferred) {
          navigateTo(link.deepLinkUrl ?? link.destination);
        }
      })
      .catch((error) => {
        console.warn('Deferred deep link check failed:', error.message);
      })
      .finally(() => {
        setIsReady(true);
      });
  }, []);

  if (!isReady) return <SplashScreen />;
  return <>{/* Your app */}</>;
}

Confidence-Based Routing

const link = await WarpLink.checkDeferredDeepLink();
if (!link?.isDeferred) return;

const confidence = link.matchConfidence ?? 0;

if (confidence > 0.5) {
  // High confidence — navigate directly
  const productId = link.customParams['product_id'] as string | undefined;
  if (productId) {
    navigation.navigate('Product', { id: productId });
  } else {
    navigation.navigate('WebView', { url: link.destination });
  }
} else if (confidence > 0.3) {
  // Medium confidence — show suggestion
  navigation.navigate('Suggestion', {
    message: 'Were you looking for this?',
    url: link.destination,
  });
}
// Below 0.3 — ignore, show default onboarding

Confidence Scores

ScenarioConfidenceMatch Type
IDFV re-engagement (iOS)1.0deterministic
Play Install Referrer (Android)1.0deterministic
Enriched fingerprint, < 1 hour0.85probabilistic
Enriched fingerprint, < 24 hours0.65probabilistic
Enriched fingerprint, < 72 hours0.40probabilistic
Multiple candidates-0.15 per extraprobabilistic

Match Window

WarpLink.configure({
  apiKey: 'wl_live_abcdefghijklmnopqrstuvwxyz012345',
  matchWindowHours: 48,
});

Platform Differences

iOSAndroid
Deterministic matchIDFV (re-engagement)Play Install Referrer
First launch trackingUserDefaultsSharedPreferences
ATT required?No (IDFV is exempt)N/A

Caching Behavior

  • Attribution check happens once per install (first launch only)
  • Result cached by the native SDK
  • Subsequent calls to checkDeferredDeepLink() return null

Edge Cases

Offline First Launch

checkDeferredDeepLink() rejects with E_NETWORK_ERROR. The first-launch flag may be consumed, so retrying later may return null.

Check for connectivity before calling checkDeferredDeepLink() if your first-launch experience depends on it.

App Reinstall

  • iOS: UserDefaults may persist across reinstalls (iCloud backup). SDK may return cached result.
  • Android: SharedPreferences cleared on uninstall. Fresh install triggers new attribution.

Only the most recent click is matched.

On this page