← All posts
Subscription attribution10 min read

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.

Apple Ads keyword attribution connected to RevenueCat subscription revenue and ROAS

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.

GoalRecommended path
View RevenueCat trial, conversion, revenue, and LTV by Apple campaign or keywordRevenueCat's native Apple Search Ads integration
Calculate keyword-level ROAS with media spendRevenueCat native attribution plus your own Apple reporting join, or Postback plus RevenueCat
Compare Apple Ads with other acquisition channels under one attribution modelAn MMP or internal attribution warehouse
Forward subscription outcomes while keeping RevenueCat as transaction truthRevenueCat 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:

ModeATT requirementWhen it fits
StandardDoes not require tracking permissionMost apps that want privacy-safe campaign segmentation
DetailedDepends on ATT authorizationApps 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:

SystemJob
Postback SDKCreate the install identity and collect AdServices attribution
Apple Ads reporting connectionImport spend, impressions, and taps
RevenueCatReport the subscription lifecycle and transaction values
postbackId subscriber attributeConnect RevenueCat's customer to the attributed install
Postback reportingJoin 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 eventPostback event
INITIAL_PURCHASE with period_type=TRIALstart_trial
RENEWAL, including a trial conversionsubscribe
Initial purchase without a trialpurchase
UNCANCELLATIONpurchase
NON_RENEWING_PURCHASEpurchase
Other supported lifecycle changesNamespaced 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 cohortSpendInstallsTrialsMature trialsPaid subscribersRevenueROAS
Named keyword AKnownKnownKnownMatureKnownAttributedComparable
Named keyword BKnownKnownKnownPartly matureEarlyPartialProvisional
Search MatchKnownKnownKnownMatureKnownAttributedComparable

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.

  1. Confirm a new app install registers and receives a non-empty Postback ID.
  2. Confirm RevenueCat stores postbackId on the expected customer.
  3. Send a RevenueCat test webhook and confirm the integration is verified.
  4. Confirm a production lifecycle event contains the subscriber attribute.
  5. Confirm Postback attaches the event to the original install.
  6. Confirm the install has Apple campaign, ad group, and keyword context when Apple returns it.
  7. Confirm Apple Ads reporting imports spend for the same account and date range.
  8. 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

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 →