Get startedIntegrate with partnersPartner guides

RevenueCat

Connect RevenueCat to AdShift to forward subscription and in-app purchase revenue via webhook — no code changes to your purchase flow.

RevenueCat manages your app's subscriptions and in-app purchases. Connect it to AdShift to forward every purchase event via webhook — no code changes to your purchase flow and no AdShift purchase-tracking code. Once connected, every subscription event (new purchase, renewal, cancellation, refund, product change, and more) lands in AdShift alongside your other channels, so your ROAS, MRR, and retention reports reflect the full picture.

RevenueCat stays the source of truth for subscription state — AdShift only receives what RevenueCat sends. AdShift and RevenueCat

Before you begin

You'll need:

  • An AdShift app with the SDK integrated (for installs, sessions, and attribution). See the integration guide at dev.adshift.com.
  • A RevenueCat project with admin access to its dashboard.
  • The partners.manage permission on the AdShift project (Project Owner, Project Admin, or App Editor).

This integration also needs one developer step that can't be done from the dashboard: your app must send the AdShift device ID to RevenueCat as a subscriber attribute, so each purchase can be matched to the install that drove it.

Hand this to your developer

The code to sync the adshiftId subscriber attribute (and the minimum RevenueCat SDK versions) lives in the developer guide: RevenueCat integration on dev.adshift.com. This is what links each RevenueCat purchase back to the user's original install. Without it, purchases still arrive and count toward your total revenue — but the revenue can't be credited to the media source that acquired the user, so it shows up as unattributed (organic) in source-level ROAS and cohort reports.

Important — avoid double-counting revenue

RevenueCat reports App Store and Play Store purchases for you. If your app also tracks those same store purchases through the AdShift SDK (trackPurchase), every subscription is counted twice. Before you activate RevenueCat, ask your developer to turn off SDK purchase tracking for store purchases. You can keep the SDK for everything else (custom events, ad revenue, installs).

How the connection works

  1. AdShift gives you a webhook URL and a signing secret.
  2. You paste both into RevenueCat as a webhook integration.
  3. RevenueCat POSTs every purchase event to that URL, signed with the secret.
  4. AdShift verifies the secret, matches the event to the right app and install, and adds the revenue to your reports.

One RevenueCat project, one or many apps

A RevenueCat project can contain several apps (for example, your iOS and Android builds). In AdShift you connect each app individually, but they can all share one project. When you connect the second app to the same project, AdShift recognizes it and asks for that app's RC App ID so it can tell each app's events apart.

This leads to one important choice during setup — whether a webhook covers all apps in the project or just one app. Both are explained below.

Connect RevenueCat to AdShift

1. Open the RevenueCat partner

In the AdShift dashboard, go to Collaborate → Partners, find the RevenueCat card, and open it. Pick the app you want to connect, then turn on Activate partner.

2. Enter your RevenueCat IDs

Field Where to find it in RevenueCat
Project ID (projxxxxxxxx) Project settings → General → copy the Project ID.
RC App ID (appxxxxxxxx) Apps & providers → Configurations → copy the RevenueCat App ID for this app. This is not your bundle ID / package name.

Tip — AdShift checks the Project ID as you type. If the project is already connected to another app in your account, AdShift tells you and asks for the RC App ID so it can route each app's events correctly. A RevenueCat project can be connected to only one AdShift account.

3. Choose what the webhook covers

Under Set up a webhook for:, pick one of:

  • All apps in this project (recommended) — one shared webhook for the whole RevenueCat project. AdShift routes each event to the right app by its App ID.
  • Just this app — a dedicated webhook that accepts only this app's events.

Most teams should choose All apps in this project. See Choosing the webhook scope below for the details.

4. Activate and copy your webhook URL + secret

Click Activate. AdShift shows a one-time panel with two values:

  • a Webhook URL (looks like https://webhooks.adshift.com/webhook/subscription/revenuecat/…), and
  • a Signing secret, shown only once.

Copy both now and check "I have saved the secret securely." If you lose the secret, you can generate a new one later with Rotate (see Managing the connection).

5. Add the webhook in RevenueCat

In the RevenueCat dashboard:

  1. Open Project settings → Integrations.
  2. Click + New and choose Webhook.
  3. Paste the Webhook URL from AdShift into the URL field.
  4. In the Authorization header field, paste the signing secret exactly — no Bearer prefix, no quotes, no trailing spaces.
  5. Set the App filter:
    • All apps in this project → set the filter to All apps, and paste the project default app's secret.
    • Just this app → filter to this app, and paste this app's secret.
  6. Click Save, then Send test event. AdShift answers 200 OK (the test event only checks connectivity and the secret — it doesn't appear in reports).

Your RevenueCat integration is now live.

Choosing the webhook scope

All apps in this project (recommended) Just this app
Webhooks in RevenueCat One, shared by every app in the project One per app
Best for Most teams; simplest to manage Strict isolation, or separate teams per app
Authenticated by The project default app's secret This app's secret
Routing AdShift routes each event to the right app by its App ID Only this app's events are accepted

Note — On a multi-app project the two URLs are not interchangeable. The shared (“All apps”) URL accepts the whole project and is authenticated by the default app's secret; the dedicated URL rejects events from other apps. AdShift shows both URLs on the integration screen once configured, each labeled with which RevenueCat App filter it matches.

Connecting more than one app in a project

To add another app to a project you've already connected, open that app's RevenueCat partner screen, enter the same Project ID and the new app's RC App ID, and activate.

If you use the shared All apps webhook, you don't need to add a second webhook in RevenueCat — the one you already configured covers the new app too. AdShift even reminds you of this on the reveal screen and shows the new app's optional dedicated URL in case you'd rather isolate it.

The default app for PROMOTIONAL events

Some RevenueCat events — PROMOTIONAL grants issued from the RevenueCat dashboard — carry no App ID. Because AdShift can't tell which app they belong to, one app per project is the "default" and receives all PROMOTIONAL events for the project.

  • The first app you connect becomes the default automatically.
  • To change it, open another app's integration screen and click Make this app the default, or turn on Make this the default app for PROMOTIONAL grants while connecting.

Important — changing the default also changes which secret the shared webhook needs

The shared All apps webhook authenticates with the default app's secret. If you make a different app the default (or disconnect the current default), the shared webhook then expects the new default app's secret. Update the Authorization header in RevenueCat to that app's signing secret (use Rotate first if you didn't save it) — otherwise the shared webhook returns 401 until you do. RevenueCat keeps retrying for ~155 minutes, so a quick update means no events are lost. Dedicated per-app webhooks are unaffected.

Managing the connection

Manage everything from Collaborate → Active Integrations → Tech Partners, or from the app's RevenueCat integration screen.

Rotate the signing secret. Click Rotate and confirm. The old secret stays valid for 155 minutes so any in-flight events keep authenticating; update the Authorization header in RevenueCat with the new secret within that window.

Change the default app. Use Make this app the default (see the warning above about updating the shared webhook's secret).

Disconnect one app. Removes that app's webhook and switches its revenue measurement back to your SDK. Reconnecting later generates a fresh URL and secret.

Note — If you disconnect the app that is currently the project default, another app takes over as default, and the shared webhook then needs that app's secret (same as above). If it was the last app in the project, the shared webhook stops working entirely.

Turn the integration off temporarily. Use Deactivate integration to stop accepting RevenueCat events without deleting the webhook config — switch it back on later without re-entering credentials. (Make sure SDK purchase tracking is active again if you rely on it while RevenueCat is off.)

Check that it's working

  • The Send test event in step 5 confirms the URL and secret are correct.
  • On Collaborate → Active Integrations → Tech Partners, the RevenueCat health badge flips from Pending to Connected as soon as the first real (non-test) event arrives.
  • The integration screen shows "First webhook received: <timestamp>" once a live event lands. Trigger a sandbox or real purchase to confirm end-to-end.

Where your RevenueCat revenue appears

RevenueCat revenue flows into the same revenue reports as your other sources. In the Revenue Breakdown widget on the Overview page, use the Data source dropdown to slice by source:

  • All sources — everything combined (the classic total).
  • RevenueCat — only revenue delivered via the RevenueCat webhook.
  • SDK — only revenue tracked directly by the AdShift SDK.

This is the fastest way to confirm RevenueCat is contributing — and to spot double-counting (a non-zero SDK bucket for store purchases means SDK trackPurchase is still on).

Troubleshooting

The health badge stays on "Pending" after my test event. Usually one of:

  1. Secret mismatch — re-paste the signing secret into RevenueCat's Authorization header (no Bearer, no quotes, no trailing space). If unsure, click Rotate in AdShift and paste the new secret.
  2. Wrong URL — the URL must match exactly the one AdShift showed for this app and scope.
  3. Webhook disabled — confirm the webhook is Active in RevenueCat's Integrations screen.

RevenueCat logs each failed delivery (with AdShift's HTTP response) under Integrations → Webhooks → Logs — the quickest way to see whether it's a 401 (auth) or something else.

The shared webhook suddenly returns 401. The project default app changed (you set a new default or disconnected the old one). Update the Authorization header in RevenueCat to the new default app's secret.

Revenue is counted twice. Both RevenueCat and SDK purchase tracking are active for store purchases. Ask your developer to remove the SDK trackPurchase calls for App Store / Play Store purchases. Historical data is unaffected.

PROMOTIONAL grants are missing. Make sure one app is set as the project default, and that the Project ID in AdShift matches RevenueCat's Project settings → General exactly.

"This project ID is already in use by another account." A RevenueCat project can connect to only one AdShift account. Use a different project, or contact support if you believe this is an error.

See also