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:
| Group | Access level | Why Snow needs it |
|---|---|---|
| Project configuration | Read & write | To 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 information | Read only | To 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.