Learn how to build production-ready KPI cards and summary tables in Power BI Desktop that executives actually want to use. This lesson covers DAX measure design, card formatting, conditional formatting for tables, and layout principles drawn from real dashboard design practice.

Executive dashboards live or die on their first five seconds. When a VP opens your report before a Monday morning stand-up, they shouldn't have to hunt for the numbers that matter. Revenue, margin, units sold, and whether those numbers are up or down versus last month — these need to jump off the screen immediately, cleanly, and without ambiguity. That's the job of KPI cards and summary tables, and it's a job most new Power BI developers get wrong the first time.
The typical mistake is treating cards and tables as cosmetic afterthoughts — something you drag onto the canvas after the "real" visuals are done. In reality, KPI cards and summary tables are the real visuals for most senior stakeholders. The bar chart explaining regional breakdown is supporting evidence; the headline revenue number with a delta badge is the thing that drives decisions. Building these correctly requires solid DAX measures, deliberate formatting choices, and a layout philosophy borrowed from good print design.
By the end of this lesson, you'll have built a production-ready executive summary page: a row of KPI cards showing current-period performance with variance indicators, plus a summary table that lets executives drill into department or product performance without leaving the page.
What you'll learn:
You should already be comfortable navigating Power BI Desktop and have a data model loaded. If you're still getting your bearings, Your First Power BI Report in 30 Minutes will get you there quickly. You should also understand the basics of DAX — specifically the difference between calculated columns and measures. If that distinction is fuzzy, read Power BI Calculated Columns vs Measures: When to Use Each and Why It Matters before continuing, because everything in this lesson builds on measures.
For the examples below, we'll use a fictional retail dataset: a Sales fact table with columns OrderDate, Revenue, Cost, Units, ProductCategory, and RegionName, linked to a Date table and a Products dimension table. The structure follows a standard star schema — if you want to understand why that structure matters, Power BI Data Modeling: Master Star Schema Design and Relationship Optimization covers it thoroughly.
Before you touch a single visual, you need to build the measures that will power your dashboard. This is the most important and most skipped step. Developers who skip it end up with implicit measures dragged straight from tables — which look fine in demos but break the moment a slicer or filter is applied in a way the developer didn't anticipate.
Open the Model view and create a dedicated measures table. This is a common professional practice: right-click in the Fields pane, choose New Table, and enter:
_Measures = ROW("x", 1)
This creates a single-row placeholder table. You'll store all your measures here, which keeps them organized and makes the Fields pane readable. You can hide the x column so it doesn't clutter the field list.
Now let's build the core KPI measures, one at a time.
Total Revenue =
SUM(Sales[Revenue])
Total Cost =
SUM(Sales[Cost])
Gross Profit =
[Total Revenue] - [Total Cost]
Gross Margin % =
DIVIDE([Gross Profit], [Total Revenue], 0)
Total Units Sold =
SUM(Sales[Units])
These are your base measures. Notice we're using DIVIDE() instead of the / operator for the margin calculation. This protects against divide-by-zero errors — if [Total Revenue] evaluates to zero for a filtered slice of data, DIVIDE() returns the third argument (0) rather than an error that crashes your visual.
Tip
Always use DIVIDE() for ratio measures in Power BI. A single filter combination that produces a zero denominator will show an error in your visual instead of a value. That's not a good look on an executive dashboard.
This is where dashboards go from informative to genuinely useful. A revenue number by itself is incomplete; revenue compared to last month tells a story.
Revenue PY =
CALCULATE(
[Total Revenue],
SAMEPERIODLASTYEAR(Date[Date])
)
Revenue vs PY =
[Total Revenue] - [Revenue PY]
Revenue vs PY % =
DIVIDE(
[Revenue vs PY],
[Revenue PY],
0
)
SAMEPERIODLASTYEAR is a time intelligence function — it shifts the filter context to the same period one year ago. This requires a proper Date table marked as a date table in your model. If you're new to time intelligence, Mastering Time Intelligence in Power BI: Building YTD, MTD, and Period-over-Period DAX Measures walks through all the mechanics.
Let's also add a YTD measure, because executives almost always want to see both current-period and year-to-date:
Revenue YTD =
TOTALYTD([Total Revenue], Date[Date])
Revenue YTD PY =
TOTALYTD([Total Revenue], SAMEPERIODLASTYEAR(Date[Date]))
Revenue YTD vs PY % =
DIVIDE(
[Revenue YTD] - [Revenue YTD PY],
[Revenue YTD PY],
0
)
This is a trick that makes your dashboards look significantly more professional. Instead of showing a raw percentage like -0.0382, you can create a text measure that formats the variance with an arrow symbol:
Revenue Variance Label =
VAR _pct = [Revenue vs PY %]
VAR _arrow = IF(_pct >= 0, "▲ ", "▼ ")
VAR _color_hint = IF(_pct >= 0, "Favorable", "Unfavorable")
RETURN
_arrow & FORMAT(ABS(_pct), "0.0%") & " vs PY"
You'll use this in a Card visual's subtitle or in a multi-card layout to give the number context at a glance. The FORMAT() function converts the decimal to a display string, and ABS() strips the sign since the arrow already communicates direction.
Note
This text measure is purely for display — you can't use it in calculations. Keep your numeric variance measures (Revenue vs PY %) separate so they remain available for conditional formatting logic.
Power BI gives you several card-type visuals, and the differences matter more than they appear.
The Card visual shows a single value — one measure, formatted large, with an optional subtitle. Use this when one number is the entire message: "Total Revenue: $4.2M." It's the simplest and highest-impact option for headline metrics.
The New Card visual (introduced in late 2023) gives you more layout control — you can stack a reference value below the main value, add a callout, and control padding and alignment much more precisely. If you're on a current version of Power BI Desktop, prefer this over the original Card.
The Multi-Row Card shows multiple measures in a compact grid. Use it when you need 4-8 secondary metrics that don't warrant their own large card — things like average order value, return rate, or customer count. It's denser and slightly harder to read at a glance, but useful for operational dashboards.
The KPI visual is specifically designed for showing a value against a target, with a trend sparkline. If your executives track metrics against budget or targets, this visual communicates attainment in a single glance. The catch: it requires a target measure, and the sparkline requires a date axis field.
For our executive dashboard, we'll use the New Card visual for the four headline metrics, and we'll build a KPI visual for the gross margin metric where we have a target.
Select the New Card visual from the Visualizations pane (it looks like a rectangle with a large number). Drag it to the top-left of your canvas and resize it to roughly one-quarter of the page width.
In the Fields well, add [Total Revenue] as the field.
Now open the Format pane. Here's where most developers stop — they leave the card on default settings and wonder why the dashboard looks amateurish. Let's fix that systematically.
Under "Callout value":
Under "Category label":
Under "Reference label" (bottom of the card):
[Revenue vs PY %] as a reference valueUnder "Card" > "Background":
Under "Card" > "Border":
Under "Card" > "Shadow":
Now duplicate this card three times (Ctrl+C, Ctrl+V) and swap the measures for [Gross Margin %], [Total Units Sold], and [Revenue YTD]. Align all four cards horizontally using Format > Align > Top and distribute them with equal spacing.
Warning
When you duplicate a card and change the measure, double-check the display units and format string. A card originally showing revenue in millions will display "0.45M" for gross margin percentage — which is nonsensical. Each card needs its own format settings tuned to the measure it's showing.
The KPI visual is more opinionated than the Card, so let's build it correctly.
Drag a KPI visual onto the canvas below the card row. Add the following:
[Gross Margin %]Date[Date] (or Date[Month Year] if you want monthly grain)Gross Margin Target = 0.42
This hardcodes a 42% gross margin target. In a real model, this might come from a Budget table:
Gross Margin Target =
CALCULATE(
DIVIDE(SUM(Budget[Target_Profit]), SUM(Budget[Target_Revenue])),
ALL(Date)
)
Add that target measure to the Target goals well in the KPI visual.
In the Format pane:
Key insight
The KPI visual automatically colors the variance indicator green or red based on whether the current value is above or below the target, and the direction setting you choose. This is the fastest way to communicate attainment without writing any conditional formatting DAX.
The summary table is the workhorse of executive dashboards. It answers the follow-up question after the KPI cards: "Which categories or regions are driving that number?"
A well-built summary table:
Add a Table visual to the lower half of the canvas. In the Columns well, add:
Products[Category] (or Sales[RegionName] — choose your primary breakdown dimension)[Total Revenue][Revenue vs PY %][Gross Margin %][Total Units Sold]Now format the columns:
In the Format pane, under Columns, select each measure column and set:
For [Total Revenue], set display units to Millions, 1 decimal.
For [Revenue vs PY %] and [Gross Margin %], set format to Percentage, 1 decimal.
Under Style presets, choose "Minimal" — this removes the heavy grid lines that make tables look like spreadsheets rather than designed artifacts.
Under Grid:
Under Column headers:
Under Values:
Tip
The "Minimal" style preset won't do everything you need — think of it as a starting point that removes the worst default formatting, not a finished look. You always need to go through the Format pane manually afterward.
This is where the table transforms from an information display into a decision-support tool. We'll add conditional formatting to the variance column and the margin column.
For Revenue vs PY %:
Click the column name in the Fields well, then open the Conditional formatting section in the Format pane. Enable Font color.
Choose Rules as the format style and add:
| Rule | Color |
|---|---|
| If value is < 0 | #DC2626 (red) |
| If value is >= 0 and < 0.05 | #D97706 (amber) |
| If value is >= 0.05 | #16A34A (green) |
This creates a traffic light system: red for declining vs prior year, amber for marginal improvement (under 5%), green for solid growth.
For Gross Margin %:
Enable Data bars for this column instead of font color. Data bars give instant visual sizing of relative margin without requiring the reader to parse every number.
In the Data bars settings:
Note
Using green/red for data bars implies a good/bad judgment that may not be appropriate for margin (a 20% margin might be excellent for one category and terrible for another). Blue bars let the reader make that judgment rather than the visualization making it for them. Save traffic light colors for metrics where the direction is unambiguous.
If you want more sophisticated conditional formatting driven by DAX logic — for instance, coloring rows based on complex business rules — Mastering Power BI Conditional Formatting: Dynamic Colors, Data Bars, and Icon Sets Driven by DAX Measures covers that in depth.
In the Format pane, scroll to Totals and toggle it on. This adds a grand total row at the bottom of the table.
One thing to check: if your variance measures are calculated correctly as DAX measures (not as column-level aggregations), the totals row will show the correct aggregate variance — not the average of the row variances. This is a key advantage of measure-based tables over calculated column-based tables. The total revenue variance versus prior year in the grand total row reflects the variance of the total, which is what the executive actually wants to see.
Warning
If your table's totals row shows a variance that doesn't match your KPI card's variance, you likely have a measure that contains ALL() or ALLSELECTED() without the proper scope. The measure's filter context in the totals row is different from its context within individual category rows. Check your DAX logic — specifically whether any CALCULATE() wrappers are overriding the row context when they shouldn't be.
You can have perfect measures and clean formatting and still produce a dashboard that fails to communicate. Layout is the invisible layer that makes data comprehensible.
Eye-tracking research consistently shows that Western readers scan dashboards in an F-pattern or Z-pattern: top-left first, then across the top, then down the left side. This means:
For our dashboard, this translates to:
Power BI's canvas alignment tools are underused. Select all four KPI cards, then use Format > Align > Top to snap them to the same y-position. Then use Format > Distribute > Horizontally to ensure equal spacing between them.
Set a consistent margin from the canvas edge. The default canvas is 1280×720 — leave 16px of padding on all sides. In practice: your leftmost card should start at x=16, and your rightmost card should end at x=1264.
For the summary table below the KPI cards, leave a 24px gap between the card row and the table. This gap communicates that these are related but separate sections — not one undifferentiated mass of visuals.
Every executive dashboard page needs a header. Use a Text Box visual (Insert > Text Box) at the top of the canvas.
Example:
Executive Sales Summary
FY2024 | Updated: [refresh date]
For the refresh date, you can create a measure:
Last Refresh Date = "Updated: " & FORMAT(NOW(), "MMM DD, YYYY")
And display it in a Card visual with font size reduced to 10pt, positioned in the top-right corner. This tells stakeholders that the data is current — a small touch that builds a lot of trust.
Don't leave the canvas on the default white background with individual white card backgrounds — the result is a flat, hard-to-read page. Instead:
Set the page background to a very light gray (#F3F4F6) and keep individual card and table backgrounds white. The slight contrast creates visual depth and naturally groups the white elements together as "content" against the gray "canvas."
In Page settings (Format pane with nothing selected on the canvas), set:
If you want to go further with consistent branding across your organization's reports, Master Power BI Templates and Theme Files for Professional, Consistent Reporting shows you how to encode these formatting decisions into a reusable theme file so you never have to repeat them.
A static summary page is useful; an interactive one is powerful. Two quick additions will let executives drill into the data without leaving the executive summary page.
Add a Date slicer at the top of the page. Set it to the Between style so executives can select a custom date range.
In the slicer Format pane:
Date[Date]Also add a Dropdown slicer for Sales[RegionName]. When a region is selected, all four KPI cards, the KPI visual, and the summary table should update simultaneously — this is cross-filtering working as intended.
Key insight
Make sure your slicers interact with every visual on the page. In Power BI Desktop, go to View > Edit Interactions and confirm that each slicer has a "filter" interaction (the funnel icon, not the X) with each KPI card and table. New visuals sometimes default to no interaction, which produces confusing behavior where a slicer updates some visuals but not others.
To learn more about controlling exactly how filters flow between visuals, Master Filters, Slicers, and Cross-Filtering in Power BI is the definitive resource.
For the summary table, configure a drill-through target. This lets an executive right-click on a category row in the summary table and navigate to a detail page for that category.
Products[Category] to the drill-through fieldPower BI automatically adds a back button when a page has drill-through configured. The executive experience: see a concerning margin number in the summary table, right-click the row, select "Drill through > Category Detail," review the detail, click back. Smooth and self-contained.
Build the following executive dashboard page using your own data (or a sample dataset from Microsoft's AdventureWorks):
Step 1: Create a measures table and write the following measures: Total Revenue, Gross Profit, Gross Margin %, Total Units Sold, Revenue vs PY %, Revenue YTD, and a variance label text measure.
Step 2: Place four New Card visuals across the top of the canvas, one each for: Total Revenue, Gross Margin %, Total Units Sold, and Revenue YTD. Format all four with consistent fonts, a white background, light border, and shadow. Display the revenue variance percentage as a reference value on the Revenue card.
Step 3: Build a KPI visual for Gross Margin % with a target of 42% (or a target from your own data). Position it below the card row, on the left half of the canvas.
Step 4: Build a summary table with ProductCategory as the row dimension and five measure columns. Apply font color conditional formatting to the variance column (red/amber/green) and data bar formatting to the margin column.
Step 5: Add a date slicer and a region/category slicer. Verify that all visuals respond to both slicers.
Step 6: Set the page background to #F3F4F6 and ensure all card/table backgrounds are white. Add a page title text box.
Stretch goal: Add a "Last Refresh Date" card in the top-right corner and configure a drill-through connection to a detail page.
Measure shows blank in a card but works in a table. This usually means the measure has a dependency on a filter context that isn't provided at the card level. Cards don't have a row context — they evaluate the measure over the entire filter context of the page. If your measure references another table's column without aggregating it properly, it may return blank. Check with DAX Studio by evaluating the measure in an empty filter context.
Variance card shows the wrong sign. If "Revenue vs PY %" shows positive when revenue declined, your formula is reversed. Check whether you've written [Total Revenue] - [Revenue PY] or accidentally reversed it. The correct direction: current minus prior. If current is higher, the result is positive.
Totals row in the summary table shows a wildly different variance than expected. As mentioned earlier, this is usually a measure that contains ALL() or ALLSELECTED() that overrides the category filter in individual rows but also overrides the total row's filter context unexpectedly. Add HASONEVALUE(Products[Category]) logic to bifurcate the measure's behavior:
Revenue vs PY % Safe =
IF(
HASONEVALUE(Products[Category]),
DIVIDE([Total Revenue] - [Revenue PY], [Revenue PY], 0),
DIVIDE([Total Revenue] - CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(Date[Date])),
CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(Date[Date])), 0)
)
Cards don't update when a slicer is changed. Go to View > Edit Interactions and check that the slicer has a filter relationship (not "None") with each card visual. Also verify that the slicer is filtering on a column that's in the same table lineage as the measures' source data.
Conditional formatting rules don't seem to apply. Power BI conditional formatting rules compare against the raw unformatted value, not the displayed value. If your margin is 0.42 (42%), your rule condition should be >= 0.42, not >= 42. This is a surprisingly common trip-up with percentage measures.
The dashboard looks cluttered on smaller screens. Executive dashboards are often opened on laptops at 1366×768 or presented on a screen via Teams. Design at 1280×720 canvas size and check the report in browser view at 80% zoom. If it looks cluttered there, it will look cluttered in the meeting. Power BI Mobile: Design Reports That Work on Any Device covers responsive design patterns if your executives use tablets.
Warning
Never rely on Power BI's auto-fit or "Fit to page" view for executive presentations. These views can rescale visuals in ways that make font sizes illegible. Always know the target screen size and design to it explicitly.
You've now built the foundation of an executive dashboard: well-structured DAX measures, properly formatted KPI cards, and a conditional-formatting-powered summary table — all laid out with intention rather than default settings.
The core principles to carry forward:
From here, several paths open up depending on what your dashboard needs next:
The executive summary page you built today is the front door of your report — make it worth walking through.
Getting Started with Power BI