ga4-overview
Skill0 starsChanged 22 days agoMITView on GitHub
Review the Google Analytics 4 side of a Search Console property through the GSC Wizard MCP server: which GA4 properties are readable and linked, the traffic overview with its previous-period comparison, the channel mix with the organic share and trend, one breakdown dimension of choice, the key event (conversion) that matters, error pages, and the site's own custom dimensions. Use when the user asks "how is my GA4 traffic", "show me analytics for my site", "sessions and conversions this month", "which pages get traffic in GA4", "is organic growing in analytics", "which pages show a 404", or "what custom dimensions do I have".
In this repository33 other files it gives its agents.
- ai-assistant-trafficSkill
- anomaly-checkSkill
- bing-crawl-healthSkill
- bing-performanceSkill
- branded-splitSkill
- cannibalizationSkill
- client-reportSkill
- content-decaySkill
- content-groupsSkill
- core-web-vitalsSkill
- country-deviceSkill
- ctr-optimizationSkill
- experiment-resultsSkill
- indexing-healthSkill
- indexing-trackerSkill
- indexnow-submitSkill
- long-tail-analysisSkill
- merchant-center-healthSkill
- onpage-auditSkill
- page-deep-diveSkill
- portfolio-overviewSkill
- property-setupSkill
- query-deep-diveSkill
- quick-winsSkill
- ranking-changesSkill
- shopping-performanceSkill
- site-auditSkill
- sitemap-auditSkill
- site-migrationSkill
- traffic-dropSkill
- traffic-forecastSkill
- weekly-reportSkill
- yandex-performanceSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 42
Do not fabricate rows the tools did not return.
- Distinctive: line 43
Keep Search Console questions (clicks, queries, rankings) out of this skill: refer the agent to the site-audit skill for the search side.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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
- Resolve the property. If the user's request or the conversation names a property, use it. Site URLs use GSC formats:
sc-domain:example.comorhttps://www.example.com/. Otherwise calllist_sitesand 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 omittingstartDateandendDateis 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. - Confirm the GA4 link. Call
list_ga4_properties(no arguments). Readconnected:falsemeans the Google Analytics consent has not been granted in the GSC Wizard app for this account (accountnames it), andconnected: falsewithreauthRequired: truemeans 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 whoselinkedSiteUrlscontains 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.linkedSiteUrlsonly covers the GSC Wizard account this connection is authenticated as, so a link made from another account of the user shows as empty here. Readerrorsfor Google accounts whose properties are missing from the list and relay eachmessage. - Traffic overview. Call
get_ga4_overviewwithsiteUrl; it always compares against the same-length period immediately before unless bothcomparisonStartDateandcomparisonEndDateare passed. ReadsummaryandprevSummary: 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. WhencomparisonHasDatais false,prevSummaryis null because the data stream did not exist yet; report the current period alone instead of a change. SetincludeTimeseries: trueonly when the user wants the daily shape (timeseries, oldest day first). If the response carriessiteScope, the GA4 property is shared by several sites and every number is limited to this site's hostnames; say that once. - Channel mix and the organic share. Call
query_ga4_reportwithdimension: "channel",comparisonStartDateandcomparisonEndDateset to the previous period (this tool only compares when both are given; without them theprev*fields are 0 andhasComparisonis false) andlimit: 25. Rows carry the metric names listed inmetrics(sessions, activeUsers, engagementRate and keyEvents for this dimension), sorted by sessions. Derive the organic share as the "Organic Search" row's sessions divided bysummary.sessionsfrom 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 withdimension: "date"andfilters: { channel: ["Organic Search"] }; date breakdowns take no comparison range. Rows stop atlimit(truncatedandnotesay when more exist), so never sum rows to reach a total;get_ga4_overviewowns the totals. - One more breakdown when the question asks for it.
query_ga4_reporttakes one dimension per call andsecondaryDimension(dateorhostName, different fromdimension) splits each row further, for exampledimension: "event"withsecondaryDimension: "date"shows on which days an event fired.filtersnarrow bychannel,sourceMedium,pagePath,landingPage,country,device,eventorhostName; to follow one event passfilters: { event: ["<eventName>"] }. Keeplimitat 25 unless the user wants more (max 1000). Pick the dimension from the question:
| Question | dimension |
| which pages bring visitors in | landingPage |
| which pages are viewed most | page |
| which referrers or campaigns send traffic | sourceMedium |
| where the audience is, on what | country, device |
| which events fire, and when | event, with secondaryDimension: "date" |
| which host or stream the traffic hits | hostName |
- Conversions. Call
get_ga4_key_eventswithsiteUrland, when the user named one,keyEvent; omit it to let the tool pick the most active key event of the period. The response lists every available name inkeyEventNameswith their activity inkeyEvents, so offer the others when the chosen one is not what the user meant. Readsummary(keyEventCount,sessionKeyEventRateanduserKeyEventRateas 0-1 fractions) and the breakdown tableschannels,sources,landingPages,pages,countriesanddevices, each sorted by keyEventCount.isKeyEvent: falsemeans the event exists but is not marked as a key event in GA4, so the numbers are plain event counts;metricMode: "event_filter"means the name has characters beyond letters, digits and underscores and sessions and users count the sessions in which it fired; whenrawEventCountis abovekeyEventCount, thenoteexplains that GA4 does not count occurrences from before the event was marked as a key event. Pass both comparison dates for a period-over-period view. - Error pages. Call
get_ga4_error_pageswithsiteUrl. GA4 has no native 404 signal, so the tool matches the page title against the patterns saved for the site in the app's Error Pages report;noPatterns: truemeans none are saved and none were passed, in which case retry once withtitleFilters: [{ operator: "contains", value: "404" }, { operator: "contains", value: "not found" }](operatorscontains,equals,starts_with,ends_with,regex; case-insensitive, OR-ed, nothing is saved) and tell the user to save patterns in the app for next time. Report theerrorPagesrows (title and URL with sessions, page views, active users and bounce rate as a 0-1 fraction) andtotals, which counts each session and user once across all matching pages and is therefore smaller than the row sum. An error page with real sessions is a redirect or restore candidate. - Custom dimensions (only when relevant). When the user asks about their own event parameters or user properties, call
list_ga4_custom_dimensionsfirst and read each entry'sapiName(for examplecustomEvent:source_format) andqueryableflag; item-scoped definitions are listed withqueryable: false, and a parameter that is not registered in GA4 Admin cannot be reported on at all, so never guess a name. Then callquery_ga4_custom_dimensionswithdimensionset to thatapiName, optionallysecondaryDimension(another customapiName, or one ofeventName,pagePath,landingPage,sessionDefaultChannelGroup,sessionSourceMedium,country,deviceCategory) for one row per pair of values,filters: { event: ["<eventName>"] }to limit it to the event that carries the parameter, andvalueFilters(dimension,operatorfromcontains,equals,not_contains,not_equals,regex, andvalue) to drill into one value. Rows carrykey,secondary,eventCount,sessions,activeUsersandkeyEvents;customMetricsadds registered custom metrics as columns.
Interpretation rules
- GA4 rates (
engagementRate,bounceRate,sessionKeyEventRate,userKeyEventRate) are 0-1 fractions: show them as percentages after multiplying by 100 and say which tool they came from. GSCctrvalues elsewhere are already percentages on a 0-100 scale; never multiply them by 100.position: lower is better. - Present every multi-row result as a compact markdown table (top rows only, typically 5 to 10); keep prose for interpretation, not for restating numbers.
- Judge changes by the sessions and key events at stake, not by percentage alone: a channel that doubled from 20 sessions matters less than a 10% move on the organic channel.
- Do not fabricate rows the tools did not return; when a breakdown is empty, say so and move on.
- Keep Search Console questions (clicks, queries, rankings) out of this skill: refer the agent to the site-audit skill for the search side; for which landing pages make money,
get_blended_landing_pagesjoins the two sides per page and the page-deep-dive skill reads it.
Output
- Overview table: sessions, users, engagement rate, bounce rate and key events, current versus previous period with the change (
get_ga4_overview), plus one sentence on the GA4 property and its link (list_ga4_properties). - Channels: the channel table and the derived organic share, with the organic trend from the date breakdown when it was pulled (
query_ga4_report). - Conversions: the key event chosen, its totals and rates, and the top channels and landing pages behind it (
get_ga4_key_events). - Error pages: the table and
totals, or the note that no patterns are saved (get_ga4_error_pages). - Any extra breakdown or custom-dimension table the user asked for (
query_ga4_report,query_ga4_custom_dimensions). - End with a short prioritized list of 3 to 7 concrete recommendations (restore or redirect error pages that still get sessions, investigate the channel that fell, mark a frequently fired event as a key event, put landing pages with poor engagement on a refresh list), each naming the pages or events to act on.
Follow-up
After delivering the overview, offer generate_seo_report for the property, which runs the whole analysis suite in one call and includes the GA4 section when a property is linked, as a styled HTML report to hand over; run it only if the user asks, since the default format: "html" is a large result.
Error handling
If any tool call fails with an authentication or subscription error, tell the user to run /mcp to (re)authenticate, and that a GSC Wizard account with an active plan or trial plus a connected Google Search Console account is required. If the property is not found, re-run list_sites and offer the closest matches instead of guessing a URL format. If a single tool fails for another reason, report the gap in the relevant section and complete the rest of the workflow with the remaining data.
A GA4 tool that answers notConfigured: true is not an error: read reason, relay hint, and continue with whatever else works.
reason | Meaning | What to tell the user |
no_scope | Google Analytics is not connected in the GSC Wizard app for the account in account | connect Google Analytics in the app, then retry |
no_scope with reauthRequired: true | it is connected but Google rejects the saved connection | reconnect Google Analytics on the Account page of the app |
no_property | no GA4 property is linked to this site in the app under that account | link one on the site's Analytics page in the app |
A refusal carrying reason: "google_token_unavailable" is temporary: retry the call once. ga4_not_shared means the property was shared with this account without GA4 access and only the owner can enable it on the invite; google_reconnect_required and ga4_permission_denied need the user to reconnect Google Analytics with an account that can read the GA4 property, and owner_google_connection_unavailable needs the owner who shared the property to do the same.
Grounding
Every number you report must name the tool it came from and the date range it covers, for example "clicks 12,340 (get_site_summary, 2026-09-21 to 2026-09-27)". For a table, state the tool and date range once on the line above it. If you derive a figure yourself (a delta, a sum, a share), say so and name the tool outputs it was computed from. Never report a number no tool returned.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

