RevenueCat
Attribute RevenueCat purchases, renewals and store refunds to the visits that led to them.
Use this connector when you sell subscriptions or one-time products through RevenueCat, on the web with Web Billing or in a native app through the RevenueCat SDK. Seean checks the webhook’s Authorization header against the value you configured, records purchase events as orders and treats store refunds reported by RevenueCat as refunds. Attribution is derived on Seean’s server from the buyer’s tracked visits when the event carries the visitor ID as purchase metadata or a subscriber attribute.
Setup
- In Seean open Settings → Integrations → Payment providers on your own website, choose RevenueCat, select Enable and copy the webhook URL (
https://events.seean.io/api/connect/revenuecat/<site ID>; use the exact value shown). - In RevenueCat open your project’s Integrations → Webhooks and add a webhook with that URL.
- Set an Authorization header value of your choice (8-256 characters, for example
Bearer <random token>). Leave the event filter open or includeINITIAL_PURCHASE,RENEWAL,NON_RENEWING_PURCHASEandCANCELLATION. - Paste the same Authorization value into Seean, then choose Save secret. Seean accepts a delivery only when the header equals this value exactly; treat it like a password.
- Pass the visitor ID as described below before the purchase.
Only the website owner can connect, replace or disconnect a provider; one connection per provider; demo websites cannot connect providers.
Attribution handoff
Web Billing. Read window.seean.attribution() in the browser and pass it as metadata in the purchase call; RevenueCat includes it on the webhook event:
await window.seean?.ready;
const a = window.seean?.attribution?.() ?? {};
const seean = { seean_visitor_id: a.visitorId, seean_landing_path: a.landingPath, seean_converting_path: a.convertingPath, seean_campaign: a.campaign };
await Purchases.getSharedInstance().purchase({
rcPackage: pkg,
metadata: Object.fromEntries(Object.entries(seean).filter(([, v]) => v)),
});
Native apps. Set the same keys as subscriber attributes before the purchase. The visitor ID must come from the website visit that led to the app (for example passed in the link that opened the app); the mobile SDK has no Seean tracker of its own:
await Purchases.setAttributes({ seean_visitor_id: visitorIdFromTheWebsite, seean_campaign: "launch" });
Seean reads the keys from the event’s metadata (Web Billing) and subscriber_attributes (native); a subscriber attribute wins when both carry the same key.
| Key | Meaning |
|---|---|
seean_visitor_id |
Links the order to the buyer’s tracked visits; touches, first and last source, landing page and time to buy are derived from that history. |
seean_landing_path |
Used only when Seean has no tracked visit for the visitor in the 90 days before the order. |
seean_converting_path |
The page where checkout started. |
seean_campaign |
Overrides the campaign derived from the tracked history. |
Orders without seean_visitor_id are recorded as Unattributed.
What is recorded
| Event | Result in Seean |
|---|---|
INITIAL_PURCHASE, RENEWAL |
Subscription order with price_in_purchased_currency in currency (the USD price when the event has no currency). Renewals are recorded as separate orders. |
NON_RENEWING_PURCHASE |
One-time order. |
CANCELLATION with cancel_reason: CUSTOMER_SUPPORT |
Full refund of the transaction; RevenueCat reports store refunds this way. |
The order ID is transaction_id, the product name is product_id and the order time is purchased_at_ms. Events with a zero or missing price (trials, unknown prices), TEST events and every other event type are acknowledged and ignored.
Refunds
A CANCELLATION event whose reason is CUSTOMER_SUPPORT refunds the remaining amount of the order with the same transaction ID, once per event ID. RevenueCat does not report partial refund amounts, so the refund is always the full order. Refunds lower net revenue in the period of the original order. If the original order has not arrived, Seean returns HTTP 503 and shows Last event failed: Order not found. The provider can retry after the order arrives; the refund ID prevents double counting. A refund whose order is still missing one day after the refund was created is acknowledged and ignored, so refunds of payments Seean never recorded do not keep the endpoint failing; record those with the Order API. See delivery recovery if retries expire.
Currency
Orders are stored in the website’s reporting currency (Settings → Integrations → Revenue integration). Decimal prices are converted with the ISO 4217 exponent (2.49 USD is 249 minor units). A purchase in another currency is acknowledged but not stored, and the reason appears under the provider; app-store purchases in a buyer’s local currency cannot be converted by Seean.
Verify
Use Send test event in RevenueCat: the TEST event is acknowledged and ignored, so check that the last-event time under the provider updates. Then make a sandbox purchase. The status line under RevenueCat shows the last event time and, if the last event could not be stored, the error. Open Revenue for a range containing the order and check the amount, product and derived attribution. Duplicate deliveries return duplicate and change nothing.
Limits
- RevenueCat’s optional HMAC signature header is not used; the Authorization value is the shared secret, so rotate it in both places if it leaks.
- Request bodies above 64 KiB are rejected with 413. Events Seean does not handle are acknowledged with 200; rate limits return 429 and temporary ingestion failures return 503 so the provider can retry. See delivery recovery.
- Disable stops accepting events (the URL answers 404); delete the webhook in RevenueCat so it stops retrying. Existing orders are kept.
Related: Revenue attribution, Order API and refunds.
Something unclear? Contact support.