Admin metric audit — 13 September 2026
Financial corrections
Both Stripe accounts are connected. The empty customer-cost columns were caused by requiring a recorded provider charge for every historical request. One missing charge erased the entire cohort's cost. Historical token records are available; individual historical invoices generally are not.
The reporting projection now uses, in order:
- Recorded request charge, including a genuine zero.
- OpenRouter's billed cost for that model and UTC day, weighted by the request's input/output mix. This includes the account's cache and routing effects on average. It does not establish an individual customer's cache hit rate.
- A reference token-price estimate when no billed model-day rate is available.
- Explicitly unpriced when none of those sources exists.
BYOK is excluded from platform cost. Estimates are never written into the actual-charge field. The overall cash contribution continues to use Stripe net receipts minus OpenRouter account usage, with no scaling to force app request history to match the account bill. The model-day source reconciled exactly to account usage on all 255 completed UTC dates checked: $71,831.29 on each side, maximum daily difference $0.00. Earlier zero-usage dates are included in that coverage count.
Customer play costs include failed/repetitive play attempts for qualifying players. Receipts include their packs and plans in the same selected period. No-payment players include former payers and granted accounts, so that row is not synonymous with the current Free tier.
Purchase costs allocate a payer's AI use across purchases by positive receipt share. This is not a trace of which pack funded a request. Unmapped payments no longer erase an entire product's estimate: the matched portion and matched-payer denominator are displayed. Refund-only adjustments remain visible so all purchase receipts reconcile to the headline.
Signup economics use complete 7/30/90-day observation windows. Receipts less estimated AI cost per signup measures room for acquisition spending before infrastructure; it is not lifetime value. Internal accounts are excluded from these acquisition cohorts.
For pricing, use a recent period for typical usage, then examine higher-use customers and the full-use scenario. All-time receipt/player values contain multiple subscription cycles. Full-use scenarios consume one plan grant, eligible recovery and maximum 30-day check-ins at the observed charged-play mix. They exclude packs, existing balances and exceptional grants; they are scenarios, not a hard maximum or forecast.
Metric contracts
| Surface | Definition / accuracy limit |
|---|---|
| Main app accounts | Existing main-app accounts; independent of anonymous game players. |
| Active people | Qualifying play, creation, community/reward activity, or sustained engaged browsing. Opening a page does not qualify. Explicitly linked guests merge with accounts. |
| Browsing | 60 seconds in the foreground with recent deliberate input and multiple input observations. Idle/background tabs do not qualify. Browsing is not game time. |
| Game time, all time | Lifetime counters plus non-overlapping linked standalone time. |
| Game time, date range | Timestamped intervals only. Historical cumulative time cannot be allocated to days retrospectively. Coverage remains partial. |
| Model tokens | Input plus output, including BYOK; BYOK people and volume are broken out. |
| Mushie flow | Historical funding shares allocated per person. Grouping preserves every debit. Missing cost portions are labelled and excluded from the cost graph, never treated as zero. |
| Retention | Weighted completed cohorts. Activity retains the broader definition; play cohorts qualify at 3+ or 10+ initial-window messages and require any play return. W1 uses next-week returns. |
| World ranking/map | Distinct players, recorded world time, tokens, W1 retention and shared-player edges. Ranked catalog coverage is shown; shared players do not imply causal recommendations. |
| Audience | Reported age and observed reading preferences, genres and languages. Male-/female-oriented content preferences are not inferred demographic gender. |
| Acquisition | Identified first-touch source where recoverable. PostHog exports begin July 28; anonymous events without account linkage remain unattributed. Coverage is shown. |
| Users | Current account/plan dimensions from Neon, prepared usage from ClickHouse/Redis, global sorting before pagination. Historical Users cost uses reference prices; finance adds billed model-day estimation. |
UI and serving
- Activity and money charts inspect on hover, support pinned selection, and show the revenue-minus-cost gap.
- The world map uses individual cover callouts tied to exact metric positions, with a small selectable set and the ranked list retained.
- Moderation shows larger covers and gallery images in the metadata panel, with a shared zoom/gallery viewer. Limited is green, Limitless yellow, female-oriented red and male-oriented blue. Pending edits use the proposed cover/rating.
- Admin clicks read prepared snapshots. Client cache retains prior periods; background refresh does not blank the current view. Warehouse work stays off the click path.
- Refresh targets: overview 60 seconds; finance, tokens and worlds five minutes; retention fifteen minutes. These are scheduling targets, not guaranteed data age. Every report exposes its real source cutoff and stale status.
Verification record
- All 21 existing report/period combinations reconciled: overview, finance, tokens and worlds across five ranges, plus retention.
- Live Users checks reconciled 31,395 accounts and all plan counts, five sorts, two distinct pages, active filtering and @okok lookup. Fourth Quadrant, okok, moco and stay ranked above 卡蒙 by the displayed reference estimate.
- Separately checked all 500 displayed worlds' player/token totals and 3,000 overlap edges; checked audience population and age conservation.
- Checked moderation metadata for 20 gallery-bearing worlds and fetched five sample image URLs successfully. No moderation action was executed.
- 90 dashboard/data/cache tests passed. Real isolated ClickHouse fixtures cover cash reconciliation, duplicate facts, time boundaries, retention, estimated costs, BYOK, true zero charges, input/output weighting and partial purchase attribution.
- Live finance and token snapshots passed ten additional checks across all five periods. Every customer cohort has a play-cost estimate; refund-only adjustments and unpriced funding portions remain explicitly incomplete.
- Fixed the model-history import's Date/String alias collision and tested its real ClickHouse path, including empty months and correction of removed model rows. Model-rate freshness is exposed separately from account usage.
- The historical customer query now starts with 16 spill partitions. Two repeated production checks completed in about 19 seconds with identical results; measured peak memory was about 928 MiB, below the 2 GiB limit that intermittently stopped the previous query.
- Production build and typecheck passed. Browser rendering was not exercised: repository instructions prohibit browser verification without an explicit browser request. Layout was reviewed in source against the supplied screenshots.
Operational requirements
Apply 007_cost_estimates.sql to the analytics database before deploying the worker/report builders. It creates two analytics-only tables and does not restart Neon. The importer needs SELECT/INSERT on those tables. It refreshes the public model catalog, billed model-day history with a seven-day overlap, and audits older model-day history daily. Interrupted imports retain existing facts; missing rates fall back visibly to reference estimates. Never substitute these estimated rates in consumer billing.
