Three dashboards show three different revenue numbers and all three are right. Here is the model behind a catalogue that settles it, the prompts to build it, and what it takes to run it.
Your private status link is on its way to your inbox.
A metric definitions catalogue is four parts: one definition per metric in business language, a named owner who can change it, versions with effective dates, and links to every report using it. The problem it solves is not that people disagree about the number. It is that three teams each have a defensible definition and nobody wrote them down, so every meeting spends its first ten minutes discovering that again.
Metric catalogue
142
Metrics defined
11
No owner
4
Changed this quarter
38%
Dashboard metrics uncatalogued
| Metric | Owner | Excludes | Version | Used by |
|---|---|---|---|---|
| Net new ARR | VP Finance | Services, renewals | v3, from 1 Apr | 9 reports |
| Weekly active user | VP Product | Internal accounts | v2, from 1 Jan | 14 reports |
| Qualified pipeline | VP Sales | Renewals, closed lost | v5, from 1 Jul | 22 reports |
| Gross margin | VP Finance | Stock comp | v1, from 1 Jan | 6 reports |
| Time to value | Unassigned | - | draft | 2 reports |
You run data, analytics or the function that keeps being asked why two numbers disagree. What you want is one place that answers what a metric means, who decided that, and what changes if it changes.
What happens when two dashboards disagree, and how the catalogue makes that a five-minute conversation.
The plain definition first, with the query and source tables as supporting detail underneath.
Which is where the disagreement almost always is: services, internal accounts, renewals.
A named person in the business who would defend the number, not the data team who calculated it.
Definitions are versioned with effective dates, so a number from March is explained by the definition in force in March.
It routes to the owner, and the exchange is kept, because in a year the reasoning is more useful than the definition.
Every dashboard, report and model that depends on it, listed before anybody changes anything.
A metric catalogue is not a data dictionary. It is four parts, and the second is the one that makes it a decision rather than documentation.
In business language, with the exclusions stated explicitly. The query, the source table and the grain are supporting detail rather than the definition itself.
A named person in the business, not the data team, who can change the definition and is asked when someone wants to. Ownership by a team means ownership by nobody.
Each with an effective date and a note of what changed and why. Editing in place makes every historical number quietly wrong and unexplainable.
The dashboards, reports and models that depend on this metric, so changing a definition shows its blast radius before anyone changes it.
These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix
Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.
Business first, query second, exclusions explicit.
In this Helix project, build me a metric definitions catalogue.
Each metric has a name, a short business definition in plain language, the
question it answers, its grain (per what, per when), the unit, and a
worked example with real-ish numbers.
Then, and this is the field most catalogues leave out, an explicit list of
what the metric deliberately excludes. Most disagreements about a number
are about the exclusions rather than the inclusions: does revenue include
services, does an active user include internal accounts, does pipeline
include renewals. Write those down as their own field and half the
arguments stop.
Keep the technical detail as supporting information: source tables, the
query or transformation, the refresh cadence. Useful, but not the
definition. A definition only an analyst can read cannot settle an
argument in a leadership meeting.
Let me tag metrics by domain and search across everything, including the
exclusions.
I sign in through Helix, so do not build a login page. Read the signed-in
user from the runtime. And do not put any key or connection string in the
code: if this needs to reach another system, tell me and I will create the
connection in my workspace. Worth knowing. The exclusions field is the cheapest thing here and it resolves most of what these catalogues are built to resolve.
Because a definition the data team owns is one nobody will defend.
Give every metric a named owner, and require it. Not the data team: somebody
in the function that uses the number and would defend it in a meeting.
Add a reviewer too, usually from the data team, who checks that the
definition and the query actually agree.
Flag any metric with no owner, and any metric whose owner has left, if I
give you a list of current staff.
Then let anybody raise a question or a proposed change against a metric.
It routes to the owner, they respond, and the exchange is kept on the
metric. Six months later the useful artefact is often not the definition
but the record of why it is that and not the obvious alternative. So last year stays explainable.
Make definitions versioned, with an effective date and a note of what changed
and why.
Never edit a published version in place. If revenue stops including
services in April, a number calculated in March was not wrong, and editing
the definition makes it look as though it was. Anyone reading a historical
report needs to see which version applied at the time.
Show a diff between versions, and show which version was in force on any
date I pick.
Add a status: draft, active, deprecated, and replaced by. Deprecated
metrics stay visible with a pointer to their replacement, because they
will keep turning up in old decks for years and people need somewhere to
land. Worth knowing. Editing a definition in place is how a company loses the ability to explain its own history. Versions with effective dates cost almost nothing and prevent it.
Lineage, and the reports that quietly disagree.
Link each metric to what uses it: dashboards, scheduled reports, models,
and any app that reads it.
Then when somebody proposes a change, show the full list of what depends
on that definition. Changing a metric is not a data task, it is a
communications task, and the list of affected reports is the audience.
Add a conflict report: metrics with similar names or similar definitions
that are not linked. That is where the three-numbers-for-revenue problem
actually lives, and it is invisible until something goes looking for it.
Report coverage too: how many metrics used in dashboards have no catalogue
entry at all. That number starts high and it is the honest measure of
whether the catalogue is finished. The step that turns a working prototype into something with your data in it.
Now connect it to the systems we actually run, so it works on real data
rather than the rows you seeded.
Anything in angle brackets is a placeholder. Swap it for whatever we use
instead, and have the app name the connection it wants rather than assume
a vendor, so changing my mind later is a config change and not a rewrite.
<Looker>. Read which dashboards use which metric, so a proposed change
comes with its blast radius.
<Snowflake>. Read table and column metadata, so a definition can be
checked against what the query actually does.
<Okta>. Resolve metric owners to real people, and flag any whose owner has
left.
<Slack>. Route a proposed change to the owner and keep the exchange on the
metric.
<dbt>. Read the models behind a metric, so the definition can be checked
against the transformation rather than the dashboard.
<Google Sheets>. Catch the metrics that only exist in a spreadsheet, which
is where the disputed ones usually live.
<Notion>. Mirror each definition into the docs space, so somebody
searching a metric name finds the definition and not a dashboard.
Only write where I have said to write. Everything else is read only.
Do not write a key, a token or a connection string anywhere in the code,
and do not ask me to paste one. Tell me which connections you need and I
will create each as an authentication in my Helix workspace. Reference
them by alias. Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.
The last step of every build: a URL, and the right people on it.
Deploy my app. Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. Definitions are only authoritative if people can see who owns them, so set Access Control before sharing: everyone reads, owners edit their own metrics.
A catalogue that cannot see what uses a metric cannot tell you what a change would break.
Looker
Read which dashboards use which metric, so a proposed change comes with its blast radius.
Snowflake
Read table and column metadata, so a definition can be checked against what the query actually does.
Okta
Resolve metric owners to real people, and flag any whose owner has left.
Slack
Route a proposed change to the owner and keep the exchange on the metric.
dbt
Read the models behind a metric, so the definition can be checked against the transformation rather than the dashboard.
Google Sheets
Catch the metrics that only exist in a spreadsheet, which is where the disputed ones usually live.
Notion
Mirror each definition into the docs space, so somebody searching a metric name finds the definition and not a dashboard.
Each line says whether the app reads, writes or both. Anything not described as writing should be read only.
Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.
Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.
The build gets you a working catalogue. It becomes the authority on what your numbers mean, so who can change it matters as much as what it holds.
AI Deployment
One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.
App Security
A definition is only authoritative if the change history is attributable. SSO means every version carries a verified author, and access is scoped so owners edit their own metrics while everyone else reads.
App Security
Pulling table metadata, dashboard lists and refresh status from your warehouse and BI tool needs real access. Granting it to the app rather than pasting keys into it means credentials can be rotated or revoked without a redeploy.
App Registry
Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.
Cost Management
Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.
One place holding the canonical definition of each metric in business language, with a named owner, versions carrying effective dates, and links to every report that uses it. It exists so the first ten minutes of a meeting are not spent rediscovering that two teams define revenue differently.
Because a definition only an analyst can read cannot settle an argument between two functions. Put the plain-language definition first and keep the query, source tables and grain as supporting detail underneath it.
The exclusions. Most disagreements are about what a metric leaves out rather than what it includes: whether revenue counts services, whether active users count internal accounts. Making that its own field ends a surprising share of the arguments.
A named person in the function that uses the number, not the data team. A definition owned by data is a definition nobody in the business will defend when it is questioned, which defeats the point of writing it down.
Because if revenue stops including services in April, the number calculated in March was not wrong. Editing in place makes historical reports look mistaken and removes the ability to explain what any past number actually meant.
Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are which metrics are worth cataloguing first and who owns each one, and neither is technical.
Data and Analytics
Check freshness, volume, nulls and referential integrity on the tables people actually use, with an owner per check and alerts nobody learns to ignore. Prompts to build it, and what it takes to run it.
Data and Analytics
A small set of numbers everyone agrees on, each with a target, a trend and a named owner, refreshed on a schedule that is visible. Prompts to build it, and what it takes to run it.
Data and Analytics
Ask for the decision rather than the columns, check whether the answer already exists, prioritise against capacity, and turn repeat requests into something self-serve. Prompts to build it, and what it takes to run it.
Sales and RevOps
Find the opportunities distorting your forecast, name who owns each fix, and make hygiene a short weekly list rather than a quarterly clean-up. Prompts to build it, and what it takes to run it.
Last reviewed September 2026.
Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.
Your private status link is on its way to your inbox.