Data Driven Subscriptions in Power BI
What was that? Did I just say you could create a data driven subscription in Power BI? Like old school SSRS reporting where i can determine that these 5 sales people get an email with the information only relevant to them while these other 5 people over here get information only relevant to them?
Yep, that is exactly what i said…
Really this is pretty basic stuff and although you will see that this technique is a bit limited in options (for instance, we can ONLY send the hyperlink to the report and not a PDF or attachment) it works nonetheless.
I have chosen to do this via Microsoft Flow, but this technique could be achieved several ways. You can use the scheduler of your choice. Flow is a business friendly workflow engine and if you are already an Office 365 shop, it is likely you can use it as part of your current licensing. In this article we are going to use Flow to iterate through a subscription table stored in SQL Server twice a day and send emails with a hyperlink to the properly filtered report.
To learn more about Flow and how to evaluate it for FREE, visit https://preview.flow.microsoft.com/en-us/
The Power BI Report
In this blog post we will use the AdventureWorksDW database and key off of the “DimSalesTerritory” table to determine which sales country should be filtered in the subscription notification. The report has two pages showing sales information. The PBIX file is available on my GitHub repository if you don’t want to create your own.
When setting up the report, add DimSalesTerritory.SalesTerritoryCountry to the Report Level Filters. Adding to the Report Level will ensure that EVERY page of the report adheres to the filtered value that comes from the subscription (described below).
Enabling Data Driven Subscriptions
To achieve this we will use url query string parameters as described here when putting the hyperlink in the email notification.
To create a custom hyperlink for each email address (to make it truly data driven), I am using a SQL Server table to store the Sales Territory each employee should see in the report. Below is the DDL for the “subscriptions” table that I am adding to the AdventureWorksDW database. However, this could easily be a SharePoint list or some other data store that can be accessed from Microsoft Flow to drive the email subscriptions
CREATE TABLE [dbo].[subscriptions]( [id] [int] IDENTITY(1,1) NOT NULL, [email] [varchar](50) NOT NULL, [groupid] [varchar](50) NOT NULL, [reportid] [varchar](50) NOT NULL, [filtertable] [varchar](50) NULL, [filtercolumn] [varchar](50) NULL, [filteroperator] [varchar](12) NULL, [filtervalue] [varchar](50) NULL, [modifieddt] [datetime] NULL, [modifieduser] [varbinary](50) NULL ) GO
URL Formats in Power BI
The table above will contain the email address of the recipient as well as critical sections of the Power BI URL: the group id and the report id.
There are 3 different formats of the base url that for this example you will have to determine how your report is available to users in Power BI.
If the report is shared directly in your personal workspace, the format is below
Notice that in this scenario, the group identified is “me”. This indicates the report is available in your personal workspace.
If the report is shared with you from an App Workspace (formerly known as Group Workspace), the format is below
As described in my previous blog post Power BI Content Workflow – with Apps , the best practice however is to distribute content via an “App” and therefore the format should render as below:
In this scenario, we are using the groupid value from the SQL Server data source as the App and you can see that the group is still specified as “me”
In the guidance referenced above for including a query string, all of the above formats would have “?filter=DimSalesTerritory/SalesTerritoryCountry eq ‘United States’” for instance appended to set the report filter to only shows sales related to the United States.
SQL Server Entries
In this example, there are two entries in my subscriptions table, one for firstname.lastname@example.org that will be sent a link via email for ‘United States’ sales and another for email@example.com that will be sent a link for ‘France’ sales.
Setting up Microsoft Flow
In Microsoft Flow, there are two types of activities: Actions and Triggers. We will create a “Schedule” trigger in a blank flow
From the Schedule (Recurrence) trigger, select the frequency to be Daily and the proper time zone from the advanced options. Then you can select multiple hours you want the subscription to be ran
To add an additional action, use the New Step button
After that select the “SQL Server – Get Rows” action and find your “subscription” table. Note: You will need to connect to your database first if you have never connected before via Microsoft Flow.
And this is where the magic happens if you have never used flow before… add the “Send an email” action. Flow detects the previous action and sees that there is a “Get Rows” that has been performed. It will first create a loop (Apply to each) for every row in the table and then it will show the columns available from the selected rows so that they can be used in the “Send an email” action.
The email address can be used for the “To” location. I created a static subject for “Your Power BI report is ready!”. Click “Show advanced options” to expand the selection and make sure to set “Is HTML” to “Yes”.
Finally in the “Body” use an html tag <a href=”…”>Click Me!</a> or something more elegant of course. In the href attribute string together the base url (in my case, “https://app.powerbi.com/groups/me/apps/”) and append the rest of the variable data from the subscriptions table to make dynamic data driven link.
Now Save your flow and you can click “Run Now” to test it (this will run it now regardless of the trigger schedule you created).
As expected I receive an email for both firstname.lastname@example.org and email@example.com
Because when we setup the Power BI report, we used a Page level filter, both pages of the report will auto filter to the expected sales territory.
Now, every day at the times selected for the schedule 100s of people can get the filtered report link that would show them the most up to date information after data refreshes have occurred.
In this example, I used a simple email, however, you could have selected Twilio to use for text messaging notifications or something like SendGrid to create highly polished email content that looks much better than a simple url link. More complex workflows could also be performed by created conditional logic or more complex filters.
As said, this is pretty basic stuff… but very powerful.