Analytics Layer
Status as of March 28, 2026.
Goal
ButtrBase should expose a control-plane analytics layer, not just a pile of legacy counters.
The first shipped slice focuses on:
- app analytics overview
- organization analytics overview
- custom event ingestion
- shared analytics views in both the React and Solid admin consoles
- organizations
- members
- teams
- active users over the last 7 days
- new users over the last 30 days
- audit events over the last 30 days
- custom analytics events over the last 30 days
- trailing revenue totals from stored pricing rows
- user activity over the last 14 days
- event volume over the last 14 days
- trailing 6-month revenue trend
- pricing funnel conversion
- auth and SSO adoption mix
- entitlement deny-rate signals
- session and governance operational signals
pricing_funnelauth_adoptionentitlementsgovernancepricing_funnelpreview_count_30dquote_count_30dcheckout_started_30dcheckout_completed_30dpreview_to_quote_ratequote_to_checkout_ratecheckout_completion_rateauth_adoptionauth_login_30doidc_login_30dotp_verified_30dsso_share_pctotp_share_pctpassword_share_pctentitlementschecks_30ddenied_30ddeny_rate_pcttop_denied_features(same shape as breakdown rows:key,label,value)governanceaudit_exports_30dteam_created_30dteam_member_added_30dteam_member_removed_30dgovernance_events_30devent_nameevent_categorysourceapp_uuidorg_uuidteam_uuidstatusamount_centscurrencymetadataoccurred_atusersfor sign-in and creation recencyorguserandteamsfor membership and team countsapp_pricingfor stored billing totalsaudit_eventsfor structured admin actionsanalytics_eventsfor custom event ingestion/dashboard/:appName/:appId/analytics/dashboard/:appName/:appId/org/:orgName/:orgId/analytics/dashboard/:appName/:appId/analytics/dashboard/:appName/:appId/org/:orgName/:orgId/analytics- Revenue is aggregated from stored billing rows without FX normalization.
- If the
analytics_eventsmigration has not been applied, overview routes still work, but custom-event storage is reported as not ready. - The first slice is overview-driven, not yet a full warehouse, segmentation, or export platform.
auth_*sso_*mfa_*session_*team_*role_*entitlement_*pricing_*governance_*agent_*audit_*
Live Backend Surface
GET /api/analytics/apps/:app_uuid/overview
Returns the app-level analytics overview.
Current summary coverage includes:
Current chart coverage includes:
Optional panel coverage (when instrumentation is present) includes:
GET /api/analytics/organizations/:org_uuid/overview
Returns the same analytics contract at organization scope.
Optional panels Contract
Both overview endpoints may include an optional top-level panels object.
If panels is missing, consumers should keep rendering the base summary/series/breakdown/status contract.
Current optional panel keys:
Current panel fields:
POST /api/analytics/events
Stores a first-class analytics event.
Current fields:
At least one of app_uuid or org_uuid should be present.
Current Data Sources
The first analytics layer intentionally reuses existing operational data before moving to a dedicated warehouse:
Current Frontend Surface
React:
Solid:
Both consoles now use the same backend analytics contract and render optional decision panels when panels data is present.
Important Limits In Phase 1
Recommended Event Taxonomy
The next events worth standardizing are:
Next Build Steps
1. Automatically instrument pricing preview, quote, checkout, entitlement, and auth flows into analytics_events
2. Add export and warehouse sync paths once volume justifies it
3. Move the same analytics contract into the Rust migration plan after the current control-plane slices stabilize