modellerUpdated 2026-06-14

KPIs (Key Performance Indicators)

What this covers

KPIs track how well your organisation is meeting its business objectives. Each KPI uses an expression written in the KPI formula language to compute a value, then compares that value against a target using threshold bands that produce a traffic-light status. This article explains what KPIs are, the expression system, KPI types, thresholds, time intelligence, the scorecard, snapshots, governance, and integrations.

How KPIs work

A KPI is a named metric definition stored within a semantic model. It uses a formula expression to derive a numeric value from one or more measures, then evaluates that value against configurable threshold bands to produce a status (good, warning, poor) and detects a trend direction (improving, stable, declining).

Expression system

KPIs are defined using a formula language with 21 built-in functions. The expression is compiled to SQL and executed against the source database via the query-router.

Core functions

FunctionDescriptionExample
measure("Name")Reference a model measure.measure("Revenue")
kpi("Name")Reference another KPI's value.kpi("Margin %")
literal(n)A constant number.literal(100)
safe_div(a, b)Division returning NULL when b is zero.safe_div(measure("Revenue"), measure("Cost"))
div(a, b, fallback)Division with a fallback value.div(measure("A"), measure("B"), 0)
coalesce(a, b, ...)First non-NULL value.coalesce(measure("A"), literal(0))
if_then_else(c, t, f)Conditional.if_then_else(measure("A"), measure("B"), literal(0))
abs(x)Absolute value.abs(measure("Variance"))
round(x, d)Round to d decimal places.round(measure("Rate"), literal(2))
min_of(a, b)Smaller of two values.min_of(measure("A"), measure("B"))
max_of(a, b)Larger of two values.max_of(measure("A"), measure("B"))

Time intelligence functions

FunctionDescription
prior_period(expr, grain)Same expression from the prior period (year, quarter, month, week).
period_to_date(expr, grain)Cumulative value from period start (YTD, QTD, MTD, WTD).
moving_avg(expr, n, grain)Rolling average over n periods.
trailing_sum(expr, n, grain)Rolling sum over n periods.
lag(expr, n, grain)Value from n periods ago.
lead(expr, n, grain)Value from n periods ahead.
pct_change(expr, grain)Percentage change from prior period.
cagr(expr, n)Compound annual growth rate over n years.
fiscal_period_to_date(expr, grain)Period-to-date using fiscal calendar.

Arithmetic operators (+, -, *, /) and parentheses are supported. Expressions are validated live in the wizard before saving.

How rolling windows are measured. Functions that look back over "the last n periods" (moving_avg, trailing_sum, lag, prior_period, pct_change) measure each period as a rolling interval counted back from today's date — not as a calendar period. A "month" window ending today covers the last 30-ish days (for example 12 May to 12 June), not the calendar month of May. Two consequences worth knowing:

KPI types

The wizard offers six KPI type presets that generate the appropriate expression:

TypeDescriptionExpression pattern
Simple measureTrack a single measure against a target.measure("Revenue")
RatioDivide one measure by another.safe_div(measure("Revenue"), measure("Cost"))
VarianceDifference between two measures.measure("Actual") - measure("Budget")
Growth ratePeriod-over-period change.pct_change(measure("Revenue"), "month")
Moving windowRolling average or trailing sum.moving_avg(measure("Revenue"), literal(3), "month")
CompositeWeighted combination of other KPIs.kpi("A") * literal(0.6) + kpi("B") * literal(0.4)

You can also write custom expressions directly in the formula editor.

Targets and direction

Each KPI can have a target value. The target determines the reference point for threshold evaluation.

Target types: no target, static value, from a measure, prior period value, or custom expression.

Direction controls which way is "good":

DirectionMeaningExample KPIs
Higher is betterA larger value is a better result.Revenue, satisfaction score, conversion rate.
Lower is betterA smaller value is a better result.Cost per unit, error rate, churn, response time.
Closer is betterThe best result is exactly at the target; any deviation above or below is worse.Budget adherence, inventory level, production tolerance.

Direction affects everything on the scorecard card:

Threshold bands

Threshold bands define when a KPI shows green, amber, or red. You can choose from presets (standard 3-band, standard 4-band, tight tolerance, centred deviation) or configure custom bands. Each band has a label, colour, and min/max range.

When you set the KPI direction, the default threshold bands adjust automatically:

You can always customise bands after the defaults are applied.

Evaluation types: percentage of target, absolute variance, percentage variance, z-score (statistical), percentile rank (peer group).

A colour-blind-safe palette option is available.

Trend detection

TrendIconMeaning
ImprovingGreen up arrowValue is moving in the desired direction.
StableGrey flat arrowValue is within the trend threshold.
DecliningRed down arrowValue is moving against the desired direction.

How direction affects trend:

The trend threshold (default 1%) and comparison period (day, week, month, quarter, year) are configurable per KPI.

Visual types

TypeDescription
Traffic lightStatus icon with green/amber/red colours.
GaugeCircular dial showing performance relative to target. The needle position accounts for the KPI direction, so a "lower is better" KPI that beats its target shows the needle in the green zone.
Bullet chartHorizontal bar with target marker.
RAG barStacked coloured segments showing status bands.
SpeedometerDial with needle, fixed scale.

Persona filtering

When a persona is active, KPIs are filtered to show only those whose referenced measures are within the persona's allowed measure list. If a KPI references a measure outside the persona scope, it is hidden from the list and blocked from evaluation. This applies to the scorecard, the API, and all evaluation endpoints.

Composite KPIs

Composite KPIs combine multiple child KPIs using weighted scores. Set a parent KPI and assign weights to each child. The composite value is computed as the weighted sum of child KPI values, with optional normalisation.

How the score is computed

  1. Each child is evaluated and normalised to a 0-100 score — by default as a percentage of the child's own target (a child at 100 against a target of 200 scores 50).
  2. Weights are renormalised to sum to 1. Weights of 3 and 1 behave exactly like 0.75 and 0.25, so you can use any convenient scale.
  3. Children with no value or no usable target are excluded, and the remaining weights are renormalised. If every child is excluded, the composite has no value.
  4. The composite's own status, trend, and formatting are then computed from the score against the composite's target — exactly the same way as for any other KPI, and identically wherever the KPI appears (KPIs panel, Scorecard, the $KPIs table for BI tools).

When a child input breaks

There are two very different reasons a child can end up with no value, and the platform now treats them differently:

When a child is broken, the composite still computes its score from the children that did work, but it now carries a visible Degraded badge on its scorecard card. Hover the badge to see exactly which child failed and why. This stops a broken input from being silently swept under the rug while the parent shows a falsely confident number.

If every child is broken, there is nothing trustworthy left to score from, so the composite shows an error instead of inventing a number.

Nested composites

A composite can itself be the child of another composite. The platform scores these recursively, from the bottom up: the inner composite's weighted score becomes its raw value inside the outer composite, and is normalised against the inner composite's own target like any other child. Example: an "Overall Health" composite whose only child is a "Financial Health" composite scoring 40 against a target of 50 evaluates to 80 (40/50 of target, normalised to 0-100).

Two guard rails apply, and both fail with a clear error rather than a silently wrong number:

Who sees what

Composite scores respect the viewer's privileges. Draft children are excluded for users who cannot see drafts, and children referencing measures outside the viewer's persona scope are excluded too — in both cases the remaining weights are renormalised. This means a viewer and an admin can legitimately see different composite scores for the same KPI: each sees the weighted score of the children they are allowed to see. When comparing numbers across users, check certification status and persona scope first.

The KPI Scorecard

The KPI Scorecard provides a live, at-a-glance view of all KPIs in a model.

The KPI Scorecard for the acme demo ModelX, open on the KPIs tab. The summary bar reads 6 total KPIs — 3 Good, 1 Warning, 2 Poor — with filters for certification, display folder, indicator type, and a viewing-as-persona preview. Below, the Sales Performance folder shows cards for Avg Transaction Value (bullet chart, $2,504.71, On Track), Gross Margin % (72.5%, On Track), and Net Sales (bullet chart, $141.5M, Near Target), each with its current value, goal, gap-to-goal, and status badge.

Each card is built from one server-computed evaluation, so the visual, the value, the gap-to-goal, and the status badge always tell the same story. The summary bar at the top counts how many KPIs are Good, Warning, or Poor, and the filters let you narrow by certification, folder, or indicator type — or preview the board as a specific persona before you publish.

What it shows

How evaluation works

The scorecard evaluates KPIs using the evaluate-batch endpoint. Each KPI's expression is compiled to SQL and executed via the query-router. Results include the computed value, formatted value, status code, status colour, trend direction, and sparkline data points. Results are cached with a configurable TTL, invalidated when a KPI is updated or the model is deployed.

Snapshots

KPIs can capture periodic snapshots of their evaluated values for historical tracking. Snapshot frequency and retention are configured per KPI in the wizard (only available for non-draft KPIs).

Available frequencies: hourly, daily (midnight or 6 AM), weekly (Mondays), monthly (1st), quarterly (1st of Jan/Apr/Jul/Oct). Retention ranges from 7 to 365 snapshots.

Governance

Certification lifecycle

StatusMeaning
Draft (default)Available for use, not formally endorsed.
CertifiedReviewed and approved for organisational use. Green badge.
DeprecatedNo longer recommended. Orange badge. Optionally linked to a replacement KPI.

Certification and deprecation are gated by ownership: only the KPI owner or an admin can change the certification status.

Version history

Each save creates a new version. Versions can be compared and reverted from the wizard review step.

Audit trail

All KPI operations (create, update, delete, certify, deprecate, revert) are logged to the audit trail.

JDBC and XMLA exposure

KPIs in the conversational agent

The conversational agent can evaluate KPIs on demand using the evaluate_kpi tool. When a user asks about KPI performance, the agent retrieves the list of non-deprecated KPIs from the model profile and evaluates any of them.

KPIs in the Excel plugin

Best practices

Related