Builder Lesson 39 of 70 ⏱ 10 min ▶ Video

The KPI card — one headline number, with a trend, a comparison, and a target

Lesson summary

A KPI card takes a whole report and shows one number — this month's tickets, this quarter's revenue — big enough to read across the room. It's the least fussy visualization in DashboardFox: point it at almost any report and it renders. The catch is a quiet one. How much card you get — a bare number, or a number with a trend, a comparison, and a target — is decided by one thing: whether your report has a date, and whether that date carries a year. This lesson builds two cards and makes that rule impossible to miss.

By the end of this lesson

  • Build a KPI card from a two-column report — a value and a date — and read it against the previous period
  • Know how the Value Source and a year-bearing date unlock comparisons, trend, per-period goals, and viewer period-switching
  • Keep a wall of KPI cards fast — constrain dates, filter the subset, and aggregate to the period you show

You'll need

  • A report open in the Composer with a number to count or sum, and ideally a date column — see Your first report
  • Aggregate basics (count, sum, average) — see Report formulas. A KPI is an aggregate with a nice face on it

Background

A KPI card answers one question with one number. Where a chart needs its data carefully shaped, a KPI asks almost nothing — no required columns, no category values, no schema to match. Point it at a report and it draws a number. What decides how much of the card lights up is a single column: the one that says when each row happened.

That date column puts you on one of three rungs. This is the whole mental model, so it's worth seeing laid out:

Your date column
What the card can do
None
Show one number — a single cell, or a total across the report. Compare it against another column or another row. That's the whole card.
Period labels with no year
January, Nov, Q3
A trend, and one comparison: the period immediately before. No year-over-year. No viewer period-switching.
Real dates, or labels with a year
2026-03-15, Mar-26, Q3-2026
Everything. Eight comparison recipes, roll up from days to months to quarters to years, let viewers change the period on the fly, and click straight through to the exact date range behind the number.

The gap between rung two and rung three is one character: a year. March gets you a trend and a look at last month. Mar-2026 gets you the same month last year, the same portion of last year, and everything else. When you have the choice, write the year, and prefer ISO dates (2026-03-15) — they're read the same everywhere and never land on the wrong day.

Value Source — what the big number means

One more idea before the walkthrough, because it gates half the options on the card. Value Source tells the card where the headline number comes from:

  • Single value (cell) — one cell of the report: pick a column and a row. No date needed.
  • Text, as-is — a cell shown exactly as written: a name, a status, a label. No date needed. This is how you show "top sales rep" or "top product line" as the headline.
  • Latest period — the most recent period's figure. This is what most people want, and it's the only source that unlocks time comparisons, the trend, per-period goals, and the runtime period-switcher.
  • Total, all periods — every row added up.

The video moves fast past this and lands on Latest period (it calls it "last period") because the ticket data has a date. Whenever you want comparisons or a trend, that's the one to pick.

The one-line version: a KPI is an aggregate with a face on it. Give it a value and a real, year-bearing date, choose Latest period, and the rest of the card opens up.
Haven't watched the video yet? It's about ten minutes and builds two cards start to finish — a count of tickets by month, then a summed-revenue finance card scoped to closed months with a year-over-year comparison. It's worth the ten minutes; this page covers the same ground and adds the parts the video moves past: what your date column unlocks, and how to keep a dashboard full of these cards fast.

Stuck before you've got a report to turn into a card? Email [email protected] and tell us the app and what number you're trying to show. Real human, same business day reply.

Do it

  1. Build the dataset — a value and a date

    Start simple. In the Composer, open the Tickets app and pull in two fields: ticket number (the thing you'll count) and the open date (the "when"). Put a descending sort on the date so the most recent rows lead.

    That's the whole dataset a KPI needs. Ticket number is text, not a number — and that's fine. The card will count it, which is the only calculation that makes sense on a text field, and it's exactly what you want here: how many tickets.

  2. Open the builder — Visualizations → KPI

    Click Visualizations in the toolbar and choose KPI. A lot is decided for you from the dataset. Leave KPI Title blank to show the number on its own, or type one.

    Select Display Type is Big Number and Trend — one value, an optional comparison, a goal, and a small chart over time. Select Value Column has already picked ticket number (the only value field present), and the calculation is Count — again, the only option on a text field.

    One thing to keep in mind the whole time you're in here: the preview is a 50-row sample. Don't fully trust its numbers. You'll confirm against the real thing with View Full Document at the end.

  3. Let the date drive it — Value Source and period

    Because the dataset has a date with real detail, the card defaults its Value Source to Latest period (the video says "it defaulted to last period"). If there were no date at all, it would just total the whole report instead.

    With a period-based source, a few fields appear: the Period Column (your date), Group by (roll daily rows up to Day / Week / Month / Quarter / Year), and Calculation (Sum / Average / Min / Max / Count). The rule for Group by only goes one way — you can always roll up, you can never invent detail you don't have. Daily rows become months; monthly rows can't become days.

  4. Format the number, then add a comparison

    Number Format sets how the value reads — None, Fixed point, Percent, Large number (1.2M), or Currency, with decimals and currency symbol here. Value Color colors the big number. Formatting is display only; it never changes the arithmetic.

    Now the part that makes a KPI a KPI. Open Comparison Options and turn it on. With a date in play, choose the time-based source, then a recipe under Compare tovs previous period to start. Set Favorable (higher is better, or lower is better) so the little change chip is green when the news is good and red when it isn't — the card can't know which way is up for your metric, so tell it. Switch Style from Compact (a small chip beside the value) to Detailed (a labelled row with the prior figure) to see the difference.

  5. Add a trend and turn on viewer interactivity

    Under Trend Options, draw a small chart of the value over time — Line / area or Bars. Dense data is grouped automatically so the shape stays readable; your figures are untouched.

    Open Interactivity. Two useful things live here. A drill-down target report makes the card clickable — click the number and open that report filtered to the rows behind it. And viewer controls let people reading the dashboard change what the card shows without editing it — switch the period grain, or flip the comparison basis between previous period and same period last year. In the video, turning this on is what lets a viewer swing the finance card from month-over-month to year-over-year on their own.

  6. Save, then View Full Document

    Save the card. Then — because everything so far ran on a 50-row sample — click View Full Document to run it against everything. That's the real card. In the video, the full run shows 886 tickets in July, and the trend makes the month-to-month rhythm obvious in a way the sample couldn't.

    To come back and edit, use Config next to the visualization — it reopens the builder with your settings intact.

  7. A richer card — the finance example

    The second card shows what a little dataset prep buys you. This time work in the finance part of the app, where the value is real revenue, not a count.

    Two moves happen in the dataset, before the KPI, and they matter:

    • Scope the rows with criteria. The finance table mixes actuals and budget, revenue and expenses. A KPI should show one clean thing, so hard-code the dataset: value type Is Actual and category Is Revenue. Now the number can't be muddied by budget rows or expense lines.
    • Constrain the dates — and set up year-over-year while you're there. Finance closes monthly, so you don't want the current, un-closed month distorting things. On the date field, add Is Year to Date and Is not This month to get every closed month this year. Then add one more with the logical filter set to Or: Or Is Last Year. That single Or is what makes same period last year possible later — you've pulled this year and last year, and nothing else.

    Now open the KPI. The value is your revenue amount, and because it's a real number the calculation is Sum (with Average, Min, Max also available — more than the text field allowed). Set the Period to your date, format as Large number or Currency (a currency code like GBP swaps the symbol to £; clear it to go back to $), pick a Line trend, and save. View Full Document, and you're comparing whole closed months — June against May, and June this year against June last year, all switchable by the viewer through the interactivity you turned on.

Make it real

The card works the moment you save it. These are the things that make it right — the one data decision that unlocks the good comparisons, the parts that earn it a place on a wall, and the habits that keep a dashboard of these fast.

The year in your data is the whole ballgame

Almost every "why can't I get year-over-year?" comes down to a year-less period label. March can only look back one period; Mar-2026 can look back a year. If you're aggregating a report down to a period label (Block below), keep the year in it — 2026-03, never March. Drop the year and you fall to rung two of the ladder and lose the very comparison you probably aggregated in order to afford.

Status words and goals — where a card earns a wall

Two accordions turn a number into a judgement, and they're worth a look once the basics land. Status and Thresholds shows a colored word — On Target, Behind — when the value crosses a cut point you set (measured as the value itself, a percent of a reference, a percent change, or standard deviations from average). Goal Options puts a target under the number with an arrow: a fixed value, a cell, or — the useful one — a per-period target like a budget column, so March's actuals meet March's budget and the target follows when you switch to quarterly.

One behavior surprises people: if the reference can't be worked out, no status word shows — no goal set, a goal of zero, a missing prior period all mean the card shows nothing rather than a color that means nothing. That's deliberate. The full control-by-control breakdown, including custom status tiers, is in the visualization options reference.

Keep a wall of KPI cards fast

Here's the part people skip until a dashboard takes fifteen seconds to open. Every KPI tile runs its own report, and therefore its own database query. The card displays one number, but the database doesn't know that — ten tiles each pulling five years of rows is ten heavy queries on every load. Three levers, cheapest first:

  • Constrain the dates. Most cards are about now. Add a date criterion with a predetermined range — Year to Date, Last 3 Months. For year-over-year, Year to Date Or Last Year is all you need — two years, not five.
  • Filter to the subset that matters. If the card is about open tickets, status Is Open. Every row nobody's looking at is a row read and shipped for nothing.
  • Aggregate to the period you show (the biggest win). A monthly trend needs 24 monthly totals, not 240,000 daily rows. Add a formula that reduces the date to a period label (keep the year), a Sum aggregate on the value, and hide the rest. See Report formulas and Data prep tools.

And the trap that undoes all three: a filter column that fragments your rows. You aggregate to one row per month, then leave customer_name visible to filter on it — now it's one row per month per customer, thousands of rows again. A field can drive a filter while non-visible. Turn it off; the filter still works, the rows stay collapsed.

Caption tokens — context that fills itself in

The most under-used field on the card. In Caption and Subtitle, type @ and pick a token the card resolves at run time — {prior}, {priorPeriod}, {goal}, {goalPct}, {toGoal}, and more. So vs {prior} in {priorPeriod} renders as vs $565,921 in Feb 2026, and {goalPct} of {goal} — {toGoal} to go reads as 82% of $3,000,000 — $540,000 to go. Tokens that can't resolve just render as nothing, so they're safe to use.

If you're stuck

The KPI stumbles, roughly in the order they show up. Most are about what your date column can and can't do — not about anything being broken.

My date column isn't in the Period Column list

The card only offers columns it can read as dates. If yours isn't there, its values aren't consistently readable — mixed formats, too many blanks, or a date buried in free text. Clean the column, or build one consistent date with a formula. ISO (2026-03-15) is the safest target.

There's no "same period last year" option

Your period labels have no year, so the card can only reach back one period. Add the year: March becomes Mar-2026. Same cause hides Group by and the viewer period-switcher — a year-less label can't be rolled up or compared across years.

There's no Trend option

Trend needs a period-based Value Source and a readable date. If it's missing, your Value Source isn't Latest period, or the report has no date the card can read. Switch the source, or fix the date column.

My number column won't Sum — it only offers Count

The value column is typed as text, so the card can only count rows. Override the field's data type to a number (see Formula fields), and Sum / Average appear.

The status word never appears

The reference it measures against can't be resolved — no goal set, a goal of zero, or no prior period to compare to. The card shows nothing rather than a meaningless color. Check Compare to under Status and Thresholds, and confirm the goal or prior period it points at actually exists.

The change chip is green when the news is bad

Favorable is set the wrong way. Revenue is higher is better; churn, cost, and response time are lower is better. The card has no way to know which — set it under Comparison Options.

The dashboard takes forever to load

Every tile is querying years of raw rows. Constrain each card by date, filter to the subset it's about, and aggregate to the period you display — the three levers in Make it real above. This is the single biggest cause of a slow KPI dashboard.

None of these match my situation

Email [email protected] with the app, the report, and a screenshot of the card. Real human, same business day reply. The full control-by-control reference is the visualization options reference.

7-day free trial — no credit card

Built lean. Priced fairly. Supported by humans.

Full access to all features. No credit card required.

Prefer no subscriptions & full control? Self-hosted from $4,995 one-time →

Click once to extend to 14 days — need more time? Just reach out.

25+ years building BI tools Support from the team that builds it Available in US & EU regions
DashboardFox mascot