Guides

Revenue and drop-offs

How problems get a price, what counts as a sale, and connecting RevenueCat.

6 min readSDK 0.5.0

Riveora ranks everything that makes people give up in your app by the sales it costs you. This page explains how that number is worked out, and how to connect RevenueCat so it uses your real revenue.

Why people leave

The Why people leave page has two lists. The fix list ranks problems: crashes, failed and slow requests, rage taps, taps on things that do nothing, screens where people hesitate or go in circles, and forms they start but don’t finish. Where people leave shows the screens where visits most often end, ranked by the sales those exits cost. Click a screen to see what’s different about the people who leave it: what they tapped last, which problems they hit, where they came from and which app version they were on.

How a problem gets a price

  1. Compare like with like. Visits to the same screen with the problem are compared with visits without it.
  2. Count the extra exits. If 80% of visits with a failed coupon request end on the cart, but only 28% of other cart visits do, the difference is the damage the failure likely caused.
  3. Turn exits into sales. Each extra exit is multiplied by how often people who carried on from that screen went on to buy.
  4. Turn sales into dollars. With RevenueCat connected, Riveora uses your average revenue per paying customer over the last 90 days. Without it, it uses the value you set in Settings, or shows lost sales instead of dollars.

What counts as a sale

  • A buyer is someone with a paywall closed with reason: 'purchased', or a RevenueCat payment above $0 linked to them with Riveora.identify(). It’s yes or no per person, not an amount. Sandbox purchases never count.
  • One sale is worth your average revenue per paying customer over the last 90 days when RevenueCat is connected (renewals included, refunds subtracted), or the value you set in Settings. It’s one value for the whole app, so different products are averaged together.
  • Subscriptions count 90 days of revenue, not their whole lifetime, so long-lived subscribers are valued conservatively.
  • Free trials count once they’re charged (with RevenueCat). If your app reports 'purchased' when a trial starts, it counts straight away.
  • Restores aren’t new sales: report them as 'restored'.
  • In-app purchases outside a paywall, like a coin store, are only seen through RevenueCat.
Estimates, not invoices

With a few dozen people the numbers move around. Use the order of the list to decide what to fix first, and replays to confirm a problem is real before you act.

Did my fix work?

Every event carries the appVersion you pass to RiveoraProvider, plus the platform. Each problem’s page shows the share of people on each version who hit it, and tells you whether your newest version fixed it, improved it, or still has it.

iOS and Android are judged separately: each platform’s newest version is compared only with that platform’s earlier versions. So it works when the two apps are numbered differently, or ship the same fix at different times. If your version numbers differ per platform, pass the right one for each:

tsx
import { Platform } from 'react-native';

<RiveoraProvider appVersion={Platform.select({ ios: '2.3.0', android: '2.1.4' })} …>

Connect RevenueCat

  1. In Riveora, open Revenue and click Create webhook details.
  2. In RevenueCat, go to Integrations → Webhooks → Add new configuration and paste the webhook URL and authorization header. Copy the header right away: Riveora shows it only once and keeps just a fingerprint of it.
  3. Give both SDKs the same user ID, so purchases join the right journey:
tsx
await Purchases.logIn(user.id);   // RevenueCat
Riveora.identify(user.id);        // Riveora

Riveora stores purchases, renewals, cancellations and refunds. Sandbox purchases are kept out of revenue, and repeated deliveries of the same event are ignored.

Replace the secret or disconnect

Open Settings → Integrations to see the webhook URL, the last 4 characters of the authorization header, and when the last event arrived. The full header can’t be shown again; if you lost it, replace the secret.

Creating or replacing the secret, disconnecting, deleting an app, and buying or changing a plan need you to confirm it’s you. If you haven’t in the last 10 minutes, Riveora emails you a code (or asks you to sign in with Google again) before continuing. Signing in with a password doesn’t count, so a stolen session can’t do these.

  • Replace secret creates a new authorization header. The old one stops working right away, so paste the new one into RevenueCat (Integrations → Webhooks → your Riveora webhook) and send a test event. The URL doesn’t change. Use it if the header leaked.
  • Disconnect stops Riveora accepting events from the webhook. Problems are then priced with the value you set in Settings. Revenue already received is kept and shows again if you reconnect. Delete the webhook in RevenueCat too, so it stops sending.

What makes people buy

This page looks at everyone whose first visit was in the chosen period, and compares what buyers did in that first visit with what everyone else did: screens opened, buttons tapped and your custom events. Actions almost everyone does, and actions fewer than 10 people did, are left out because they can’t tell the two groups apart. These are patterns, not proof, so test a change before you rely on it.

Something unclear or missing? Email us and we’ll improve this page.
Revenue and drop-offs · Riveora Docs