Datenschutz

Matomo mit CookieConsent: das Consent-Banner von Orest Bida anbinden

CookieConsent von Orest Bida ist ein freies Consent-Banner, das Sie selbst hosten, ohne Dienst eines Dritten. Hier steht, wie Sie es mit Matomo verbinden, so dass Matomo immer cookielos misst und Cookies erst nach Zustimmung setzt, wie das mit dem Matomo Tag Manager aussieht und wie das Banner auch Skripte von Google oder Meta steuert.

Ein Consent-Banner muss nicht von einem Anbieter in der Cloud kommen. CookieConsent von Orest Bida ist eine kleine JavaScript-Bibliothek unter MIT-Lizenz, die Sie mit Ihrer Website ausliefern. Sie fragt nach Kategorien wie Statistik und Marketing, merkt sich die Entscheidung, gibt Skripte erst nach Zustimmung frei und löscht Cookies wieder, wenn jemand ablehnt. Matomo hängt sich über Callbacks daran.

Das Prinzip: cookielos messen, Cookies nach Zustimmung

Matomo misst jeden Besuch ohne Cookies und ohne Erkennung von Browser-Funktionen. Stimmt jemand der Kategorie Statistik zu, setzt Matomo ab dann Cookies und erkennt den Besucher wieder. Lehnt er ab oder zieht seine Zustimmung zurück, löscht Matomo die Cookies. Die Grundzahlen bleiben so vollständig, und wer zustimmt, wird über mehrere Besuche hinweg erkannt. Was cookielos fehlt, steht unter Matomo ohne Cookies.

Ein Banner, drei Folgen: Vor der Entscheidung misst Matomo cookielos, Werbe-Skripte bleiben gesperrt. Nach Zustimmung setzt Matomo Cookies und Marketing-Tags laden, nach Ablehnung bleibt alles cookielos und gesperrt.

Einbinden, selbst gehostet

CookieConsent gibt es als npm-Paket vanilla-cookieconsent, im November 2026 in Version 3.3. Aus dem Ordner dist brauchen Sie zwei Dateien, cookieconsent.umd.js und cookieconsent.css, dazu eine Datei mit Ihren Texten. Alle drei legen Sie auf Ihren Server; die Beispiele in der Dokumentation laden sie von einem CDN, das braucht es nicht.

<link rel="stylesheet" href="/assets/cookieconsent/cookieconsent.css">
<script src="/assets/cookieconsent/cookieconsent.umd.js"></script>
<script>
  CookieConsent.run({
    categories: {
      necessary: { enabled: true, readOnly: true },
      analytics: {
        // Matomo-Cookies löschen, wenn Statistik abgelehnt wird
        autoClear: { cookies: [{ name: /^_pk_/ }, { name: 'mtm_cookie_consent' }] }
      },
      marketing: {}
    },
    language: {
      default: 'de',
      translations: { de: '/assets/cookieconsent/de.json' }
    },
    onConsent: syncConsent,   // bei der ersten Entscheidung und auf jeder Seite danach
    onChange: syncConsent     // wenn jemand seine Auswahl ändert
  });
</script>

Ein paar Standards von CookieConsent passen schon: Der Modus ist opt-in, Skripte laufen also erst nach Zustimmung. Die Schaltflächen für Annehmen und Ablehnen sind gleich gewichtet. Und die Entscheidung liegt 182 Tage im Cookie cc_cookie. Mit revision fragt das Banner neu, wenn Sie Dienste oder Kategorien ändern.

Matomo ohne Tag Manager

Der Tracking-Code bekommt eine Zeile dazu, requireCookieConsent. Damit misst Matomo von Anfang an, aber ohne Cookies:

<script>
  var _paq = window._paq = window._paq || [];
  _paq.push(['requireCookieConsent']);   // cookielos, bis die Zustimmung kommt
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u = 'https://matomo.example.com/';
    _paq.push(['setTrackerUrl', u + 'matomo.php']);
    _paq.push(['setSiteId', '1']);
    var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
    g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s);
  })();
</script>

Der Callback, den CookieConsent oben aufruft, übersetzt die Entscheidung in Matomo-Befehle. Definieren Sie ihn vor CookieConsent.run:

<script>
  function syncConsent() {
    window._paq = window._paq || [];
    if (CookieConsent.acceptedCategory('analytics')) {
      _paq.push(['rememberCookieConsentGiven']);   // Cookies ab jetzt erlaubt
    } else {
      _paq.push(['forgetCookieConsentGiven']);     // Cookies löschen, wieder cookielos
    }
  }
</script>

rememberCookieConsentGiven speichert die Zustimmung im Cookie mtm_cookie_consent, forgetCookieConsentGiven löscht es und die Matomo-Cookies. Die Befehle über _paq erreichen jeden Matomo-Tracker auf der Seite, auch den aus einem Container des Tag Managers.

Mit dem Matomo Tag Manager

Mit dem Tag Manager steuert der Callback nicht Matomo direkt, sondern schickt die Entscheidung in den Datenlayer. Was daraufhin passiert, legen Sie im Container fest, auch für Werbe-Tags:

<script>
  function syncConsent() {
    window._mtm = window._mtm || [];
    window._mtm.push({
      event: 'cc_consent',
      cc_analytics: CookieConsent.acceptedCategory('analytics') ? 'granted' : 'denied',
      cc_marketing: CookieConsent.acceptedCategory('marketing') ? 'granted' : 'denied'
    });
  }
</script>

Im Container brauchen Sie dafür:

Was Typ Einstellung
Matomo-Konfiguration Variable Einwilligung zu Cookies erfordern an
cc_analytics, cc_marketing Variable vom Typ Data-Layer Data-Layer-Variablenname cc_analytics bzw. cc_marketing
Zustimmung Statistik Trigger vom Typ Benutzerdefiniertes Ereignis Ereignis cc_consent, Bedingung cc_analytics ist gleich granted
Ablehnung Statistik Trigger vom Typ Benutzerdefiniertes Ereignis Ereignis cc_consent, Bedingung cc_analytics ist gleich denied
Zustimmung Marketing Trigger vom Typ Benutzerdefiniertes Ereignis Ereignis cc_consent, Bedingung cc_marketing ist gleich granted
Matomo Analytics Tag wie bisher auf Seitenansicht, misst bis zur Zustimmung cookielos
Matomo-Cookies erlauben Tag vom Typ Benutzerdefiniertes HTML _paq.push(['rememberCookieConsentGiven']), Trigger Zustimmung Statistik
Matomo-Cookies entfernen Tag vom Typ Benutzerdefiniertes HTML _paq.push(['forgetCookieConsentGiven']), Trigger Ablehnung Statistik
Werbe-Tags etwa Facebook-Pixel oder Google Tag Trigger Zustimmung Marketing statt Seitenansicht

In beiden Tags vom Typ Benutzerdefiniertes HTML steht vor dem Befehl window._paq = window._paq || [];, damit er auch greift, wenn Matomo noch lädt.

Weil CookieConsent onConsent auf jeder Seite aufruft, auf der eine Entscheidung vorliegt, kommt das Ereignis cc_consent auf jeder Seite, und die Werbe-Tags feuern dort, nur eben erst mit Zustimmung. Wie Variablen, Trigger und Versionen im Tag Manager funktionieren, steht unter Matomo Tag Manager. Nach jeder Änderung veröffentlichen Sie eine neue Version des Containers.

Skripte von Google, Meta und anderen steuern

Werbe-Skripte dürfen erst nach Zustimmung laden. Dafür gibt es drei Wege:

Über die Skript-Tags. CookieConsent gibt ein Skript erst frei, wenn die Kategorie angenommen ist, wenn Sie es mit type="text/plain" und data-category kennzeichnen. Mit data-service bekommt es im Banner einen eigenen Schalter:

<script type="text/plain" data-category="marketing" data-service="Meta Pixel">
  /* Code des Meta Pixel */
</script>
<script type="text/plain" data-category="marketing" data-service="Google Ads"
        data-src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXX"></script>

Über den Tag Manager. Wer Werbe-Tags im Matomo Tag Manager pflegt, hängt sie an den Trigger Zustimmung Marketing, wie in der Tabelle oben.

Über den Consent Mode von Google. Google-Tags kennen eigene Einwilligungssignale. Sie starten mit denied und werden im Callback auf granted gesetzt:

<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() { dataLayer.push(arguments); }
  gtag('consent', 'default', {
    ad_storage: 'denied', ad_user_data: 'denied',
    ad_personalization: 'denied', analytics_storage: 'denied'
  });
  // im Callback, wenn Marketing angenommen ist:
  // gtag('consent', 'update', { ad_storage: 'granted', ad_user_data: 'granted', ad_personalization: 'granted' });
</script>

Wie viele Pixel es überhaupt braucht, ist eine eigene Frage: Conversions lassen sich auch vom Server an die Werbeplattformen melden, beschrieben unter Conversions API.

Im Browser prüfen

Ein Banner ist nur so gut wie das, was der Browser tatsächlich tut. Öffnen Sie die Website in einem privaten Fenster mit den Entwicklerwerkzeugen:

  1. Vor der Entscheidung: Unter Speicher oder Anwendung gibt es keine Cookies, die mit _pk_ beginnen. Im Netzwerk gehen Anfragen an matomo.php, aber keine an Facebook, Google oder andere Werbenetzwerke.
  2. Nach Annehmen: Die Cookies _pk_id und _pk_ses und mtm_cookie_consent erscheinen, die Werbe-Skripte laden.
  3. Nach Ablehnen oder Widerruf: Die Matomo-Cookies sind weg, Matomo misst weiter cookielos, Werbe-Skripte laden nicht.

Ob Ihre Website schon vor der Entscheidung Daten an Dritte schickt, zeigt auch der kostenlose Website-Check.

So passt das Banner zu Matomo

  • Cookielos zuerst Matomo misst immer, Cookies erst nach Zustimmung.
  • Alles selbst gehostet Skript, Stile und Texte auf dem eigenen Server.
  • Ablehnen gleichwertig Gleich gewichtete Schaltflächen, nichts vorausgewählt.
  • Ein Callback für alles Matomo, Tag Manager und Werbe-Skripte hängen an derselben Entscheidung.

Typische Stolpersteine

  • Matomo blockiert statt cookielos Ohne Zustimmung fehlen dann alle Zahlen.
  • Pixel direkt im Template Sie laden, bevor jemand gefragt wurde.
  • Kein Abgleich bei Widerruf Die Cookies bleiben, obwohl jemand abgelehnt hat.
  • Nie im Browser nachgesehen Banner und Wirklichkeit weichen voneinander ab.

Quellen

Stand: 13. November 2026, CookieConsent 3.3, Matomo 5.14 und 6.0.0-rc1

FAQ

Häufige Fragen

Kostet CookieConsent etwas?

Nein. CookieConsent steht unter der MIT-Lizenz und ist kostenlos. Sie laden die Dateien aus dem npm-Paket vanilla-cookieconsent und legen sie auf Ihren eigenen Server.

Misst Matomo ohne Zustimmung gar nicht?

Das entscheiden Sie. Mit requireCookieConsent misst Matomo ohne Zustimmung cookielos und ohne Erkennung von Browser-Funktionen, nach der Zustimmung mit Cookies. Wer ohne Zustimmung gar nicht messen will, nimmt stattdessen requireConsent. Die rechtliche Bewertung bleibt bei Ihrer Datenschutzberatung.

Brauche ich den Matomo Tag Manager dafür?

Nein. Ohne Tag Manager ruft der Callback von CookieConsent die Matomo-Befehle direkt auf. Mit Tag Manager schickt er ein Ereignis in den Datenlayer, und Trigger im Container entscheiden, welche Tags feuern.

Wie fragt das Banner nach einer Änderung neu nach?

Über die Option revision. Erhöhen Sie die Zahl, gilt die bisherige Entscheidung nicht mehr, und das Banner erscheint wieder. Das ist sinnvoll, wenn neue Dienste oder Kategorien dazukommen.

Fragen zu Ihrem Setup?

Im Erstgespräch schauen wir gemeinsam auf Ihre Situation.

Erstgespräch buchen

Newsletter

Matomo-Wissen, einmal im Monat.

Praxistipps zu Tracking, Datenschutz-Einstellungen und Performance, dazu Hinweise auf wichtige Matomo-Updates. Kein Spam, Abmeldung jederzeit.