Analytics & reporting

Answers from the system of record — not a second data stack.

Finance wants MRR by plan, month over month. Ops wants an SLA dashboard. The usual answer is exporting into a BI tool where permissions, definitions, and freshness quietly drift. ObjectOS runs the same questions over the governed objects themselves — defined once as a dataset, rendered in dashboards, and assembled in a designer.

ObjectOS product surface connecting business data, applications, and AI agents
AI Writes metadata Objects, permissions, workflows, tools
Human Reviews diff Business authority, data access, approvals
Runtime Enforces policy UI, APIs, audit, MCP, actions
3
Query strategies: native SQL, ObjectQL, in-memory
Same rules
Row and field permissions apply to every report
Zero ETL
Reports run on live objects, not exported copies

Metrics as metadata

Define the measure once. Reuse it everywhere.

A dataset names the measures and dimensions a business cares about. Dashboards, reports, and AI questions all resolve against the same definition, so "monthly recurring revenue" means one thing.

import { defineDataset, defineReport } from '@objectstack/spec/ui';

export const RevenueDataset = defineDataset({
  name: 'billing_revenue',
  label: 'Revenue',
  object: 'billing_subscription',
  dimensions: [
    { name: 'plan', label: 'Plan', field: 'plan', type: 'string' },
    { name: 'month', label: 'Month', field: 'renews_at', type: 'date', dateGranularity: 'month' },
  ],
  measures: [
    { name: 'mrr', label: 'MRR', aggregate: 'sum', field: 'mrr', format: '0.0' },
    { name: 'active_subs', label: 'Active Subscriptions', aggregate: 'count' },
  ],
});

export const MrrByPlan = defineReport({
  name: 'billing_mrr_by_plan',
  label: 'MRR by Plan',
  type: 'summary',
  drilldown: true,
  dataset: 'billing_revenue',
  rows: ['plan'],
  values: ['mrr'],
});

Reporting primitives

Answer finance’s question, then keep going

The analytics service compiles questions to the right strategy — pushed down to SQL where it can, computed in the runtime where it must.

Aggregations & grouping

“MRR by plan” is the dataset’s sum over one dimension — sums, counts, averages, and breakdowns traverse relations through the query engine.

Time series

The renewal curve by month, ticket volume by week — time-zone-aware bucketing by day, week, or month on any date dimension.

Funnels

Trial → paid, request → approved → fulfilled — stage-to-stage conversion across status fields and processes.

Dashboards

The MRR chart, the active-subscriptions counter, and the churn table compose into one shareable dashboard next to the records they summarize.

Semantic datasets

Named measures and dimensions keep every team — and every AI answer — computing the same numbers.

The dashboard & report designers

Assembled by clicking, saved as metadata

Dashboards and reports open in designers in the open-source console — what you click together is stored as the same reviewable definitions an agent writes.

The dashboard designer

Click a widget on the grid canvas and an inspector opens for its title, chart type, and data binding; add new widgets from a picker of 10+ types — charts render live data while you design.

The report designer

Band-based layout — report header, detail, group and page footers — with text, field, chart, and table elements placed on the canvas and a preview toggle to check the output.

Drill down to the records

Reports built with drilldown enabled let a reviewer click the MRR number and land on the exact subscriptions behind it — permissions applied on the way down.

One dataset feeds them all

The designer binds widgets to datasets, not raw tables — so the dashboard, the report, and an AI answer stay on the same definition of “revenue”.

Governed by design

The report respects the same authority as the app

Because analytics runs inside the runtime, the permission model is not an afterthought — it is the execution path.

Permission-aware results

A regional manager’s dashboard aggregates only their region’s rows; masked fields never leak into a chart or an export.

Same rules for AI and people

AI Ask answers inside the same permissions as every dashboard, so a chat answer never shows more than the screen would.

No export drift

Reports read live objects instead of stale copies, so the number in the meeting is the number in the system.

Decision surface

What changes, who reviews it, what runs

Business needAI writesRuntime supplies
MRR by plan and monthA dataset with measures and dimensionsCompiled queries, charts, and caching
A new KPI card on the ops dashboardNothing — click it together in the designerThe widget inspector, live data, saved as metadata
Pipeline conversion by stageA summary report over the stage fieldStage-to-stage computation and trends
Ask AI "how did Q3 close?"Nothing new — the dataset is enoughThe same governed numbers, in chat

Review checklist

An analytics review should confirm

  • Key measures are defined once, in datasets, not per chart.
  • Dashboards inherit row and field permissions.
  • Time series use consistent time zones and calendars.
  • AI answers resolve against the same definitions as reports.
  • No pipeline exports data to a less-governed copy.

FAQ

Questions this page should answer

Does this replace our BI tool?

For operational reporting on business objects, you will not need a separate stack: dashboards, funnels, and time series run in the platform. For cross-system warehousing, ObjectOS coexists — federation and APIs make governed objects easy to consume.

Are the dashboard and report designers in the open-source edition?

Yes. The widget-based dashboard designer, the band-based report designer, drilldown, aggregations, time series, funnels, and semantic datasets are all part of the open-source runtime, with the same permission enforcement as the rest of the platform.

Next pages

Keep building the evaluation packet.