<%- include('partials/head') %> <%- include('partials/header') %>

Statistik

Auswertung all deiner Bewerbungen — Verlauf, Erfolgsquote und Verteilungen.

<%= total %> Bewerbungen
<% if (total === 0) { %>

Noch keine Bewerbungen erfasst

Sobald du Bewerbungen anlegst, erscheint hier deine komplette Auswertung.

<% } else { %>
<%= total %>
Bewerbungen gesamt
<%= kpis.gesendet %>
Versendet
<%= kpis.eingestellt %>
Einstellungen
<%= kpis.erfolgsquote %>% Erfolgsquote
<%= kpis.gespraech %>
Vorstellungsgespräche
<%= kpis.absagen %>
Absagen
<%= kpis.antwortquote %>% Antwortquote
<%= kpis.avgProMonat %>
Ø pro Monat
über <%= kpis.monateAktiv %> Monate

Bewerbungen pro Monat

Wie viele Bewerbungen in jedem Monat erstellt wurden.

<% const maxM = Math.max(1, ...byMonth.map(m => m.count)); const VB = 1000, BH = 320; // viewBox dimensions const padL = 28, padR = 10, padB = 26, padT = 10; const innerW = VB - padL - padR; const innerH = BH - padT - padB; const slot = byMonth.length ? innerW / byMonth.length : innerW; const bw = Math.min(slot * .62, 40); const monthName = (ym) => { const [, mo] = ym.split('-'); return ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'][Number(mo)-1] || ''; }; const yearOf = (ym) => ym.split('-')[0]; let prevYear = ''; %>
<% for (let gy = 1; gy <= 4; gy++) { const y = padT + innerH * (1 - gy/4); const val = Math.round(maxM * gy/4); %> <%= val %> <% } %> <% byMonth.forEach((m, i) => { const h = (m.count / maxM) * innerH; const x = padL + slot * i + (slot - bw)/2; const y = padT + innerH - h; const yr = yearOf(m.ym); const showYear = yr !== prevYear; prevYear = yr; %> <%= monthName(m.ym) %> <% if (showYear) { %><%= yr %><% } %> <%= m.ym %>: <%= m.count %> Bewerbung<%= m.count===1?'':'en' %> <% }); %>

Verteilung nach Status

Aktueller Status jeder Bewerbung.

<% if (byStatus.length) { const maxS = Math.max(...byStatus.map(s => s.count)); const statusColor = (s) => ({ 'Entwurf':'#94a3b8','Gesendet':'#3b82f6','Eingangsbestätigung':'#0ea5e9','In Bearbeitung':'#6366f1', 'Interessiert':'#8b5cf6','Warten auf Rückmeldung':'#a3a3a3','Warten auf meine Antwort':'#a3a3a3', 'Vorstellungsgespräch':'#10b981','Vertragsverhandlung':'#84cc16','Absage':'#f43f5e','Absage von meiner Seite':'#f97316', 'Einstellung':'#059669','Keine Rückmeldung':'#cbd5e1' }[s] || '#2563eb'); %> <% byStatus.forEach(s => { const pct = Math.round((s.count / maxS) * 100); %>
<%= s.status %>
<%= s.count %>
<% }); %> <% } else { %>
Keine Daten
<% } %>

Verteilung nach Bewerbungsart

Über welchen Kanal die Bewerbung lief.

<% if (byArt.length) { const maxA = Math.max(...byArt.map(a => a.count)); const artColor = ['#2563eb','#0ea5e9','#10b981','#8b5cf6','#f59e0b','#f43f5e','#6366f1','#ec4899','#14b8a6']; %> <% byArt.forEach((a, i) => { const pct = Math.round((a.count / maxA) * 100); %>
<%= a.art %>
<%= a.count %>
<% }); %> <% } else { %>
Keine Daten
<% } %>

Bewerbungs-Funnel

Wie viele Bewerbungen jede Stufe je erreicht haben.

<% const topF = Math.max(1, funnel[0].count); const fColor = ['#2563eb','#3b82f6','#0ea5e9','#10b981','#059669']; funnel.forEach((f, i) => { const pct = Math.round((f.count / topF) * 100); const conv = i === 0 ? '' : ' · ' + Math.round((f.count / Math.max(1, funnel[0].count) * 100)) + '%'; %>
<%= f.label %> <%= f.count %><%= conv %>
<%= f.count %>
<% }); %>

Top Standorte

Wo du dich am häufigsten bewirbst.

<% if (byOrt.length) { const maxO = Math.max(...byOrt.map(o => o.count)); const ortColor = ['#6366f1','#0ea5e9','#10b981','#f59e0b','#f43f5e','#8b5cf6','#14b8a6','#ec4899','#3b82f6','#a3a3a3']; %> <% byOrt.forEach((o, i) => { const pct = Math.round((o.count / maxO) * 100); %>
<%= o.ort %>
<%= o.count %>
<% }); %> <% } else { %>
Keine Standorte erfasst
<% } %>

Letzte Aktivität

Die jüngsten Statusänderungen deiner Bewerbungen. Alle

<% if (aktivitaet.length) { const statusColor = (s) => ({ 'Entwurf':'#94a3b8','Gesendet':'#3b82f6','Eingangsbestätigung':'#0ea5e9','In Bearbeitung':'#6366f1', 'Interessiert':'#8b5cf6','Warten auf Rückmeldung':'#a3a3a3','Warten auf meine Antwort':'#a3a3a3', 'Vorstellungsgespräch':'#10b981','Vertragsverhandlung':'#84cc16','Absage':'#f43f5e','Absage von meiner Seite':'#f97316', 'Einstellung':'#059669','Keine Rückmeldung':'#cbd5e1' }[s] || '#2563eb'); %>
<% aktivitaet.forEach(a => { %>
<% if (a.bewerbung_id) { %> <%= a.firma || '(ohne Firma)' %> · <%= a.stelle || '' %> <% } else { %> Gelöschte Bewerbung <% } %>
<%= a.status %> · <%= a.datum %> <% if (a.kommentar) { %>· <%= a.kommentar %><% } %>
<% }); %>
<% } else { %>
Noch keine Statusänderungen protokolliert.
<% } %>
<% } %>