Connect RevenueCat

Connecting RevenueCat brings your app's in-app subscription revenue into the same place as your web traffic: the revenue metrics, the conversions list, and the link between a purchase and the visit that drove it. You connect RevenueCat per site, so each site reports its own revenue.

RevenueCat has no bulk purchase history to import - its API lists purchases one customer at a time, and full history is only available through Scheduled Data Exports to your own storage. Snow therefore reports revenue from the moment you connect, not before it.

Create a v2 secret key

In the RevenueCat dashboard, open Project settings → API keys for the project whose revenue you want in Snow, click + New, and create a secret key. It starts with sk_; a v1 key will not work.

Set two of the permission groups and leave the rest on No access:

GroupAccess levelWhy Snow needs it
Project configurationRead & writeTo confirm which project the key belongs to, to read each product's billing period (which is what turns a price into MRR), and - the write part - to register Snow's own webhook.
Customer informationRead onlyTo read a subscription's real start date, which a renewal webhook does not carry.

Project configuration has to be Read & write, not Read only. RevenueCat files webhooks under that group (project_configuration:integrations:read_write), and registering one is the only way revenue reaches Snow - so Snow refuses a read-only key rather than connecting to nothing.

Create the key from inside a single project. A key that can see more than one project leaves Snow with no way to tell which one to sync, and it is rejected.

Paste it into your site's integration settings

Back in Snow, go to Settings → Integrations → Mobile Apps → RevenueCat and paste the key. Snow encrypts the key at rest before storing it, so the raw key is never kept in plain text.

Snow then works out which project the key belongs to and creates one webhook integration in it, named after your site. Purchases, renewals, cancellations and refunds arrive from that point on. See how revenue stays up to date.

Snow reads one payment provider at a time

A site can hold connections to several payment providers, but two providers' revenue is not one number, so the most recently connected one wins and the rest stay hidden. Connecting RevenueCat therefore hides an existing Stripe, Polar or Dodo connection's revenue.

Nothing is lost: the other connection stays where it is, keeps syncing, and the integration row offers a Make primary button that switches the dashboard back to it.

Tie an app purchase back to a visit

A mobile purchase has no checkout page to carry metadata, so RevenueCat's equivalent is a subscriber attribute. Set the two ids the Snow tracking snippet writes on your website - they live in the _sa_vid and _sa_sid cookies

  • on the customer before they buy:
Purchases.shared.setAttributes([
  "sa_visitor_id": visitorId,
  "sa_session_id": sessionId,
])
Purchases.sharedInstance.setAttributes(
  mapOf(
    "sa_visitor_id" to visitorId,
    "sa_session_id" to sessionId,
  )
)

RevenueCat sends those attributes on every webhook, which is where Snow reads them. This is the same sa_visitor_id / sa_session_id convention Snow uses for Stripe, Polar and Dodo.

How you get the ids into the app is up to you - the usual routes are a deep link from the web page the user signed up on, or a value your own backend already stores against the account.

A purchase with no sa_visitor_id still counts. It appears in MRR, in revenue totals and in the payments table exactly like any other - it just cannot be placed under a traffic source in revenue by dimension.

What Snow ignores

Sandbox purchases are dropped. RevenueCat sends them for real, but a developer's test flow is not revenue, so anything not marked PRODUCTION is discarded before it is written.

Free trials are not revenue either. A trial starting is recorded as a trialing subscription with zero MRR, so it shows in your trial counts without inflating your MRR. The renewal that ends it is what books the trial_conversion.

Cancelling is not refunding. A cancellation in RevenueCat means auto-renew was switched off - the customer keeps access, and keeps counting, until the period actually ends. Only a support-issued refund reverses the charge.

Next step

On this page