Skip to main content
← Back to blog
Felix Cameron··10 min read

How to Connect RevenueCat to Instally for Revenue Tracking

Step-by-step guide to connecting RevenueCat to Instally. See revenue per link, per campaign, per creator — not just install counts.

Why connect RevenueCat to Instally?

Instally tracks which links drive installs. RevenueCat tracks which users pay. Connecting them gives you revenue per link.

Without the integration, you know "Creator A drove 500 installs" but not whether those installs converted to paid users. With it, you know "Creator A drove 500 installs and $2,100 in revenue." That's the difference between counting downloads and measuring business impact.

Once connected, your Instally dashboard shows revenue alongside clicks and installs for every link:

SourceClicksInstallsRevenueRev/Install
Creator A (YouTube)4,200840$2,100$2.50
Creator B (Instagram)6,100915$457$0.50
Blog: Getting started1,800450$1,350$3.00
Email: Welcome series2,400600$2,160$3.60
Creator A and Creator B have a similar number of installs, but Creator A's audience pays at 5x the rate. That's data you can act on.

What you'll need

RequirementDetails
Instally accountFree tier works for testing. Revenue tracking requires Growth ($40/mo) or Scale ($79/mo)
RevenueCat accountAny plan
Instally SDK integratedThe SDK must be in your app so installs can be matched to clicks. See our iOS or Android guide
10 minutesThat's all this takes

How it works

The integration uses RevenueCat's webhook system. When a purchase event occurs (initial subscription, renewal, cancellation, etc.), RevenueCat sends a webhook to Instally's API. Instally matches the event to the user's install record and credits the revenue to the link that brought them in.

The flow looks like this:

    • User clicks a tracking link → Instally records the click
    • User installs the app → Instally SDK matches the install to the click
    • User subscribes via your paywall → RevenueCat processes the purchase
    • RevenueCat sends a webhook to Instally → Instally matches the purchase to the install (and therefore the link)
    • Revenue appears on the link in your dashboard
The key piece that ties everything together is the RevenueCat app user ID. After the SDK checks the install, send that RevenueCat user ID to Instally with setUserId. When RevenueCat sends a webhook, Instally can connect the purchase back to the install and the link that drove it.

Step 1: Set up the Instally SDK

If you've already integrated the Instally SDK, skip to Step 2. If not, here's the minimum setup.

Swift example:

import Instally
import RevenueCat

@main
struct YourApp: App {
    init() {
        Instally.configure(appId: "YOUR_APP_ID", apiKey: "YOUR_API_KEY")
        Purchases.configure(withAPIKey: "appl_your_rc_key")
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Kotlin example:

import io.instally.sdk.Instally
import com.revenuecat.purchases.Purchases
import com.revenuecat.purchases.PurchasesConfiguration

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Instally.configure(this, appId = "YOUR_APP_ID", apiKey = "YOUR_API_KEY")
        Purchases.configure(
            PurchasesConfiguration.Builder(this, "goog_your_rc_key").build()
        )
    }
}

Step 2: Link the RevenueCat user ID to Instally

This is the most important step. After calling trackInstall, pass RevenueCat's current app user ID to Instally. This ensures that when RevenueCat reports a purchase, Instally can match it to the correct install and link.

Swift example:

struct ContentView: View {
    var body: some View {
        Text("Hello")
            .task {
                do {
                    Instally.trackInstall()
                    Instally.setUserId(Purchases.shared.appUserID)
                }
            }
    }
}

Kotlin example:

lifecycleScope.launch {
    Instally.trackInstall(this@MainActivity) { result ->
        Log.d("Instally", "matched=${result.matched}, method=${result.method}")
    }
    Instally.setUserId(this@MainActivity, Purchases.sharedInstance.appUserID)
}

Flutter example:

await Instally.trackInstall();
await Instally.setUserId(await Purchases.appUserID);

React Native example:

const result = await instally.trackInstall();
await instally.setUserId(await Purchases.getAppUserID());

The user ID link needs to happen once, on the first app launch after install. Calling it after trackInstall() is safe; native SDKs queue the user ID while the install check is still running.

Step 3: Add the Instally webhook in RevenueCat

Now configure RevenueCat to send purchase events to Instally.

    • Log in to the RevenueCat dashboard
    • Navigate to your project
    • Go to Integrations in the left sidebar
    • Click Webhooks
    • Click Add New
    • Set the webhook URL to:
https://api.instally.io/webhooks/revenuecat
    • Add an authorization header:
- Header name: X-Instally-Api-Key - Header value: Your Instally API key (found in the Instally dashboard under Settings > API Keys)
    • Under Events, select the following:
EventWhat it tracks
INITIAL_PURCHASEFirst subscription or one-time purchase
RENEWALSubscription renewal
PRODUCT_CHANGEUpgrade or downgrade
CANCELLATIONUser cancelled (still active until period end)
EXPIRATIONSubscription expired
BILLING_ISSUEPayment failed
UNCANCELLATIONUser re-enabled auto-renew
At minimum, select INITIAL_PURCHASE, RENEWAL, and PRODUCT_CHANGE. These are the events that represent actual revenue. The others are useful for churn analysis but don't directly affect revenue numbers.
    • Click Save

Step 4: Test the integration

Test end-to-end before relying on the data:

    • Create a test tracking link in Instally
    • Click the link once on a physical test device
    • Install the app from the store, TestFlight, internal testing, or a development build
    • Open the app — the SDK should call trackInstall and sync the user ID with RevenueCat
    • Make a sandbox purchase through your paywall
    • Check the Instally dashboard — you should see the revenue appear on the test link within a few seconds
Development builds are supported. For the cleanest install test, click the link and launch the app within a few minutes on the same device and network. Avoid clicking the same tracking link several times before first launch, because repeated clicks from the same device can make the match ambiguous. When rerunning the same test, uninstall/reinstall the app or clear the SDK's cached install state with the debug-only reset helper:

#if DEBUG
Instally.resetForTesting()
#endif

if (BuildConfig.DEBUG) {
    Instally.resetForTesting(context)
}

if (kDebugMode) {
  await Instally.resetForTesting();
}

if (__DEV__) {
  await instally.resetForTesting();
}

If the revenue doesn't appear:

  • Verify the webhook is active in RevenueCat (check the webhook logs for delivery status)
  • Confirm the X-Instally-Api-Key header is correct
  • Make sure trackInstall runs before Instally.setUserId
  • Confirm that the RevenueCat app user ID passed to setUserId matches the user ID shown in RevenueCat's customer view
  • If you see matched=false, confidence=0, method=no_match, create a fresh click and reset the app's cached install state before launching again

What events show up in Instally

Once the integration is live, Instally processes RevenueCat events and surfaces them in your dashboard:

RevenueCat eventHow Instally handles it
INITIAL_PURCHASEAdds the transaction amount to the link's revenue total
RENEWALAdds the renewal amount to the link's revenue total
PRODUCT_CHANGEAdjusts revenue based on the new product price
CANCELLATIONMarked in the user's event timeline (no revenue adjustment — user still has access until period end)
EXPIRATIONMarked in the user's event timeline
BILLING_ISSUEFlagged for awareness (no revenue adjustment until resolved)
Revenue is always shown in the currency reported by RevenueCat. If you have users paying in different currencies, Instally converts to your account's base currency using daily exchange rates.

Revenue metrics in the dashboard

With RevenueCat connected, each link in your dashboard gains revenue columns:

  • Revenue: Total revenue generated by installs from this link
  • Rev/Install: Average revenue per install for this link
  • Paying users: Number of installs from this link that made at least one purchase
  • Conversion to paid: Percentage of installs that became paying users
These metrics update in real time as RevenueCat sends events. There's no 24-hour delay like App Store Connect.

Common patterns

After running the integration for a few weeks, developers typically discover a few patterns:

High-install links don't always mean high-revenue links. A viral TikTok might drive thousands of installs, but if the audience is teenagers who don't pay for apps, the revenue per install will be low. A niche blog post might drive 50 installs, but if those users are professionals who immediately subscribe, the revenue per install is much higher. Welcome sequences and onboarding emails drive the highest revenue per install. Users who install from an email are already engaged. They're more likely to convert. See our email tracking guide for more on this. Renewal revenue compounds over time. A link might show $500 in revenue after the first month, but $1,500 after three months as those users renew. Check revenue at different time windows to get the full picture.

Alternative: Client-side revenue reporting

If you don't want to use webhooks, or if you need to report revenue from a source that's not RevenueCat, you can report purchases directly from the SDK.

Swift example:

Instally.trackPurchase(
    productId: "pro_monthly",
    revenue: 9.99,
    currency: "USD",
    transactionId: transaction.id
)

Kotlin example:

Instally.trackPurchase(
    context = context,
    productId = "pro_monthly",
    revenue = 9.99,
    currency = "USD",
    transactionId = purchase.orderId
)

This works with any payment provider. Call it after a successful purchase, and the revenue will be attributed to the link that drove the install. The webhook approach is recommended because it catches renewals and server-side events automatically, but client-side reporting works if webhooks aren't an option.

FAQ

Does this work with RevenueCat's free tier?

Yes. RevenueCat's free plan includes webhook support. You can set up the Instally integration without upgrading your RevenueCat plan.

What if the user doesn't install from a tracking link?

If the install is organic (not from an Instally tracking link), the revenue is still recorded but categorized as "organic" in your dashboard. You'll see total revenue and tracked revenue separately.

Can I use both the webhook and client-side revenue tracking?

We recommend picking one to avoid double-counting. The webhook approach is preferred because it captures renewals and server-side events without additional client code.

How quickly does revenue data appear?

Revenue appears within seconds of RevenueCat sending the webhook event. For sandbox purchases during testing, it should be near-instant. In production, RevenueCat typically sends webhooks within a few seconds of the App Store or Play Store confirming the transaction.

Does this work with RevenueCat Paywalls?

Yes. RevenueCat Paywalls is a UI layer on top of RevenueCat's purchase infrastructure. The webhook events are the same regardless of whether you use RevenueCat Paywalls or your own paywall UI.

I use Stripe, not RevenueCat. Can I still track revenue?

Absolutely. We also support Stripe webhooks. See our Stripe integration guide for the setup process.

---

Install counts tell you who's interested. Revenue tells you who's valuable. Connect RevenueCat to Instally and start seeing which links, campaigns, and creators actually drive paying users.

Ready / v1.0

Stop guessing. Start shipping.

Track clicks, installs, and revenue from every link. Set up in five minutes.

Get started free