The first option is suited for use cases where real-time data is a priority, which is rarely the case for data visualization, typically used for retrospective analysis. In addition, storing data directly in a dataset has several drawbacks, particularly in terms of volatility, data cleaning, and data management.
We will then set up automatic synchronization between the data in this list and Power BI.
The first step is to create a list containing all the data we will need in Power BI.
Example for collecting satisfaction data in an airport:
- The Time column will contain the time at which the tracker sent the data. It should be in date format and include the event time.
- The Place column will contain the tracker label, which in this case corresponds to its location within the airport.
- The Score column will contain the rating given for that data entry at the specified time.
- The Votes column will contain the number of votes recorded for that score at that time.
Many other data points are available. For example, you can use sites in combination with tracker labels.
Connect Ubiqod to the list using Power Automate
To send tracker data to the list, create a Power Automate flow using the “
Receive Data From Trackers” trigger from Taqt (make sure to create the associated connector in Ubiqod).
Save your flow and turn it on. You can test it using QR codes or the simulator built into the Ubiqod platform.
Synchronize list data with a Power BI dataset
In Microsoft Lists, click Export to Power BI from the Export menu:
Create a dataset associated with this source and select the workspace where the dataset will be stored:

Display the data in Power BI
The dataset is now available for creating reports from the data. By default, the data will be stored in a table called "table".
You can write DAX queries to create your own indicators, such as the aggregated satisfaction level hour by hour, using the following formula:
Aggregated Score = DIVIDE( SUMX('table', 'table'[Score] * 'table'[Votes]), SUM('table'[Votes]), 0 )
With the following column for the hourly time slot:
DateHour = 'table'[Time] - MOD('table'[Time], 1/24)
You can then use these new columns to create your reports:

Data refresh
You can schedule automatic data refresh:

Known limitations
Power Automate limits the number of daily actions depending on your license. In this case, consider using Azure Logic Apps.
Microsoft Lists can theoretically handle millions of rows. However, performance issues may arise once you reach several thousand rows, particularly in terms of display and synchronization time. Below are some optimization tips to help you get the most out of the solution.
Recommended optimizations
Indexing
Indexing allows SharePoint to sort and filter large volumes of data more efficiently.
If you mainly work with date-based queries, you can, for example, index the column containing the date of the data sent by the trackers:
7-day default view
Creating a view with the most recent data and setting it as the default view limits the amount of data displayed when users access the list, thereby improving performance:
Using multiple lists (partitioning)
To avoid overloading a single list, it is recommended to use multiple lists—for example, one list per client or per contract—with dedicated Power Automate flows and Ubiqod connectors for each.
Using Dataverse
If you plan to generate tens or even hundreds of thousands of rows, consider storing the data in Dataverse. It is a database better suited for handling large volumes of data and can also be synchronized with a Power BI dataset.