# KPI-Katalog Jede Kennzahl mit Definition, Berechnung und Fundstelle im Code. Alle Funktionen liegen in `features/dashboard/data/calculations.ts`. **Zwei Zeitbezüge sind zu unterscheiden:** - **zeitraumbezogen**: reagiert auf die Zeitraum-Umschaltung (Umsatz, neue Kunden) - **stichtagsbezogen**: gilt zum heutigen Tag, unabhängig vom Zeitraum (offene Forderungen, aktive Aufträge, Auslastung des Bestands) Das ist Absicht: „Offene Forderungen der letzten 7 Tage" wäre keine sinnvolle Zahl. In der Oberfläche steht der Zeitbezug in der **Fußzeile jeder KPI-Karte** („im gewählten Zeitraum" / „zum Stichtag" / „über alle Zeiträume"). Karten mit Vorperiodenvergleich zeigen dort stattdessen den Trend, die Anatomie bleibt gleich, damit die Reihe eine gemeinsame Grundlinie hat. Diagrammkarten, die den Zeitraumfilter ignorieren, sagen es im Untertitel. --- ## Übersicht | KPI | Definition | Bezug | Funktion | |---|---|---|---| | Umsatz (Zahlungseingang) | Summe bezahlter Ausgangsrechnungen, gezählt am Zahlungsdatum | Zeitraum | `umsatz()` | | Trend Umsatz | Vergleich mit dem gleich langen Zeitraum davor | Zeitraum | `umsatzVorperiode()` + `berechneTrend()` | | Offene Forderungen | Summe aller nicht bezahlten Ausgangsrechnungen | Stichtag | `offenePosten().gesamt` | | Aktive Aufträge | Vorgänge im Status „beauftragt" oder „in Arbeit" | Stichtag | `aktiveAuftraege()` | | Ø Auslastung Monteure | Mittel der produktiven Stunden je verfügbarer Stunde | Zeitraum | `teamKennzahlen()` | | Neue Kunden | Kundendatensätze mit Anlagedatum im Zeitraum | Zeitraum | `neueKunden()` | | Abschlussquote | Gewonnene Aufträge im Angebotsgeschäft, bezogen auf alle Angebote | Stichtag | `abschlussquote()` | | Deckungsbeitrag | Nach Auftragswert gewichtete Marge abgeschlossener Aufträge | Zeitraum | `marge()` | **Umsatzentwicklung** (`umsatzVerlauf()`) bildet zusätzlich den Vorjahreszeitraum ab: Jede Zahlung wird um zwölf Monate verschoben in denselben Zeitraster einsortiert. Die Auflösung wechselt automatisch, bis 30 Tage tageweise, darüber monatsweise. --- ## Finanzen | KPI | Definition | Bezug | Funktion | |---|---|---|---| | Umsatz (bezahlt) | wie oben | Zeitraum | `umsatz()` | | Offene Forderungen | Status „gestellt" oder „überfällig" | Stichtag | `offenePosten()` | | Überfällig | Nur Status „überfällig" (Zahlungsziel deutlich überschritten) | Stichtag | `offenePosten().ueberfaellig*` | | Ø Zahlungsdauer | Mittel aus Rechnungsdatum bis Zahlungseingang | Zeitraum | `zahlungsdauer()` | | Deckungsbeitrag | siehe oben | Zeitraum | `marge()` | | Forderungen nach Alter | Buckets ab Fälligkeit: 0–30 / 31–60 / 61–90 / > 90 Tage | Stichtag | `offenePosten().nachAlter` | | Rechnungsvolumen nach Status | Betragssumme je Rechnungsstatus | Stichtag | `rechnungenNachStatus()` | | Umsatz nach Gewerk | Bezahlte Rechnungen, zugeordnet über den Auftrag | Zeitraum | `umsatzNachGewerk()` | | Top-Kunden | Kunden nach bezahltem Gesamtumsatz | gesamt | `topKunden()` | Die Altersstruktur ist die wichtigste Karte der Seite: Ab etwa 60 Tagen sinkt die Einbringungsquote erfahrungsgemäß deutlich. Die Balken sind deshalb von grün nach rot eingefärbt. --- ## Aufträge | KPI | Definition | Bezug | Funktion | |---|---|---|---| | Neue Aufträge | Vorgänge mit Anlagedatum im Zeitraum | Zeitraum | `auftraegeImZeitraum()` | | Aktive Aufträge | „beauftragt" oder „in Arbeit" | Stichtag | `aktiveAuftraege()` | | Auftragsbestand | Summe der Werte aktiver Aufträge | Stichtag | abgeleitet | | Über Termin | Beauftragt oder in Arbeit und Fälligkeit überschritten | Stichtag | `ueberfaelligeAuftraege()` | | Abschlussquote | siehe Übersicht | Stichtag | `abschlussquote()` | | Ø Durchlaufzeit | Anlagedatum bis Abschluss, nur abgeschlossene Vorgänge | Stichtag | `durchlaufzeit()` | | Vertriebstrichter | Vorgänge je erreichter Stufe | Stichtag | `vertriebsTrichter()` | | Förderquote BAFA/KfW | Anteil **förderfähiger** Aufträge mit beantragter oder bewilligter Förderung | Stichtag | `foerderQuote()` | **Zum Trichter:** Er zeigt ausschließlich das **Angebotsgeschäft**: Vorhaben ab etwa 6.000 €, für die schriftlich angeboten wird (Feld `ueberAngebot`). Wartung, Notdienst und E-Check gehen ohne Angebot direkt in die Ausführung; zählte man sie mit, würde der Trichter unten breiter als oben. Verlorene Vorgänge zählen bis zu der Stufe, auf der sie abgesprungen sind (Feld `verlorenAb`). Ohne diese Unterscheidung wären die oberen Stufen systematisch zu klein und die Übergangsquoten wertlos. **Zur Abschlussquote:** gleiche Bezugsgröße wie der Trichter. Sie entspricht deshalb exakt der Übergangsquote von „Angebot" auf „Beauftragt": im Demo-Datensatz rund 38 %. **Zur Förderquote:** Bezugsgröße sind nur förderfähige Leistungen (Wärmepumpe, PV-Anlage, Batteriespeicher, Lüftungsanlage). Über alle Aufträge gerechnet läge sie im einstelligen Bereich und wäre wertlos, eine Badsanierung war nie förderfähig. --- ## Kunden | KPI | Definition | Bezug | Funktion | |---|---|---|---| | Kunden gesamt | Alle Kundendatensätze | Stichtag |: | | Neue Kunden | Anlagedatum im Zeitraum | Zeitraum | `neueKunden()` | | Wiederkehrende Kunden | Anteil mit mehr als einem Auftrag | Stichtag | `wiederkehrquote()` | | Ø Kundenwert | Bezahlter Umsatz je Kunde mit mindestens einem Auftrag | gesamt | abgeleitet | | Reaktivierbar | Kunden mit Historie, über 12 Monate ohne Auftrag | Stichtag | `inaktiveKunden()` | | Kunden nach Quelle / Typ / Region | Verteilungen | Stichtag | `kundenNach()` | | Auffällige Zahlungsmoral | Ø Zahlungsdauer über 30 Tage | Stichtag | `zahlungsauffaellig()` | Empfehlung und Bestandskunden zusammen zeigen, wie stark der Betrieb ohne Werbebudget wächst, im Handwerk die aussagekräftigste Quellenkennzahl. --- ## Team | KPI | Definition | Bezug | Funktion | |---|---|---|---| | Im Einsatz | Gewerblich Beschäftigte mit Status „aktiv" | Stichtag |: | | Ø Auslastung | Produktive Stunden / verfügbare Stunden (aus Wochenstunden hochgerechnet) | Zeitraum | `teamKennzahlen()` | | Produktivquote | Auftragsbezogene Stunden / erfasste Stunden | Zeitraum | abgeleitet | | Erfasste Stunden | Summe aller Zeiteinträge | Zeitraum | abgeleitet | | Abwesenheit | Stunden für Urlaub, Krankheit, Fortbildung | Zeitraum | abgeleitet | | Abgeschlossene Aufträge je Mitarbeiter | Anzahl im Zeitraum abgeschlossener Aufträge | Zeitraum | `teamKennzahlen()` | | Auftragswert je Mitarbeiter | Summe der Werte dieser Aufträge | Zeitraum | `teamKennzahlen()` | **Auslastungsschwellen** (in `AuslastungsBalken.tsx`, betrieblich festzulegen): | Bereich | Bedeutung | |---|---| | < 70 % | Luft frei: Kapazität ungenutzt | | 70–95 % | Zielkorridor | | > 95 % | Ausgebucht: Terminrisiko | Der Auftragswert je Mitarbeiter ist ausdrücklich **kein Leistungsvergleich**: Ein Wärmepumpen-Auftrag ist um ein Vielfaches größer als eine Wartung. Der Hinweis steht als Tooltip an der Karte. --- ## Bewusst nicht enthalten | Kennzahl | Grund | |---|---| | Live-Aktualisierung | Für die Gestaltungsabstimmung ohne Nutzen | | CSV-/Excel-Export | Reine Umsetzungsfrage, kein Gestaltungsthema | | Drilldown auf Einzeldatensätze | Der Absprung in die bestehenden Listen genügt | | E-Mail-Marketing-Kennzahlen | Eigenes Modul (siehe Planungsordner 04) | | Workflow-Kennzahlen | Eigenes Modul |