Running paid acquisition without connecting it to subscription revenue means flying blind. Attribution data lives in one tool, subscription events in another, and the relationship between your ad spend and actual LTV stays murky. RevenueCat’s new Appstack integration closes that gap.
What is Appstack?
Appstack is an ad attribution platform that's been gaining popularity, especially among subscription app developers who want cleaner visibility into which campaigns are actually driving LTV.
Using RevenueCat’s Appstack integration
With the Appstack integration you can:
- Send RevenueCat subscription events directly to your Appstack webhook endpoint (optional).
- Attribute subscription revenue to campaigns tracked by Appstack using the Purchases SDK.
- Identify users in Appstack using the
$appstackIdsubscriber attribute.
Integrating with Appstack requires that Appstack SDK is installed in your app. Refer to the Appstack developer documentation for the latest installation instructions.
1. SDK attribution mapping
A single call — setAppstackAttributionParams() — pulls attribution data from the Appstack SDK and forwards it to RevenueCat. Under the hood, it sets $appstackId, campaign attribution attributes ($mediaSource, $campaign, $adGroup, $ad, $keyword), click IDs, and device identifiers. No need to call collectDeviceIdentifiers() separately.
The call also syncs attributes to the RevenueCat backend and fetches fresh offerings before returning. That means by the time the callback fires, your paywall is already reflecting the user’s Appstack targeting data.
Set the following attributes after configuring the Purchases SDK and before the first purchase occurs.
1import AdSupport
2// ...
3Purchases.configure(withAPIKey: "public_sdk_key")
4// ...
5
6// Retrieve attribution params from the Appstack SDK
7let attributionParams = AppstackAttributionSdk.shared.getAttributionParams()
8
9// Forward to RevenueCat — syncs attributes and fetches fresh offerings
10// so Appstack-based targeting is applied before the await returns.
11do {
12 let offerings = try await Purchases.shared.attribution.setAppstackAttributionParams(attributionParams)
13 // Use `offerings` to present the correct paywall for this user
14} catch {
15 // handle error
16}
This is enough for RevenueCat to start storing attribute subscription revenue information from Appstack.
Device identifiers with iOS App Tracking Transparency (iOS 14.5+)
One thing to watch for on iOS: if you are requesting the App Tracking permission through ATT to access the IDFA, call setAppstackAttributionParams() again after the customer grants permission, passing the latest params from AppstackAttributionSdk.shared.getAttributionParams().
Keep in mind that AdSupport framework is required to collect the IDFA on iOS.

2. Subscription lifecycle event forwarding
The Appstack integration uses a reserved subscriber attribute to associate RevenueCat events with users in Appstack if the integration is configured to send events. Event forwarding supports following properties:
| Includes Revenue | Supports Negative Revenue | Sends Sandbox Events | Includes Customer Attributes | Sends Transfer Events | Optional Event Types |
| ✅ | ✅ | ❌ | ❌ | ✅ | ❌ |
Configure Appstack in the RevenueCat dashboard under Integrations → Attribution → Appstack. You’ll need your webhook URL and an authorization header from Appstack.

Once set up, RevenueCat forwards the full event suite. This lets you measure subscription revenue and LTV from your acquisition campaigns in Appstack, rather than just top-of-funnel installs. Following events are sent to Appstack
- Initial Purchase
- Renewal
- Cancellation
- Uncancellation
- Non-Renewing Purchase
- Subscription Paused
- Expiration
- Billing Issue
- Product Change
- Transfer
- Subscriber Alias
Start
Integrate RevenueCat with Appstack for attribution and targeting to get a clear picture from ad click to paying subscriber to long-term LTV. The integration is live now on iOS and Android SDKs, available for all apps from the Attribution section of your RevenueCat dashboard. Check out the full docs

