Matomo Reporting API extension. Self-hosted or Matomo Cloud analytics as a GA4 alternative or complement. Organic traffic, landing pages, device / country breakdowns, referrers, search keywords. Triggers on "Matomo", "self-hosted analytics", "analytics ohne Google", "GA4 alternative", "Matomo Reporting", "Piwik".
Self-hosted analytics surface. Use Matomo as a privacy-first GA4 alternative
when you own your analytics data, want zero Google dependency, or operate
behind a strict data-residency boundary. The same seo-matomo skill works
against Matomo Cloud and self-hosted instances.
extensions/matomo/install.sh or install.ps1.token_auth with view access on the sites you analyze.idSite to avoid passing --site-id on every call.| Command | Underlying script |
|---|---|
/seo matomo check | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_auth.py --check |
/seo matomo organic [site-id] | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py organic --site-id <id> |
/seo matomo top-pages | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py top-pages |
/seo matomo device | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py device |
/seo matomo country | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py country |
/seo matomo referrers | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py referrers |
/seo matomo keywords | "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_report.py keywords |
All commands accept --days (default 28), --limit, --site-id, and
--json. The site ID falls back to MATOMO_SITE_ID from settings.
seo-google; this
skill is the reporting substitute.seo-google.
seo-matomo covers reporting (visits / pages / referrers), not search
performance metrics.seo-geo. Matomo
offers no LLM-specific signals./seo audit, the orchestrator spawns the seo-matomo agent
(analogous to seo-google) whenever "${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_auth.py --check succeeds. Both agents can be active simultaneously when the
user has both GA4 and Matomo configured.Every Matomo request goes through claude-seo's SSRF guard: the instance URL
is validated and DNS-pinned, and a redirect off the instance is refused.
Private, loopback, and link-local addresses are refused by default. When the
user's instance lives on one (http://matomo.internal:8080,
http://192.168.1.20, http://localhost:8080), tell them to name it in the
CLAUDE_SEO_LOCAL_TARGETS allowlist:
export CLAUDE_SEO_LOCAL_TARGETS="matomo.internal:8080"Entries are host or host:port, comma-separated, matched exactly. The
allowlist covers only the top-level instance URL; redirect targets and every
other host stay fail-closed, and cloud metadata addresses are refused even
when listed. Never suggest disabling the guard or editing url_safety.py:
the allowlist is the supported route. Details in
extensions/matomo/docs/MATOMO-SETUP.md and SECURITY.md.
CLAUDE_SEO_LOCAL_TARGETS): the
instance is on a private address that has not been allowlisted. Give the
user the exact export line from the error, which already carries the right
host:port.MATOMO_URL is pointing at a redirector rather than at the Reporting API.
Ask the user for the URL their instance actually serves the API from.extensions/matomo/install.sh or
"${CLAUDE_PLUGIN_ROOT}/scripts/claude-seo" run matomo_auth.py --setup.result=error payloads from Matomo (e.g. invalid idSite): surface
the message verbatim; do not guess.ConnectionError, SSLError, timeout) and confirm
MATOMO_URL resolves.anonymized_share_pct prominently.
Many keywords will be "(not provided)" due to browser privacy and
Matomo's anonymization rules; this is normal, not a data bug.4b99de2
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.