SignalSeal Docs

Revenue & Proceeds

How SignalSeal counts Revenue and Proceeds, and which events feed them.

SignalSeal shows two money columns on dashboards and the campaigns table:

  • Revenue - gross amount the customer paid at the storefront.
  • Proceeds - what you actually receive: revenue minus the store's commission and tax (Apple, Google, Stripe). Net Profit is then Proceeds − Ad Spend, and ROAS is Revenue ÷ Ad Spend.

ROAS uses gross revenue; Net Profit uses Proceeds. A campaign at 2× ROAS can still be unprofitable on iOS once Apple's ~15-30% cut is removed - that's why the two numbers can tell different stories.

One revenue source per app

A single purchase can be reported twice - once by the SignalSeal SDK in your app, and once by your subscription platform's webhook (RevenueCat or SuperWall). If we summed both, your revenue would double.

So SignalSeal counts revenue from exactly one source per app:

  • If you've connected RevenueCat → Revenue and Proceeds come from RevenueCat's webhook events.
  • If you've connected SuperWall → they come from SuperWall's events.
  • If you've connected neither → they come from the SDK's purchase events.

RevenueCat and SuperWall can't both be enabled for the same app - they do the same job. Enabling one while the other is on is blocked; disable the first to switch. (You still install the SDK either way - it handles installs, sign-ups, and any custom events. It just isn't counted for Revenue/Proceeds when a subscription webhook is connected.)

The metric tooltip on any money column tells you which source is active ("Source: RevenueCat"), and the Integrations page shows a banner if it detects you're still sending purchase events from a channel that isn't being counted.

Which events count

Revenue and Proceeds sum the price of events that map to one of these purchase event types:

Event typeWhat it is
subscribeA paid subscription started (not from a trial)
trial_convertedA free trial converted to a paid subscription
subscription_renewedA subscription auto-renewed
purchaseA one-off, non-renewing purchase
refundA refunded purchase (counts as negative)

Trial starts are deliberately not in this list - a free trial is $0, so it has no revenue.

Each event type maps to specific raw event names (e.g. subscriberc_subscription_started). You can see and edit those mappings under Settings → Event types. Anything that doesn't map to a purchase type - including the _qualified events - is excluded so it can't inflate the totals.

Custom events

Custom events you log with the SDK (.custom('ad_watched', { price })) are not counted as revenue by default - otherwise a bug or a malicious client firing fake events could distort your numbers. If you genuinely want a custom event to count, map it onto a purchase type (usually purchase) under Settings → Event types. Once you've opted it in explicitly, it's treated like any other purchase event.

Why your number might look different than your store

SignalSeal's Revenue won't exactly match App Store Connect or Google Play Console, for a few reasons:

  • Attribution window. Dashboard numbers are scoped to the date range you're viewing, by event date.
  • Source coverage. If a purchase event never reached the counted source (e.g. the signalseal_id wasn't set, so RevenueCat couldn't match it), it won't appear.
  • Proceeds estimate. Commission/tax percentages come from your subscription platform's payload; for some regions or payment providers they're unavailable, in which case Proceeds is left blank rather than guessed.

If something looks far off, open a purchase in the Live Feed to see exactly which source reported it and what price/proceeds were recorded.