Web Analytics ohne Cookies – Plausible, Umami & DSGVO-konforme Alternativen (2025)

~16 Min. Lesezeit · Veröffentlicht am
Cookie-Banner nerven. Deine Besucher, dich und wahrscheinlich sogar deinen Hund. Die gute Nachricht: Du kannst professionelle Web-Analytics betreiben, ohne einen einzigen Cookie zu setzen. Keine Banner, keine Einwilligung, keine DSGVO-Sorgen – und trotzdem weißt du, was auf deiner Website passiert.
Das Problem mit Google Analytics & DSGVO
Seit dem EuGH-Urteil "Schrems II" (Juli 2020) ist Google Analytics in der EU rechtlich problematisch:
• Datentransfer in die USA (kein angemessenes Datenschutzniveau)
• Cookies erfordern explizite Einwilligung
• Bußgelder bis 20 Mio. € oder 4% des Jahresumsatzes
• Österreich, Frankreich, Italien: GA bereits als rechtswidrig eingestuft
• Deutsche Datenschutzbehörden prüfen verstärkt
Dazu kommt: 30-50% der Nutzer lehnen Tracking-Cookies ab, Ad-Blocker blockieren Google Analytics komplett. Du verlierst also massiv Daten.
Wie funktioniert Analytics ohne Cookies?
Cookie-freie Tools nutzen andere Methoden zur Besuchererkennung:
// So generieren cookie-freie Tools eine Session-ID (vereinfacht)
function generateSessionHash(request) {
const components = [
request.ip.substr(0, 16), // IP-Adresse (anonymisiert)
request.headers['user-agent'], // Browser
request.headers['accept-language'], // Sprache
new Date().toDateString(), // Datum (Daily Salt)
'your-site-salt' // Site-spezifischer Salt
];
// Hash generieren (nicht rückverfolgbar)
return crypto
.createHash('sha256')
.update(components.join('|'))
.digest('hex');
}
// Dieser Hash gilt nur für 24h, dann wird neu generiert
// → Kein permanentes Tracking, DSGVO-konform! Die Top 5 Cookie-freien Analytics-Tools
| Tool | Preis/Monat | Self-Host | Features | Beste für |
|---|---|---|---|---|
| Plausible | Ab 9€ (10k Views) | ✅ (Docker) | Einfach, schnell, Events | Einsteiger, SaaS |
| Umami | Kostenlos / 9$ Cloud | ✅ (Node.js) | Open Source, Realtime | Entwickler, Self-Host |
| Matomo | Ab 19€ / Kostenlos | ✅ (PHP) | Umfangreich, E-Commerce | Enterprises, Shops |
| Fathom | Ab 14$ (100k Views) | ❌ | EU-Hosting, Uptime | Agenturen, Premium |
| Simple Analytics | Ab 19€ | ❌ | Tweet-Viewer, Goals | Marketing Teams |
Plausible Analytics – Der Einsteiger-Freund
Plausible ist mein Favorit für die meisten Projekte: Simpel, schnell, günstig.
Quick Setup (SaaS-Version)
<!-- In den <head> deiner Seite -->
<script defer data-domain="deine-domain.de"
src="https://plausible.io/js/script.js"></script>
<!-- Mit Custom Events -->
<script defer data-domain="deine-domain.de"
src="https://plausible.io/js/script.tagged-events.js"></script> Custom Events tracken
// Einfache Events
document.addEventListener('DOMContentLoaded', function() {
// Download tracking
document.querySelectorAll('a[download]').forEach(link => {
link.addEventListener('click', () => {
plausible('Download', {
props: {
file: link.getAttribute('download')
}
});
});
});
// Newsletter Signup
document.getElementById('newsletter-form')?.addEventListener('submit', (e) => {
e.preventDefault();
// Form handling...
plausible('Newsletter', {
props: {
source: 'footer'
}
});
});
// 404 Tracking
if (document.title.includes('404')) {
plausible('404', {
props: {
path: window.location.pathname
}
});
}
}); Self-Hosting mit Docker
# docker-compose.yml für Plausible Self-Hosting
version: '3.3'
services:
plausible_db:
image: postgres:14-alpine
restart: always
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
plausible_events_db:
image: clickhouse/clickhouse-server:22.6-alpine
restart: always
volumes:
- event-data:/var/lib/clickhouse
- ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
- ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
ulimits:
nofile:
soft: 262144
hard: 262144
plausible:
image: plausible/analytics:latest
restart: always
command: sh -c "sleep 10 && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
- plausible_db
- plausible_events_db
ports:
- 8000:8000
environment:
- BASE_URL=https://analytics.deine-domain.de
- SECRET_KEY_BASE=your-64-char-secret-key-here
- DATABASE_URL=postgres://postgres:postgres@plausible_db:5432/plausible_db
- CLICKHOUSE_DATABASE_URL=http://plausible_events_db:8123/plausible_events_db
volumes:
db-data:
event-data: • Sehr kleines Script (~1 KB) im Vergleich zu GA
• Öffentliche Dashboards möglich
• API für Custom Dashboards
• WordPress Plugin verfügbar
• EU-Server (DSGVO++)
• Keine User Flows
• Kein A/B Testing
• Limitierte Segmentierung
• Kein E-Commerce Tracking
• Weniger Details als GA
Umami – Der Open-Source-Champion
Umami ist komplett kostenlos, Open Source und perfekt für Entwickler:
Installation mit Docker
# Quick Start mit Docker
docker run -d \
--name umami \
-p 3000:3000 \
-e DATABASE_URL=postgresql://username:password@host:port/database \
-e DATABASE_TYPE=postgresql \
-e HASH_SALT=your-random-salt \
ghcr.io/umami-software/umami:postgresql-latest Oder mit Node.js
# Repository klonen
git clone https://github.com/umami-software/umami.git
cd umami
# Dependencies installieren
npm install
# Database Setup (PostgreSQL oder MySQL)
npm run build-db
# Build
npm run build
# Start
npm start # Läuft auf Port 3000 Umami Integration
<!-- Tracking Script -->
<script async src="https://analytics.deine-domain.de/script.js"
data-website-id="your-website-id"></script>
<!-- Custom Events mit data-Attributen -->
<button data-umami-event="signup-button">
Newsletter abonnieren
</button>
<!-- Mit Event-Properties -->
<button data-umami-event="purchase"
data-umami-event-product="T-Shirt"
data-umami-event-price="29.99">
Kaufen
</button> Umami API nutzen
// Daten via API abrufen
async function getAnalyticsData() {
const token = 'your-api-token';
const websiteId = 'your-website-id';
// Stats der letzten 7 Tage
const response = await fetch(`https://analytics.deine-domain.de/api/websites/${websiteId}/stats`, {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
method: 'POST',
body: JSON.stringify({
startAt: Date.now() - 7 * 24 * 60 * 60 * 1000,
endAt: Date.now()
})
});
const data = await response.json();
console.log(data);
// { pageviews: 1234, visitors: 567, bounces: 123, ... }
}
// Custom Dashboard bauen
function displayStats(stats) {
document.getElementById('visitors').textContent = stats.visitors.toLocaleString();
document.getElementById('pageviews').textContent = stats.pageviews.toLocaleString();
document.getElementById('bounce-rate').textContent =
`${(stats.bounces / stats.visitors * 100).toFixed(1)}%`;
} Matomo – Die Enterprise-Lösung
Matomo (früher Piwik) ist der Platzhirsch für große Projekte:
Matomo ohne Cookies konfigurieren
// Cookie-freies Tracking aktivieren
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']); // Keine Cookies!
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.deine-domain.de/";
_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);
})(); E-Commerce Tracking mit Matomo
// Produkt-Views
_paq.push(['setEcommerceView',
'SKU123', // SKU
'Cooles T-Shirt', // Name
['Kleidung', 'Shirts'], // Kategorien
29.99 // Preis
]);
// Warenkorb tracken
_paq.push(['addEcommerceItem',
'SKU123', // SKU
'Cooles T-Shirt', // Name
['Kleidung'], // Kategorie
29.99, // Preis
2 // Anzahl
]);
// Bestellung tracken
_paq.push(['trackEcommerceOrder',
'ORDER-12345', // Order ID
59.98, // Gesamt
49.98, // Subtotal
5.00, // Versand
5.00, // Steuer
false // Rabatt
]); Migration von Google Analytics
Schritt 1: Parallel tracken (Übergangsphase)
<!-- Beide Scripts parallel laufen lassen -->
<!-- Google Analytics (noch) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_ID"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'GA_ID');
</script>
<!-- Plausible (neu) -->
<script defer data-domain="deine-domain.de"
src="https://plausible.io/js/script.js"></script> Schritt 2: Goals/Events mappen
// Alt: Google Analytics Events
gtag('event', 'purchase', {
'value': 29.99,
'currency': 'EUR',
'items': [{
'id': 'SKU123',
'name': 'T-Shirt',
'category': 'Apparel',
'quantity': 1,
'price': 29.99
}]
});
// Neu: Plausible Events (vereinfacht)
plausible('Purchase', {
props: {
value: '29.99',
product: 'T-Shirt'
}
});
// Oder Umami
umami.track('purchase', {
value: 29.99,
product: 'T-Shirt'
}); Schritt 3: Historische Daten exportieren
# GA4 Daten via API exportieren (Python)
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import RunReportRequest
import pandas as pd
def export_ga4_data():
client = BetaAnalyticsDataClient()
request = RunReportRequest(
property=f"properties/YOUR_PROPERTY_ID",
dimensions=[
{"name": "date"},
{"name": "pagePath"},
{"name": "country"}
],
metrics=[
{"name": "sessions"},
{"name": "totalUsers"},
{"name": "screenPageViews"}
],
date_ranges=[{
"start_date": "2024-01-01",
"end_date": "2024-12-31"
}]
)
response = client.run_report(request)
# In DataFrame konvertieren
data = []
for row in response.rows:
data.append({
'date': row.dimension_values[0].value,
'page': row.dimension_values[1].value,
'country': row.dimension_values[2].value,
'sessions': row.metric_values[0].value,
'users': row.metric_values[1].value,
'pageviews': row.metric_values[2].value
})
df = pd.DataFrame(data)
df.to_csv('ga4_export.csv', index=False)
return df Proxy-Setup für maximale Performance
Analytics-Scripts über eigene Domain ausliefern = weniger Blocking, bessere Performance:
Nginx Proxy Config
# /etc/nginx/sites-available/analytics-proxy
server {
listen 443 ssl http2;
server_name analytics.deine-domain.de;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# Plausible Proxy
location /js/ {
proxy_pass https://plausible.io/js/;
proxy_set_header Host plausible.io;
# Cache für 1 Tag
proxy_cache_valid 200 1d;
add_header Cache-Control "public, max-age=86400";
}
location /api/event {
proxy_pass https://plausible.io/api/event;
proxy_set_header Host plausible.io;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Wichtig: Original-IP weitergeben
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_http_version 1.1;
}
} Cloudflare Workers Proxy
// Plausible via Cloudflare Workers proxyen
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url)
// Script-Requests
if (url.pathname.startsWith('/js/')) {
const response = await fetch('https://plausible.io' + url.pathname)
// Mit Cache-Headers
const newResponse = new Response(response.body, response)
newResponse.headers.set('Cache-Control', 'public, max-age=86400')
return newResponse
}
// Event-Requests
if (url.pathname === '/api/event') {
const newRequest = new Request('https://plausible.io/api/event', {
method: request.method,
headers: request.headers,
body: request.body
})
return fetch(newRequest)
}
return new Response('Not found', { status: 404 })
} Custom Dashboards bauen
Alle Tools bieten APIs für eigene Dashboards:
<!-- Real-time Visitor Counter -->
<div id="visitor-counter" class="stats-widget">
<div class="stat">
<span class="number" id="current-visitors">-</span>
<span class="label">Live Besucher</span>
</div>
<div class="stat">
<span class="number" id="today-visitors">-</span>
<span class="label">Heute</span>
</div>
<div class="stat">
<span class="number" id="month-visitors">-</span>
<span class="label">Diesen Monat</span>
</div>
</div>
<script>
// Live-Updates via Plausible API
async function updateStats() {
const response = await fetch('https://plausible.io/api/v1/stats/aggregate', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
const data = await response.json();
document.getElementById('current-visitors').textContent =
data.results.visitors.value;
document.getElementById('today-visitors').textContent =
data.results.pageviews.value;
}
// Update alle 30 Sekunden
setInterval(updateStats, 30000);
updateStats();
</script> Rechtssicherheit: Das musst du beachten
Wenn kein Cookie gesetzt wird, brauchst du keine Einwilligung
Auch cookie-freie Tools müssen erwähnt werden
Alle Tools hier anonymisieren IPs automatisch
Session-Hashes verfallen täglich
Self-Host oder EU-Server wählen
Freiwillig, aber user-freundlich
Muster-Datenschutzerklärung
<!-- Beispiel für Plausible in der Datenschutzerklärung -->
<h3>Web-Analyse mit Plausible</h3>
<p>
Diese Website nutzt Plausible Analytics, einen datenschutzfreundlichen
Webanalysedienst ohne Cookies. Plausible erfasst anonymisierte Daten
über Websitebesuche ohne personenbezogene Informationen zu speichern.
Es werden keine Cookies gesetzt und keine persönlichen Daten gesammelt.
</p>
<p>
Folgende Daten werden erfasst:
• Referrer (woher Sie kommen)
• Aufgerufene Seiten
• Verwendeter Browser und Betriebssystem
• Verweildauer
• Land (ohne genauen Standort)
</p>
<p>
Die Daten werden auf Servern in der EU gespeichert.
Rechtsgrundlage: Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse).
</p> Performance-Vergleich: Script-Größen
| Tool | Script-Größe | Requests | Load Time | Impact auf Core Web Vitals |
|---|---|---|---|---|
| Plausible | < 1 KB | 2 | ~15ms | Minimal |
| Umami | 2 KB | 2 | ~20ms | Minimal |
| Fathom | < 1 KB | 2 | ~15ms | Minimal |
| Matomo (no cookies) | 22 KB | 3 | ~80ms | Gering |
| Google Analytics 4 | 45+ KB | 4+ | ~200ms | Spürbar |
Kosten-Nutzen-Analyse
• Plausible Cloud: 19€/Monat
• Umami Self-Host: ~5€ VPS-Kosten
• Matomo Cloud: 29€/Monat
• Fathom: 14$/Monat
• Google Analytics: "Kostenlos" (aber Daten-Preis)
Versteckte Kosten bei GA: Cookie-Banner-Tool (5-50€/Monat), DSGVO-Beratung, mögliche Bußgelder, verlorene Conversions durch Banner
Quick Decision Matrix
Plausible wählen wenn:
✓ Du schnell starten willst
✓ Einfachheit wichtiger als Features ist
✓ Du öffentliche Stats teilen willst
Umami wählen wenn:
✓ Du Self-Hosting bevorzugst
✓ Kosten minimieren willst
✓ Du technisch versiert bist
Matomo wählen wenn:
✓ Du E-Commerce trackst
✓ Viele Details brauchst
✓ Enterprise-Features wichtig sind
Fathom wählen wenn:
✓ Premium-Support wichtig ist
✓ Du Uptime-Monitoring brauchst
✓ Budget kein Problem ist
Setup in 5 Minuten: Der Quickstart
# Option 1: Plausible SaaS (am schnellsten)
# 1. Account auf plausible.io erstellen
# 2. Domain hinzufügen
# 3. Script-Tag kopieren und einfügen
# Fertig!
# Option 2: Umami mit Docker (self-hosted)
# 1. Docker Compose erstellen
cat > docker-compose.yml << EOF
version: '3'
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
HASH_SALT: $(openssl rand -base64 32)
depends_on:
- db
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- umami-db:/var/lib/postgresql/data
volumes:
umami-db:
EOF
# 2. Starten
docker-compose up -d
# 3. Browser öffnen: http://localhost:3000
# Default Login: admin / umami
# 4. Website hinzufügen, Script-Tag kopieren
# Fertig! Fazit: Privacy First ist die Zukunft
Cookie-freie Analytics sind nicht nur DSGVO-konform, sie sind auch nutzerfreundlicher und oft genauer als Google Analytics:
„Privacy ist kein Feature, es ist ein Grundrecht. Respektiere deine Nutzer, und sie respektieren dich."
– Marko Saric, Plausible Co-Founder
1. Wähle ein Tool (Empfehlung: Plausible für SaaS, Umami für Self-Host)
2. Installiere es parallel zu GA
3. Vergleiche 30 Tage lang die Daten
4. Schalte GA ab und entferne Cookie-Banner
5. Genieße bessere Performance und zufriedene Nutzer!
Mehr zu Performance-Optimierung findest du in Core Web Vitals verbessern.
Für rechtssichere Websites lies Website Relaunch – SEO-Planung.
Self-Hosting mit Docker erkläre ich in Docker für Webentwickler.