Guides · Purchase data
Adapty
If Adapty already processes your app’s purchases, Proofline can read the same events from an Adapty webhook. You don’t point Apple or Google anywhere new.
1. Connect Adapty in Proofline
Open Integrations for your app and connect Adapty. Leave the Authorization value blank and Proofline generates one. It is shown once, so copy it before you close the dialog. Your webhook URL is:
https://app.proofline.link/api/ingest/adapty/<appId>2. Add the webhook in Adapty
In Adapty, open Integrations → Webhook and set:
- Production endpoint URL and Sandbox endpoint URL: the URL above, for both.
- Authorization header value for production and for sandbox: the value from Proofline, for both.
Adapty sends it exactly as entered. Proofline compares it in constant time and rejects anything
else with
401. - Send user attributes: on. Proofline only reads the
proofline_*keys. - Send Play Store purchase token: on, if you sell on Google Play. It lets Proofline join the purchase to Play’s own notifications.
When you save, Adapty sends an empty test request. Proofline answers it with 200 {} and stores
nothing.
3. Link purchases to the Proofline user
Purchases are tied to creators through the Proofline end-user id. Write it to Adapty as a custom
attribute, and use the same customer user id in Adapty and in Proofline’s identify call:
let token = try await Proofline.identify(userID: user.id)
try await Adapty.identify(user.id)
// Write the Proofline keys as Adapty custom attributes.
let params = try AdaptyProfileParameters.Builder()
.with(customAttribute: token.uuidString, forKey: "proofline_end_user_id")
.build()
try await Adapty.updateProfile(params: params)
4. Renamed events
Adapty lets you rename event types. If you have, list each one in the Proofline dialog under Renamed events, one per line, with your name first and Adapty’s default name second:
sub_renew = subscription_renewed
trial_go = trial_started
Renamed events that aren’t listed are acknowledged and ignored.
What Proofline reads
| Adapty event | In Proofline |
|---|---|
subscription_started, trial_started, non_subscription_purchase |
Purchase (a trial at price 0) |
subscription_renewed, trial_converted |
Renewal (trial_converted is the first paid period) |
subscription_refunded, non_subscription_purchase_refunded |
Refund, reversed against the stored purchase |
*_renewal_cancelled, *_renewal_reactivated, *_expired, billing_issue_detected, entered_grace_period, subscription_paused |
Subscription state |
subscription_active, trial_active, subscription_deferred, access_level_updated |
Ignored (no new money) |
Money comes from price_local in the purchase currency, converted once to integer minor units. Tax
and the store fee come from Adapty’s tax_amount_local and net_revenue_local, so commissions use
the same net revenue Adapty reports. App Store, Google Play and Stripe purchases are settled.
Paddle and custom stores are ignored.
If another source reports the same purchase
Adapty reports the store’s own transaction ids. If RevenueCat, App Store Server Notifications, Google Play notifications or another subscription tool reports the same purchase, every source lands on the same transaction in Proofline, so a sale earns at most one commission per program. Stripe is the exception: when your Stripe account is connected to Proofline directly, Stripe purchases that Adapty reports are ignored and Stripe’s own events are used.
Privacy
Adapty events include e-mail addresses, device ids, IP addresses and attribution data. Proofline stores only the fields it needs and drops the rest when the event arrives.
Limits
- No backfill: events from before you connect are not imported, and there is no nightly reconciliation for Adapty yet.
- Proofline answers within two seconds and processes events in the background. Duplicates are
ignored by Adapty’s
profile_event_id. - Sandbox purchases are recorded but never earn commission.