Live feed & events
Every badge in the feed, the Apple notification behind it, and what the amount means.
What the feed shows
The feed is the per-event view of Apple's App Store Server Notifications V2: one row per verified notification, the moment it arrives. Each row shows the event badge, the app, the product, the customer (see customers & LTV), the country from the transaction's storefront, and a signed USD amount: positive for money in, negative for churn and refunds, $0.00 for trial starts.
Amounts come from the signed transaction inside each notification (Apple reports prices in milliunits of the local currency; 39990 means 39.99) and 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
| badge | apple notification | what it means |
|---|---|---|
| BUYgreen, +$ | SUBSCRIBED · ONE_TIME_CHARGE · OFFER_REDEEMED | A 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.00 | SUBSCRIBED (free-trial transaction) | A free trial started. Detected from the signed transaction's offer type, with the trial length shown (e.g. “7d trial”). |
| RENEWgreen, +$ | DID_RENEW · OFFER_REDEEMED (UPGRADE/DOWNGRADE) | A renewal billed successfully, including recoveries from billing retry and plan changes on an already-active subscription. |
| CONVgreen, +$ | DID_RENEW (first renewal of a trial) | Trial converted to paid. Apple has no dedicated conversion type. RevenueHog detects the first renewal of a subscription whose initial transaction was a free trial. |
| CHURNred, −$ | EXPIRED · GRACE_PERIOD_EXPIRED · REVOKE · DID_CHANGE_RENEWAL_STATUS (AUTO_RENEW_DISABLED) | The 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, −$ | REFUND | Apple refunded a transaction; the amount subtracts from LTV. |
| RFRQorange, $0.00 | CONSUMPTION_REQUEST | The customer asked Apple for a refund. Not lost revenue yet — that waits for an actual REFUND — so it moves no money. Apple re-sends this while the case is open; the feed shows one row per transaction. |
| RREVgreen, +$ | REFUND_REVERSED | A refund Apple already granted was reversed. Money comes back, so this restores the revenue the RFND took away. |
| RDECgreen, $0.00 | REFUND_DECLINED | Apple declined the refund request. Nothing changes (they keep access, you keep the money), so it's $0, but it closes out the refund case in the feed. |
| PLANblue, $0.00 | DID_CHANGE_RENEWAL_PREF | 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.00 | PRICE_INCREASE | You raised the subscription's price (PENDING = awaiting the customer's consent, ACCEPTED = consented). $0, because the new price applies at future renewals. |
| RISKred, $0.00 | DID_FAIL_TO_RENEW | Billing 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.00 | SUBSCRIBED (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 Apple's daily snapshot, so counting them here would double-count the same dollars.
Unknown or future Apple notification types (TEST, RENEWAL_EXTENDED and anything Apple 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.
Sandbox vs production
Every event carries its Apple environment. The feed shows production events by default; sandbox events (from development builds and Apple's accelerated-clock test subscriptions) 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.
No events yet?