Website Analytics Skill
Pull website performance from Google Analytics (GA4) and Google Search Console. Use for traffic reports, top pages, conversion analysis, organic queries, and indexing issues.
Website Analytics
Read GA4 reports and Search Console performance via bridge google. The bridge automatically resolves credentials from the claw owner's Google connection.
Scope error handling
Call the bridge command for the user's actual request directly — do not pre-flight a verifier call first. JIT will surface the right signal if a permission is missing; adding a verifier just triggers an unrelated extra consent prompt the user shouldn't have to grant.
MUST: when any bridge google command returns a JSON object with a "reason" field (no_connection, scope_required, team_claw_unsupported, expired) instead of API data, paste the entire JSON line verbatim in your reply on its own line. Paraphrasing, summarising, or omitting any field means the inline Connect button does not render and the user is stuck with no way to grant the permission. After the JSON line add one short sentence telling the user what's missing. Never offer browser walkthroughs, settings-page navigation, "open it in your browser" links, or other manual workarounds — the inline button is the only supported path.
Google Analytics 4
List GA4 properties the user has access to
bridge google --skill website-analytics analyticsadmin accountSummaries list --params '{}'
Run a basic traffic report (sessions / users by date)
bridge google --skill website-analytics analyticsdata properties runReport --params '{"property":"properties/PROPERTY_ID"}' --json '{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "date"}],
"metrics": [{"name": "sessions"}, {"name": "activeUsers"}]
}'
Top pages by views
bridge google --skill website-analytics analyticsdata properties runReport --params '{"property":"properties/PROPERTY_ID"}' --json '{
"dateRanges": [{"startDate": "7daysAgo", "endDate": "today"}],
"dimensions": [{"name": "pagePath"}],
"metrics": [{"name": "screenPageViews"}],
"orderBys": [{"metric": {"metricName": "screenPageViews"}, "desc": true}],
"limit": 20
}'
Traffic by source / medium
bridge google --skill website-analytics analyticsdata properties runReport --params '{"property":"properties/PROPERTY_ID"}' --json '{
"dateRanges": [{"startDate": "30daysAgo", "endDate": "today"}],
"dimensions": [{"name": "sessionSource"}, {"name": "sessionMedium"}],
"metrics": [{"name": "sessions"}, {"name": "engagedSessions"}, {"name": "conversions"}]
}'
Google Search Console
List verified sites
bridge google --skill website-analytics webmasters sites list --params '{}'
Top queries (last 28 days)
bridge google --skill website-analytics webmasters searchanalytics query --params '{"siteUrl":"https://example.com/"}' --json '{
"startDate": "2026-03-26",
"endDate": "2026-04-23",
"dimensions": ["query"],
"rowLimit": 25
}'
Top landing pages from organic search
bridge google --skill website-analytics webmasters searchanalytics query --params '{"siteUrl":"https://example.com/"}' --json '{
"startDate": "2026-03-26",
"endDate": "2026-04-23",
"dimensions": ["page"],
"rowLimit": 25
}'
Inspect a specific URL's index status
bridge google --skill website-analytics searchconsole urlInspection index inspect --params '{}' --json '{
"inspectionUrl": "https://example.com/some-page",
"siteUrl": "https://example.com/"
}'
Safety
- Always include a
dateRanges/startDate+endDate— open-ended queries can be huge - Cap with
limit/rowLimit(10–25 is usually plenty for chat) - When the user asks "why is traffic down?", run a comparison report (current vs previous period) — don't speculate
- Format numbers cleanly; don't dump raw JSON unless the user asked for it