OpseerOpseer
Docs
Dashboard

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)