RevenueHogdocs
Dashboard

Customers

Customer profiles built from transactions alone: one customer per subscription, how LTV and status are computed, entitlements, history, SDK identity upgrades.

The Customers page (/customers) lists everyone who has bought or trialled, with a profile per customer. Profiles work with zero SDK data, and upgrade to your own user IDs when the optional SDK identifies them.

One customer per subscription

Every Apple originalTransactionId (the identifier Apple keeps stable across a subscription's whole life) becomes one customer. Their timeline is the verified events on that transaction: trial start, conversion, renewals, refunds, churn. Stripe subscriptions appear the same way.

SDK-less customers get a stable, privacy-preserving identity derived by hashing the transaction ID: the same subscriber always resolves to the same handle (for example customer_8f3c2a) without storing anything extra. The copyable ID has the form $u_t…. Their attribution reads "Organic / App Store", because that is all Apple's data can say.

List

Columns: HANDLE (pink when SDK-identified, hover for "SDK-identified" or "Derived from transactions"), APP, PRODUCT, STATUS, LTV, LAST SEEN. The header shows the total (1,731 customers). Rows are newest activity first, 40 per page, with Load more → and ← First page.

Search handles and IDs… filters by handle or customer ID (case-insensitive); Clear resets. Search runs over the 1,000 most recently active subscriptions. The topbar app filter applies. Apple lookup → opens customer lookup for a transaction or order ID.

An identified person with two subscriptions appears as two rows. Empty: "No customers yet. They appear as purchase events arrive. No SDK required; the SDK upgrades anonymous records to real user IDs."

How LTV is computed

LTV = Σ signed USD of the customer's money events
      + BUY, RENEW, CONV   (purchases, renewals, trial conversions)
      − RFND               (refunds)
      + RREV               (reversed refunds)
      TRIAL and Family Sharing copies contribute $0

Amounts come from each signed transaction's own price and currency, converted with daily ECB rates (see currency conversion).

Scope

LTV is computed from the live event stream, so it covers activity since your apps' notifications were wired (plus anything imported or re-delivered). It is a per-customer telemetry number, not a reconciliation against Apple's payouts.

Status

Status follows the latest event on the timeline:

StatusWhen
ChurnedThe last word was a churn event or refund, or the latest transaction's own expiry has passed
TrialThe latest transaction is an unexpired free trial
ActiveOtherwise

The Count cancelled trials as active preference does not change status. A trial user who turned auto-renew off is still entitled and still in their trial, so their status stays Trial until it lapses. That preference is about metric counts, not a person's state.

Profile

/customers/<id> shows:

  • Identity: handle, Copy customer ID, a status pill, and for SDK customers VERIFIED (identify came from an App Attest enrolled device) or UNVERIFIED (simulator, React Native, Android or raw HTTP). Product and app chips.
  • Details: LTV, First seen, Last seen, Country, Platform, Attribution (SDK identify, SDK identify (unverified), or Organic / App Store).
  • Entitlements: one card per product, Entitlement: <product> with Renews <date> or Until <date>, the price (for example $9.99/mo, omitted during an offer period) and the store. State On (active), Cancelled (auto-renew off, still entitled), or Expired (refunded or past expiry).
  • HISTORY: each event with title, date, signed amount and age, refund-request responses and reasons, ending at Subscription started (marked · est. when inferred from Apple's original purchase date because the initial notification predates your wiring).

SDK identity upgrades

The optional SDKs (iOS, Android, React Native) add identify and attribute calls that link transactions to your user IDs. When a transaction is attributed, its anonymous customer upgrades to a real profile: your user ID, device model, OS version, locale and any custom attributes. Purchases reported before login (under a persisted anonymous ID) re-attribute automatically after identify. Everything else on this page works without them.

Last updated on

On this page