RevenueHogdocs← Back to app

Live feed & events

Every badge in the feed, the App Store notification, Stripe event or Google Play notification behind it, and what the amount means.

What the feed shows

The feed is the per-event view of every connected source: Apple's App Store Server Notifications V2, Stripe's billing events for connected Stripe accounts, and Google Play's real-time developer notifications for connected Android apps. One row per verified event, the moment it arrives. Each row shows the event badge, the app, the product, the customer (see customers & LTV), the country (the App Store storefront, or the customer's country on Stripe), and a signed USD amount: positive for money in, negative for churn and refunds, $0.00 for trial starts.

App Store amounts come from the signed transaction inside each notification (Apple reports prices in milliunits of the local currency; 39990 means 39.99). Stripe amounts come from the invoice, payment or refund in the currency's minor units (cents, or whole yen for zero-decimal currencies). Both are converted to USD with daily ECB reference rates, the same conversion the metrics methodology describes. Some churn payloads carry no price; those rows show no amount rather than a guess.

Event badges

badgesource eventwhat it means
BUYgreen, +$App StoreSUBSCRIBED · ONE_TIME_CHARGE · OFFER_REDEEMEDStripeinvoice.paid (new subscription) · checkout.session.completed (one-time payment)Google PlaySUBSCRIPTION_PURCHASED · ONE_TIME_PRODUCT_PURCHASEDA new or returning purchase: a paid subscription start, a resubscribe, a one-time purchase, or an offer redeemed as a first/again purchase.
TRIALcyan, $0.00App StoreSUBSCRIBED (free-trial transaction)Stripecustomer.subscription.created (trialing)Google PlaySUBSCRIPTION_PURCHASED (free-trial offer phase)A free trial started. Detected from the signed transaction's offer type (App Store) or a subscription created in trial (Stripe), with the trial length shown (e.g. “7d trial”).
RENEWgreen, +$App StoreDID_RENEW · OFFER_REDEEMED (UPGRADE/DOWNGRADE)Stripeinvoice.paid (renewal or plan change)Google PlaySUBSCRIPTION_RENEWED · SUBSCRIPTION_RECOVEREDA renewal billed successfully, including recoveries from billing retry and plan changes on an already-active subscription.
CONVgreen, +$App StoreDID_RENEW (first renewal of a trial)Stripeinvoice.paid (first paid invoice after a trial)Google PlaySUBSCRIPTION_RENEWED (first paid renewal after a trial)Trial converted to paid. Neither source has a dedicated conversion event. RevenueHog detects the first paid renewal of a subscription that started as a free trial.
CHURNred, −$App StoreEXPIRED · GRACE_PERIOD_EXPIRED · REVOKE · DID_CHANGE_RENEWAL_STATUS (AUTO_RENEW_DISABLED)Stripecustomer.subscription.updated (cancel at period end) · customer.subscription.deletedGoogle PlaySUBSCRIPTION_CANCELED · SUBSCRIPTION_EXPIRED · SUBSCRIPTION_REVOKEDThe subscription ended (expired, grace period ran out, access revoked) or the user turned auto-renew off, shown as “Unsubscribed”, since they keep access until the period ends.
RFNDamber, −$App StoreREFUNDStriperefund.created · charge.dispute.closed (lost)Google PlayVoided purchase (refund or chargeback)Money went back to the customer: an App Store refund, a Stripe refund (partial refunds carry the partial amount), or a Stripe dispute lost. The amount subtracts from LTV.
RFRQorange, $0.00App StoreCONSUMPTION_REQUESTStripecharge.dispute.createdThe customer asked Apple for a refund, or opened a chargeback on a Stripe payment. Not lost revenue yet, that waits for an actual refund or a lost dispute, so it moves no money. Apple re-sends this while the case is open; the feed shows one row per transaction.
RREVgreen, +$App StoreREFUND_REVERSEDStripecharge.dispute.funds_reinstatedA refund Apple already granted was reversed, or Stripe reinstated a disputed charge. Money comes back, so this restores the revenue the RFND took away.
RDECgreen, $0.00App StoreREFUND_DECLINEDStripecharge.dispute.closed (won)Apple declined the refund request, or you won a Stripe dispute. Nothing changes (you keep the money), so it's $0, but it closes out the case in the feed.
PLANblue, $0.00App StoreDID_CHANGE_RENEWAL_PREFStripecustomer.subscription.updated (price change)The customer queued a plan change (upgrade, downgrade or crossgrade). $0 here: the money moves at the upgrade transaction or the next renewal.
PRICamber, $0.00App StorePRICE_INCREASEYou raised the subscription's price (PENDING = awaiting the customer's consent, ACCEPTED = consented). $0, because the new price applies at future renewals.
RISKred, $0.00App StoreDID_FAIL_TO_RENEWStripeinvoice.payment_failedGoogle PlaySUBSCRIPTION_IN_GRACE_PERIOD · SUBSCRIPTION_ON_HOLDBilling failed. The subscription is in retry, or in a grace period with access intact. The leading edge of churn, but no money has moved, so it is not counted as churn.
FAMILYblue, $0.00App StoreSUBSCRIBED (inAppOwnershipType FAMILY_SHARED)Someone gained access through the purchaser's Family Sharing group. A real entitlement, but not a second sale, so it is worth $0. Only purchases are relabelled this way: a family-shared churn is still churn.

Only BUY, RENEW, CONV and RREV add money, and only RFND takes it away. The rest are $0 on purpose. A refund request, a declined refund, a queued plan change, a price increase and a billing failure move no money by themselves; whatever they eventually do to revenue arrives through a later renewal and the daily subscription snapshot, so counting them here would double-count the same dollars.

Unknown or future event types (Apple's TEST and RENEWAL_EXTENDED, Stripe events outside the list above, and anything either ships next) are recorded but not rendered, so a new type can never break ingestion.

Trial → paid detection

Apple does not send a "trial converted" notification. A conversion arrives as an ordinary DID_RENEW, indistinguishable from any other renewal unless you go looking. Two signals find it.

The primary one is lineage: RevenueHog has the trial's SUBSCRIBED start on file and this is the first renewal of that same subscription, so it is a conversion.

The fallback matters more than it sounds, because you will usually connect RevenueHog in the middle of subscriptions that are already running and it will never have seen their trial starts. In that case the renewal transaction is read on its own: if the very first period, from the original purchase to this one, was materially shorter than a full billing term, that short first period was the trial. A seven-day trial against a monthly term, or a month against an annual one, falls well under half a term, while a genuine renewal's first period is a full term. The check limits itself to the first renewal, since by the second one that gap already spans a full term.

Either way the row is badged CONV ("Trial → paid") and later renewals are plain RENEWs. On Stripe, the first paid renewal invoice of a subscription whose trial start is on file is the conversion.

Sandbox vs production

Every event carries its environment. The feed shows production events by default; sandbox events (from development builds, Apple's accelerated-clock test subscriptions, and Stripe test mode) are hidden unless you enable them under Settings → Notifications. Sandbox push alerts are a separate toggle, also off by default.

Event detail & forwarding status

Opening an event shows the full decoded facts (notification type and subtype, environment, product, amount and currency, storefront) plus the event's forwarding status when the app has forwarding endpoints configured: delivered, failed (with the HTTP status), or skipped when no endpoint is set for the event's environment. Forwarding applies to App Store notifications; Stripe can deliver the same events to your own server directly, so add your endpoint in Stripe.

No events yet?

Events only arrive when something happens. For App Store apps, wire S2S per the setup guide, then make a sandbox purchase or use the send-test button on the app detail page. Stripe events arrive through the connected account's webhook, or within a few hours through polling when no webhook is set up (see connect Stripe).