exoDocs

The stack

11 · Observability

exo-analyze keeps visits, sign-ups, conversion, and cost to serve in one Exo event layer; PostHog is a swappable dashboard adapter.

Dimension
11 · Observability
Platform
PostHog + RevenueCat · via exo-analyze
PostHog
Replaceable dashboards and replay over Exo-owned events: visits, sign-ups, conversion, and cost to serve. Optional adapter · authority: EXO
RevenueCat
Mobile subscriptions and in-app purchase events normalized beside web payments. Optional adapter · authority: App
Status
Accepted (ADR 0006, 2026-09-27); planned.

Renamed from Analytics (2026-10-05): the same exo-analyze layer, named for what it does.

What it is

Visits, sign-ups, conversion, and cost to serve land in one Exo event layer beside payments. Dashboards are an adapter, so the provider can change without touching an App. The service design is on the exo-analyze page.

Platform

  • PostHog provides dashboards and session replay, sitting behind Exo as a swappable adapter. Plausible and GA4 remain possible adapters.
  • RevenueCat supplies the paid step of the funnel for app-store purchases, beside Stripe for web payments (ADR 0006). Revenue events land in the ledger described on Payments.

Boundary and replaceability

  • 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 and Expo).
  • Apps never integrate an analytics platform directly. Changing platforms is an Exo adapter change.
  • Event schema changes are platform decisions. Privacy and consent (cookie banners, data deletion) are centralized in Exo.

Cost notes

From ADR 0006:

  • At today's portfolio scale, event volume fits PostHog's free tier (~1M events/month).
  • The incremental cost is Convex storage and function usage for the event table, expected to be a few dollars per month.
  • If volume outgrows the free tier, Exo can sample or aggregate before forwarding to the adapter while keeping full-fidelity funnel counts in Convex.

Status

Source: content/docs/stack/observability.mdx

On this page