exoDocs
Decisions (ADRs)

Decisions and roadmap

ADR 0006: exo-analyze — Exo-owned product analytics

  • Status: accepted (owner-approved 2026-09-27)
  • Date: 2026-09-27
  • Roadmap: product-analytics (exo-analyze)

Context

Exo provisions shared platform services to every app so apps do not spend time on basic plumbing. Today RevenueCat and Stripe tell us about payments only. We cannot see visits, sign-up conversion, or what it costs to serve a user, so we cannot compute per-app unit economics or margin. Letting each app wire its own analytics vendor would repeat the integration per app and scatter the data.

Decision

Exo owns product analytics as a platform service, exo-analyze:

  • Ingestion and schema live in Exo's Convex backend, partitioned per app and per environment. Apps send events to one Exo endpoint through a thin SDK (web + Expo).
  • Exo stores the funnel end to end: visits → sign-ups (Exo ID) → paid (RevenueCat / Stripe webhooks) → cost-to-serve (exoAiBrokerJobs, plus exo-verify and infra cost). That join gives per-app unit economics: acquisition, conversion, revenue per user, and margin.
  • PostHog sits behind Exo as a swappable adapter for dashboards and session replay (free tier ~1M events/month). Plausible and GA4 remain possible adapters.
  • Apps never integrate an analytics vendor directly. Changing vendors is an Exo adapter change, not an app change.

Unit economics

  • At portfolio scale today, event volume fits PostHog's free tier; the incremental cost is Convex storage/function usage for the event table, expected to be a few dollars per month.
  • Each app's dashboard reports cost per active user and gross margin per paying user, so feature design can be judged on cost per unit and margin, not revenue alone.
  • If volume outgrows the free tier, Exo can sample or aggregate before forwarding to the adapter while keeping full-fidelity funnel counts in Convex.

Alternatives considered

  • Per-app PostHog/Plausible/GA4 — fastest for one app, but no cross-app funnel, no join to Exo ID or broker cost, and vendor lock-in in every codebase.
  • PostHog as system of record — good dashboards, but ties revenue and cost-to-serve joins to a vendor schema; kept as an adapter instead.
  • RevenueCat/Stripe only — status quo; payments without the top of the funnel or cost.

Consequences

  • Exo ships and versions the analytics SDK; exo-mobilize bakes it into the mobile template.
  • Event schema changes are platform decisions, reviewed like any other Exo contract.
  • Privacy/consent handling (cookie banners, data deletion) is centralized in Exo.

Source: docs/adr/0006-exo-analyze-product-analytics.md

On this page