How to build a warehouse heat map in Power BI
Your Power BI model already knows what is in every bin and how often it is picked. What it cannot do on its own is show that data on the warehouse floor. This guide explains why, compares the workarounds, and walks through building a heat map of every storage location, from the CAD drawing to the finished report.
The question a table can't answer
Picture a slotting review. The inventory report shows the oldest stock in the building, sorted by days on hand, and every row is a location ID: 14-03-C, 14-05-B, 15-02-A. The list is accurate, but it hides the pattern that matters. Most of those pallets sit in two aisles, three levels up, directly across from the fastest-moving pick faces in the warehouse.
Nobody can see that from a table, because a location ID describes a place without showing it. A warehouse heat map does the opposite. It draws every storage location where it physically stands and colors it by a measure, so concentrations, gaps, and outliers become visible at a glance. Aging stock, pick density, replenishment pressure, and capacity all read differently once they are laid over the floor.
For most operations teams, the data for this already lives in Power BI. Inventory snapshots, pick lines, and replenishment tasks arrive from the WMS every night. The missing piece is the warehouse itself.
Why Power BI has no warehouse map
Power BI's map visuals are built for geography. Azure Maps, the filled map, and the ArcGIS visual all place data by latitude and longitude, or by a recognized place name such as a city or postal code. A warehouse doesn't work that way. Its locations live in a private coordinate space measured in inches or feet from a corner of the building, with rack levels stacked on top of each other. There is no built-in visual that understands aisles, bays, and levels, and none that draws a building's own floor plan beneath the data.
That leaves report authors with three workarounds. Each can produce something map-like, and each runs into a wall at a different point.
The workarounds, and where they fall short
The scatter chart
The quickest experiment is a scatter chart: put the X coordinate on one axis, the Y coordinate on the other, and color the points with conditional formatting. It works, and for a small single-level pick area it may be enough.
The trouble starts with a real building. Every location becomes a dot of the same size, so a floor-stack lane looks identical to a carton-flow slot. Rack levels share the same X and Y, so five levels collapse into one point and four of them disappear. Large layouts are sampled, which means some locations may not be drawn at all. You can place an image behind the plot area, but lining a floor plan up with the data means pinning both axis ranges to the drawing's exact extent and redoing it whenever the layout changes.
Shape Map
Shape Map colors regions from a custom map file, so in principle each storage location can be its own shape. In practice, someone has to draw every location as a polygon, give it an ID that matches the data, and convert the result to TopoJSON. A warehouse with 5,000 locations means 5,000 shapes, and a re-rack means rebuilding the file.
Even then, two limits remain. Shape Map has no option for a custom background image, so the CAD layout that gives the shapes their context cannot sit behind them. And it is flat by design, so every level of a rack has to be a separate map or a separate filter.
Deneb
Deneb is the most flexible option. It is a certified custom visual that renders charts from Vega and Vega-Lite specifications, so a skilled author can draw rectangles at real coordinates, size them from the data, and layer an image underneath.
The cost is code. Every part of the visual, from the scales and marks to the tooltips and interactions, is written and maintained as a JSON specification. Search, level filtering, saved views, and anything resembling 3D have to be built by hand, and the specification usually ends up understood by one person on the team. For a proof of concept, Deneb can be a good fit. For a report that operations relies on every day, it becomes a small software project.
| Approach | CAD layout behind the data | Rack levels | Location sizes | Effort to build and maintain |
|---|---|---|---|---|
| Scatter chart | Possible, aligned by hand | Levels overlap | Same-size markers | Low to start, fiddly to align |
| Shape Map | Not supported | Flat, one map per level | From hand-drawn shapes | High: draw and convert every shape |
| Deneb | Possible, with code | With custom code | With custom code | High: write and maintain the specification |
| Unclocked 3D Heatmap | Yes, aligned to your coordinates | Stacked in 3D, or one level in 2D | From your data | Low once coordinates exist |
The workarounds share a root problem. None of them start from what a warehouse already has, which is a list of locations with positions and sizes. That is the gap we built for.
Closing the gap: coordinates and a visual built for warehouses
A useful warehouse heat map needs two things that Power BI doesn't provide: coordinates for every location, and a visual that knows what to do with them.
The coordinates usually already exist, just not in a form Power BI can read. They are in the facility's AutoCAD drawing, where every rack and bay was placed to scale. Our warehouse mapping service turns that drawing into a coordinate table: one row per location with its ID, X, Y, and Z, plus sizes where the drawing has them. We confirm units, location naming, and level heights with you before mapping starts, so the table matches the IDs in your WMS.
The visual is Unclocked 3D Heatmap, a certified Power BI visual that reads that table directly. It draws each location at its real position and size, stacks rack levels at their heights, and can place the same CAD layout underneath as a floor image. Report users can orbit the warehouse in 3D, switch to a flat 2D plan, search for a location, and filter by aisle or level, all inside the report and in step with its slicers.
The rest of this guide covers the full build, whether you prepare the coordinates yourself or have us do it.
Start with a location table
Every approach above comes down to the same foundation: a table with one row per bin, slot, or pallet position, describing where that location is.
| Location ID | Aisle | Level | X | Y | Z | Width | Length | Height |
|---|---|---|---|---|---|---|---|---|
A01-01-A | A01 | A | 0 | 0 | 0 | 40 | 48 | 48 |
A01-01-B | A01 | B | 0 | 0 | 48 | 40 | 48 | 48 |
A01-02-A | A01 | A | 40 | 0 | 0 | 40 | 48 | 48 |
X and Y place the location's corner on the floor, and Z is the height of its base, which is what separates one rack level from the next. Width, length, and height are optional, but they let a mixed building read correctly, with floor-stack lanes, pallet positions, and carton-flow slots each drawn at their true size. Choose one unit for every column; mixing feet and inches is the most common reason a first layout comes out stretched or overlapping.
Getting coordinates from your CAD drawing
Few WMS exports include coordinates, so they usually come from one of three places.
The WMS or a slotting tool. Some systems store travel-sequence or slotting coordinates for each location. It is worth asking whoever maintains your location master before building anything.
The AutoCAD drawing. When racks are drawn as blocks, AutoCAD's DATAEXTRACTION command can export each block's attributes and insertion point to a CSV. Two details deserve attention before loading the result. A block's insertion point is not always the corner of the location, so check whether it needs offsetting by half the width and length. And drawings typically show one block per bay rather than one per level, so each bay needs to be expanded into its levels, each with its own Z. When the drawing doesn't use clean blocks, or the team doesn't have time to untangle it, this is the work our mapping service takes on.
A calculated grid. Regular racked areas can be calculated from the location ID. With aisles 120 inches apart, 48-inch bays, and 60-inch levels, three custom columns in Power Query place every location:
X = ([Aisle Number] - 1) * 120
Y = ([Bay Number] - 1) * 48
Z = ([Level Number] - 1) * 60
Real buildings have columns, cross aisles, and the occasional short rack, so compare the result with the floor plan and correct the exceptions by hand.
Model the layout once
Load the location table as its own dimension and relate Layout[Location ID] to each fact table, one to many, filtering in a single direction. Take every descriptive field from the layout table: coordinates, sizes, aisle, level, zone, and location type.
Keeping the layout separate is what keeps empty locations on the map. If locations came from the inventory table, an empty bin would have no row and would never be drawn, and empty space is often exactly what a planner is looking for. In the visual, turning on Show items with no data for the location field makes sure Power BI sends locations whose measures are all blank.
Finally, make every location ID unique across the model. If several buildings share one report, include the site in the ID or the key, because A01-01-A almost certainly exists in each of them.
Measures that tell the story
Color the map with measures rather than columns, so the warehouse responds to date, client, and zone slicers like every other visual on the page. These four answer most of the questions operations teams bring to a heat map:
On Hand Units = SUM ( Inventory[Quantity] )
Picks Last 28 Days =
CALCULATE (
COUNTROWS ( PickLines ),
DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -28, DAY )
)
Location Fill % =
DIVIDE ( [On Hand Units], SUM ( Layout[Capacity Units] ) )
Days Since Last Pick =
VAR LastPick = CALCULATE ( MAX ( PickLines[Pick Date] ) )
RETURN
IF ( ISBLANK ( LastPick ), BLANK (), DATEDIFF ( LastPick, TODAY (), DAY ) )
Rather than building a page for each, give report users a single heat map with a field parameter, or a small disconnected table and a SWITCH measure, so they can move between stock, activity, and fill on the same layout.
Put it on the floor plan
With the location table and measures in place, the visual itself takes a few minutes to set up.
- In Power BI Desktop, select Get more visuals, search for Unclocked 3D Heatmap, and add it. It is free for up to 2,500 locations.
- Add
Layout[Location ID]to Location ID, your X and Y columns to the coordinate fields, and Z if the building has rack levels. - Add one of your measures, such as
Days Since Last Pick, to Heat Value. - Add width, length, and height if location sizes vary, and up to three category fields, such as aisle, level, and zone, for filtering inside the visual.
- To show the CAD layout beneath the racks, add the floor plan as an image in the visual's Scene settings and align it to the same coordinate bounds as your data.
The how-to guide covers every setting in detail. To explore before connecting your own data, open the sample report, or load our 2,208-location sample CSV, which already includes coordinates, sizes, and values.
Colors that hold up in a meeting
A heat map earns trust when its colors mean the same thing every time someone looks at it. Three decisions make the difference.
Gradient or bands. A smooth gradient shows small differences and suits exploration. Bands, with hard breaks at set values, suit operating rules: a location at 92% fill is over the line, and one at 88% is not. If the team already works to thresholds, the color scale should match them.
A fixed range for comparisons. An automatic range rescales to whatever is on screen, so red during a quiet week and red during peak season describe very different numbers. When comparing weeks, sites, or zones, set a manual minimum and maximum.
A plan for outliers and zeros. One location with 4,000 picks can push the rest of the building into the same pale shade, and capping outliers restores the contrast. Zeros deserve a deliberate choice too. For fill, an empty location is useful information; for picks, a zero may be the next candidate for re-slotting.
When targets vary with the selection, such as a different aging threshold for each client, the thresholds can come from DAX measures rather than fixed numbers, and the colors follow the slicers.
Five questions to put on the map first
- Where is aging stock concentrated? Color by days on hand or days since last pick. Old stock clustered near the dock is occupying the most valuable space in the building.
- Are fast movers slotted well? Color by picks over the last four weeks. Hot locations on upper levels, or at the far end of a long aisle, are the first candidates to move.
- Where is replenishment pressure building? Color by open replenishment units, or by locations below their minimum.
- How full is the building, really? Color by fill. A warehouse at 85% overall can still be full in the zones that matter most.
- Which locations need attention today? Rank exceptions, such as negative stock or locations holding stock with no pick in 180 days, and work through them on the layout.
Before you share it
- Coordinates and sizes use the same unit.
- The layout comes from its own location table, so empty bins appear.
- Every location ID is unique, including across buildings.
- Rack levels have their own Z, so one level doesn't hide another.
- The report opens on a zone or level that matches its question, rather than every location at once.
Put your warehouse on the map
Unclocked 3D Heatmap is free on Microsoft Marketplace for up to 2,500 locations. Start with the sample report, then connect your own location table. If your layout only exists in AutoCAD, we can map it for you.