Skip to main content
Every CRM object has a dashboard. It sits above the table as a strip — KPI stats in the header, a bento of charts underneath — and opens in a full sheet from the toolbar’s Analytics toggle. The math is one query, computePanels; the UI, the CLI, the API, the chat card and the App SDK all draw from it, so a number is the same number everywhere.

What a dashboard is

A dashboard is a list of panels. A panel names a metric, an optional group-by, an optional date bucketing and optional filters in the same FilterGroup shape saved views use. No SQL. Derived metrics (conversion_rate, win_rate, won_amount, lost_amount, open_pipeline, pipeline_forecast, mrr, arr) read the object’s field roles — amount, stage + won/lost/converted values, close date, owner, location, recurrence, stage probabilities — so they work on any custom object once the roles are mapped. Templates map them at install. Two synthetic fields work anywhere a field name goes:
  • $createdAt — the row’s creation time. “New leads this week” needs no date column.
  • $location — the location role, resolved through one relation hop (Account.HQ Location) so a deal inherits its account’s HQ.

Period, views, drills

  • The header’s period pill (“This month”, “Last quarter”, …) scopes every chart and the rows under the strip, and fills each stat’s previous-period delta. It is never saved onto a view.
  • Dashboards are per object or per view. Every view shows the object’s shared dashboard until it gets its own (scope --mode own starts it as a copy). Any active view follows its own filters by default.
  • Clicking a chart segment filters the table (chips in the header, one per dimension); the chart you clicked keeps its whole picture.
Deep link: /?path=<object>&analytics=1[&view=<view>][&analyticsPeriod=this_month] opens the sheet with the pill set.

Charts in chat

Ask Dench a quantitative question (“pipeline by stage this quarter”, “where are our customers”, “win rate by rep”) and the answer is a live chart card in the thread — the object’s own computePanels, updating as rows land. Open takes you to the dashboard; an ad-hoc chart offers Save to dashboard. When the panel model cannot express the question (a join across objects, a custom formula, a cohort), Dench embeds a small App SDK widget instead, fed by dench.analytics.compute; Keep as app turns it into a workspace app. Off the web UI (Slack, iMessage, comments) you get the headline number and the deep link.

CLI

--period is this_week | this_month | last_month | this_quarter | last_quarter | this_year. Each panel in a compute response says where its numbers came from (source): aggregate — pre-computed buckets, exact at any table size (counts, sums, averages, group-bys, monthly or coarser series, won/lost/open $, MRR/ARR, forecast, win rate); scan — the newest rows; or snapshot — a background pass over every row that replaces a clipped scan. truncated: true appears only while a scan panel could not see every row; the snapshot is requested automatically and the next response is exact. link is the deep link above.

API

Apps call the same query through the bridge: dench.analytics.compute({ objectName, viewName?, panels?, panelIds?, period?, extraFilters? }) — see the Apps reference.