Skip to main content

Affiliate programs for iOS and Android apps in 2026: codes vs links, and what RevenueCat changes

A solo dev wants to pay creators $1 a sale on a $2.99 a month app. Where codes and links lose the referral at the App Store, what RevenueCat fixes, and what four tools charge.

Updated 14 min readMarkdown

A solo iOS dev posted in r/iOSAppsMarketing last week with a utility app priced at $9.99 one time or $2.99 a month, and a simple plan: everyone gets a code, and whoever's code gets used earns a dollar (the post). Two days later they were choosing between WinWinKit, Influto or "hand rolling a solution", and they didn't want a big monthly bill (follow-up).

They'd already found the catch. They figured the paywall had to move into an in-app purchase "for the affiliate link thing to work." That's the gap a mobile app affiliate program has to close. A creator's link gets a click on the web. Then the App Store sits in the middle, the install starts the app fresh, and the purchase happens inside StoreKit or Google Play Billing, where a web affiliate tool never sees it. Tolt's docs put it plainly: "Links and cookies don't survive an App Store install" (Tolt docs: mobile apps). Dub's docs say the same about iOS from their side: "iOS doesn't provide a built-in install referrer API" (Dub docs: deferred deep linking).

So the job is to rebuild one fact after the install: which partner does this app user belong to? You can do it with a code the user types, with a link that survives the store, or both. Then you need the purchases, renewals and refunds to show up somewhere that can pay commission.

Codes: the store's own, or your own

Store codes and your own codes are not the same thing.

The first kind belongs to the store. Apple's offer codes give "a free or discounted price for a specific duration" on auto-renewable subscriptions. Custom codes like SPRINGPROMO can be redeemed "through a redemption URL or within your app", each customer can redeem "one code per offer", and each app gets "up to 1 million codes per quarter" (App Store Connect help: offer codes). In-app redemption needs iOS 14 or later and the right StoreKit method in your app.

App Store Connect help, read Nov 11, 2026: custom offer codes are redeemed through a redemption URL or within your app, and customers can redeem one code per offer.

Google Play's version is narrower. Subscription promo codes give "a free trial of between 3 and 90 days", and custom codes can only be redeemed in your app, only for subscriptions, and only "by users who have not previously subscribed" (Play Console help: create promotions). For a subscription, a Play promo code is a free trial, not 20% off.

That has a cost the founder's plan didn't price in. A store code has to give the buyer something, a discount or a trial, on top of the dollar you pay the creator. The upside is that RevenueCat passes the code along: its webhook has an offer_code field, "Available for App Store and Google Play" (RevenueCat docs: event types and fields). Map each code to a creator and you know who sold it.

The second kind is your own code: a "Have a code?" field in onboarding or on the paywall that tags the user and gives no store discount at all. That's how Tolt, Insert Affiliate and WinWinKit take a typed code. It's deterministic. It also counts only the people who remember the code and bother to type it.

Android has a clean path for links. Google's Install Referrer API lets your app read "the referrer URL of the installed package" after install (Android Developers: Play Install Referrer). Dub uses it for deferred deep linking: the app reads the referrer on first launch, pulls out the deep link and reports the open (Dub docs: deferred deep linking).

iOS has no such API, so every tool improvises. Dub's approach is "deterministic tracking (clipboard-based) and probabilistic tracking (IP-based)". The clipboard path works only if the user taps "Get the App" on Dub's landing page, which copies the link before the App Store opens. Tap "Get the App without Copying", or decline paste permission, and Dub falls back to matching IP addresses (same page). On a shared office or carrier network, that's a guess, and you should treat it as one.

Links also break on a new phone. The referrer, the clipboard and the IP match all happen once, at first install. Six months later the user buys a new iPhone, reinstalls, and restores their subscription. If the partner was tied to that device, the partner is gone. The fix is the same for every tool: tie the partner to your own user ID, not to the install.

What RevenueCat changes for a mobile app affiliate program

RevenueCat doesn't do attribution. It does the other half: telling a server what happened to the money, for both stores, in one format. Its webhooks send INITIAL_PURCHASE, RENEWAL, CANCELLATION ("canceled or refunded"), NON_RENEWING_PURCHASE and TRANSFER, among others (event types and fields). It's free "for up to $2,500 in monthly tracked revenue", then 1% of what it tracks (RevenueCat pricing). A program tracking a few hundred dollars a month stays under that cap. The Reddit posts don't say how much this founder already tracks.

Once purchases come from RevenueCat, attribution shrinks to one question: which partner owns this app user ID? Tolt, Insert Affiliate and WinWinKit answer it by tying a code or link claim to the user RevenueCat reports, through the App User ID or a subscriber attribute.

Three details in RevenueCat's docs will bite whoever writes the commission logic, you or a vendor:

  1. Refunds show up as CANCELLATION with reason CUSTOMER_SUPPORT, and for subscriptions the event "fires only when the latest subscription period is refunded; refunds for earlier periods do not trigger it" (event types and fields). Refund last March's renewal and nobody's commission moves.
  2. Webhooks can arrive twice. RevenueCat retries up to 5 times over about 80 minutes and tells you to make processing idempotent (RevenueCat docs: webhooks).
  3. Purchase events carry is_family_share, which is true when the purchase reached the user through Apple's Family Sharing. Decide whether a family member's access earns a creator anything before it happens.

RevenueCat webhook docs, read Nov 11, 2026: CANCELLATION covers cancels and refunds, and for subscriptions it fires only when the latest period is refunded.

Where Dub fits, and where it doesn't

For an app-only product, Dub loses a lot.

Dub has no RevenueCat, App Store or Google Play integration. "RevenueCat" appears zero times in Dub's full docs export, its integrations page and its changelog. The way in is the track-sale API, POST /track/sale, whose paymentProcessor field accepts apple and revenuecat (Dub API: track a sale). That's a label. Nothing in the docs describes Dub listening to Apple or RevenueCat on its own. You write the RevenueCat webhook handler, and it calls Dub for every purchase and every renewal.

Dub API reference, read Nov 11, 2026: the track-sale endpoint's paymentProcessor field lists apple and revenuecat as options, a label you set yourself.

The mobile SDKs are the iOS SDK and the React Native SDK, both marked beta, and "Android support is coming soon" (Dub docs: mobile SDKs). Deep link attribution itself "requires a Business plan subscription or higher" and is "currently only available for iOS (Swift) and React Native" (Dub docs: deep link attribution). Business is $90 a month, or $81 billed yearly, plus a 5% payout fee, with $2.5K in partner payouts a month on the monthly plan (dub.co/pricing).

Dub docs, read Nov 11, 2026: deep link attribution requires a Business plan or higher and is only available for iOS (Swift) and React Native; Android (Kotlin) is coming soon.

Refunds are manual on this path. Dub's Stripe integration catches refunds by itself. Without Stripe, you pass a unique invoiceId with each sale, find the commission by that ID when a refund comes in, and set it to refunded through the API. Paid commissions "cannot be refunded", so you'd create a clawback instead (Dub docs: tracking refunds). The upside of that invoiceId is that "only one sale event can be recorded for a given invoice ID" (track a sale), so if you pass RevenueCat's transaction ID, a duplicate webhook can't pay a partner twice.

Where Dub can win is a product that sells on the web and in the app. Each sale you track carries a customerExternalId, "used to identify and attribute all future events to this customer" (track a sale). Use the same user ID in your app, in RevenueCat and in your Stripe checkout, and app renewals and web purchases land in one partner program with one payout run. Sale rewards can be flat, like the founder's $1, or recurring "on every renewal for as long as you choose" (Dub help: sale rewards). Dub also collects W-9s and W-8s and sends 1099-NECs to US partners paid $600 or more in a year (Dub help: partner payouts). That web-plus-app setup is my reading of how the documented pieces fit. Dub doesn't publish it as a mobile recipe, so test it.

Tolt, Insert Affiliate and WinWinKit, on their own pages

All three sell RevenueCat-connected tracking. Each one is described here only from its own site and docs.

Tolt connects through a RevenueCat webhook and uses codes first. Users claim a creator's code with Tolt's Swift or Android SDK, "The first code they claim counts", and a refund "takes the commission back, even after it's been paid" (Tolt: RevenueCat affiliate program). Its docs map TRANSFER to "The customer moves to the new app user id", say it ignores sandbox and Test Store purchases, and offer switches to exclude tax and store fees from commission (Tolt docs: RevenueCat). Growth is $99 a month for up to $20k a month in partner revenue, Pro is $199 up to $50k, and payouts cost 2% of what's paid out (Tolt pricing).

Insert Affiliate is codes plus its own deep links, called Insert Links. With RevenueCat, your app sets a custom attribute, insert_affiliate, so purchases carry the affiliate (Insert Affiliate docs: integration overview). A refund before payout cancels the commission. After payout, the affiliate's balance goes negative, and a refund only counts once it's confirmed with RevenueCat using your secret API key (Insert Affiliate docs: automatic payouts). Pricing is in pounds: free for up to 2 affiliates and 100 transactions, then Starter at £20 a month plus 10% of affiliate transaction revenue, limited to 5 affiliates, Growth at £70 plus 8%, Enterprise at £200 plus 7.5% (insertaffiliate.com).

WinWinKit takes RevenueCat webhooks for purchases, renewals, refunds and expirations, matched by App User ID (WinWinKit docs: RevenueCat). Each refund "automatically updates the attributed revenue and earnings" (WinWinKit: attribution and revenue). It also has a no-code option built on Apple offer codes, App Store only and invite-only (WinWinKit: no-code). Starter is $30 a month up to $3k in monthly attributed revenue, Essential $75 up to $7.5k, Scale $150 up to $15k, with payout fees of 7%, 5% and 3% plus 3% Stripe processing (WinWinKit pricing).

Say creators bring 100 subscribers a month at $2.99 and each earns them $1, so $100 in commission and $299 in referred revenue. On list prices, Dub Business monthly is $90 plus $5 in payout fees, $95. Tolt Growth is $99 plus $2, $101. WinWinKit Starter is $30 plus 7% and a 3% Stripe processing fee; if both apply to the $100 payout, that's $40, though the page doesn't say what the Stripe 3% is charged on. Insert Affiliate's free tier allows 2 affiliates and 100 transactions, so this example already sits on the transaction cap, and "everyone gets a code" walks past the affiliate cap immediately. Starter is £20 plus 10% of $299, which is £20 plus $29.90, and it only allows 5 affiliates. Of the three tools that publish a USD price, Tolt is the highest bill, Dub is next, and Dub is also the most engineering. If the app is all you sell, it's hard to argue for. It starts to make sense when you also sell on the web through Stripe and want one program for both.

A sandbox test before you pay anyone

Run these four before you invite a single creator. Tools treat test purchases differently: Tolt ignores sandbox purchases entirely, WinWinKit has a sandbox mode that tracks only sandbox transactions (WinWinKit pricing), and Dub gives Business plans a staging workspace with no real money (Dub docs: testing).

  1. Purchase. Claim a creator's code or open their link on a fresh install, then subscribe. Expect one customer tied to that creator and one commission at your rate. Tolt documents that a free trial shows as a lead and that commission starts on the first paid period (Tolt: RevenueCat affiliate program). Check the $0-trial case on whichever tool you pick, because RevenueCat can report a trial as a purchase with price 0.
  2. Renewal. Let a sandbox subscription renew. Expect a second commission if your reward is recurring, none if it's one-time, and still exactly one commission per renewal if the webhook fires twice.
  3. Refund. Refund the latest period before the payout hold ends. Expect the commission voided. Then refund an older period and check that you know what happens, because RevenueCat won't send an event for it.
  4. Reinstall on a new phone. Delete the app, install on a second device, sign in or restore purchases. Expect no new commission and the same creator on the customer. If the customer now belongs to nobody, your user ID isn't stable, and every partner will lose customers this way.

Try Dub Partners: https://refer.dub.co/shamil (Affiliate link - I may earn a commission)

FAQ

Can I run an affiliate program for an app that sells through the App Store? Yes. You need a way to tie a user to a partner after install, a code or a deep link, and a purchase feed such as RevenueCat webhooks. Stripe-only affiliate tools never see App Store purchases.

Do Apple offer codes work as creator codes? They can. Each code must carry a free or discounted price, each customer can redeem one code per offer, and RevenueCat's webhook reports the code used.

Does Dub integrate with RevenueCat? Not natively, as of Nov 11, 2026. You'd send each purchase and renewal to Dub's track-sale API from your own webhook handler.

Does Dub have an Android SDK? No. Dub's docs list iOS and React Native SDKs in beta and say Android support is coming soon.

Not verified

  • Whether Dub's React Native SDK does deep link attribution on Android devices. The React Native guide has an Android-only code branch, but the attribution page says Android (Kotlin) is coming soon.
  • Whether Dub can credit a partner from a code alone, with no click, inside an app. Dub's discount codes name Stripe, Shopify and a custom webhook as providers. Apple and Google aren't mentioned.
  • Which Tolt plans include the RevenueCat integration. Its pricing page doesn't say.
  • Insert Affiliate's fixed-price plans. Only the revenue-share prices rendered when I read the page, and they're in GBP.
  • Whether WinWinKit has a free plan. Its pricing page says "No", and its no-code page mentions "the Free plan".
  • How WinWinKit handles a refund after a commission is already paid.
  • How any of the four tools treats is_family_share purchases.
  • Whether Insert Affiliate's 100-transaction free limit is per month or in total.
  • How Insert Affiliate, WinWinKit and Dub treat a $0 trial purchase. Tolt documents lead-until-paid; I didn't find the same statement on the other three.
  • Influto. I didn't read its docs for this piece.

Sources

Every page linked above was read on Nov 11, 2026. Prices are list prices on that date and change often, so check them before you buy.

About the author

  • Independent notes on SaaS affiliate and referral tracking: pricing, Stripe attribution, refunds and payouts. Sourced from each vendor's own docs.

No comments yet. Be the first to comment.