Inventory Dashboard Template
A stock layout that assembles itself from your own export. Bring one row per SKU per warehouse carrying a product name, a category, a location, a unit cost, a selling price, the quantity on hand, a rating and a discontinued flag. Drop the file and you get stock value, margin, warehouse mix and dead-stock panels. There is nothing to fill in.
The sample is the fastest way to see whether this layout fits before you go and find your own export. A small catalog across several warehouses, already in contract shape.
The column contract
Nine columns. Three of them are money or quantity, four are labels, one is a rating and one is a flag. That mix is what lets the layout produce something more interesting than a bar chart of how many SKUs you have.
| Column | What it holds | Role | Required | What breaks without it |
|---|---|---|---|---|
sku |
The stock keeping unit code, like SKU-3000 | Identifier | Required | Distinct product counts become row counts, so a SKU held in four warehouses is counted as four products. |
product_name |
The human label, like Clamp 10mm | Category | Optional | Top-value panels list bare codes. Everything still works, but nobody can read the chart without the catalog open beside it. |
category |
The product group, like Fasteners | Category | Required | Every breakdown collapses to a single total. Stock value with no grouping is one bar, and one bar is a number. |
warehouse |
The stocking location, like Newark | Category | Optional | You lose the location mix, which is the panel that shows one site is holding most of the capital. |
cost |
Unit landed cost | Currency | Required | Stock value at cost and every margin panel go. Without cost you can only talk about revenue you have not made yet. |
price |
Unit selling price | Currency | Required | Margin cannot be computed at all, and retail stock value disappears with it. |
stock |
Units on hand right now | Count | Required | The dashboard becomes a price list. Nothing can be weighted by how much you actually hold. |
rating |
Average product rating, 1 to 5 | Rating | Optional | You lose the quality-against-margin scatter, and any way to spot well-reviewed products you are underpricing. |
discontinued |
true or false | Boolean | Optional | Dead stock is folded invisibly into every total, so the healthy-looking inventory value includes things you can no longer sell. |
What you get
- A KPI strip. Distinct SKUs, total units on hand, stock value at cost, stock value at retail and average margin percent. Distinct SKUs rather than row count, so multi-warehouse products are counted once.
- Stock value by category. Units multiplied by cost, summed per category, largest first. This is the panel that tells you which product group is eating the working capital.
- Stock value by warehouse. The same money split by location. A site holding forty percent of the value on ten percent of the SKUs is a conversation worth having.
- Units on hand by category. Quantity rather than money, which ranks very differently. Consumables are usually first here and near the bottom on value.
- Margin by category. The gap between price and cost, averaged per group. Categories that look large on revenue and thin here are the ones worth repricing.
- Price distribution. A histogram of selling price across the catalog, which usually shows the price bands you did not know you had.
- Active against discontinued. Stock value split by the flag. The discontinued share is dead capital stated plainly.
- Rating by category. Average product rating per group, so quality sits next to commercials instead of in a different report.
i. Bring these columns
Get your stock report down to one row per SKU per warehouse, then rename the header row to match the contract. The grain matters more than the names here. A file at the wrong grain will produce a beautiful dashboard describing something other than your inventory, and nothing on screen will warn you.
Check three things before you drop it. That stock is a current quantity rather than a movement. That cost and price are per unit rather than extended totals. That both money columns are in one currency.
ii. Drop the file
Open the dashboard view and drop the CSV on it. Columns are read from their values, not from their headers, so a cost column holding $26.88 is money and renders as money on every axis, in every bar label and in the exported chart data. stock is a plain count so it sums. sku looks numeric in some catalogs and is an identifier, so it is never offered as something to add up.
The whole thing runs in the tab. Your cost prices do not go to a server, which matters because a supplier cost list is one of the few files where a leak has contractual consequences.
iii. Adjust what you need
Swap a value panel between the cost basis and the retail basis depending on who is in the room. Sort the warehouse panel by value rather than alphabetically. Raise the top-N on category when your catalog has thirty groups and the folded Other bar is bigger than the ones above it, which is a sign the grouping is too fine rather than a sign the chart is wrong.
Then export. PNG for the stock review deck, SVG when it has to be printed at poster size for a warehouse wall, and the aggregated CSV when somebody wants to check your arithmetic, which in inventory they always do.
Getting your export into this shape
Stock exports come out of three kinds of system and each one is wrong in its own way. A warehouse management system gives you the quantities and the locations and often no prices at all, because pricing lives elsewhere. An ERP stock report gives you cost and quantity but a valuation cost rather than a current one. An ecommerce platform gives you selling price and stock and no cost, because it never needed to know.
So the usual job is a join. Take the quantity file as the base, join the price list on SKU, join the cost list on SKU, and check the row count afterwards. A join that grows the file has duplicate keys somewhere, usually a price list with historical rows that were never end-dated. The app does the join and shows the row count before and after, which is the check worth doing every single time.
The next issue is grain. NetSuite's inventory valuation report exports one line per item per location per bin, and bins are one level finer than this template wants. Aggregate the bins away by summing stock per SKU per warehouse, or you get twelve rows for one product in one building and a distinct-SKU count that means nothing. SAP's MB52 comes out per plant and storage location with the same problem. Shopify's inventory export is per variant per location and is usually already at the right grain, which is a pleasant surprise.
Then the money columns. Split extended values back into unit values if your report gives you a total: a column called inventory_value is stock multiplied by cost, and dropping that in as cost will multiply by quantity a second time and inflate every panel. Strip currency codes appended as text, like 26.88 USD, since that reads as a category rather than as money. And if the file spans regions with different currencies, convert before you drop it; a single sum across dollars, euros and yen is arithmetic that produces a number and no meaning.
Watch the negatives too. Warehouse systems record negative stock when a pick was booked before a receipt, and those rows are real but they distort a value panel. I usually leave them in and look at them deliberately, because a category with negative units is a data quality problem worth seeing on a chart rather than a row to quietly filter out.
Last, normalize the discontinued flag. Systems export it as Y, 1, INACTIVE, or as an empty cell meaning active. Rewrite it to lowercase true and false in every row, including the ones that were blank, so the split panel adds back to your total.
What this template will not do
- No stock movement over time. The contract has no date column, on purpose. This is a snapshot layout. Turnover, days of cover and depletion curves need a movement history, which is a different file and a different dashboard.
- No reorder alerts. There is no threshold to compare against and no ordering rules in the file. The dashboard will show you the distribution of stock levels; deciding what is too low is still yours.
- No demand forecast. A snapshot cannot predict anything. Any tool offering you a forecast from a single stock file is drawing a line through one point.
- One currency only. Cost and price are summed as plain numbers. Multi-currency catalogs must be converted before they arrive, because there is no exchange rate anywhere in a CSV.
- No bill of materials. Assemblies and their components are separate rows with no relationship the dashboard can see, so a kit and its parts will both be counted as stock value.
- It cannot fix duplicate SKUs. The same product entered twice under two codes appears as two products. Deduplicate in the app first, then come back.
Frequently Asked Questions
Where is the template file?
There is not one. A template here is a column contract: a promise that if your rows carry sku, product_name, category, warehouse, cost, price, stock, rating and discontinued, this layout appears. The advantage over a downloadable workbook is that your data never has to be pasted into somebody else's grid. You export from the system that already owns the numbers, rename a header row, and drop it.
Why does the contract need both cost and price?
Because one of them tells you what the shelf is worth and the other tells you what it earns, and they are different questions. Stock multiplied by cost is capital tied up, which is the number a finance conversation is about. Stock multiplied by price is potential revenue, which is the number a sales conversation is about. The gap between them is margin, and margin per category is the panel most stock reports leave out. With only one of the two columns you get half the dashboard.
Is stock a snapshot or a movement?
A snapshot. One row per SKU per warehouse, holding the quantity on hand at the moment of export. This template does not model receipts, issues, transfers or a running balance. If your export is a movement ledger with one row per transaction, aggregate it to a current quantity per SKU first, or you will get a dashboard describing how much stock you have ever touched rather than how much you have.
My SKUs appear in more than one warehouse. Is that a problem?
No, that is the expected shape. One row per SKU per warehouse is exactly right, and the warehouse panels depend on it. Just be aware that the count of rows is then not the count of distinct products. If you want a product count, use a distinct count on sku rather than a row count. The KPI strip already does this, which is why the number it shows may be smaller than the number of lines in your file.
What should discontinued contain?
The words true and false, lowercase, in every row. That reads cleanly as a boolean and gives you a split panel showing how much of your stock value is sitting in products you have stopped selling, which is usually an uncomfortable and useful number. Yes and no work as well. What does not work is a blank meaning false, because blank is read as missing rather than as no, and the split will not add up to your total.
Can I add a reorder point or a lead time column?
Yes. Any extra column with a recognizable role gets a panel of its own. A numeric reorder_point produces a distribution, and a lead_time_days column produces one too. What the dashboard will not do on its own is compare two columns row by row and flag the SKUs below their reorder point, because that is a filter rather than an aggregate. Add a calculated column in the app that subtracts one from the other, then the dashboard has a single number to chart.
How does the rating column get used?
As a product-quality signal plotted against the commercial ones. Average rating by category is a panel, and rating against margin is the scatter that occasionally shows you are discounting your best-reviewed products for no reason. It is optional. If you carry no rating data, delete the column rather than filling it with zeros, since a wall of zeros will drag every average down and look like a catastrophe.
How large a catalog can this handle?
The page caps files at 100 MB, which is a very large stock file. A catalog of a few hundred thousand SKUs aggregates comfortably on a laptop, because the panels are group-bys and the work scales with the number of distinct categories and warehouses rather than with the row count. Fifty thousand SKUs across four warehouses is four bars and it draws instantly.
Does my catalog leave the browser?
No. The file is read, parsed and aggregated inside the tab. There is no upload endpoint behind this page and no request carries your rows anywhere. Cost prices are commercially sensitive in a way most data is not, and a supplier cost list landing on somebody else's server is the sort of thing that ends contracts, so this is worth being precise about.
Related
Try the layout on sample stock
A catalog across four warehouses, already in contract shape, so you can judge the fit in seconds.
Load the template with sample data