ga4-overview

Installation
SKILL.md

GA4 Overview

Read the Google Analytics 4 property linked to one Search Console site and present a traffic overview, the organic channel's share and trend, conversions, error pages and recommendations. The user's request may contain a property, a date range, a key event name (for example "form_submit"), a dimension to break down by, or a custom dimension name; honor what is given and resolve the rest below.

Workflow

  1. Resolve the property. If the user's request or the conversation names a property, use it. Site URLs use GSC formats: sc-domain:example.com or https://www.example.com/. Otherwise call list_sites and pick the obvious match. If several plausible properties exist, ask the user which one before continuing. Use the last 28 days compared with the previous period unless the user specifies dates. Every GA4 tool here defaults to the same settled window as the Search Console tools (the last 28 days ending about 3 days back), so omitting startDate and endDate is the safe choice; when the user asks for explicit dates that reach into the last day or two, say that GA4 may still be processing them and treat the newest day as incomplete rather than as a drop.

  2. Confirm the GA4 link. Call list_ga4_properties (no arguments). Read connected: false means the Google Analytics consent has not been granted in the GSC Wizard app for this account (account names it), and connected: false with reauthRequired: true means it was granted but Google now rejects every Google account carrying it, so the user has to reconnect it on the Account page of the app. Find the property whose linkedSiteUrls contains the resolved site; linking happens in the app, not through the MCP, so if no property lists the site, say so and tell the user to link one in GSC Wizard. linkedSiteUrls only covers the GSC Wizard account this connection is authenticated as, so a link made from another account of the user shows as empty here. Read errors for Google accounts whose properties are missing from the list and relay each message.

  3. Traffic overview. Call get_ga4_overview with siteUrl; it always compares against the same-length period immediately before unless both comparisonStartDate and comparisonEndDate are passed. Read summary and prevSummary: sessions, active, total and new users, page views, engagementRate, averageSessionDuration (seconds), bounceRate, event count and key events. The two rates are 0-1 fractions, so multiply them by 100 for display and say so. When comparisonHasData is false, prevSummary is null because the data stream did not exist yet; report the current period alone instead of a change. Set includeTimeseries: true only when the user wants the daily shape (timeseries, oldest day first). If the response carries siteScope, the GA4 property is shared by several sites and every number is limited to this site's hostnames; say that once.

  4. Channel mix and the organic share. Call query_ga4_report with dimension: "channel", comparisonStartDate and comparisonEndDate set to the previous period (this tool only compares when both are given; without them the prev* fields are 0 and hasComparison is false) and limit: 25. Rows carry the metric names listed in metrics (sessions, activeUsers, engagementRate and keyEvents for this dimension), sorted by sessions. Derive the organic share as the "Organic Search" row's sessions divided by summary.sessions from step 3, label it as derived, and report the change in organic sessions against the comparison. For the trend over days, call the tool again with dimension: "date" and filters: { channel: ["Organic Search"] }; date breakdowns take no comparison range. Rows stop at limit (truncated and note say when more exist), so never sum rows to reach a total; get_ga4_overview owns the totals.

  5. One more breakdown when the question asks for it. query_ga4_report takes one dimension per call and secondaryDimension (date or hostName, different from dimension) splits each row further, for example dimension: "event" with secondaryDimension: "date" shows on which days an event fired. filters narrow by channel, sourceMedium, pagePath, landingPage, country, device, event or hostName; to follow one event pass filters: { event: ["<eventName>"] }. Keep limit at 25 unless the user wants more (max 1000). Pick the dimension from the question:

Installs
2
First Seen
2 days ago