How to Track Revenue from App Store Links
Installs tell you who's interested. Revenue tells you who's valuable. Here's how to tie App Store subscription and IAP revenue back to the specific link that drove the install.
TL;DR
- To track revenue from App Store links: combine a tracking link, an SDK inside your app, and a webhook from your billing provider (RevenueCat, Stripe, Superwall, or Adapty). Each purchase gets credited back to the link that drove the install.
- Real-time reporting — no 24-48 hour App Store Connect delay.
- Setup time: about 15 minutes once the SDK is already in place.
- Works with subscriptions, one-time IAP, renewals, product changes, and cross-currency purchases.
- Pricing: revenue tracking is included on the Growth plan ($40/mo) and above.
Why install counts lie
A creator drops your link. A week later, you see 600 installs from their code. That's the easy number to chase. The harder, more useful number is "how much revenue did those 600 installs produce?"
Because in practice, the answer varies wildly. A YouTuber's audience might install and subscribe at 15%, bringing in four figures a month. A TikTok with a teenage audience might install at a much higher rate but convert to paid at under 1%. Same install count, very different business impact.
If your dashboard only shows installs per link, you can't tell these two channels apart. You'll keep paying the cheap-looking but low-value channel and miss the expensive-looking but high-LTV one.
This post covers the setup for revenue-per-link tracking on App Store (and Google Play) links. For the umbrella view, see how to track app installs with links.
What "revenue per App Store link" actually means
The goal is a single table with one row per link and columns for clicks, installs, paying users, and revenue. Something like:
| Source | Clicks | Installs | Paying | Revenue | Rev/Install |
|---|---|---|---|---|---|
| Creator A (YouTube) | 4,200 | 840 | 126 | $3,780 | $4.50 |
| Creator B (TikTok) | 12,400 | 1,860 | 56 | $560 | $0.30 |
| April newsletter | 1,240 | 310 | 78 | $1,870 | $6.00 |
| Homepage hero | 3,100 | 465 | 70 | $2,100 | $4.50 |
| Reddit r/indiegames | 620 | 93 | 28 | $840 | $9.00 |
Why App Store Connect can't do this
App Store Connect shows you total revenue across your app. It does not segment revenue by the link that drove the install. It aggregates everything into daily totals broken down by country, product, and territory — not by marketing channel or per-link source.
Three specific gaps:
No per-referrer revenue. You know your app made $4,200 yesterday. You do not know that $2,100 of it came from users who originally installed via a creator link last month and finally converted this week. 24-48 hour reporting delay. Financial data in App Store Connect is not real time. For campaign decisions, you need faster feedback. No join between the install referrer and the subscription. The store knows who paid. The store does not know which link that user originally tapped. That connection lives somewhere else — specifically, in a tracking layer that matches installs to clicks and a billing layer that reports purchases back to that same user.How revenue-per-link tracking works
Three components working together:
Tracking link. Wraps your App Store URL. Records the click and the source. SDK in your app. Reports the install back to Instally and ties it to the earlier click. Revenue source. Your subscription or IAP tool (RevenueCat, Stripe, Superwall, Adapty, or client-side events) sends purchase events. Each event is matched to the install record, which already carries the source link.End result: a purchase that happened today gets credited back to the link that drove the install two weeks ago. You see full-funnel numbers per link without touching App Store Connect.
The flow, start to finish:
- User taps your tracking link → click logged
- User installs and opens the app → SDK reports the install, matched to the click
- User subscribes via your paywall → your billing provider processes the purchase
- Billing provider sends a webhook to Instally → purchase matched to the install, and therefore to the link
- Revenue appears on that link in your dashboard
Setting it up
Step 1: Create tracking links for your sources
In the Instally dashboard, make one link per source. Pick slugs you'll recognize later.
| Source | Slug |
|---|---|
| Creator A YouTube drop | creator-a-yt |
| Creator B TikTok series | creator-b-tt |
| April welcome email | email-welcome-april |
| Homepage hero CTA | homepage-hero |
| Reddit launch thread | reddit-launch |
instally.io/app/ and redirects to the App Store (iOS) or Google Play (Android) based on the visitor's device.
Step 2: Integrate the Instally SDK
If you haven't added the SDK yet, it's a one-time setup per app. Revenue tracking requires the SDK because the SDK is what produces the install record that revenue gets matched against.
Swift example:
import Instally
@main
struct YourApp: App {
init() {
Instally.configure(appId: "YOUR_APP_ID", apiKey: "ik_live_your_key")
}
var body: some Scene {
WindowGroup {
ContentView()
.task {
try? await Instally.trackInstall()
}
}
}
}
Kotlin example:
import io.instally.sdk.Instally
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Instally.configure(this, "ik_live_your_key")
Instally.trackInstall()
}
}
Full platform walkthroughs: iOS, Android, Flutter.
Step 3: Sync the user ID with your billing provider
This is the step people miss and then wonder why revenue isn't showing up. After the SDK tracks the install, use the Instally user ID as the app user ID in your billing provider. This is what lets us match the purchase back to the install record.
Swift example (with RevenueCat):
struct ContentView: View {
var body: some View {
Text("Welcome")
.task {
do {
Instally.trackInstall()
// Link the RevenueCat app user ID to this install
Instally.setUserId(Purchases.shared.appUserID)
} catch {
print("Tracking error: \(error)")
}
}
}
}
Kotlin example:
lifecycleScope.launch {
try {
Instally.trackInstall(this@MainActivity)
Instally.setUserId(this@MainActivity, Purchases.sharedInstance.appUserID)
} catch (e: Exception) {
Log.e("App", "Tracking error: $e")
}
}
Do this once, on first launch after install. After that, the billing provider will keep using the Instally user ID for every event on that user.
Step 4: Connect your billing provider
Pick the setup that matches your stack. Each one takes about five minutes.
RevenueCat (recommended if you use it):- In the RevenueCat dashboard, go to Integrations > Webhooks
- Add webhook URL:
https://api.instally.io/webhooks/revenuecat - Add header
X-Instally-Api-Keywith your Instally API key - Select events:
INITIAL_PURCHASE,RENEWAL,PRODUCT_CHANGE
- In Stripe, go to Developers > Webhooks > Add endpoint
- Endpoint URL:
https://api.instally.io/webhooks/stripe - Select events:
checkout.session.completed,invoice.paid,customer.subscription.updated - Copy the signing secret into your Instally dashboard
Add the Instally webhook in Superwall's integrations panel and map the user ID to the Instally user ID. Full walkthrough: Superwall integration guide.
Adapty:Adapty's webhook integration follows the same shape — point Adapty at the Instally endpoint and pass through purchase events.
Client-side (if you don't use any of the above):If you process purchases directly (no RevenueCat / Stripe / Superwall / Adapty layer), report revenue from the SDK after a successful purchase:
Instally.trackPurchase(
productId: "pro_monthly",
revenue: 9.99,
currency: "USD",
transactionId: transaction.id
)
Instally.trackPurchase(
context = context,
productId = "pro_monthly",
revenue = 9.99,
currency = "USD",
transactionId = purchase.orderId
)
Webhooks are preferred because they also catch renewals and server-side events without any extra client code. Use client-side reporting only when webhooks aren't an option.
Step 5: Test end-to-end
- Create a test tracking link in Instally
- Tap the link on a test device and install the app (or TestFlight build)
- Make a sandbox purchase through your paywall
- Open the Instally dashboard — the purchase should show up on the test link within a few seconds
What shows up in the dashboard
Each link gains revenue columns once the integration is live:
- Revenue — total purchase amount from users who came through this link
- Paying users — count of installs from this link that made at least one purchase
- Conversion to paid — percentage of installs that became paying users
- Rev/Install — average revenue per install for the link
Patterns that show up in per-link revenue data
After a few weeks of running this, a few things consistently appear:
High installs, low revenue. Viral TikTok and Instagram reels often produce huge install spikes with very low paid conversion. It's not that the audience is bad — it's that the install intent was impulsive. Filter these out of your decision-making; optimize for revenue, not installs. Low installs, high revenue. Niche blog posts, podcast mentions, and warm creator audiences often drive small numbers of installs but very high conversion rates. These are the channels to invest more in. Welcome email is almost always the highest-converting source. Users who install from a welcome email or onboarding sequence are already committed. Their rev/install consistently beats cold channels. See how to track app installs from email. Renewal revenue compounds. A link might show $500 in revenue in month one and $2,000 by month six as those users renew. Look at revenue across a rolling window, not just last-7-days, to see the full shape.More on this framing: measure ROI from creator marketing.
Revenue in the creator and UGC world
If you pay creators based on performance, per-link revenue is the number that matters. "Installs per creator" can be gamed or inflated; "revenue per creator" can't, because it's tied to real paying users.
On the Scale tier, each creator gets their own dashboard showing only their links, with installs and revenue visible. Payouts through Stripe Connect run automatically based on those numbers. Full breakdown: pay UGC creators per install.
FAQ
Does this work with one-time purchases as well as subscriptions?
Yes. Any purchase event reported by your billing provider (including non-subscription IAP) gets matched to the install and attributed to the source link. The event types you select in the webhook setup determine what gets counted.
What about refunds and cancellations?
Refunds and cancellations are recorded on the user's timeline. Subscription cancellations don't adjust historical revenue because the user still had access during the billed period. Refunds can be surfaced separately if you want a net-of-refunds revenue view.
Does this work without IDFA or the ATT prompt?
Yes. The install match happens without any advertising identifier and without triggering the iOS tracking prompt. Full context: app install tracking without IDFA.
Which currency does the dashboard show?
Whatever currency your billing provider reports. If you have purchases across multiple currencies, Instally converts to your account's base currency using daily exchange rates.
What if the install was organic (not from a tracking link)?
Organic installs are still recorded, and their revenue is still tracked — it's just categorized as "organic" rather than attributed to a specific link. Your dashboard shows tracked revenue and organic revenue separately.
Do I need to upgrade my RevenueCat / Stripe plan?
No. RevenueCat's free plan supports webhooks. Stripe charges nothing extra for webhooks. You can run the full integration on the free tier of either.
How does this compare to an MMP like AppsFlyer or Adjust?
MMPs focus on ad-network attribution (Meta, Google, TikTok Ads) with SKAdNetwork postbacks and fraud detection. They charge accordingly. Instally focuses on organic, creator, content, and email channels and ties revenue back to your own links without an ad-network integration. For a direct comparison: AppsFlyer alternatives for indie developers.
Can I see per-country or per-device revenue?
Yes. Each link's revenue can be broken down by country and device type, on top of the totals.
What does this cost?
Free tier does not include revenue tracking. Growth ($40/mo) includes revenue integrations and unlimited tracking links for up to 3 apps. Scale ($79/mo) adds creator dashboards and Stripe Connect payouts. See pricing.
---
Install counts answer "who is interested?" Revenue answers "who is valuable?" If you share App Store links anywhere — creators, bios, email, press, content — wrap them with tracking links, connect your billing provider, and start seeing the number that actually matters per source. Start a free account and connect your first revenue source.
Stop guessing. Start shipping.
Track clicks, installs, and revenue from every link. Set up in five minutes.
Get started free