Deep link attribution requires a Business plan subscription or higher.
Dub’s powerful attribution platform lets you understand how well your deep links are translating to actual users and revenue dollars inside your app.
Conversion analytics
This feature is currently only available for iOS (Swift). React Native and Android support are coming soon. If you’d like early access, please contact us.

Prerequisites

First, you’ll need to enable conversion tracking for your Dub links to be able to start tracking conversions:
If you’re using Dub Partners, you can skip this step since partner links will have conversion tracking enabled by default.
To enable conversion tracking for all future links in a workspace, you can do the following: To enable conversion tracking for all future links in a workspace, you can do the following:
  1. Navigate to your workspace’s Analytics settings page.
  2. Toggle the Workspace-level Conversion Tracking switch to enable conversion tracking for the workspace.
Enabling conversion tracking for a workspace
This option will enable conversion tracking in the Dub Link Builder for all future links.
Alternatively, you can also enable conversion tracking programmatically via the Dub API. All you need to do is pass trackConversion: true when creating or updating a link:
const link = await dub.links.create({
  url: "https://dub.co",
  trackConversion: true,
});
Then, you’ll need generate a publishable key from your Dub workspace to track conversions on the client-side. To do that, navigate to your workspace’s Analytics settings page and generate a new publishable key under the Publishable Key section.
Enabling conversion tracking for a workspace
Once these are set up, we can start tracking conversion events for your deep links.

Step 1: Install the client-side Mobile SDK

Install the Dub React Native SDK and initialize it with your publishable key and short link domain.
1

Install the Dub React Native SDK

# With npm
npm install @dub/react-native

# With yarn
yarn add @dub/react-native

# With pnpm
pnpm add @dub/react-native
2

Initialize the SDK

You must call init on your dub instance with your publishable key and domain prior to being able to use the dub instance. We provide two ways to initialize the SDK:Option 1: Use the DubProvider to wrap your app
import { DubProvider } from "@dub/react-native";

export default function App() {
  return (
    <DubProvider
      publishableKey="<DUB_PUBLISHABLE_KEY>"
      dubDomain="<DUB_DOMAIN>"
    >
      // Your app content...
    </DubProvider>
  );
}
Option 2: Manually initialize the Dub SDK
import dub from "@dub/react-native";

export default function App() {
  useEffect(() => {
    dub.init({
      publishableKey: "<DUB_PUBLISHABLE_KEY>",
      domain: "<DUB_DOMAIN>",
    });
  }, []);

  // Return your app...
}
Once the SDK has been initialized, you can start tracking deep link and deferred deep link events. Call trackOpen on the dub instance to track deep link and deferred deep link open events. The trackOpen function should be called once without a deepLink parameter on first launch, and then again with the deepLink parameter whenever the app is opened from a deep link.
import { useState, useEffect, useRef } from "react";
import { Linking } from "react-native";
import AsyncStorage from "@react-native-async-storage/async-storage";
import dub from "@dub/react-native";

export default function App() {
  useEffect(() => {
    dub.init({
      publishableKey: "<DUB_PUBLISHABLE_KEY>",
      domain: "<DUB_DOMAIN>",
    });

    // Check if this is first launch
    const isFirstLaunch = await AsyncStorage.getItem("is_first_launch");

    if (isFirstLaunch === null) {
      await handleFirstLaunch();
      await AsyncStorage.setItem("is_first_launch", "false");
    } else {
      // Handle initial deep link url (Android only)
      const url = await Linking.getInitialURL();

      if (url) {
        await handleDeepLink(url);
      }
    }

    const linkingListener = Linking.addEventListener("url", (event) => {
      handleDeepLink(event.url);
    });

    return () => {
      linkingListener.remove();
    };
  }, []);

  const handleFirstLaunch = async (
    deepLinkUrl?: string | null | undefined
  ): Promise<void> => {
    try {
      const response = await dub.trackOpen(deepLinkUrl);

      const destinationURL = response.link?.url;
      // Navigate to the destination URL
    } catch (error) {
      // Handle error
    }
  };

  // Return your app...
}
If the deep link was successfully resolved and correlated to the original click, the response object will contain the destination URL, which you can use to navigate the user to the appropriate screen. It will also contain the clickId, which the dub instance will persist internally.

Step 3: Track conversion events

You may track conversion events directly in your app with the trackLead and trackSale methods.
import dub from "@dub/react-native";

function trackLead(user: User) {
  try {
    await dub.trackLead({
      eventName: "User Sign Up",
      customerExternalId: user.id,
      customerName: user.name,
      customerEmail: user.email,
    });
  } catch (error) {
    // Handle sale tracking error
  }
}

function trackSale(user: User, product: Product) {
  try {
    await dub.trackSale({
      customerExternalId: user.id,
      amount: product.price.amount,
      currency: "usd",
      eventName: "Purchase",
    });
  } catch (error) {
    // Handle sale tracking error
  }
}
Alternatively, you can track conversion events server-side for lead events and sale events by sending the clickId resolved from the deep link to your backend and then calling off to either:

Step 4: View your conversions

Once you’ve enabled conversion tracking for your links, all your tracked conversions will show up on your Analytics dashboard. We provide 3 different views to help you understand your conversions:
Time-series line chart
  • Funnel chart: A funnel chart view visualizing the conversion & dropoff rates across the different steps in the conversion funnel (clicks → leads → sales).
Funnel chart view showing the conversion & dropoff rates from clicks → leads → sales
  • Real-time events stream: A real-time events stream of every single conversion event that occurs across all your links in your workspace.
The Events Stream dashboard on Dub