# Connect Adapty

> Send Adapty subscription events to Whisperr through Adapty's webhook integration, so Whisperr knows the billing state of each user.

Whisperr receives subscription events from Adapty through Adapty’s webhook integration. It uses them to know the billing state of each user: in a trial, paid, cancelled with access left, payment failed, expired or refunded. The webhook needs no app code. Your app needs only the shared user ID below.

Whisperr uses one billing source per app. To connect Adapty, first disconnect RevenueCat or Superwall if the app has one: open it in **Integrations → Billing** and hold **Hold to disconnect**.

## Use the same user ID in both SDKs

Whisperr links an Adapty customer to a Whisperr user by the customer user ID (`customer_user_id` in Adapty’s events). Call Adapty `identify` with the same user ID that you give to Whisperr `identify()`, and Adapty `logout` where you call Whisperr `reset`.

| Platform                             | Identify                                | Log out                      |
| ------------------------------------ | --------------------------------------- | ---------------------------- |
| Swift                                | `try await Adapty.identify(user.id)`    | `try await Adapty.logout()`  |
| Android                              | `Adapty.identify(user.id) { error -> }` | `Adapty.logout { error -> }` |
| Flutter (`adapty_flutter`)           | `await Adapty().identify(user.id);`     | `await Adapty().logout();`   |
| React Native (`react-native-adapty`) | `await adapty.identify(user.id);`       | `await adapty.logout();`     |

An Adapty profile with no customer user ID never matches a user. An app with no log-in can set the Adapty custom attribute `whisperr_id` to the Whisperr anonymous ID, and turn on **Send user attributes** in the Adapty webhook settings. Of the Whisperr SDKs, only Flutter exposes the anonymous ID today, as `Whisperr.instance.anonymousId`. Whisperr reads no other attribute, and never the email, IP address or advertising IDs that Adapty sends.

## Connect

1. In the Whisperr dashboard, open **Integrations → Billing → Adapty**, or go straight to `https://app.whisperr.net/integrations?source=adapty`. Click **Create values**. Copy the webhook URL and the authorization value. A workspace owner or admin must do this step. Whisperr shows the authorization value only once and keeps only its hash.
2. In Adapty, open [Integrations → Webhook](https://app.adapty.io/integrations/customwebhook) and turn it on. Paste the URL in **Production endpoint URL** and **Sandbox endpoint URL**. Paste the authorization value in both **Authorization header value** fields. Keep Adapty’s default event names. Click **Save**.
3. When you click **Save**, Adapty checks the URL. The Whisperr dashboard shows **Adapty checked the URL**. Adapty is now connected.

If the dashboard says that the authorization value did not match, paste the value from step 1 again.

If you lose the authorization value, hold **Hold to replace the value** in the Adapty setup and paste the new value in Adapty at once. The old value stops working within a minute.

## What Whisperr does with billing events

Adapty events go through the same billing states, billing events and subscription playbooks as RevenueCat events. See [What Whisperr does with billing events](/integrations/revenuecat/#what-whisperr-does-with-billing-events).

| Adapty event                                                      | What it does in Whisperr                      |
| ----------------------------------------------------------------- | --------------------------------------------- |
| `trial_started`, `subscription_started`                           | Starts a trial or a paid subscription.        |
| `subscription_renewed`, `trial_converted`                         | A paid renewal, or the trial’s first payment. |
| `subscription_renewal_cancelled`, `trial_renewal_cancelled`       | Cancel with access left.                      |
| `subscription_renewal_reactivated`, `trial_renewal_reactivated`   | Cancel reverted.                              |
| `subscription_expired`, `trial_expired`                           | The subscription or trial ended.              |
| `entered_grace_period`, `billing_issue_detected`                  | Payment failed.                               |
| `subscription_refunded`                                           | Refunded.                                     |
| `subscription_paused`, `subscription_deferred`                    | Pause scheduled, period extended.             |
| `non_subscription_purchase`, `non_subscription_purchase_refunded` | One-time revenue, no billing state.           |

Whisperr accepts and ignores `subscription_active`, `trial_active`, `access_level_updated`, events that you renamed in Adapty, and cancellations of a plan that was upgraded or replaced.

- **Sandbox events** show in the dashboard. They do not change a billing state and do not start a playbook.
- **Prices** are converted to USD with the daily rate of the purchase date.

Whisperr stores a minimized copy of each event: type, store, product, dates, cancel and expiry reasons, and price. After Whisperr matches an event, it keeps Adapty customer IDs only as keyed hashes.

## History

Whisperr sees Adapty events from the moment you connect. It does not import older history. An event that reaches Whisperr more than 72 hours after it happened sets the billing state but starts no playbook.

## Check the match

After live events arrive, the dashboard shows the share of Adapty customers in the last 30 days that match a Whisperr user. Your coding agent can read the same numbers with the Whisperr MCP tool `get_adapty_status`.

## Common questions

### Which Adapty events does Whisperr use?

Trial and subscription starts, renewals, cancellations and reactivations, expirations, billing issues and grace periods, refunds, pauses and deferrals, and one-time purchases. Whisperr accepts and ignores subscription_active, trial_active and access_level_updated.

### Does Whisperr read Adapty profile data such as email?

No. Of the profile, Whisperr reads only the customer user ID, the Adapty profile ID and the custom attribute whisperr_id. It never reads the email, IP address or advertising IDs that Adapty sends.

### Does Whisperr import past Adapty events?

No. Whisperr sees Adapty events from the moment you connect. An event that arrives more than 72 hours after it happened sets the billing state but starts no playbook.

Source: https://docs.whisperr.net/integrations/adapty/
