Drill-through is one of Power BI's most powerful UX patterns — but it only works if you configure it correctly and design the destination page with intention. This lesson teaches you how to build context-aware detail pages that give every type of user exactly the depth they need, from field setup to DAX measures that confirm filter context.

Picture this: your sales manager is staring at a bar chart showing regional revenue. The Northeast is significantly underperforming. She right-clicks on that bar and — instead of a dead end — she's transported to a detailed page showing every transaction, every product, every rep, and every customer in the Northeast, all pre-filtered automatically. She didn't have to touch a slicer or navigate back and forth between pages. The report just knew what context she was bringing with her.
That's drill-through, and it's one of the most powerful UX patterns in Power BI. When designed well, it transforms a report from a static set of charts into a navigable investigation tool. When designed poorly — which is unfortunately common — it produces pages that break context, confuse users, or return blank visuals with no explanation. This lesson will make sure you end up in the first camp.
By the end of this lesson, you'll know how to design a drill-through page from scratch, wire it up to summary visuals, control what filters carry through, write supporting DAX measures that respond to drill-through context, and troubleshoot the half-dozen things that routinely go wrong. You'll build a realistic sales analytics example that you could drop into a production report tomorrow.
What you'll learn:
This lesson assumes you're comfortable with the fundamentals of Power BI Desktop. Specifically, you should understand:
We'll be working with a sample model containing: a Sales fact table, a Product dimension, a Customer dimension, a Date dimension, and a Region dimension. The Sales table includes columns for OrderID, OrderDate, SalesAmount, Quantity, UnitPrice, Discount, and foreign keys connecting to each dimension.
Before you touch a single field, it's worth understanding what Power BI is actually doing when a user triggers drill-through. The mental model here saves you from hours of head-scratching later.
When you right-click on a data point in a visual and choose "Drill through," Power BI captures the filter context of that specific data point — meaning the values of the fields associated with that point — and applies them as page-level filters when it navigates to the destination drill-through page. The destination page then renders all its visuals within that applied filter context.
The key detail: drill-through carries context based on the fields you designate as drill-through fields on the destination page. It does not automatically carry every filter currently active on the source page. This distinction is what trips up most beginners.
Here's a concrete example. Suppose your summary page has a slicer set to "2024" and a bar chart showing revenue by Region. You right-click on "Northeast" in the bar chart. Power BI will pass the "Northeast" region value to the drill-through page because Region is configured as a drill-through field on the destination. The year slicer? By default, that also carries through — but whether it does depends on a setting called Keep all filters, which we'll cover in detail shortly.
Key insight
Drill-through is not the same as cross-filtering or slicing. It's a deliberate navigation action that relocates the user to a different page with a pinned filter context. Users don't stay on the same page — they move. That's what makes the back button so important.
There are two types of drill-through in Power BI Desktop:
We'll focus primarily on field-based drill-through since it covers the vast majority of real-world use cases, and touch on measure-based drill-through toward the end.
We'll work with a scenario you've likely encountered: a regional sales report where executives need summary visuals at the top level, but analysts need to investigate individual transactions and customer details when something looks off.
If you're following along, create a Power BI Desktop file and import (or paste) the following sample data structure. If you have your own dataset with similar characteristics — a fact table and dimension tables — you can adapt the steps.
Your model should have these tables connected as a star schema:
Sales (fact): OrderID, CustomerID, ProductID, RegionID, DateKey, SalesAmount, Quantity, UnitPrice, Discountdim_Region: RegionID, RegionName, Territorydim_Product: ProductID, ProductName, Category, SubCategory, UnitCostdim_Customer: CustomerID, CustomerName, Segment, Industrydim_Date: DateKey, Date, Year, Quarter, Month, MonthNameThe relationships should all be one-to-many from each dimension to the Sales fact table, with single-directional cross-filtering from dimension to fact. If you need help thinking through relationship setup, the article on Understanding Power BI Relationships: How to Connect Tables, Set Cardinality, and Avoid Common Modeling Mistakes is a solid reference.
Note
For this exercise, it's worth having at least 200–300 rows of data so the detail page renders meaningfully. You can generate sample data using Excel's RANDBETWEEN formulas or use any of the free sample datasets Microsoft provides — the AdventureWorks or Contoso datasets both fit this structure well.
Before creating the drill-through destination, let's set up the summary page that users will drill from. This matters because drill-through is useless if users can't find the right-click entry point, or if the visuals don't have the right fields to trigger it.
Create a new page in Power BI Desktop and name it "Sales Overview."
Add the following visuals to this page:
1. Revenue by Region (Clustered Bar Chart)
dim_Region[RegionName]Total Revenue2. Monthly Revenue Trend (Line Chart)
dim_Date[MonthName]Total Revenue3. Top Products by Revenue (Table or Matrix)
dim_Product[ProductName], dim_Product[Category]Total Revenue, a measure called Order CountCreate the basic measures you'll need. In the Sales table (or a dedicated Measures table), add:
Total Revenue = SUM(Sales[SalesAmount])
Order Count = DISTINCTCOUNT(Sales[OrderID])
Avg Order Value = DIVIDE([Total Revenue], [Order Count])
These are the foundational measures. The summary page should now show a reasonable overview of business performance. The goal is to give users something interesting enough that they'd want to investigate — specifically, they should be able to look at the revenue-by-region bar and think "I want to see what's behind that Northeast bar."
Tip
The visuals on your summary page don't need any special configuration to support drill-through. As long as they contain fields that you'll designate as drill-through fields on the destination page, the right-click context menu will automatically show the drill-through option. The configuration lives entirely on the destination page.
Now comes the core of the lesson. Add a new page to your report and name it "Region Detail." This page will be the drill-through destination.
With the Region Detail page selected, look at the Visualizations pane on the right. You'll see a section in the "Build visual" panel (at the bottom, below the field wells for a selected visual) — but you need to look at the Page settings area instead.
Here's how to find the drill-through field setup:
Actually, let me be more precise about where this lives in current versions of Power BI Desktop, since the UI has evolved:
The drill-through field setup is in the Visualizations pane, under the Build tab, when you have no visual selected. You should see a section called Drill through with a field well labeled "Add drill-through fields here."
Drag dim_Region[RegionName] into the Drill through field well on this page.
The moment you do this, two things happen automatically:
RegionName in its field configuration will now show a "Drill through → Region Detail" option when you right-click a data pointWarning
Do not delete the auto-generated Back button. It's not just cosmetic — it's also pre-wired to remember which page the user came from, which a manually created navigation button cannot do without additional bookmark configuration. You can reposition and reformat it, but keep it on the page.
Just below the drill-through field well, you'll see a toggle called Keep all filters. This is one of the most consequential settings in drill-through design, and it's often misunderstood.
When this is ON (default): All filters currently active on the source page — including slicer selections, page-level filters, and report-level filters — carry over to the drill-through page in addition to the drill-through field filter. So if the user had the year slicer set to 2024 and they drill through on the Northeast region, the detail page will show 2024 Northeast data.
When this is OFF: Only the drill-through field value is passed. The detail page renders with its own default filters and only the drill-through filter applied. This means the user arrives at "all years, Northeast" regardless of what slicer they had set.
For most analytical scenarios, Keep all filters ON is the right choice. It preserves investigation context — the user was looking at 2024 data, so they want to investigate 2024 data. Turning it off makes sense only when the detail page has its own filter controls that should take precedence, or when you deliberately want to give users an unfiltered starting point for their investigation.
Now add visuals to the Region Detail page. These visuals will all automatically respond to the drill-through filter context — whatever RegionName value the user drilled from will be applied as an invisible filter across the whole page.
A. Context Header Card
Create a Card visual and use this measure as its value:
Drill Region Label =
"Region Detail: " & SELECTEDVALUE(dim_Region[RegionName], "All Regions")
This measure uses SELECTEDVALUE to detect which region is currently filtered. When the user arrives via drill-through, this will display something like "Region Detail: Northeast." If somehow the page is viewed without a drill-through filter, it gracefully falls back to "All Regions."
Format this card large and prominently at the top of the page — it's the user's visual confirmation that the drill-through worked correctly and they're looking at the right context.
B. Summary KPI Cards
Add three Card visuals for:
Total Revenue Order CountAvg Order ValueThese will automatically reflect the filtered region context. No additional configuration needed.
C. Transaction-Level Table
Add a Table visual with these fields:
dim_Date[Date]dim_Customer[CustomerName]dim_Product[ProductName]Sales[Quantity]Sales[UnitPrice]Sales[Discount]Total RevenueSort this table by Date descending so the most recent transactions appear first. This is the "show me the data" table that answers the question behind the drill-through.
D. Product Performance Bar Chart
Add a Clustered Bar Chart:
dim_Product[Category]Total RevenueThis tells the analyst which product categories are driving (or dragging down) the region's numbers.
E. Customer Segment Breakdown
Add a Donut or Pie Chart:
dim_Customer[Segment]Total RevenueThis adds a third dimension — not just what sold, but to whom.
Tip
Resist the urge to pack too many visuals onto the drill-through page. The goal is focused investigation, not another summary page. Five to seven well-chosen visuals is usually the sweet spot. If users need even more depth, you can create a second level of drill-through from this page.
One powerful technique is creating a measure that summarizes the full filter context in a human-readable way, which you can display as a subtitle or in a text box using a card visual:
Context Summary =
VAR SelectedRegion = SELECTEDVALUE(dim_Region[RegionName], "All Regions")
VAR SelectedYear = SELECTEDVALUE(dim_Date[Year], "All Years")
VAR RevTotal = FORMAT([Total Revenue], "$#,##0")
RETURN
SelectedRegion & " | " & SelectedYear & " | Revenue: " & RevTotal
This dynamic label gives users immediate orientation: they can see "Northeast | 2024 | Revenue: $1,247,350" at a glance without having to mentally reconstruct what filters are active. Place this in a Card visual immediately below your page title.
Before going any further with design, let's verify the connection actually works.
Navigate back to the Sales Overview page. Right-click on one of the bars in your Revenue by Region chart — specifically on a region name bar, not an empty area of the chart. You should see a context menu appear. Look for a section called Drill through with an arrow pointing to Region Detail.
Click it.
You should land on the Region Detail page with:
If this works — great, the fundamental wiring is correct. If not, see the troubleshooting section below.
Note
The drill-through option in the right-click menu only appears on data points that have the drill-through field in context. If you right-click on a visual that doesn't contain RegionName in its axis, legend, or rows, you won't see the option. For example, right-clicking on the monthly trend line chart (which uses Month on the axis) would not offer drill-through to Region Detail.
Real-world reports often need more specificity. Instead of "show me all data for Northeast," your users might need "show me all data for Northeast, specifically for the Enterprise customer segment." You can configure multiple drill-through fields on a single destination page.
On the Region Detail page, add dim_Customer[Segment] to the Drill-through field well alongside RegionName.
Now the drill-through page requires both fields to be in context for the right-click option to appear. This means:
This is powerful for matrix visuals where users are examining intersections. The mental model: each field you add to the drill-through well is an and condition — the user must be on a visual where all those fields are in filter context simultaneously.
Warning
Be thoughtful about adding too many required drill-through fields. Each field you add narrows the set of source visuals that can trigger the drill-through. With three or more required fields, you may find that most of your summary visuals can't trigger it at all, defeating the purpose. When in doubt, use one primary drill-through field and let "Keep all filters" handle secondary context from slicers.
Power BI also supports drill-through based on measures rather than dimension fields, though this feature requires a bit more setup and has specific use cases.
The scenario: you have a report that segments customers into "High Value," "Mid Value," and "Low Value" tiers based on a calculated revenue threshold. These tiers don't exist as a column in your data — they're computed. You want users to be able to drill through on a tier to see the customers in that tier.
To do this, you first need a calculated column (not a measure) that assigns the tier to each customer:
-- In dim_Customer table as a calculated column
Customer Tier =
VAR CustomerRevenue =
CALCULATE(
SUM(Sales[SalesAmount]),
ALLEXCEPT(dim_Customer, dim_Customer[CustomerID])
)
RETURN
SWITCH(
TRUE(),
CustomerRevenue >= 100000, "High Value",
CustomerRevenue >= 25000, "Mid Value",
"Low Value"
)
Note
You can read more about the nuances of when to use calculated columns versus measures in the Power BI Calculated Columns vs Measures: When to Use Each and Why It Matters article — the distinction is especially relevant here because drill-through fields must be categorical (columns), not numeric (measures).
Once you have the calculated column, add dim_Customer[Customer Tier] as a drill-through field on a new "Customer Tier Detail" page, and your summary visuals that show tier breakdowns will support drill-through just like any other dimension field.
The auto-generated back button is functional but visually generic. Since users need to notice and trust it, some formatting investment pays off.
Select the Back button on the Region Detail page. In the Format pane, you can:
For consistent styling across all drill-through pages in your report, consider creating a theme that defines button styles globally. The lesson on Master Power BI Templates and Theme Files for Professional, Consistent Reporting covers how to do this efficiently.
One important behavior to understand: the Back button uses Power BI's smart navigation — it doesn't hardcode a destination page. It returns the user to whatever page they drilled from, even if you have multiple pages that all drill through to Region Detail. This is significantly more sophisticated than a manual navigation button pointing to a specific page name.
If you're building a report that also uses bookmarks and custom button navigation alongside drill-through, the article on Build Professional Navigation in Power BI: Bookmarks, Buttons & Page Flow Mastery covers how to integrate these patterns without them conflicting with each other.
By default, drill-through pages appear in the page tab strip at the bottom of the report, which creates a UX problem: users can navigate directly to the Region Detail page without any drill-through context, and they'll see either blank visuals or unfiltered data — neither of which is useful or intended.
The solution is to hide the drill-through page from normal navigation.
Right-click on the Region Detail page tab at the bottom of Power BI Desktop. Select Hide page. The page tab will now appear grayed out in Desktop view (you can still see it, but users in Power BI Service won't see it in the tab strip).
Hidden pages are still fully accessible via drill-through — the navigation action bypasses the hidden status. Users can only reach the page through an intentional drill-through action, which is exactly the behavior you want.
Tip
Always hide your drill-through destination pages. It's not just about preventing confusion — it's also about performance. Users who navigate directly to a detail page without filter context might trigger expensive queries across your entire dataset. Hiding the page and requiring drill-through ensures the page always loads with a focused filter context, which is much faster.
The measures you've already written (Total Revenue, Order Count, etc.) will work correctly on the drill-through page because drill-through applies its filter context through the standard filter engine — the same mechanism that makes slicers and page filters work. Any measure that respects filter context will automatically be correct on the detail page.
Where things get interesting is when you want measures that know they're in a drill-through context and behave differently. Here are a few patterns that add significant polish.
Show how the drilled region compares to the overall total:
Region vs Total % =
VAR RegionRevenue = [Total Revenue]
VAR AllRevenue = CALCULATE([Total Revenue], ALL(dim_Region))
RETURN
DIVIDE(RegionRevenue, AllRevenue)
Format this as a percentage. When viewed on the drill-through page, it will show "Northeast accounts for 23% of total revenue" — giving the analyst immediate proportional context without having to remember what the company total was.
You can combine drill-through with time intelligence for deeper analysis. This measure shows how the drilled region is performing compared to the same period last year:
Revenue YoY Growth =
VAR CurrentRevenue = [Total Revenue]
VAR PriorRevenue =
CALCULATE(
[Total Revenue],
SAMEPERIODLASTYEAR(dim_Date[Date])
)
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue)
If the user drilled through with a date filter active (because "Keep all filters" is on and they had a year slicer set), this measure will correctly compute the year-over-year comparison within the drilled region context. For more time intelligence patterns like this, see Mastering Time Intelligence in Power BI: Building YTD, MTD, and Period-over-Period DAX Measures.
Make the detail page visually respond to whether performance is good or bad within the drill-through context:
Revenue Performance Color =
VAR CurrentRevenue = [Total Revenue]
VAR BenchmarkRevenue =
CALCULATE(
AVERAGEX(
VALUES(dim_Region[RegionName]),
[Total Revenue]
),
ALL(dim_Region)
)
RETURN
IF(CurrentRevenue >= BenchmarkRevenue, "#1E8449", "#C0392B")
-- Green if at or above average, red if below
Use this in conditional formatting on your KPI cards to give instant visual feedback on whether the drilled region is performing above or below the company average. The Mastering Power BI Conditional Formatting: Dynamic Colors, Data Bars, and Icon Sets Driven by DAX Measures article covers applying these color measures in the Format pane in detail.
Now let's put everything together in a structured exercise that extends the basic setup into a genuinely useful two-level drill-through chain.
Goal: Create a report where users can drill from a Region summary to a Region Detail page, and then from the Region Detail page further into an individual Customer Detail page.
Step 1: Finish the Region Detail page as described in the main lesson above.
Step 2: Create the Customer Detail page
dim_Customer[CustomerName] into the Drill-through field wellStep 3: Add visuals to Customer Detail
Customer Context Label =
"Customer: " & SELECTEDVALUE(dim_Customer[CustomerName], "All Customers") &
" | " & SELECTEDVALUE(dim_Region[RegionName], "All Regions")
Total Revenue over dim_Date[MonthName] for this specific customerOrderID, Date, ProductName, Quantity, SalesAmountTotal Revenue, Order Count, Avg Order ValueStep 4: Enable drill-through from Region Detail to Customer Detail
On the Region Detail page, your transaction table already has dim_Customer[CustomerName] in its rows. This means right-clicking on any customer row in that table will offer "Drill through → Customer Detail." No additional configuration is needed on the source (Region Detail) page.
Step 5: Test the full chain
This three-page chain is a realistic pattern for executive → manager → analyst reporting structures.
Cause: The visual you're right-clicking doesn't contain the drill-through field in its visual-level field wells.
Fix: Check the drill-through field on the destination page. Then look at your source visual — the field you designated as the drill-through field must appear in the axis, legend, small multiples, or rows/columns of the source visual. It's not enough for it to merely exist in the data model.
Cause 1: The drill-through field relationship is broken or the field was dragged into the wrong well on the destination page.
Cause 2: You have a visual on the detail page using a measure with ALL() or REMOVEFILTERS() that's clearing the drill-through context.
Fix: Check your DAX measures for any explicit ALL() calls that might be removing the drill-through filter. Use ALLEXCEPT() to preserve the drill-through field's filter while removing others.
Cause: You duplicated a drill-through page (which is fine), but the duplicate kept a hardcoded navigation action on the Back button pointing to a specific page.
Fix: Delete the Back button from the duplicated page and let Power BI auto-generate a new one by temporarily removing and re-adding the drill-through field. The auto-generated button uses smart navigation; manually wired buttons don't.
Cause: "Keep all filters" is ON, and the user has multiple slicers active that together over-filter the detail page to zero rows.
Fix: This is often a sign that the user's filter combination is legitimate (there genuinely is no data for that intersection), but if it happens frequently, consider turning off "Keep all filters" and redesigning the detail page with its own date/filter slicers so users control the scope themselves.
Cause: The data exists for the drill-through trigger (so the option appears) but some visuals on the detail page have field-level filters or hardcoded conditions that exclude that subset.
Fix: Check each visual on the detail page for visual-level filters. It's easy to accidentally add a filter during development (like filtering to SalesAmount > 0 for testing) and forget to remove it.
Warning
If you're using DirectQuery mode rather than Import mode, drill-through performance can be noticeably slower since each visual on the detail page fires a separate query to the data source when the page loads. For high-traffic reports, consider whether the detail page can be served from an Import mode table or aggregation. The article on Optimizing Power BI Report Performance: Query Reduction, Aggregations, and DirectQuery Tuning has specific strategies for this.
Cause: The visual's data point doesn't have a valid value for the drill-through field — typically a blank or null value in that field.
Fix: Ensure your dimension tables don't have null values in the drill-through field. Add a data quality step in Power Query to replace nulls with "Unknown" or similar placeholder values.
Drill-through pages are one of the highest-leverage features in Power BI for creating reports that actually serve different types of users simultaneously. Your executive gets a clean summary view. Your analyst gets granular transaction data. Neither has to compromise on what they see, and navigation between the two is seamless and context-preserving.
Here's what you built in this lesson:
The design principles here — focused page scope, explicit context confirmation, easy back navigation — apply broadly to Power BI report design. As your reports grow more complex, you may want to combine drill-through with other navigation patterns like bookmarks for a richer user experience, which you can explore in Master Power BI Bookmarks, Buttons, and Page Navigation for Interactive Reports.
You should also think about how drill-through pages behave once your report is published to Power BI Service — particularly how they interact with row-level security when different users might have access to different regions or customer segments. That intersection of drill-through and security is covered in Implementing Row-Level Security in Power BI: Dynamic Rules, Role Testing, and Enterprise Deployment.
The next natural step is to extend the interactivity of your summary pages with advanced filter and slicer patterns. Master Filters, Slicers, and Cross-Filtering in Power BI will show you how to combine the cross-filtering behavior of summary visuals with drill-through so your users have multiple natural investigation paths from every chart on the page.