ยท7 min readยทSam Wild

Marketing attribution for React Native apps

You're running ads, posting on TikTok, paying influencers. Purchases are coming in. But which channel is actually driving them? Here's how to track it in React Native.

You've got a React Native app. It's making some money. You're spending time (maybe actual money) on marketing across a few different channels. And you have no idea which one is working.

RevenueCat tells you someone bought a subscription. Your analytics tell you downloads are up. But there's a gap between "someone downloaded the app" and "this TikTok post caused that download." That gap is attribution, and most React Native developers don't have it set up at all.

The problem with guessing

Without attribution, you're doing marketing by vibes. You post on three platforms, run a small ad campaign, and ask an influencer to mention your app. Downloads go up that week. Which one caused it?

You don't know. So you keep doing all of them, spreading your budget thin, and hoping the numbers keep moving. Meanwhile, maybe 80% of your purchases came from one channel, and you're wasting time on the other two.

This gets expensive quickly when you start paying for ads or influencer deals. Even with organic marketing, your time has a cost. Knowing which posts convert means you can do more of what works and stop wasting afternoons on what doesn't.

Why most attribution tools are overkill

The big names in mobile attribution are AppsFlyer, Adjust, Branch, and Kochava. They're built for companies spending six figures on user acquisition across dozens of campaigns. They charge accordingly.

AppsFlyer starts around $0.05 per install, which sounds cheap until you realise that's per install, not per purchase. If your conversion rate is 5%, you're paying for attribution on 20 installs to find one buyer. Adjust works on annual contracts that start in the thousands. Branch is free for deep linking but charges for attribution features.

For an indie developer making a few hundred purchases a month, these tools cost more than the revenue they're helping you optimise. You end up paying $200/month to track $500/month in revenue. The maths doesn't work.

There's also the integration complexity. Most of these SDKs want native modules, custom build configurations, and setup that assumes you have a dedicated mobile engineering team. React Native developers โ€” especially those using Expo โ€” often can't use them without ejecting from the managed workflow entirely.

What you actually need

Here's what attribution looks like when you strip away the enterprise features:

  1. Create a unique link for each marketing channel or campaign
  2. When someone taps that link, record which link they used
  3. When they install your app and make a purchase, connect that purchase back to the original link

That's it. You don't need probabilistic fingerprinting, you don't need a 15MB SDK, and you don't need real-time dashboards with 47 different metrics.

You need to answer one question: which link drove this purchase?

Setting it up in React Native

The mechanics are straightforward. Your tracked link redirects to the App Store (or Play Store) while recording a click with the user's basic context โ€” timezone, locale, the link identifier. When the user opens your app after installing, the SDK sends the same context to match the click to the install. When a purchase happens, it gets attributed to that original link.

Here's how this looks with LinkOwl, which was built specifically for this use case:

npm install @linkowlnew/react-native

Then initialise it when your app starts:

import { LinkOwl } from '@linkowlnew/react-native';

// In your app's entry point
LinkOwl.initialize('your-api-key');

That's the entire integration. The SDK is pure JavaScript โ€” no native modules, no linking step, no ejecting from Expo. It works in Expo Go during development, which means you can test attribution without building to a device.

Creating tracked links

Each marketing channel gets its own link. You create these in the LinkOwl dashboard or via the API:

  • linkowl.app/r/your-app/tiktok โ€” for TikTok bio and post links
  • linkowl.app/r/your-app/reddit-launch โ€” for your Reddit launch post
  • linkowl.app/r/your-app/james-review โ€” for a specific YouTuber's review

When someone taps any of these, they end up at your App Store page. But now you know which path they took to get there.

Connecting purchases

If you're using RevenueCat for billing (and you probably should be), purchase attribution can work automatically. RevenueCat sends a webhook when a purchase happens. LinkOwl matches it to the original click. You see the result in your dashboard without writing any additional code.

The alternative is calling the SDK directly when a purchase happens:

LinkOwl.trackPurchase({
  amount: 2.49,
  currency: 'GBP',
  productId: 'premium_lifetime'
});

Either approach works. The webhook method means attribution keeps working even if you swap out your billing provider later.

What this actually looks like in practice

Say you're marketing a fitness app. You've got three channels running:

  • TikTok: posting workout clips with your app link in bio
  • Reddit: active in r/fitness, linking to your app in relevant threads
  • Instagram: one micro-influencer doing a sponsored post

After two weeks with tracked links, you check your dashboard. TikTok sent 340 clicks, 45 installs, 3 purchases. Reddit sent 80 clicks, 22 installs, 8 purchases. Instagram sent 200 clicks, 30 installs, 12 purchases.

Reddit's click volume is the lowest, but its purchase rate is the highest. Instagram's influencer drove more total revenue than TikTok despite fewer clicks. TikTok's conversion from click to purchase is terrible โ€” maybe the audience isn't right, or the link placement isn't working.

Without attribution, you'd look at TikTok's 340 clicks and think it's your best channel. With it, you know Instagram and Reddit are where the money actually comes from. That changes how you spend your next month of marketing effort.

React Native specifics that matter

A few things specific to React Native apps worth knowing:

Expo compatibility. Most attribution SDKs require native modules, which means ejecting from Expo's managed workflow. Look for SDKs that are pure JavaScript. If an attribution tool tells you to run npx pod-install or add a Gradle dependency, it's going to cause problems with Expo Go and managed builds.

Hermes engine. React Native now defaults to Hermes for JavaScript execution. Make sure whatever attribution SDK you choose has been tested with Hermes. Older SDKs built for JavaScriptCore sometimes have subtle issues.

App startup timing. Attribution needs to initialise early โ€” before any navigation happens. Put the initialisation call in your root App.tsx or _layout.tsx if you're using Expo Router. Don't put it inside a screen component where it might load late or re-initialise on navigation.

Android back stack. On Android, users often install an app and don't open it immediately. The attribution window matters. Most tools give you 7-14 days between click and install. If your users tend to install and forget for a week, make sure the window is long enough.

The pricing reality

Enterprise attribution tools charge per install because their customers are spending enough on user acquisition that the per-install fee is a rounding error. For indie developers, it's not.

LinkOwl charges 5p per attributed purchase instead. No monthly fee, no per-install charge. If nobody buys anything, you pay nothing. If someone installs but doesn't purchase, you pay nothing. You only pay when attribution actually connects a link to revenue.

For an app doing 100 purchases a month, that's ยฃ5/month. Compare that to AppsFlyer at potentially ยฃ50-100/month (depending on install volume) or Adjust at whatever their current annual contract requires.

Getting started

The setup takes about ten minutes:

  1. Sign up at linkowl.app and register your app
  2. Install the React Native SDK (npm install @linkowlnew/react-native)
  3. Add LinkOwl.initialize('your-key') to your app's entry point
  4. Create tracked links for each marketing channel
  5. If using RevenueCat, add the webhook URL to your RevenueCat dashboard

After that, every purchase that came through a tracked link will show up with its source. You'll finally know which of your marketing channels is worth your time.

No eject required. No native modules. No annual contracts. Just the answer to "where did this customer come from?"

Track your marketing links with LinkOwl

5p per sale, no subscription. Know exactly which post, influencer, or campaign drove each purchase.

Start tracking free โ†’