The KPI card — one headline number, with a trend, a comparison, and a target
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:
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.
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
-
Build the dataset — a value and a date
Start simple. In the Composer, open the
Ticketsapp 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.
-
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.
-
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.
-
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 to — vs 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.
-
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.
-
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.
-
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 Actualandcategory 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 DateandIs not This monthto 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.
- 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:
You have a working connection. Below is what to tighten before real users see it. Skip if you're just testing.
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
Sumaggregate 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.
