Revenue Dashboard (5-channel unified)
Track revenue from 2 ad channels (AdMob/AdSense) and 3 payment channels (Stripe/RevenueCat/Polar) in a single dashboard with a unified skeleton.
Last updated: 2026-05-18
The Opseer Revenue dashboard tracks 5 channels in one place. Ad and payment channels have different natures so their layouts diverge, but routing, period presets, loading behavior, and other shared policies stay identical across all 5 channels.
Page structure
- /dashboard/revenue/admob — AdMob detail
- /dashboard/revenue/adsense — AdSense detail
- /dashboard/revenue/stripe — Stripe detail
- /dashboard/revenue/revenuecat — RevenueCat detail
- /dashboard/revenue/polar — Polar detail
Use the Revenue section in the sidebar to navigate directly to each channel page.
Period presets (shared across 5 channels)
6 unified presets:
- Today — today only
- Yesterday — yesterday only
- 7 days (default)
- This month — 1st through today
- Last month (full)
- Custom — start date free, max 90-day window
Today/Yesterday cards are always shown separately, regardless of the selected period. With today/yesterday presets, charts and Period Summary are hidden automatically (1 datapoint — applied consistently across all 5 channels).
Custom range
Free start date (any past) + max 90-day window. No cache write (single API call). Returning to a preset auto-restores cached data. Same pattern across all 5 channels.
Cache policy
All 5 channels share revenue_daily_cache with a per-source 90-day sliding window:
- last refresh = today → SELECT cache (90 days) + parallel today/yesterday API calls → progressive render per area
- last refresh < today → gap-day backfill (today/yesterday realtime, days in between via API) → sliding window UPSERT
- cache empty → first-visit flow: render layout first + "collecting initial data" notice → 90-day backfill
- today/yesterday always realtime API call (absorbs Google post-correction window)
RevenueCat charts API D-1 lag metrics skip set if today's datapoint is empty. Snapshot metrics (MRR / Active Subs / Active Trials / New Customers) are today/yesterday realtime.
Payment 3-channel unified skeleton (P14)
Stripe / RevenueCat / Polar share these unified sections (some channels skip rendering due to data limits — intentional):
- Today/Yesterday 3×2 grid — Row 1: Today MRR · Yesterday MRR · MRR snapshot / Row 2: Today Revenue · Yesterday Revenue · Active Subs
- Subscription Movement Chart — diverging stacked bar (newSubs / churnedSubs). All 3 channels
- Payment Movement Chart — orders + refunds. Skipped on RC (no orders/refunds count metric)
- Product Breakdown — recurring vs one_time. Skipped on RC
- MRR Trend Chart — area + trial overlay. Skipped on RevenueCat (no daily MRR time-series support)
- MRR Movement Chart — new/expansion/contraction/churn MRR breakdown. Stripe and Polar
- Platform-specific sections — Stripe operations 5-card / Polar Cumulative Revenue · Checkout Conversion / RC Top 5 Projects, etc.
On Stripe, the MRR Trend chart also shows a 90-day forward projection with a confidence interval band (once enough historical data has accumulated). This is a simple estimate based on a linear trend.
Alert message format (unified 5 metrics)
In personal alerts, the 3 payment channels share a unified 5-metric format — MRR / Revenue / Orders / New Subs / Churned with identical labels and ordering. RC may show N/A for orders. Ad channels use their own unified emoji/ordering/labels.
Messages contain only yesterday's 1-day metrics — analysis-only metrics (time-series, MRR Movement) are excluded.
Loading behavior
- First visit (empty cache): render layout first + single centered spinner + "Fetching AdMob..." text
- Subsequent visits / period change / Refresh: per-card micro-spinner (only that card dims; neighbors unaffected)
- No layout shift — area-level progressive render OK, container height/position fixed up front
- No mock skeleton layouts (no flash-then-replace patterns)
Per-integration guides
See each channel's integration guide for connection steps, OAuth/API-key issuance, and token rotation policies:
- AdMob — Google OAuth (account-level)
- AdSense — Google OAuth (account-level)
- Stripe — Restricted API Key (account-level, sk_ keys rejected)
- RevenueCat — OAuth 2.0 + PKCE (account-level, multi-project fan-out)
- Polar — OAuth 2.0 + PKCE (account-level, multi-organization aggregation)