KPI Dashboard Template
There is no workbook to download here. The template is a contract over six columns, and the shape it asks for is long rather than wide: one row per metric, per team, per period, carrying a target, an actual and the gap between them. Bring a file in that shape and the scorecard assembles itself, attainment tiles and all.
The sample is the fastest way to see whether the layout fits before you go and find your own export. It is a year of monthly rows across several teams and metrics, in exactly the shape the contract describes.
Download the sample CSV and use it as the target layout when you reshape your own sheet.
The column contract
Six columns, exactly as spelled in the sample. The unusual one is metric: it holds the name of the thing being measured rather than the measurement, which is what lets one file carry revenue, active accounts and response time side by side without any of them being averaged together.
| Column | What it holds | Role | Required | What breaks without it |
|---|---|---|---|---|
date |
First day of the period the row reports on. | date | Required | The scorecard becomes a snapshot. You can see the current gap but never whether it is closing, which is the only thing a review really wants to know. |
team |
Who owns the number: Growth, Success, Platform. | category | Optional | Accountability disappears. Every metric floats free of an owner and the team comparison panel has nothing to compare. |
metric |
Name of the measure, such as Net revenue. | category | Required | Everything. Without it the target and actual columns are numbers with no units, and the dashboard would happily add dollars to percentages. |
target |
The number the team committed to for that period. | count | Required | There is no reference line, so a trend going up tells you nothing about whether up is far enough. |
actual |
What the number came in at. | count | Required | You have a plan and no results, which is a budget document rather than a dashboard. |
variance_pct |
Signed gap against target, as a percentage. | percent | Optional | The ranked miss list and the colour coding are computed instead of stated, so your own convention for lower-is-better metrics is lost. |
Note that target and actual are read as plain numbers, not as currency, because in one file they will be dollars on one row and a count of accounts on the next. If every metric in your file is money, add a currency symbol and they will format as money throughout.
What you get
- An attainment strip. One tile per headline metric for the latest period, each showing the actual, the target underneath it and the variance in green or rust depending on the sign.
- Target against actual over time. Two lines per metric on one axis, the target usually flat or stepped and the actual doing whatever it did. The area between them is the story.
- Variance by metric. A ranked bar of the current gap, biggest miss at the top, so a review starts at the problem rather than working down an alphabetical list.
- Team comparison. Average attainment by
team, which is the panel that turns a scorecard into a conversation about capacity rather than effort. - A metric by period grid. Metrics down the side, periods across the top, variance shaded in each cell. Twelve months of six metrics in one glance, and a streak of rust across one row is instantly visible.
- The underlying table. Every row as filed, sortable, so anyone who disputes a number can find it in two clicks instead of asking you to check.
i. Bring these columns
This is the one template where the reshaping matters more than the renaming, because almost every hand-maintained scorecard is wide. Somebody built it to type into, and typing into a wide grid is genuinely easier. Charting a wide grid is not. Convert it: each cell in the grid becomes a row carrying its period, its metric name and its value.
While you are converting, settle the naming. A metric called ARR in one tab and Annual recurring revenue in another becomes two metrics in the dashboard and two lines that should have been one. Fix the spelling once at the source and the file stays fixable forever.
ii. Drop the file
Drag the CSV in. The metric column becomes the primary grouping, target and actual bind as a paired measure so they draw on the same axis with the same formatting, and variance_pct drives the colour on every tile and cell.
Check one thing on your first load: that the attainment tiles show the latest period rather than a total across all periods. If the file has a stray row with a date far in the future, perhaps a placeholder for next year's target, the tiles will jump to it and every actual will read as zero. Delete the placeholder rows or leave the date blank on them.
iii. Adjust what you need
Filter to a single team before a team's own review, and the whole board narrows to their numbers without you building a second file. Reorder the metric list so the two that matter sit at the top, because a scorecard where the important number is fourth gets read fourth. Change the grain if you track weekly and report monthly.
Then export. The board goes out as an image for the deck, and any panel hands you its numbers as CSV, which is the version to paste into the minutes so the commitments and the chart cannot drift apart later.
Getting your export into this shape
Unlike sales or marketing data, a KPI sheet rarely comes out of a system. Somebody maintains it, usually in a shared spreadsheet, and it has grown organically for two years. Here is what that file typically looks like and what has to happen to it.
It is wide, and it has merged cells. Months run across the top, often with a merged quarter header above them, and metrics run down the left with blank rows separating sections. Delete the merged header row, delete the blank separators, then unpivot the months into rows. Merged cells export as a value in the first column and empty strings in the rest, which is why a naive export produces a file with a header row that looks like Q1,,,Q2,,,.
Targets and actuals live in different tabs. Very common: a Plan tab set in January and an Actuals tab updated monthly. They have to be joined on metric and period before export. The join usually reveals that the two tabs disagree about metric names, which is annoying and also the most valuable thing the exercise will produce.
Numbers are stored as display text. A cell reading 1.2M or 84k or 85% is text with a suffix. Percentages are the worst offender because a cell showing 85% might hold 0.85 underneath, so half the file is on a zero-to-one scale and half is on a zero-to-a-hundred scale. Pick one, and write the variance the same way throughout.
There are notes in the number columns. Cells containing TBD, see note, or a value with an asterisk. Those are not numbers and they will be excluded from totals with a count shown beneath the panel rather than silently treated as zero. Move the commentary into its own column and the numeric columns become clean.
What this template will not do
- It will not set thresholds for you. There is no red-amber-green banding with configurable cut-offs. Colour follows the sign of the variance, nothing more. A miss of one percent and a miss of forty percent are both rust, ranked by size.
- It will not roll a quarter up from months. If you want quarterly targets, put quarterly rows in the file. Summing three monthly targets is right for revenue and wrong for anything that is already a rate or an ending balance.
- It will not track who changed a target. No history, no audit trail. A target quietly revised down in March looks in the file like a target that was always that low.
- It will not alert anyone. No emails, no thresholds firing into a chat channel. This is a board you open, not a monitor that watches for you.
- It will not reconcile across metrics. If net revenue and gross revenue are both in the file and they contradict each other, both are drawn. Nothing checks the arithmetic between metrics.
- It will not refresh. Next month you drop next month's file. There is no live connection to a warehouse or a sheet.
Frequently Asked Questions
My scorecard has one column per month. Why will that not work?
Because the months are header text rather than values, and a chart cannot put header text on a time axis. A wide sheet with Jan, Feb and Mar across the top is easy to type into and impossible to aggregate. Unpivot it so each month becomes rows: one row per metric per team per month, with the month in a date column. Most spreadsheets do this with an unpivot or a paste-transpose, and the app will do it too. It is the single most common reason a hand-maintained scorecard will not build.
Do I need the variance_pct column if it can be calculated?
No, and I would keep it anyway. The dashboard can compute the gap from target and actual, but a stored variance column is the one place where your definition of variance is written down. Some teams measure variance against target, some against the prior period, and some invert the sign for metrics where lower is better, like cost or churn. A column makes that choice explicit and reviewable rather than implied by whichever formula ran last.
How do I handle metrics where a lower number is better?
Set the sign on variance_pct yourself so that positive always means good. If churn is targeted at 3 percent and came in at 2.4, write the variance as positive, because the team beat the target. Otherwise your worst-performing metric and your best-performing metric sit in the same green colour and nobody notices. The dashboard colours variance by sign, so the sign has to carry the meaning.
Can I put revenue and headcount in the same metric column?
Yes, and that is the whole design. Long format means the target and actual columns hold numbers on wildly different scales, dollars beside percentages beside counts. That is fine because nothing sums across metrics. Every panel groups by metric first, so revenue is never added to headcount. What you should not do is total the actual column across all rows, because that number is arithmetic on incompatible units.
What period should each row represent?
Whatever cadence you actually review on, stated as the first day of that period. Monthly scorecards use the first of the month, which is why the sample dates are all the first. Weekly scorecards use the Monday. The important part is consistency: mixing a monthly revenue row with a weekly signup row in one file gives you a time axis where a single point means two different spans.
What happens to a metric with an actual but no target?
It still charts. The actual line draws, the target line has a gap and the variance for that row is blank rather than zero, which is the honest answer. Blank is not the same as on target and treating it as zero would put a metric nobody set a goal for into the on-track bucket. If a metric genuinely has no target, that is worth seeing on the scorecard.
Does this replace a real BI tool?
For a monthly review deck, often yes. For a live wall-mounted board, no. There is no scheduled refresh here and no connection to a warehouse. What this does well is turn the sheet somebody already maintains by hand into a dashboard in the two minutes before the meeting, without a project, a licence or an admin.
Is my scorecard sent anywhere?
No. Everything is parsed and drawn in your browser tab, with no upload endpoint behind the page. That is worth knowing for a KPI file, because a scorecard is often the most sensitive single document a company has: it names the teams that are missing, and the targets themselves reveal the plan.
Related
Try it before you reshape anything
Open the sample scorecard, see what long format buys you, then decide whether to unpivot your own.
Load the template with sample data