Google Analytics 4 in Power BI: Practical Worked Example and Data Modeling via OData
Connect GA4 to Power BI via OData and calculate engagement rate with a worked example. Check report dimensions, data quality and metrics you should not sum.
By Auke Westra
Founder of DigiData
Short answer
You load Google Analytics 4 into Power BI by reading DigiData's 8 pre-aggregated report families via OData. Because metrics like active users are non-additive, daily rows cannot simply be summed. In this worked example, we calculate the weighted engagement rate over a bounded period using a DAX measure, explain data quality flags (thresholding and sampling), and outline the operation of source API quotas.
Why connect Google Analytics 4 to Power BI?
Connect your Google account with read access in DigiData and select the GA4 property. Wait for a successful synchronization. In Power BI Desktop, choose Get Data → OData Feed and use your DigiData URL with Basic authentication (API key as password). Load GoogleAnalytics4_TrafficAcquisition and rename it to Ga4TrafficAcquisition in Power Query for the DAX measure below. Names below refer to report models; check the available table names in your feed.
Website visits and online conversions represent the start of the customer journey for many organizations. While the Google Analytics 4 interface provides rapid insights, marketing and finance teams want to combine web performance in Power BI with data from CRM (such as HubSpot or Simplicate) and recognized invoices (from Exact Online or Twinfield).
Without a central data layer, analysts encounter major technical hurdles with GA4: complex API authentication, strict token quotas per property, sampled data, and thresholding. DigiData simplifies loading by providing eight structured report families in a reliable OData feed.
The 8 GA4 report families in DigiData
DigiData retrieves already aggregated reports from the Google Analytics Data API into eight separate tables.
- Traffic Acquisition (
Ga4TrafficAcquisition): Session-based attribution (with dimensions likeSessionDefaultChannelGroup,SessionSource,SessionMediumand metrics likeSessions,EngagedSessions,KeyEvents,TotalRevenue). - User Acquisition (
Ga4UserAcquisition): First-user attribution (FirstUserDefaultChannelGroup,FirstUserSource,FirstUserMedium,ActiveUsers,NewUsers). - Landing Pages (
Ga4LandingPage): Performance per landing page (LandingPagePlusQueryString,Sessions,EngagedSessions,EngagementRate). - Pages and Screens (
Ga4Page): Page views and interaction duration (PagePathPlusQueryString,PageTitle,ScreenPageViews,UserEngagementDuration,EventCount). - Events (
Ga4Event): Aggregated event counts (EventName,EventCount,TotalUsers,EventValue,KeyEvents). - E-commerce Items (
Ga4EcommerceItem): Product sales (ItemId,ItemName,ItemBrand,ItemCategory,ItemsViewed,ItemsPurchased,ItemRevenue). - Technology (
Ga4Technology): Device and browser statistics (DeviceCategory,Browser,OperatingSystem,Sessions). - Geography (
Ga4Geography): Country and regional data (Country,CountryId,Sessions,EngagedSessions,KeyEvents).
Two crucial pitfalls in GA4 modeling
When building a Power BI report on GA4 data, analysts must avoid two common mistakes:
1. Summing non-additive active users (ActiveUsers)
Unlike sessions or page views, the metric ActiveUsers is strictly non-additive. Google deduplicates individual visitors across the selected time period. If a user visits your website on Monday, Wednesday, and Friday, Google counts that user as one active user for that week. If you sum daily rows in Power BI using SUM(ActiveUsers), you count that visitor three times. For summations across time, exclusively use additive metrics like Sessions or ScreenPageViews, or report ActiveUsers only within the natural level of detail of the source table.
2. Mixing different table grains
Never attempt to merge rows from Ga4TrafficAcquisition (session grain) and Ga4UserAcquisition (first-user grain) into one wide flat table. These tables use fundamentally different attribution models. Treat each report family as a separate fact table in a star schema, connected to shared dimensions such as Date.
Practical worked example: Engagement Rate by channel
The ratio between sessions and engaged sessions provides a clean view of traffic quality. Google determines engaged sessions using duration, key events and page or screen views. Check the configured timer and the official engagement definition.
The example below shows an explicitly fictional dataset for the example period (July 1, 2026 through September 1, 2026) on the dimension Session default channel group:
| Channel Group (Fictional Example) | Sessions | Engaged Sessions | Calculated Engagement Rate |
|---|---|---|---|
| Organic Search | 14,500 | 8,990 | 62.0% |
| Direct | 6,200 | 3,844 | 62.0% |
| Paid Search | 9,800 | 5,194 | 53.0% |
| Referral | 2,500 | 1,700 | 68.0% |
| Organic Social | 1,800 | 864 | 48.0% |
| Total (Weighted Average) | 34,800 | 20,592 | 59.17% |
[!NOTE] Example values rationale: The above numbers and channel names are explicitly fictional and serve as an illustrative calculation example.
In Power BI, never average the column EngagementRate for total averages (which would yield an unweighted average of percentages). Always create an explicit DAX measure instead:
Engagement Rate =
DIVIDE(
SUM('Ga4TrafficAcquisition'[EngagedSessions]),
SUM('Ga4TrafficAcquisition'[Sessions]),
0
)
Quality metadata: Thresholding, data loss, and sampling
Every GA4 table in DigiData includes three specific quality flags:
SubjectToThresholding(Boolean): Indicates whether Google applied privacy thresholds. This occurs when Google Signals is enabled and user counts per row are small, preventing individual re-identification.DataLossFromOtherRow(Boolean): Indicates whether Google Analytics collapsed low-volume dimension values into the(other)row due to cardinality limits.SamplingRatio(Decimal/Percentage): Contains the sampling ratio reported by Google, when present. A value of 0.65 means 65% of the relevant sampling space was processed. A missing value is not independent proof that all data is available.
In Power BI, you can use these fields to display warning icons on your dashboard when data has been subject to thresholds or sampling.
Source API quotas and data refresh
A major advantage of DigiData is that interactive dashboard users in Power BI do not query the Google Analytics Data API directly. Background synchronization retrieves data in batches.
Keep in mind that the official Google Analytics 4 Data API allocates tokens per property (Core Tokens per hour and per day). Although DigiData bundles and optimizes calls, background synchronization consumes these property quotas. Avoid repeatedly triggering full historical resynchronizations on large properties unnecessarily.
Configure the data source in Power BI Service with Basic authentication using your DigiData API key, and schedule refresh shortly after nightly synchronization.
Summary
With DigiData's 8 aggregated report families, you bring Google Analytics 4 reliably into Power BI without fragile API scripts or CSV exports. By accounting for non-additive metrics and data quality flags, you build robust marketing dashboards. Learn more about the Google Analytics 4 integration or explore Power BI reporting.
Sources

About Auke Westra
Founder of DigiData
Auke Westra is Founder of DigiData and writes about data integrations, OData and Power BI.
Ready to start?
Try DigiData for free for 14 days. Connect your software, load your data into Power BI and discover the difference.
Please contact usRelated articles
Connect HubSpot CRM to Power BI via OData
Connect HubSpot to Power BI with an OData setup guide and sample deal measures. Learn which CRM tables are available and how to model your sales reports.
Connect Twinfield to Power BI via OData
Connect Twinfield to Power BI through OData. Follow the steps for office selection, data modeling, and scheduled refresh in Power BI Service.
Twinfield in Excel and Power Query via OData
Connect Twinfield to Power Query and Excel through OData. Learn how to load, transform, and refresh tables without recurring CSV exports.
Link Exact Online to ChatGPT via DigiData MCP
Use selected Exact Online data read-only in ChatGPT via DigiData MCP, with OAuth and explicit permissions for each accessible table and column.