How to Connect Apple Ads to RevenueCat for Keyword-Level ROAS
Connect Apple Ads attribution and spend to RevenueCat trials, purchases, renewals, and refunds so you can measure subscription revenue and ROAS by keyword.

There are two valid ways to connect Apple Ads to RevenueCat.
RevenueCat's native Apple Search Ads integration can segment trials, conversion, revenue, and lifetime value by Apple campaign, ad group, and keyword. That is often enough when you want subscription outcomes inside RevenueCat.
If you need actual ROAS, you must also bring in Apple Ads spend. A joined setup combines AdServices install attribution, Apple campaign reporting, and RevenueCat subscription events under one stable identity.
Apple renamed Apple Search Ads to Apple Ads in 2025. RevenueCat and many search queries still use the former name.
The short answer
Choose the architecture based on the report you need.
| Goal | Recommended path |
|---|---|
| View RevenueCat trial, conversion, revenue, and LTV by Apple campaign or keyword | RevenueCat's native Apple Search Ads integration |
| Calculate keyword-level ROAS with media spend | RevenueCat native attribution plus your own Apple reporting join, or Postback plus RevenueCat |
| Compare Apple Ads with other acquisition channels under one attribution model | An MMP or internal attribution warehouse |
| Forward subscription outcomes while keeping RevenueCat as transaction truth | RevenueCat webhook connected to your attribution layer |
RevenueCat is the subscription source in every row. The difference is where Apple attribution is collected and where spend is joined.
What RevenueCat can show from Apple Ads
RevenueCat is not an attribution network in the general case. Its documentation says that it does not decide which marketing source caused an install.
Apple Ads is a supported special case. RevenueCat can collect Apple's AdServices token from the app, request the attribution result from Apple, and store fields such as campaign, ad group, and keyword. RevenueCat charts can then segment subscription metrics using those fields.
That can answer:
- Which keyword produced the most trials?
- Which campaign produced more subscription revenue?
- How did trial-to-paid conversion vary by ad group?
- Which Apple Ads cohorts have higher lifetime value?
RevenueCat's Apple integration does not replace Apple campaign reporting. ROAS has a cost denominator, and spend comes from Apple Ads reporting rather than the subscription transaction.
Keyword ROAS = attributed subscription revenue from the keyword cohort divided by Apple Ads spend for the matching keyword cohort
If a dashboard shows keyword revenue but no matching spend, it is not yet a ROAS report.
Path A: Use RevenueCat's native Apple Ads integration
Use this path when RevenueCat is where the growth team already reviews trial, conversion, revenue, and LTV charts.
1. Configure RevenueCat before collecting attribution
Initialize the RevenueCat SDK early in app startup. Then enable AdServices attribution-token collection using the current RevenueCat SDK method for your platform.
On iOS, RevenueCat documents enableAdServicesAttributionTokenCollection() after SDK configuration. RevenueCat handles sending the token to its backend and requesting Apple's attribution data within the token's 24-hour lifetime.
Do not wait until a trial begins. Users who abandon onboarding or return later may pass the token lifetime before collection.
2. Choose Standard or Detailed attribution
RevenueCat documents two Apple attribution modes:
| Mode | ATT requirement | When it fits |
|---|---|---|
| Standard | Does not require tracking permission | Most apps that want privacy-safe campaign segmentation |
| Detailed | Depends on ATT authorization | Apps that have a justified ATT flow and need the additional available detail |
Do not add an ATT prompt solely because an old integration tutorial says Apple Ads attribution always needs it. Standard AdServices attribution does not require IDFA access.
The returned detail can still vary under Apple's rules. Build an Unspecified, Search Match, or unavailable bucket instead of assuming every Apple-attributed install includes a keyword.
3. Configure RevenueCat's server-side Apple connection
Follow RevenueCat's current Apple Search Ads integration screen. Its advanced setup supports read-only access through Sign in with Apple, while existing legacy credentials can continue to work according to RevenueCat's documentation.
Use the minimum account access required, verify the selected Apple organization, and test with the correct app and bundle identifier.
4. Verify the attribution fields in RevenueCat
After a new attributed installation reaches RevenueCat, inspect campaign, ad group, and keyword dimensions in the relevant charts or customer record.
Check three cases deliberately:
- A named keyword conversion.
- A Search Match conversion, which may have no keyword ID.
- An organic or unattributed install.
Do not force the last two into a named keyword just to produce a complete-looking chart.
5. Add spend if you need ROAS
Pull Apple Ads reporting at the same daily campaign, ad group, or keyword grain. Preserve Apple IDs, report time zone, and currency.
Group RevenueCat revenue by acquisition cohort before joining it to spend. A renewal recorded in September may belong to a user acquired from an August keyword. Event-date revenue and acquisition-date spend should not be compared as if they came from the same cohort.
The Apple Ads export guide covers the reporting API and warehouse side of this setup.
Path B: Join Apple Ads and RevenueCat in Postback
Use this path when you want one maintained report for Apple Ads attribution, spend, and RevenueCat lifecycle events, or when you expect to compare Apple with another channel later.
In this architecture, each system has one job:
| System | Job |
|---|---|
| Postback SDK | Create the install identity and collect AdServices attribution |
| Apple Ads reporting connection | Import spend, impressions, and taps |
| RevenueCat | Report the subscription lifecycle and transaction values |
postbackId subscriber attribute | Connect RevenueCat's customer to the attributed install |
| Postback reporting | Join campaign cost to trials, purchases, renewals, and revenue |
RevenueCat remains the subscription source of truth. Postback does not replace purchase validation or entitlement management.
1. Configure the Postback SDK
Install and configure the Postback SDK at app startup. On iOS, the SDK collects the AdServices token and registers an internal installation.
Wait until the install identity is available before copying it into RevenueCat. A configuration call can finish before network registration has produced the ID.
2. Set the postbackId RevenueCat attribute
Set one custom RevenueCat subscriber attribute named postbackId. For Swift, the current integration is:
import PostbackSDK
import RevenueCat
let postbackId = Postback.shared.getPostbackId()
if let postbackId {
await Purchases.shared.attribution.setAttributes([
"postbackId": postbackId,
])
}
Set it after both SDKs are configured and the Postback ID exists. RevenueCat custom attributes are included in webhook payloads, which lets the server attach a later transaction to the original install.
Do not put secrets or personal data in this attribute. It is an attribution join key.
3. Add the authenticated RevenueCat webhook
In RevenueCat, add the Postback webhook URL for the selected app:
https://api.postback.sh/v1/integrations/revenuecat/webhooks/{appId}
Set the Authorization header to the Bearer token shown in the Postback RevenueCat integration screen. Limit the webhook to the correct project and app, and send the event types your report needs.
RevenueCat can retry deliveries and may send duplicate events. The receiver must process events idempotently rather than counting every delivery as a new purchase.
4. Connect Apple Ads reporting
Connect the Apple Ads reporting integration in Postback. The SDK-side AdServices result supplies campaign identifiers for the install; the reporting connection supplies aggregate spend, taps, and impressions.
Those are separate inputs. The API vs AdServices comparison explains the boundary.
5. Confirm the lifecycle mapping
Postback currently maps the main RevenueCat lifecycle events like this:
| RevenueCat event | Postback event |
|---|---|
INITIAL_PURCHASE with period_type=TRIAL | start_trial |
RENEWAL, including a trial conversion | subscribe |
| Initial purchase without a trial | purchase |
UNCANCELLATION | purchase |
NON_RENEWING_PURCHASE | purchase |
| Other supported lifecycle changes | Namespaced custom event |
RevenueCat Paywalls can also send supported paywall view, close, cancellation, and purchase-button events when those webhooks are enabled. Keep the default RevenueCat event names so the mapping remains predictable.
Use one subscription lifecycle webhook as the source of truth for the app. If RevenueCat manages the transactions, do not also ingest Superwall lifecycle webhooks for the same purchases, or the report can count one transaction through two providers.
Build a useful keyword report
A decision-ready report should keep delivery, funnel, and cohort quality together:
| Keyword cohort | Spend | Installs | Trials | Mature trials | Paid subscribers | Revenue | ROAS |
|---|---|---|---|---|---|---|---|
| Named keyword A | Known | Known | Known | Mature | Known | Attributed | Comparable |
| Named keyword B | Known | Known | Known | Partly mature | Early | Partial | Provisional |
| Search Match | Known | Known | Known | Mature | Known | Attributed | Comparable |
Useful supporting metrics include:
- Cost per attributed install.
- Cost per trial.
- Mature trial-to-paid conversion.
- Cost per paid subscriber.
- Initial-purchase ROAS.
- Day-30 or first-renewal ROAS.
- Refund-adjusted revenue.
Label the observation window beside ROAS. A keyword with a seven-day trial should not be judged against a no-trial product after only three days.
Validation sequence
Test the identity chain in order so one missing link does not look like an Apple attribution problem.
- Confirm a new app install registers and receives a non-empty Postback ID.
- Confirm RevenueCat stores
postbackIdon the expected customer. - Send a RevenueCat test webhook and confirm the integration is verified.
- Confirm a production lifecycle event contains the subscriber attribute.
- Confirm Postback attaches the event to the original install.
- Confirm the install has Apple campaign, ad group, and keyword context when Apple returns it.
- Confirm Apple Ads reporting imports spend for the same account and date range.
- Reconcile one mature cohort under the same time zone and currency.
RevenueCat sandbox webhooks can verify the Postback connection, but Postback does not create attributed production events or outbound conversions from sandbox deliveries. Use a controlled production transaction for the final end-to-end check.
Common reasons keyword ROAS is missing
The attribution token was collected too late
Apple's token expires after 24 hours. Collect it during the early app experience.
The RevenueCat customer never received postbackId
The webhook can be valid while the campaign join fails. Inspect the subscriber attributes rather than relying only on the webhook status.
Search Match has no named keyword
Keep Search Match separate. A missing keyword ID can be expected, not a broken integration.
Spend and revenue use different grains
Do not join campaign spend to keyword revenue or mix account currencies without an explicit allocation rule.
Fresh trials are counted as failures
Keep active trials out of the mature paid-conversion denominator. Use the free-trial ROAS workflow for cohort maturity.
Revenue arrives under event date
Credit renewals and refunds back to the original acquisition cohort when measuring campaign payback.
Two providers report the same transaction
Choose RevenueCat or Superwall as the lifecycle webhook source for each transaction stream. Duplicate source systems produce credible-looking but inflated revenue.
Which path should you choose?
Start with RevenueCat's native integration if your immediate question is subscription performance by Apple campaign or keyword inside RevenueCat.
Add your own Apple reporting pipeline if your data team already operates a warehouse and wants full control of ROAS definitions.
Use an MMP when the ongoing work is the problem: identity, Apple reporting, delayed RevenueCat events, cohort maturity, and eventually cross-channel comparison. The RevenueCat attribution vs MMP guide gives the broader decision framework.
For the maintained path, follow the Postback RevenueCat setup to connect the install ID and authenticated lifecycle webhook.
Sources
- RevenueCat Apple Search Ads integration - Current native AdServices collection, configuration modes, and chart segmentation
- RevenueCat attribution overview - RevenueCat's role in attribution and supported campaign attributes
- RevenueCat webhooks - Current webhook configuration, authorization, testing, retries, and sandbox behavior
- RevenueCat webhook fields - Event types, transaction fields, and subscriber attributes
- RevenueCat customer attributes - Custom attribute storage and webhook availability
- Apple AdServices - Current Apple Ads install attribution framework
- Postback RevenueCat integration - Current
postbackId, webhook, and event-mapping setup
FAQ
Yes. RevenueCat's native Apple Search Ads integration can collect AdServices attribution and segment supported charts by campaign, ad group, and keyword when Apple returns those fields.
RevenueCat can show subscription revenue by Apple attribution dimensions. Actual media ROAS also requires matching Apple Ads spend, either through your own reporting join or an attribution platform that imports campaign cost.
RevenueCat's Standard AdServices mode does not require tracking permission. Detailed attribution depends on ATT authorization and Apple's available response.
Search Match can attribute an install without a named advertiser keyword. Privacy and attribution eligibility can also affect returned detail. Keep an explicit fallback bucket instead of guessing.
Not for the same transactions. Use one subscription lifecycle source of truth so a purchase or renewal is not counted twice.
You might also like
See all posts →
How to Connect Apple Ads to Superwall for Trial and Purchase Attribution
Connect Apple Ads attribution and spend to Superwall trial, purchase, renewal, and refund webhooks using a stable install identity and signed webhook flow.

How to Track App Campaign ROAS After a Free Trial
Measure app campaign ROAS when revenue arrives after a free trial, with mature cohorts, subscription events, refunds, and renewals.

Apple Ads API vs AdServices Attribution
Understand the difference between Apple's Campaign Management API and AdServices, what each returns, and how to combine them for campaign and keyword ROAS.