Last updated
Construction Dashboard in Power BI: Project Controls with BIM Data
Learn how to create a construction project dashboard in Power BI with BIM data, Frame templates, 3D model context, progress tracking, and project controls.
Frame Team
A construction dashboard needs quantities from the model and progress and cost records from the project team. This tutorial builds a small, checkable Power BI report first, then explains how to connect it to Frame’s model data.
The finished report has budget, earned value, actual cost, and variance cards; a work-package comparison; and an element-level detail table. The sample numbers below are fictional. They demonstrate the calculation, not a customer’s results.
1. Choose a starting report
Use the starter Power BI template for model properties
and 3D context. You need Power BI Desktop, a Frame account with access to report
generation, and a processed model. Select your model in Frame, create a report,
choose the starter template and the applicable view, and open the generated
.pbit in Power BI Desktop. Complete its connection prompts and load the data.
For a preview of a customized result, see the 5D cost dashboard. That example is a custom report built on model data; it is not a finished cost system included in the starter template. Rates, budgets, and measured progress must come from your project records.
You can also follow steps 2–4 in a blank Power BI report without a Frame account. That produces the sample charts, without a connected model or 3D selection.
2. Enter a small progress dataset
In Power BI Desktop, choose Home → Enter data. Create a table named
Progress with these columns and rows:
Scroll horizontally to see all columns.
| ModelKey | ElementKey | WorkPackage | PlannedQuantity | CompletedQuantity | UnitRate | ActualCost |
|---|---|---|---|---|---|---|
| SampleModel | Wall-001 | Walls | 100 | 60 | 50 | 3200 |
| SampleModel | Slab-001 | Slabs | 80 | 20 | 60 | 1300 |
Set the first three columns to text and the remaining columns to decimal numbers. Use one currency throughout. Quantities within a row must use the same unit as its rate: for example square metres and currency per square metre. Do not add wall areas and concrete volumes into a single physical-quantity total.
This sample uses one cumulative record per element. If you later import weekly snapshots, filter to one reporting date before aggregating; otherwise you will count the same element’s progress repeatedly.
3. Add four measures and weighted progress
Create each measure separately in the Progress table:
Budget = SUMX(Progress, Progress[PlannedQuantity] * Progress[UnitRate])
Earned Value = SUMX(Progress, Progress[CompletedQuantity] * Progress[UnitRate])
Actual Cost = SUM(Progress[ActualCost])
Cost Variance = [Earned Value] - [Actual Cost]
Progress by Budget = DIVIDE([Earned Value], [Budget])
Format the first four as currency and the last as a percentage. Earned value here means completed quantity valued at the planned unit rate. It is not an invoice total. Negative cost variance means actual cost exceeds that earned value. This example does not calculate schedule variance: that would require time-phased planned value for the same reporting date.
4. Build and check the dashboard
Add a card for each measure. Add a clustered column chart with WorkPackage on
the axis and Budget, Earned Value, and Actual Cost as values. Add a table with
ElementKey, WorkPackage, PlannedQuantity, CompletedQuantity, and the cost measures.
Finally, add a WorkPackage slicer.
Before connecting a real project, verify the unfiltered results:
Scroll horizontally to see all columns.
| Check | Expected result |
|---|---|
| Budget | 9,800 |
| Earned Value | 4,200 |
| Actual Cost | 4,500 |
| Cost Variance | −300 |
| Progress by Budget | 42.86% |
Selecting Walls should show budget 5,000, earned value 3,000, actual cost 3,200, and variance −200. If those values differ, check numeric types, duplicate rows, and active filters before adding more visuals.
5. Connect project records to model elements
Replace the sample table with controlled project data from Excel or another
maintained source. Replace the fictional keys with identifiers that actually
match your Frame model data. Inspect the loaded model tables first; do not
assume that Wall-001 is a Revit element ID or that an ID is unique across models.
Use a unique model-and-element key on the model side of the relationship. Keep Frame’s existing model/viewer identifiers and relationships intact. Relate the progress records to the matching element table and check the relationship’s cardinality and filter direction. A repeated element identifier across models must not join to both models.
Start with one known element: confirm its quantity, work package, cost, and filter behavior. Then verify the total budget remains unchanged after the join. A larger total usually means rows were duplicated or the data is at a different granularity. Records that cover a whole work package need an explicit allocation rule before they can be reported as element-level costs.
For a quantities-first workflow, see the quantity takeoff example. The Frame Excel add-in can help bring model tables into Excel; your team still owns the rates, progress records, and matching rules.
6. Establish a repeatable refresh check
Update the source progress records, process the required model version in Frame, and refresh the Power BI report. These are separate steps. Publishing a report does not itself synchronize all upstream sources. Power BI Service refresh also requires working credentials and access to every data source used by the report.
At each reporting date, check one changed element, unmatched project records, duplicate keys, and the budget total. Keep a reporting-date field when adding history and make the selected period visible on the page. Do not present a single cumulative snapshot as a trend.
For Autodesk-hosted models, follow the ACC to Power BI walkthrough. Browse the construction and BIM dashboard gallery to choose a report that matches the data you already have.