Finance Dashboard Template

Nothing gets downloaded. This template is a contract over seven columns, and any expense export or ledger extract carrying them becomes a spend dashboard the moment you drop it: where the money went, to whom, in what category, and how much of it is still waiting on somebody's approval.

Load the template with sample data

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 expense lines across categories, merchants and approval states, already in shape.

Download the sample CSV if you would rather read the contract as rows than as a table.

The column contract

These are the headers in the sample file, spelled exactly this way. One row is one transaction. A ledger extract substitutes account for category and vendor for merchant, and everything else holds.

Column What it holds Role Required What breaks without it
date Transaction date, as an ISO date. date Required No burn line and no month-on-month comparison. You would see a total with no way to tell a one-off from a habit.
employee Who submitted or incurred the expense. identifier Optional Nothing has an owner, so an unusual charge cannot be traced to a person to ask about it.
category Expense type: Travel, Software, Contractors. category Required The main breakdown vanishes and the dashboard degrades to a single number over time, which is a bank balance rather than an analysis.
merchant Vendor or supplier name. category Optional You lose vendor concentration, which is the panel that finds three separate subscriptions to the same tool sitting in three different categories.
amount Value of the transaction, negative for credits. currency Required Everything. Every panel here is a sum of money, and with no money column the layout falls back to counting receipts.
currency Three-letter code for the amount on that row. category Optional Nothing warns you that the file mixes currencies, so a total gets read as if it were one currency when it is three.
status Approval state: approved, pending, rejected. category Optional Committed spend and possible spend become the same number, which overstates the month whenever a large item is still awaiting sign-off.

The status column is the one people leave out and then miss. A month where forty thousand of the total is pending is a very different month from one where all of it is approved, and only the status column can tell the two apart.

What you get

  • A spend KPI strip. Total spend for the period, transaction count, average transaction value, and the amount currently sitting in a non-approved status.
  • Burn over time. Spend by month at a grain chosen from the date span, with the bucketing named. This is the panel where an annual software renewal shows up as a spike and gets explained rather than investigated.
  • Spend by category. A ranked bar with the value written on each one. Categories are the vocabulary a budget is written in, so this panel is what the budget conversation points at.
  • Top merchants. The same shape by vendor, which repeatedly surprises people. Vendor concentration is invisible in a category view and obvious here.
  • The approval pipeline. A breakdown by status showing both the count of items and the money behind each state, so a queue of two hundred small items and a queue of two large ones are told apart.
  • Spend by person. A ranked bar over employee, best read together with category rather than on its own.

i. Bring these columns

Decide first which date you mean. An expense line has a transaction date, a submission date, an approval date and a reimbursement date, and they can be six weeks apart. Pick the one that answers your question. Transaction date tells you when the money was committed, which is what a budget cares about. Reimbursement date tells you when cash left, which is what a cash flow forecast cares about. Put one of them in date and say which in the file name.

Then decide the sign convention. Expenses positive and credits negative is what this layout assumes, so a category total reads as money spent. If your ledger writes expenses as negatives, flip them on export, otherwise every bar points the wrong way and the largest category sits at the bottom of the ranking.

ii. Drop the file

Drag the CSV in. Amount is read as money and formatted as money everywhere, including in the exported numbers. Category, merchant and status become groupings. Employee is treated as an identifier, which means it is offered for grouping and never offered as something to sum.

The first check worth doing is the total against your accounting system's own figure for the same period. If they disagree, the usual culprits are a filter you forgot, both sides of a double entry, or a header and footer row that the export added and that became a row called Total.

iii. Adjust what you need

Filter to pending status before an approval session and the whole board becomes a work queue. Switch the merchant panel from sum to count and you find the vendors you transact with constantly rather than the ones you pay the most, which are rarely the same list. Change the category panel's aggregate to median and single large purchases stop hiding the everyday pattern.

Export when it says what you need. Any panel gives you its aggregated numbers as CSV, which for finance is often more useful than the picture, because the number is going into a memo and the memo needs to survive being checked.

Getting your export into this shape

Two kinds of file arrive here, and each has its own set of dents.

An expense tool export. Expensify, Concur, Ramp, Brex and Pleo all produce something close to this contract already, which is why the contract looks the way it does. The differences are cosmetic and consistent. Header names have spaces and capitals. The merchant field is whatever the card network sent, so the same vendor appears as AMZN Mktp US, Amazon.com and AMAZON MARKETPLACE, which becomes three bars in the merchant panel unless you normalize it. Categories may be missing on unsubmitted items, which produces a blank category bar that is worth looking at rather than deleting. And several tools export a receipt URL and a policy violation flag, which are harmless extra columns you can leave in place.

A general ledger extract. This comes out of QuickBooks, Xero, NetSuite or SAP and it is a different animal. It is double-entry, so filter to the expense accounts and one side of the entry or your total nets to zero. Debit and credit often live in two columns rather than one signed amount, so combine them. The account field is usually a code with a description beside it, like 6120 and Travel and entertainment, and the description is what you want in category because nobody reads a chart labeled with account numbers. Journal entries carry a memo rather than a merchant, and memos are free text, so the merchant panel is only useful once a vendor field exists.

Both sources will hand you subtotal rows if you export from a formatted report rather than a raw list. Those rows have a description like Total Travel and an amount equal to the sum of the rows above, so leaving them in double counts the file. Always export the transaction detail, never the summary report.

What this template will not do

  • It will not convert currencies. The currency column is there to show you the mix and let you filter, not to apply a rate. Convert before export.
  • It will not produce financial statements. No profit and loss, no balance sheet, no accruals. This is a spend analysis over a transaction list, and it is not an accounting system.
  • It will not track budget against actual. There is no budget column in this contract. If you have per-category budgets, the KPI template is built around exactly that comparison.
  • It will not detect fraud. Nothing here scores a transaction for risk or flags duplicates. It will make an odd merchant easy to see, and that is a human noticing, not a model.
  • It will not normalize merchant names. Three spellings of one vendor stay three bars. Clean them in the app with a find and replace before building.
  • It will not handle a wide budget sheet. Months across the top do not chart. One row per transaction, always.

Frequently Asked Questions

What am I actually getting if there is no file to download?

A specification and a layout. The specification is the seven column names on this page. The layout is what gets built when a file carrying those names is dropped in: total spend, a burn trend, category and merchant breakdowns and an approval pipeline. Because the template is a contract rather than a workbook, there is no copy of anything on your machine to fall out of date and no formula that breaks when your finance system adds a column.

Does this handle a general ledger export as well as an expense report?

Yes, with one substitution. A general ledger has an account code where an expense report has a category, and a vendor where an expense report has a merchant. Map account to category and vendor to merchant and the layout works unchanged. The one thing to decide is what to do with the employee column, which a ledger will not have. Leave it out, or fill it with the cost center, which is usually the more useful grouping at the ledger level anyway.

Why is there a separate currency column if amount is already money?

Because expense data is the one domain where multiple currencies genuinely turn up in one file, and because a total that silently adds euros to rupees is worse than no total at all. The currency column is there so you can see the mix and filter to one before you read any total. It is not a conversion feature. If the file has three currencies in it, convert to a reporting currency before you export, or build one dashboard per currency.

How should refunds, credits and reversals be represented?

As negative amounts on their own rows, with the same category and merchant as the original charge. Negative values are parsed correctly, including accounting parentheses, so (250.00) reads as minus two hundred and fifty. That keeps the category totals net and it keeps the row count honest. The alternative, deleting the original charge, loses the fact that it happened and makes reconciliation against a bank statement impossible.

My export has one row per ledger line, so debits and credits both appear. Is that a problem?

It is, if you leave both sides in. A double-entry export has every transaction twice with opposite signs, so the total nets to zero and every breakdown is half nonsense. Filter to one side, usually the debit side of expense accounts, before exporting. If your export has separate debit and credit columns rather than a signed amount, combine them into one signed amount column first.

What does the status column need to contain?

A small set of repeating words describing where the item is: approved, pending, rejected, reimbursed. Short and repeating is what makes it a category rather than free text. If your system writes a status per approval step, such as approved by manager pending finance, collapse it to the stage you care about. A status column with two hundred distinct values produces a chart with a long tail rather than a pipeline.

Is any of this financial data sent to a server?

No. The file is parsed, aggregated and drawn inside your browser tab, and there is no upload endpoint behind this page. For expense and ledger data that constraint tends to be non-negotiable rather than nice to have, because the file names employees, vendors and amounts, and in many companies uploading it anywhere would need approval this page does not require.

Can I see who spends the most without turning this into a witch hunt?

The employee breakdown exists and it will happily rank people by total. Read it with the category breakdown beside it. A salesperson with the highest travel spend and the highest closed revenue is not the same finding as a manager with the highest software spend and no seats deployed. Rank by spend per category rather than spend overall and the panel starts answering a question worth asking.

Look before you export

Open the sample expense file, see the panels, then decide which extract to pull.

Load the template with sample data