# Breakdown

`ga4_breakdown` · Google Analytics MCP tool · Content

One-dimension traffic breakdown: channel, device, country, sourceMedium, newVsReturning, or contentGroup. Scope with organicOnly (default true; rejected for dimension "channel") or channelFilter. Shares are computed against GA4's own total, which the rows will not sum to. Run ga4_list-properties first if you don't have a property ID.

## Google Analytics Frequently Asked Questions

**What does the Breakdown tool do?**

This page documents the Breakdown tool (`ga4_breakdown`). One-dimension traffic breakdown: channel, device, country, sourceMedium, newVsReturning, or contentGroup. Scope with organicOnly (default true; rejected for dimension "channel") or channelFilter. Shares are computed against GA4's own total, which the rows will not sum to. Run ga4_list-properties first if you don't have a property ID. It is one of the Google Analytics Content tools, invoked through your firm's Weave MCP connection and available to members whose access level permits it.

**Why does dimension "channel" reject organicOnly and channelFilter?**

The channel report is itself the all-traffic-by-channel breakdown, so scoping it to organic-only or a single channel would be circular, both inputs are rejected together with dimension: "channel". For every other dimension, organicOnly defaults to true.

**Why don't the row shares sum to 100%?**

Shares are computed against GA4's own totalSessions, not a sum of the returned rows, thresholding, an "(other)" aggregation bucket, and unattributable sessions mean the rows will not add up to the total.

**What is the Google Analytics integration?**

The Google Analytics integration connects your firm's Google Analytics account to Weave. Google Analytics is Google's web and app analytics platform. This integration lets your AI workflows read that data, properties, audience and engagement metrics, and traffic sources, for the properties your connected Google account can access. It groups 11 tools into 5 categories, exposed through your firm's Weave MCP connection and filtered per member by access level.

**How does my firm connect Google Analytics to Weave?**

An admin authorizes a Google account with access to your GA4 properties once, via Google's OAuth consent flow in the Weave console. Every firm member then works through that single connection, there is no per-member Google sign-in.

**Can these tools change anything in Google Analytics?**

No. Every ga4 tool is read-only reporting, none of them can edit a property, change tracking configuration, or modify GA4 data.

**Do I need to specify a property every time?**

Yes, run ga4_list-properties first to get the numeric propertyId for the account/property you want; every other ga4 tool requires it.

**What does organicOnly mean on these reports?**

Most tools default to organicOnly: true, scoping the report to organic search traffic; widen the scope with organicOnly: false, or narrow it further with a channelFilter where the tool supports one.

## Related
- /integrations/ga4/content/pages/
- /integrations/ga4/traffic/compare-periods/
- /integrations/ga4/traffic/trend/

## Input

- **propertyId** `string` (required, pattern: ^\d{1,15}$) — Numeric GA4 property ID (e.g. "123456789"). Get it from ga4_list-properties if you don't have one.
- **startDate** `string` (min length: 1, max length: 30) — Window start. "30daysAgo" or YYYY-MM-DD. Defaults to "30daysAgo" when omitted.
- **endDate** `string` (min length: 1, max length: 30) — Window end. "today" or YYYY-MM-DD. Defaults to "today" when omitted.
- **dimension** `string` (required, enum: "channel", "device", "country", "sourceMedium", "newVsReturning", "contentGroup") — Breakdown dimension.
- **organicOnly** `boolean` — Organic Search only. Defaults to true (except dimension "channel"). organicOnly:true is mutually exclusive with channelFilter (organicOnly:false may be combined with channelFilter). Any organicOnly value is rejected together with dimension "channel".
- **channelFilter** `string` (min length: 1) — Scope to one channel, e.g. "Organic Social". Mutually exclusive with organicOnly:true and with dimension "channel".
- **rawSources** `boolean` — sourceMedium only: show GA4 raw referrer hosts instead of normalized platforms. Defaults to false when omitted.
- **limit** `integer` (>= 1, <= 100) — Max rows to return (up to 100). Defaults to 25 when omitted.

## Output

- **propertyId** `string` (required) — The GA4 property this data came from, as a bare numeric id.
- **startDate** `string` (required) — Window start, echoing the request ("YYYY-MM-DD" or a relative form).
- **endDate** `string` (required) — Window end, echoing the request.
- **scope** `string` (required) — Traffic scope applied — "Organic Search" when organicOnly is true (the default for every dimension except "channel"), "All Traffic" when false, or the requested channel when channelFilter is set. Always "All Traffic" for dimension "channel", where organicOnly/channelFilter are rejected as inputs — the channel report itself IS the all-traffic-by-channel breakdown.
- **dimension** `string` (required) — The dimension the rows are grouped by. Known values: "channel", "device", "country", "sourceMedium", "newVsReturning", "contentGroup".
- **rows** `array` (required) — Groups ranked by sessions.
  - **[]** `object`
    - **label** `string` (required) — The dimension value.
    - **sessions** `number` (required) — Sessions.
    - **share** `number` (required) — This row's share of totalSessions, as a percentage (0-100).
    - **users** `number` (required) — Active users. Not additive across rows: GA4 de-duplicates them.
    - **engagementRate** `number` (required) — Engaged sessions as a percentage (0-100).
    - **bounceRate** `number` (required) — Non-engaged sessions as a percentage (0-100). The inverse of engagement rate.
    - **avgSessionDurationSeconds** `number` (required) — Average engagement time per session, in seconds.
    - **keyEvents** `number` (required) — Key events (GA4 conversions).
- **totalSessions** `number` (required) — GA4's own undimensioned total. Rows will not sum to it (thresholding, "(other)" aggregation, unattributable sessions), so compute shares against this rather than a row sum.
- **sourcesNormalized** `boolean` (required) — True when raw referrer hosts were collapsed under canonical sources (m.facebook.com under facebook). Pass rawSources: true to see GA4's raw hosts.
- **notSetPresent** `boolean` (required) — An unclassifiable bucket exists in the data (cookieless or cross-device sessions). Tracked separately because it can rank below the display limit and still matter.
- **emptyReason** `string` (required) — Why rows is empty. Known values: "none", "no_data", "content_groups_unassigned" (the property has content groups configured but no page is assigned to one).
