How to Connect Stripe to Instally for Revenue Tracking
Connect Stripe to Instally and see revenue per link, per campaign, per source. Step-by-step webhook setup, event mapping, and dashboard walkthrough.
Why connect Stripe to Instally?
Instally tells you which links drive installs. Stripe tells you who pays. Connect them and you see revenue per link.
If you use Stripe for in-app purchases, subscriptions, or web-based billing, this integration lets you answer questions like: "Which campaign brought in the most paying users?" and "What's the revenue per install for my blog traffic vs. my email traffic?"
Your dashboard goes from this:
| Source | Clicks | Installs |
|---|---|---|
| Creator A | 4,200 | 840 |
| Email: Launch | 2,400 | 600 |
| Blog: Comparison | 1,400 | 280 |
| Source | Clicks | Installs | Revenue | Rev/Install | Paying Users |
|---|---|---|---|---|---|
| Creator A | 4,200 | 840 | $3,360 | $4.00 | 168 |
| Email: Launch | 2,400 | 600 | $2,700 | $4.50 | 135 |
| Blog: Comparison | 1,400 | 280 | $1,680 | $6.00 | 84 |
What you'll need
| Requirement | Details |
|---|---|
| Instally account | Revenue tracking requires Growth ($40/mo) or Scale ($79/mo) |
| Stripe account | Any plan |
| Instally SDK integrated | See our iOS or Android guides |
| 15 minutes | Slightly longer than RevenueCat due to Stripe's webhook setup |
How the integration works
Stripe sends webhook events to Instally whenever a payment-related action occurs. Instally matches the Stripe customer to an app install using a shared user ID, then credits the revenue to the link that drove the install.
The flow:
- User clicks a tracking link → Instally records the click
- User installs the app → Instally SDK matches the install to the click and returns an Instally user ID
- Your app creates a Stripe customer (or updates an existing one) with the Instally user ID in the metadata
- User makes a purchase → Stripe processes the payment
- Stripe sends a webhook to Instally → Instally looks up the customer's Instally user ID in the metadata and matches the payment to the install
- Revenue appears on the link in your dashboard
Step 1: Set up the Instally SDK
If you've already integrated the SDK, skip ahead. Otherwise, here's the minimum setup.
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 {
Instally.trackInstall()
}
}
}
}
Kotlin example:
import io.instally.sdk.Instally
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Instally.configure(this, appId = "YOUR_APP_ID", apiKey = "ik_live_your_key")
lifecycleScope.launch {
Instally.trackInstall(this@MyApp)
}
}
}
Step 2: Link the Stripe customer ID to Instally
When you create or retrieve the Stripe customer for the user, pass that Stripe customer ID to Instally with setUserId. Stripe webhooks include the customer ID, so Instally can use it to match revenue back to the install.
Your backend creates the Stripe customer and returns the customer ID to the app.
Node.js example:
const stripe = require('stripe')('sk_live_your_key');
// When creating a new customer
const customer = await stripe.customers.create({
email: user.email
});
res.json({ stripeCustomerId: customer.id });
Python example:
import stripe
stripe.api_key = "sk_live_your_key"
customer = stripe.Customer.create(
email=user.email
)
return {"stripeCustomerId": customer.id}
Then link that ID in the app:
Swift:
Instally.setUserId(stripeCustomerId)
Kotlin:
Instally.setUserId(context, stripeCustomerId)
Step 3: Add the Instally webhook endpoint in Stripe
- Log in to the Stripe dashboard
- Go to Developers > Webhooks
- Click Add endpoint
- Set the endpoint URL to:
https://api.instally.io/webhooks/stripe
- Under Select events to listen to, add the following events:
| Stripe event | What it tracks |
|---|---|
checkout.session.completed | Completed checkout (one-time or first subscription) |
invoice.paid | Successful invoice payment (including renewals) |
invoice.payment_failed | Failed payment attempt |
customer.subscription.created | New subscription started |
customer.subscription.updated | Plan change (upgrade/downgrade) |
customer.subscription.deleted | Subscription cancelled |
charge.refunded | Refund processed |
- Click Add endpoint
- Copy the Signing secret (starts with
whsec_)
Step 4: Add the Stripe signing secret to Instally
- Go to the Instally dashboard
- Navigate to Settings > Integrations > Stripe
- Paste the Stripe webhook signing secret
- Click Save
Step 5: Test the integration
Run through the full flow:
- Create a test tracking link in Instally
- Click it on a test device
- Install the app (or use a development build)
- Open the app —
trackInstallshould run and return the Instally user ID - Trigger a test purchase (use Stripe's test mode)
- Check the Instally dashboard — revenue should appear on the test link
- Check Stripe's webhook logs (Developers > Webhooks > your endpoint > Recent deliveries) for delivery failures
- Verify the signing secret in Instally matches the one from Stripe
- Confirm the Stripe customer has
instally_user_idin their metadata - Make sure the
instally_user_idvalue matches what the SDK returned fromtrackInstall
How Instally processes Stripe events
| Stripe event | Instally action |
|---|---|
checkout.session.completed | Adds the payment amount to the link's revenue |
invoice.paid | Adds the invoice amount (handles renewals automatically) |
invoice.payment_failed | Flagged in user timeline, no revenue adjustment |
customer.subscription.created | Logged as a conversion event on the link |
customer.subscription.updated | Adjusts revenue tracking to new plan amount |
customer.subscription.deleted | Marked in user timeline for churn tracking |
charge.refunded | Deducts the refunded amount from the link's revenue |
Revenue metrics in your dashboard
With Stripe connected, every link in your dashboard shows:
- Revenue: Total revenue from installs attributed to this link (minus refunds)
- Rev/Install: Average revenue per install
- Paying users: Number of installs that made at least one payment
- Conversion to paid: Percentage of installs that became paying users
- MRR contribution: Monthly recurring revenue from users acquired through this link
Handling multiple products
If you sell multiple products or plans through Stripe, Instally tracks revenue at the transaction level. You'll see total revenue per link by default, but you can also filter by product in the dashboard.
For example, if you have a $9.99/month Basic plan and a $29.99/month Pro plan:
| Source | Installs | Basic subs | Pro subs | Total revenue |
|---|---|---|---|---|
| Creator A | 840 | 120 | 48 | $2,636 |
| Email campaign | 600 | 95 | 40 | $2,149 |
| Blog traffic | 280 | 50 | 34 | $1,519 |
Using Stripe with RevenueCat
Some apps use both RevenueCat (for App Store / Play Store purchases) and Stripe (for web purchases or Stripe-powered billing). In this case, you can connect both to Instally. Revenue from each source is tracked separately but shown together on each link.
We recommend connecting both but making sure each payment event is only sent once. If RevenueCat is already forwarding Stripe events to Instally via its own webhook, don't also connect Stripe directly, or you'll double-count. Choose one path:
- RevenueCat only: Connect RevenueCat webhook → Instally. RevenueCat handles all purchase events. See our RevenueCat guide.
- Stripe only: Connect Stripe webhook → Instally. Use this if you bill through Stripe directly and don't use RevenueCat.
- Both (separate sources): Connect RevenueCat for in-app purchases and Stripe for web purchases. Make sure there's no overlap in the events being sent.
Alternative: Client-side revenue reporting
If your billing setup is unusual or you want to avoid webhooks, you can report revenue directly from your app.
Swift example:
Instally.trackPurchase(
productId: "pro_monthly",
revenue: 29.99,
currency: "USD",
transactionId: "pi_stripe_payment_intent_id"
)
Kotlin example:
Instally.trackPurchase(
context = context,
productId = "pro_monthly",
revenue = 29.99,
currency = "USD",
transactionId = "pi_stripe_payment_intent_id"
)
The webhook approach is better because it catches renewals, refunds, and plan changes automatically. Client-side tracking only captures the events your app explicitly reports.
FAQ
Does this work with Stripe's test mode?
Yes. Use your test-mode webhook signing secret when testing. Instally will process test events the same way it processes live events, but they won't mix with your production data.
What if I already have Stripe customers without the Instally user ID?
Existing customers without the instally_user_id metadata won't have their revenue attributed to a link. Their revenue will show as "organic" in the dashboard. Going forward, any new customers you create with the metadata will be tracked. You can also backfill by updating existing customers' metadata if you have the mapping.
Can I use Stripe Connect with this?
Yes. If you use Stripe Connect for creator or promoter payouts (as Instally's Business plan supports), the webhook integration works alongside it. Revenue tracking and payouts are separate systems that both use Stripe data.
How are refunds handled?
When a charge.refunded event comes in, Instally subtracts the refunded amount from the link's total revenue. Your revenue numbers stay accurate without any manual adjustment.
What currencies are supported?
Instally processes revenue in whatever currency Stripe reports. If you have customers paying in EUR, GBP, and USD, Instally converts all amounts to your account's base currency using daily exchange rates so you can compare links on equal terms.
I use Superwall or Adapty instead of (or alongside) Stripe. Do you support those?
Yes. We support Superwall and Adapty integrations as well. Each integration follows a similar webhook pattern.
---
Stripe is where the money lives. Instally is where you see which links earned it. Connect them and stop guessing which campaigns, creators, and channels are actually driving revenue.
Stop guessing. Start shipping.
Track clicks, installs, and revenue from every link. Set up in five minutes.
Get started free