RevenueCat × Apple Ads
Turn on the attribution step most teams miss.
Connecting RevenueCat to Lily authorizes revenue reads. Apple Ads attribution only works after your app also collects the AdServices token and sends it to RevenueCat.
OAuth connected ≠ attribution ready. The RevenueCat dashboard integration and the SDK token collection are two additional, required steps.
The complete connection
Authorize RevenueCat
Lets Lily read project, app, and chart data. This is the step completed in Lily onboarding.
Add Apple AdServices
Lets RevenueCat request attribution details from Apple and expose Apple Ads chart dimensions.
Send the attribution token
Your production app must enable AdServices token collection after configuring the Purchases SDK.
Add the Apple AdServices integration.
Open the RevenueCat project for the same App Store app, then go to Integrations → Apple AdServices → Add Apple Search Ads integration. If you are creating a new Apple Ads account, we recommend Advanced; if the account already uses Basic, select Basic here so the two systems match.
Recommendation: choose Apple Ads Advanced when you sign up.
Advanced does not add a signup fee or a higher class of account requirements—you simply choose a different product at registration. It also gives you keyword data, detailed reporting, campaign controls, and the Campaign Management API. Unless you have a specific reason to accept Basic's limits, choose Advanced.
Why we recommend AdvancedChoose Sign in with Apple, authorize RevenueCat in Apple Ads, then return and confirm it shows connected.
Use this only when your existing Apple Ads account is Basic. Add the integration, then continue to the SDK step below; campaign, ad group, or keyword names may be unavailable.
Recommended permission: Read Only. The authorizing Apple Ads user must be an Account Admin or Campaign Group Manager. Limited Access only works when every required campaign group is included.
Advanced is our recommendation for new accounts, but RevenueCat must always match the product currently active in Apple Ads. Selecting Advanced in RevenueCat cannot upgrade an existing Basic account.
Collect and send the attribution token.
This is the step most often missed. On iOS 14.3 and later, call RevenueCat's automatic AdServices token collection immediately after Purchases is configured. The SDK sends the token to RevenueCat in the background.
import RevenueCat
Purchases.configure(
withAPIKey: "public_sdk_key",
appUserID: "your_app_user_id"
)
// Call after Purchases.configure(...)
Purchases.shared.attribution
.enableAdServicesAttributionTokenCollection()iOS 14.3+
Required for AdServices
After configure
Order matters
Background sync
No token storage needed
Choose Standard or Detailed deliberately.
Standard attribution does not require App Tracking Transparency consent and is sufficient for campaign, ad group, keyword, country, claim type, and placement analysis. Detailed attribution adds click and impression dates, but requires ATT consent.
Detailed attribution in Swift
Request ATT authorization before enabling automatic collection. If collection is enabled before the prompt, the token is only valid for Standard attribution. When a user rejects tracking, Standard data can still be collected.
import AppTrackingTransparency
import RevenueCat
Purchases.configure(
withAPIKey: "public_sdk_key",
appUserID: "your_app_user_id"
)
if ATTrackingManager.trackingAuthorizationStatus != .notDetermined {
Purchases.shared.attribution
.enableAdServicesAttributionTokenCollection()
}
// Later, when it is appropriate to show the ATT prompt:
if ATTrackingManager.trackingAuthorizationStatus == .notDetermined {
ATTrackingManager.requestTrackingAuthorization { _ in
Purchases.shared.attribution
.enableAdServicesAttributionTokenCollection()
}
}Prove attribution is arriving before using ROAS.
After a production build containing the SDK call is live, acquire real users from Apple Ads and verify the dimensions in RevenueCat Charts. RevenueCat may request each token from Apple within 24 hours, and recommends allowing up to 7 days for a new setup to gather data.
- 01Open a RevenueCat chart for revenue, trials, conversion, or lifetime value.
- 02Set Attribution source to Apple Search Ads to exclude Organic installs.
- 03Segment by Apple search ads campaign; then verify ad group and keyword where applicable.
- 04Compare at least one campaign name or ID with the Apple Ads console before trusting Lily ROAS.
Do not use TestFlight as the final proof. Debug and TestFlight environments can return placeholder or incomplete Apple Ads fields, often displayed as Unspecified.
Pre-launch audit
Is this app attribution-ready?
0 / 5Troubleshooting
When the charts still look empty.
RevenueCat is connected to Lily, but no Apple Ads campaign dimension exists.
Check both missing layers: add Apple AdServices in the RevenueCat dashboard and confirm the production app calls enableAdServicesAttributionTokenCollection() after Purchases.configure(...). Lily OAuth alone cannot create attribution data.
Campaigns appear as Unspecified.
This is common for Apple Ads Basic, which does not provide every campaign field, and for debug or TestFlight attribution where Apple may return placeholders. Verify with a production App Store build and confirm Basic/Advanced matches your Apple setup.
Installs appear as Organic.
Organic means RevenueCat did not receive an eligible Apple Search Ads attribution for that transaction. Confirm the user installed through an Apple Ads path, the SDK code was present on first launch, and enough collection time has passed.
Advanced authorization was revoked or only some campaigns appear.
Reconnect from RevenueCat if Apple access was revoked. For Limited Access users, make sure every campaign group needed by RevenueCat is assigned; Read Only access across the intended scope is the safer default.
Finish the SDK step before judging campaign revenue.
Once RevenueCat Charts contains Apple Search Ads campaign data, Lily can read those revenue dimensions and compare them with Apple Ads spend.
RevenueCat and Apple may change SDK or dashboard details. The linked RevenueCat documentation is the source of truth for current method names and compatibility.