Cloud Engineer Lab
Cloud Engineer Lab
Cloud Engineer Lab
Cloud Engineer Lab
© 2026
SCCM + Intune + Power BI: Build a Unified Endpoint Dashboard
Endpoint & CloudIntermediate

SCCM + Intune + Power BI: Build a Unified Endpoint Dashboard

Configuration Manager and Intune are two separate data sources, not one warehouse. Here's how to actually bring them together into a single, trustworthy dashboard.

11 min read
Share

The first Intune Power BI dashboard connected to one data source. This one starts from a fact that trips up a lot of otherwise solid reporting projects: the Intune Data Warehouse does not contain Configuration Manager data. They are two entirely separate systems, with two separate data stores, and if your organisation still runs co-management or a hybrid fleet, a single-source dashboard is only ever telling half the story. Bringing them together properly, not just side by side, is what this post is actually about.

The Endpoint Data architecture, hand-sketched in blue ballpoint pen, forking into Configuration Manager and Intune, down through SQL Server and OData Feed, merging back into Power BI, Power Query, Data Model, DAX, and Dashboard
Two sources, one fork, one merge, drawn out by hand so the split is impossible to miss.
Configuration Manager: on-premises SQL Server, queried through supported views
Intune: cloud OData feed, a downstream daily snapshot, not a live feed
Power BI: the only place these two genuinely different sources actually meet

Step 1: Prepare Configuration Manager

Identify the site database

Every Configuration Manager site has a SQL Server database, commonly named CM_<SiteCode>. You'll need the SQL Server instance name and this database name before Power BI can connect to anything.

Understand supported SQL views, not raw tables

Configuration Manager exposes reporting-safe SQL views, prefixed v_, v_R_System (device inventory), v_GS_OPERATING_SYSTEM (OS details from hardware inventory), v_UpdateComplianceStatus (patch compliance), v_CICurrentComplianceStatus (configuration item compliance), v_Application (deployed applications). These views exist specifically so Microsoft can restructure the underlying tables between versions without breaking every report built on top of them.

Identify the data you actually need, before you connect

Configuration Manager's schema is large. Decide up front which views map to the dashboard pages in Step 8, rather than importing broadly and filtering later.

Never query or modify the underlying tables directly

The raw tables behind these views are unsupported and can change structure at any Configuration Manager update, silently breaking a report built against them. Worse, direct writes against the site database can corrupt site operation entirely. Views are the only supported surface for reporting, full stop.


Step 2: Prepare Intune

Go to the Intune admin centre

Reports → Data warehouse.

Copy the tenant-specific OData feed URL

The full walkthrough of this step, and what the warehouse actually contains, is covered here. This is Microsoft's documented, supported route for connecting Power BI to Intune's reporting data, the same way views are the supported route into Configuration Manager.


Step 3: Connect Power BI to SCCM SQL

Power BI Desktop → Get Data → SQL Server

Enter the Configuration Manager SQL Server instance and the site database.

Choose Import, not DirectQuery, for a first build

DirectQuery keeps data live but pushes every visual interaction into a live query against production SQL. For a first version of this dashboard, Import mode against a scheduled refresh is the safer, more predictable starting point.

Select only the supported views identified in Step 1

Not the full table list Power BI's navigator will happily show you. Selecting raw tables here is the single most common way this kind of project quietly becomes unsupported.


Step 4: Connect Power BI to Intune

Get Data → OData Feed

Paste the URL copied in Step 2.

Sign in with an Organizational Account

The full connection walkthrough, including entity selection, is here, this half of the model doesn't change from the single-source version.


Step 5: Clean the Data

Remove unnecessary columns from both sources

Every column you don't need is a column that has to be reconciled or explained later. Trim aggressively in Power Query, on both the SCCM and Intune queries.

Rename columns for consistency across both sources

v_R_System and the Intune devices entity will not use the same column names for the same concept. Standardise now, Device Name, Operating System, Compliance Status, so later DAX doesn't have to compensate for naming drift.

Fix data types explicitly

Dates as Date, not Text, on both sides, exactly as important here as in the single-source build, and easier to get subtly wrong when you're juggling two schemas at once.

Normalize device names, this is the step that actually makes the merge work

Configuration Manager and Intune don't always report the same device the same way, a fully-qualified domain name on one side, a short hostname on the other, inconsistent casing on both. In Power Query, apply Text.Upper and strip any domain suffix with Text.BeforeDelimiter(DeviceName, ".") on both queries before attempting any merge. Skipping this step is the most common reason a "unified" dashboard quietly under-counts devices that actually exist in both systems.

Merge or append where appropriate, not by default

Devices genuinely present in both systems (a co-managed fleet) call for a merge on the normalised device name. Data that's structurally the same but from non-overlapping device populations calls for an append instead. Treating every combination as a merge is how duplicate or inflated counts end up on the executive page.


Step 6: Create the Data Model

This is the section worth reading twice, because it's where most of these projects either become genuinely reliable or quietly become misleading.

The star schema, hand-sketched in blue ballpoint pen: DimDevice forking into SCCM Fact, Intune Fact, and Software, all three merging back into DimDate
One shared dimension, three separate fact tables, drawn out so the grain difference is obvious at a glance.

Why two fact tables, not one

SCCM and Intune data don't share a natural grain, a row in the SCCM inventory table and a row in the Intune compliance table don't represent identical events, even for the same device. Intune's own warehouse is itself built as a star schema for exactly this reason, separating facts from dimensions rather than flattening everything into one table. Forcing SCCM and Intune data into a single combined fact table hides that difference instead of modelling it honestly.

DimDevice is the shared dimension both fact tables relate to

Built from the normalised device name from Step 5, this is what lets a single device slicer filter both SCCM and Intune facts simultaneously.

SCCM Fact and Intune Fact stay separate

Each retains its own grain and its own measures. A device can have rows in one, the other, or both, and the model should represent that honestly rather than forcing a false one-to-one join.

Software is its own fact table, not bolted onto SCCM Fact

Application inventory and health data has a different grain again, one device can have many applications, so it gets its own table related back to DimDevice rather than being crammed into the device-level fact table.

DimDate ties everything to a common timeline

Every fact table relates to DimDate independently, which is what makes a trend visual spanning both SCCM and Intune data actually possible.

Why you shouldn't just join every table to everything else

It's tempting to connect every table to every other table Power BI will let you connect, "more relationships means more flexibility." In practice, multiple active relationship paths between the same two tables create ambiguous filter propagation, Power BI has to guess which path a filter should travel, and a measure can silently return a technically-valid but wrong number with no error at all. Keep exactly one active filter path between any two tables, and use USERELATIONSHIP in a specific measure on the rare occasion you deliberately need an inactive relationship activated for one calculation.


Step 7: Create DAX Measures

text
Total Devices =
DISTINCTCOUNT(DimDevice[Device Name])
 
Compliant Devices =
CALCULATE([Total Devices], 'Intune Fact'[Compliance Status] = "Compliant")
 
Non-Compliant Devices =
CALCULATE([Total Devices], 'Intune Fact'[Compliance Status] = "Non-Compliant")
 
Compliance % = DIVIDE([Compliant Devices], [Total Devices])
 
Windows 11 % =
DIVIDE(
    CALCULATE([Total Devices], 'SCCM Fact'[OS Version] = "Windows 11"),
    [Total Devices]
)
 
Windows 10 % =
DIVIDE(
    CALCULATE([Total Devices], 'SCCM Fact'[OS Version] = "Windows 10"),
    [Total Devices]
)
 
Devices Without Recent Check-in =
CALCULATE(
    [Total Devices],
    'SCCM Fact'[Last Hardware Scan] < TODAY() - 14
)
 
Application Failure % =
DIVIDE(
    CALCULATE(COUNTROWS(Software), Software[Install Status] = "Failed"),
    COUNTROWS(Software)
)

Devices Without Recent Check-in is worth more than it looks

A device that stopped checking in isn't necessarily non-compliant, it's often just stale, and a stale device can sit in a "Compliant" state indefinitely simply because nothing has re-evaluated it. This measure catches a real blind spot that the Compliance % measure alone will not.


Step 8: Build the Dashboard

Page 1: Executive Overview

The headline numbers, total devices, compliant/non-compliant, and the OS version split, built for a five-second read by someone who isn't going to open any other page.

Page 2: Device Inventory

A searchable, filterable table view: device name, model, manufacturer, primary user, last check-in, management source.

Page 3: Compliance

A deeper cut than the executive page, compliance broken down by policy, by device group, and trended over time using DimDate.

Page 4: Windows Health

OS version distribution, update compliance from v_UpdateComplianceStatus, and the Devices Without Recent Check-in measure surfaced prominently.

Page 5: Application Health

Install success and failure rates from the Software fact table, the Application Failure % measure, and a breakdown by application to spot a specific package causing most of the failures.

Page 6: SCCM vs Intune

The page that only exists because of this dual-source approach: how many devices are SCCM-only, Intune-only, or genuinely co-managed, direct visibility into migration progress if you're moving from one to the other.

Page 7: Trends

Enrollment, compliance, and OS adoption over time, all sharing the same DimDate table so every trend line on the page is comparing the same timeline.

An example Executive Overview dashboard page showing total devices, compliant and non-compliant counts, Windows 11 and Windows 10 breakdowns, and three chart panels for device compliance trend, Windows version, and application health
Page 1, Executive Overview: the five-second read, built for someone who won't open any other page.
An example SCCM vs Intune coverage page showing a bar chart comparing SCCM-only, Intune-only, co-managed, and cloud-only device counts
Page 6, SCCM vs Intune: the page that only exists because this dashboard unifies two data sources instead of picking one.

Step 9: Refresh

These two sources refresh on genuinely different models, and the dashboard should say so

SCCM SQL → Power BI Dataset → Refresh → Dashboard. This path reflects whatever's in the site database as of the last scheduled refresh, and because the SQL Server is on-premises, scheduled refresh in the Power BI Service requires an On-premises Data Gateway, something the Intune side of this model never needs.

Intune OData → Historical Warehouse Data → Power BI. The Intune Data Warehouse is downstream from Intune itself, and takes daily snapshots, not a real-time feed. Even with a perfectly configured refresh schedule, this half of the dashboard is never more current than yesterday's snapshot.

A single "Last Refreshed" timestamp on the dashboard is misleading here, it implies one consistent freshness across every visual, when in reality the SCCM-backed pages can be hours old and the Intune-backed pages are structurally at least a day old. Label each page, or each visual group, with which source it's built from and how current that source actually is, rather than letting one refresh timestamp imply a precision the underlying data doesn't have.


Summary

StepWhat it produces
1-2. Prepare both sourcesA confirmed list of supported SCCM views and the Intune OData feed URL
3-4. Connect bothTwo independent queries in the same Power BI file
5. CleanNormalised device names, the actual key that makes unification possible
6. ModelA proper star schema: shared DimDevice, separate fact tables, one shared DimDate
7. DAXEight measures, including two (check-in staleness, app failure rate) that neither source alone makes obvious
8. DashboardSeven pages, including one that only makes sense because two sources exist
9. RefreshTwo honestly different freshness guarantees, labelled as such

The standout piece of this build isn't any single visual, it's Page 6. A dashboard that can actually answer "how far along is our Intune migration, right now, with real numbers" is doing something neither a Configuration Manager report nor a single-source Intune dashboard can do alone.


If you're running co-management today, what does your own SCCM vs Intune split actually look like? I'd guess most environments reading this are further along than they assume, or further behind. Drop a comment with your real numbers.

CChetan Yamger

Written by

Chetan Yamger

Cloud Engineer · AI Automation Architect · Modern Workplace Consultant

Cloud Engineer, AI Automation Architect, and Modern Workplace Consultant based in Amsterdam, Netherlands. Specializing in scalable, secure enterprise solutions with Microsoft Azure, Intune, PowerShell, and AI-driven automation using ChatGPT, Gemini, and modern LLM technologies.

Cloud & Modern WorkplaceMicrosoft Intune & MDMAzure & Microsoft 365AI AutomationPrompt EngineeringPowerShell & Graph APIWindows AutopilotConditional Access & Zero TrustSCCM / MECM & MSIXVDI / WVDPower BINode.js & Next.js
Newsletter

Stay in the loop.
New articles, straight to you.

Deep-dive technical articles on Intune, PowerShell, and AI — no noise, no spam.

New article notifications
No spam, ever
Free forever

Discussion

Share your thoughts — your email stays private

Leave a comment

0/2000

Your email is used to prevent spam and will never be displayed.