Unique Visitors
{{ stats.unique_visitors }}
{{ period_label }}
{% if deltas and deltas.unique_visitors is not none %}
{% set d = deltas.unique_visitors %}
{% if d > 0 %}▲{% elif d < 0 %}▼{% endif %} {{ d|abs }}%
{% endif %}
{% if compare_stats %}
Vergleich: {{ compare_stats.unique_visitors }} ({{ compare_label }})
{% endif %}
Sessions
{{ stats.sessions }}
{{ period_label }}
{% if deltas and deltas.sessions is not none %}
{% set d = deltas.sessions %}
{% if d > 0 %}▲{% elif d < 0 %}▼{% endif %} {{ d|abs }}%
{% endif %}
{% if compare_stats %}
Vergleich: {{ compare_stats.sessions }} ({{ compare_label }})
{% endif %}
Bounce Rate
{{ "%.1f"|format(stats.bounce_rate) }}%
{% if stats.bounce_rate < 50 %}Gut{% else %}Hoch{% endif %}
{% if deltas and deltas.bounce_rate is not none %}
{% set d = deltas.bounce_rate %}
{% if d > 0 %}▲{% elif d < 0 %}▼{% endif %} {{ d|abs }}%
{% endif %}
{% if compare_stats %}
Vergleich: {{ "%.1f"|format(compare_stats.bounce_rate) }}% ({{ compare_label }})
{% endif %}
Verweildauer
{{ avg_duration_fmt }}
min:sek
{% if deltas and deltas.avg_duration is not none %}
{% set d = deltas.avg_duration %}
{% if d > 0 %}▲{% elif d < 0 %}▼{% endif %} {{ d|abs }}%
{% endif %}
{% if compare_stats %}
{% set cs = compare_stats.avg_duration %}
Vergleich: {{ cs // 60 }}:{{ "%02d"|format(cs % 60) }} ({{ compare_label }})
{% endif %}
Besucher-Verlauf
{% if compare_stats %}
{{ period_label }}
{{ compare_label }}
{% endif %}
Traffic-Quellen
Top Seiten
{{ top_pages|length }} Seiten
{% if top_pages %}
| Seite | Aufrufe | Bounce |
|---|---|---|
| {{ p.path }} | {{ p.views }} | {{ "%.0f"|format(p.bounce_rate) }}% |
Noch keine Daten. Script einbinden und warten.
Geraete
📈 Perioden-Vergleich
{{ period_label }} vs. {{ compare_label }}
| Metrik | {{ period_label }} | {{ compare_label }} | Differenz |
|---|---|---|---|
| Unique Visitors | {{ stats.unique_visitors }} | {{ compare_stats.unique_visitors }} | {% set diff = stats.unique_visitors - compare_stats.unique_visitors %} {% if diff >= 0 %}+{% endif %}{{ diff }} |
| Sessions | {{ stats.sessions }} | {{ compare_stats.sessions }} | {% set diff = stats.sessions - compare_stats.sessions %} {% if diff >= 0 %}+{% endif %}{{ diff }} |
| Bounce Rate | {{ "%.1f"|format(stats.bounce_rate) }}% | {{ "%.1f"|format(compare_stats.bounce_rate) }}% | {% set diff = stats.bounce_rate - compare_stats.bounce_rate %} {% if diff >= 0 %}+{% endif %}{{ "%.1f"|format(diff) }}% |
| Verweildauer | {{ avg_duration_fmt }} | {% set cs = compare_stats.avg_duration %}{{ cs // 60 }}:{{ "%02d"|format(cs % 60) }} | {% set diff = stats.avg_duration - compare_stats.avg_duration %} {% if diff >= 0 %}+{% endif %}{{ diff }}s |
Alle Seiten — {{ period_label }}
{{ top_pages|length }}
{% if top_pages %}
| Pfad | Aufrufe | Bounce Rate | Anteil |
|---|---|---|---|
| {{ p.path }} | {{ p.views }} | {{ "%.0f"|format(p.bounce_rate) }}% |
{% if total_views.v > 0 %}
{% set pct = (p.views / total_views.v * 100)|round(1) %}
{{ pct }}%
{% endif %}
|
Keine Seiten-Daten im gewählten Zeitraum.
Traffic-Quellen — {{ period_label }}
| Quelle | Sessions | {% if compare_stats %}Vergleich | Δ | {% endif %}Anteil |
|---|---|---|---|---|
| {{ src_names.get(k, k) }} | {{ v }} | {% if compare_stats %} {% set cv = compare_stats.traffic_sources.get(k, 0) %}{{ cv }} | {% set diff = v - cv %} {% if diff != 0 %} {% if diff > 0 %}+{% endif %}{{ diff }} {% else %}—{% endif %} | {% endif %}
{% if total_src.v > 0 %}
{% set pct = (v / total_src.v * 100)|round(1) %}
{{ pct }}%
{% else %}—{% endif %}
|
Verteilung
{% if companies %}
{% else %}
{% endif %}
🏢 Identifizierte Unternehmen — {{ period_label }}
{{ companies|length }} Firmen
| Unternehmen | Domain | Besuche | Ansprechpartner | |
|---|---|---|---|---|
| {{ c.company_name }} | {% if c.domain %}{{ c.domain }}{% else %}—{% endif %} | {{ c.visits }} |
{% if c.contacts %}
{% for contact in c.contacts[:3] %}
{{ contact.first_name }} {{ contact.last_name }}
{{ contact.title }}
{% if contact.email %}✉{% endif %}
{% endfor %}
{% if c.contacts|length > 3 %}+{{ c.contacts|length - 3 }} weitere {% endif %}
{% else %}
Noch nicht gesucht
{% endif %}
|
{% if c.contacts %} {% endif %} |
🏢
Noch keine Unternehmen identifiziert
Unternehmens-Netzwerke werden automatisch erkannt wenn sie die Website besuchen.
Conversion-Ziele — {{ period_label }}
Lade Ziele...
Conversions im Zeitraum
Lade Conversion-Daten...
📋 Tracking-Script einbinden ({{ current_domain.name }})
In den <head> oder vor </body> einfuegen:
<!-- netgrade Analytics -->
<script src="https://analytics.netgrade.de/ng.js?id={{ tracking_id }}" async></script>
📊 Custom Events
// Conversion tracken
window.nga.track('lead_form_submit', { form: 'kontakt' });
// Kauf-Event
window.nga.track('purchase', { value: 199.00, currency: 'EUR' });
// SPA Pageview
window.nga.pageview();
🔑 REST API
# Stats (Zeitraum via date_from/date_to)
curl -u netgrade:analytics2026! \
"https://analytics.netgrade.de/api/v1/stats?domain_id={{ domain_id }}&date_from=2026-04-01&date_to=2026-04-10"
# Companies
curl -u netgrade:analytics2026! \
"https://analytics.netgrade.de/api/v1/companies?domain_id={{ domain_id }}&days=30"
🔒 Consent-Banner (DSGVO) — in Website einbinden
Diesen HTML-Snippet direkt vor </body> einfügen (nach dem Analytics-Script):
<div id="nga-consent-banner" style="position:fixed;bottom:0;left:0;right:0;background:#1e293b;color:#e2e8f0;padding:16px;display:flex;align-items:center;justify-content:space-between;z-index:99999;font-family:sans-serif;font-size:14px;">
<span>Wir nutzen Analytics zur Website-Optimierung. Session Recordings erfordern dein Einverstaendnis. Heatmaps (anonymisiert) sind immer aktiv.</span>
<div style="display:flex;gap:8px;margin-left:16px;white-space:nowrap">
<button onclick="window.nga.setConsent('full');document.getElementById('nga-consent-banner').remove()" style="background:#3b82f6;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer">Alles erlauben</button>
<button onclick="window.nga.setConsent('basic');document.getElementById('nga-consent-banner').remove()" style="background:#334155;color:#e2e8f0;border:none;padding:8px 16px;border-radius:6px;cursor:pointer">Nur Basis</button>
<button onclick="window.nga.setConsent('none');document.getElementById('nga-consent-banner').remove()" style="background:#334155;color:#94a3b8;border:none;padding:8px 16px;border-radius:6px;cursor:pointer">Ablehnen</button>
</div>
</div>
<script>if(document.cookie.indexOf('nga_consent=')!==-1)document.getElementById('nga-consent-banner').remove();</script>
🔒 DSGVO-Hinweis: Heatmaps laufen immer (anonymisiert, keine Session-ID). Session Recordings erfordern Consent-Level
full. Alle Eingabefelder (Input, Textarea, Select) werden in Recordings automatisch maskiert. Consent-Banner nur nötig wenn du Session Recordings nutzen willst.
🎬 Session Recordings
🔒 Alle Eingaben DSGVO-konform maskiert
🔁 Lade Recordings...
🔥 Heatmap-Visualisierung
🔥
Keine Heatmap-Daten
Heatmap-Daten werden automatisch (anonymisiert) gesammelt — kein Consent erforderlich.