Are you drowning in duplicate apps? Creating separate Executive, Sales, and Finance apps that essentially show the same data with different views?
There's a smarter way. Power BI App Audiences lets you deliver personalized, role-specific experiences within a single app – no more maintenance nightmares or content duplication.
What You'll Discover:
Streamlined Navigation: Each user sees only what matters to their role Layered Security: Combine with RLS for bulletproof data protection Developer Productivity: Manage one app instead of dozens
Enterprise Scale: Support up to 25 audiences and 10,000 users
Perfect For:
CEOs who need high-level KPIs only
Managers requiring departmental breakdowns
Sales teams focused on individual performance
IT admins seeking centralized management
Ready to revolutionize how you deliver insights? Our step-by-step walkthrough shows you exactly how to set up audiences, manage permissions, and verify everything works perfectly.
Plus: Learn the critical workspace permission mistake that breaks App Audiences – and how to avoid it!
Explore Power BI DAX functions with practical examples. Learn basic functions like CALCULATE, ALL, ALLSELECTED, ALLEXCEPT, DIVIDE, IF, and DATEADD, and see how to apply them in real-world scenarios.
The latest Power BI release confirms a clear direction: deeper AI integration, more flexible modeling, and smarter distribution.
The most impactful changes include:
AI at the Core: Copilot now generates DAX measure descriptions automatically and delivers filter-aware summaries, even in standalone mode.
Flexible Distribution: Org Apps in Pro Workspaces (Preview) enables tailored report experiences for different audiences from the same workspace.
Modeling Without Limits: Direct model editing in the service, native SQL queries in-browser, and expanded Databricks Direct Lake integration.
Better Connectivity: Updated Impala connector, Entra ID authentication for PostgreSQL, and streamlined PBIP format.
Microsoft is accelerating the shift toward self-service analytics powered by AI, while ensuring enterprise-grade modeling and connectivity. For organizations, this means faster insights, cleaner documentation, and a more personalized reporting experience.
You can create custom roles in Power BI Report Server (on-prem) — but you do it in SQL Server Management Studio (SSMS), not in the web portal. Roles are built from predefined tasks (permissions). Tasks themselves can’t be altered, and a single role can include either item-level tasks or system-level tasks (not both).
How security works
Role = set of tasks. Tasks are fixed (e.g., View reports, Manage reports). You can combine tasks into your own role definitions. You cannot create new tasks or change task behaviour.
Two scopes:
System-level roles (site-wide operations such as managing schedules, jobs, server settings).
Item-level roles (permissions on folders, reports, data sources, resources). A role can include tasks from one scope only.
Role assignments happen in the web portal (map users/groups to roles at site level and/or on folders/reports).
In my previous blog I explained bout Web.BrowserContents, in this blog I will exaplin why we should avoid using it
What if the data is not on the web page?
Let’s say you’re interested in the ‘Index of Consumer Sentiment’ data from the University of Michigan’s portal:
data.sca.isr.umich.edu/get-table.php
You could manually download the file and import it into Power BI Desktop — but that’s tedious. Every data update would require you to download the latest file and refresh your dataset manually.
A better approach is to find the direct file URL from the site, usually by inspecting the anchor (<a>) tag hyperlink. Once you have this URL, connecting directly works—until you realize there is a unique file’s ID, month and year with in the URL as query parameter.
It indicates every month the URL parameter value changes. So, you’re back to square one.
Time to roll up the sleeves and brainstorm a solution
Using Web.Contents and Text.FromBinary
When you use the graphical interface and supply the web page URL, the first navigation window will show you the table it has identified but it will not show the underlying anchor tag URLs.
If you go this route, refreshing the dataset from the Power BI Service fails due to two main reasons:
Dynamic Data Source Limitation Web.BrowserContents does not support data refresh from power bi service
Solution 1. Replace Web.BrowserContents with Web.Contents, and split your web URL into a root URL and a query parameter. Web.Contents("https://data.sca.isr.umich.edu", [RelativePath="tables.php#"])
This modification avoids issues with dynamic data sources and browser engine requirements.
Extract the HTML using Web.Contents(), As we all know the output of this function is binary value, convert this binary to text using Text.FromBinary.
As you can see we are able to extract the underlying HTML, the next task to identify the file url within this code. Here’s where things get tricky. As far as I know, there’s no M function that reads anchor elements directly.
But we have workarounds! Either we can use text manipulation function like Text.BetweenDelimiter OR we can use Html.Table function. Second option would require HTML knowledge to identify the class and identifier names of different elements in the code. Since we only need one link and to keep things simple, lets solve this using text manipulation functions
We can use functions like Text.PositionOf to locate the exact file URL. For example, in my scenario, the relative file URL is found between two position markers. As a result, you can dynamically extract the file URL.
Text.BetweenDelimiters( Text.BetweenDelimiters( Text.FromBinary( Web.Contents("https://data.sca.isr.umich.edu/tables.php#")), "The Index of Consumer Sentiment", " </div>"), " href=", ">")
If you've noticed Html.Tables being used as well, you might wonder why. The answer is simple: the output of Web.BrowserContents isn't directly a table or a readable value—it’s a binary value. You need to convert this binary data into something readable, which is where parsing functions come in. That’s why, when you’re pulling data from an API, along with Web.Contents function, functions like Json.Document, Xml.Document, or Csv.Document are invoked depending on the endpoint's data format. Similarly, data from Excel files located in Sharepoint folder will use Excel.Workbook().
Why Is Html.Tables Needed?
Let’s break this down. Suppose the URL you provided isn’t an Excel file on SharePoint or an API endpoint, but just a publicly accessible webpage. The data is available right on the page itself, which is — naturally — in HTML format. To present tabular data in HTML, developers often use the <table> tag. So, when you use a web URL as a source in Power BI Desktop, it’s intelligence identifies the output format and automatically applies the necessary parsing functions to present your data. If the site contains multiple tables (multiple <table> tags), the navigation pane displays all of them, allowing you to choose which table you want to import.
Since this data is publicly accessible, anonymous authentication works, and you can refresh the data from the Power BI Service.
In my next blog I will continue the discussion on this topic where I will explain a practical scenario
Calculation groups can greatly minimize the need for creating duplicate measures by enabling you to define DAX expressions as calculation items, which can then be applied to the existing measures in your model. In this newsletter article, I used the AdventureWorks dataset. The Power BI Desktop file, both for practice and with solutions, can be downloaded from the following link.
Tired of emailing .pbix files back and forth and losing track of the “latest version”? With CI/CD in Power BI, you can automate deployments, keep perfect version control and roll back mistakes in seconds all using Azure DevOps.
In this guide, I will show you how to set it up from scratch, even if you have never touched pipelines before.
Struggling with large semantic models or massive datasets in Power BI? In this video, I’ll show you how to parameterize Import Mode by using values from a dimension table to dynamically filter the data you load. You’ll learn how to: ✅ Create a dynamic list from a dimension ✅ Build a query parameter based on that list ✅ Filter your fact table using an inner join ✅ Save and distribute lightweight .PBIT templates
👀 Have you ever written a DAX measure with CALCULATE() and thought — “this should work!” — only to see it break unexpectedly? Or maybe you tried CALCULATETABLE() and magically, everything worked.
Both functions seem to answer the same question:
“How do I modify the filter context?”
But they work very differently — and using the wrong one can lead to confusing totals, blank visuals, and filters behaving oddly.
Today, let’s demystify CALCULATE() and CALCULATETABLE(), when to use each, and why CALCULATETABLE() is often the safer bet in complex calculations.