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

Frame Team

Construction Dashboard in Power BI: Project Controls with BIM Data

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:

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:

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.

Sign up for our newsletter

Stay up to date with the roadmap progress, announcements and exclusive discounts, feel free to sign up with your email.