Profit First ❤️

Profit & Cashflow Toolkit

Profit & Cashflow Toolkit

Dieses Tool hilft dir, die Profit-First-Prinzipien im Alltag umzusetzen: klare Schritte, automatische Aufteilungen und ein sofortiger Reality‑Check. Keine Tabellenkalkulation nötig.

Kurz‑Glossar

Real Revenue
Umsatz minus direkte Materialien und Subunternehmer. Das ist der Betrag, den du wirklich verteilen kannst.
TAP (Target Allocation Percentages)
Ziel-Prozente zur Aufteilung deines Real Revenue auf Profit, Owner’s Compensation, Tax und OpEx – je nach Größenklasse.
Konten‑Setup
Fünf Konten: Income, Profit, Owner’s Comp, Tax, OpEx. Plus zwei separate Konten (Profit, Tax) bei einer zweiten Bank ohne schnellen Zugriff.
Rhythmus
Allokationen und Zahlungen zu festen Terminen (z. B. am 10. und 25. jedes Monats) statt spontan „nach Kassenlage“.

Quick‑Start Checkliste

Die wichtigsten Schritte zum Einstieg – mit Erklärungen.
Grundprinzip & Setup

Profit kommt vor allen anderen Ausgaben. Durch das Abzweigen eines kleinen Prozentsatzes zwingst du dein Unternehmen zu Effizienz.

Allokation & Verhalten

Ein kleiner OpEx‑Topf und getrennte Konten für Profit und Steuern führen automatisch zu besseren Entscheidungen. Ein fester Rhythmus ersetzt reaktives Handeln.

Reality‑Check (Instant Assessment)

Nutze die letzten zwölf Monate, um zu sehen, wo du zu viel oder zu wenig ausgibst. Die Deltas zeigen sofort Handlungsbedarf.

Tools

Verteile Einnahmen & analysiere deine Kennzahlen.

Allocation‑Simulator

Gib den Betrag ein, der seit dem letzten Allokationslauf eingegangen ist. Verteile ihn prozentual auf Profit, Owner’s Comp, Tax und OpEx. Du kannst Presets wählen oder eigene Prozente vergeben.

Tipp: Viele verwenden zwei Läufe pro Monat (z. B. am 10. und 25.).
Die Presets basieren auf Real Revenue, nicht auf Gesamtumsatz.
Hinweis: Die Summe der Prozente sollte 100 % ergeben. Übertrage Profit und Steuerreserven auf separate Konten (zweite Bank), um die Versuchung zu minimieren.
Konto%Betrag
Profit€ 0,00
Owner’s Comp€ 0,00
Tax€ 0,00
OpEx€ 0,00
Summe0 %€ 0,00
Falls Live‑Berechnung ausbleibt, klicke „Berechnen“.

Instant Assessment

Verwende die letzten zwölf Monate, um dein Real Revenue zu berechnen und mit Zielwerten (TAP) zu vergleichen. Gib deine tatsächlichen Werte ein – das Delta zeigt dir den Handlungsbedarf.

Erlöse aus deiner GuV der letzten zwölf Monate.
Nur direkte Kosten, keine internen Gehälter/Overhead.
Real Revenue€ 0,00
TAP‑Band (Zielverteilung)
KategorieTarget %Target €IST €DeltaHinweis
Profit€ 0,00
Owner’s Comp€ 0,00
Tax€ 0,00
OpEx€ 0,00
Falls Live‑Berechnung ausbleibt, klicke „Berechnen“.

Warum dieses System funktioniert

System statt Willenskraft. Die Struktur zwingt dich, Profit zuerst abzuzweigen. Ein kleinerer OpEx‑Topf führt automatisch zu sparsameren und erfinderischeren Lösungen.

Reihenfolge zählt. Was zuerst kommt, bekommt Aufmerksamkeit. Wenn Profit ganz oben steht, bleibt er nicht länger nur ein Rest am Jahresende.

Out of sight, out of mind. Rücklagen für Profit und Steuern auf getrennten Konten (ohne Onlinezugang) schützen vor spontanen Entnahmen.

Rhythmus statt Stress. Regelmäßige Allokationsläufe beruhigen den Cashflow und machen Schwankungen sichtbar – ohne tägliche Angst vor dem Kontostand.

Motivation: "Das hier ist unser Blutbild. Die Zahlen lügen nicht. Wenn sie rot sind, ist das kein Urteil – es ist ein Startschuss. Jetzt wissen wir, wo wir ansetzen müssen, damit Profit zur Gewohnheit wird."
Gespeichert
' : ''}\n `; container.appendChild(row); const cb = row.querySelector('input'); cb.checked = stored[item.id]?.done || false; cb.addEventListener('change', function(){ const state = JSON.parse(localStorage.getItem('pf_'+id) || '{}'); state[item.id] = state[item.id] || {}; state[item.id].done = cb.checked; localStorage.setItem('pf_'+id, JSON.stringify(state)); }); const noteBtn = row.querySelector('button'); noteBtn.addEventListener('click', function(){ const key = 'pf_note_'+item.id; const existing = localStorage.getItem(key) || ''; const val = prompt('Notiz speichern/ändern:', existing); if(val !== null){ localStorage.setItem(key, val); showToast('Notiz gespeichert'); } }); }); } renderChecklist('cl1', CL1); renderChecklist('cl2', CL2); renderChecklist('cl3', CL3); // Export & reset const exportBtn = document.getElementById('export_json'); if(exportBtn){ exportBtn.addEventListener('click', function(){ const dump = {}; Object.keys(localStorage).forEach(k => { if(k.startsWith('pf_')) dump[k] = localStorage.getItem(k); }); const blob = new Blob([JSON.stringify(dump,null,2)], {type:'application/json'}); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'profit-first-data.json'; a.click(); }); } const resetBtn = document.getElementById('reset_all'); if(resetBtn){ resetBtn.addEventListener('click', function(){ if(!confirm('Alle gespeicherten Daten (pf_*) löschen?')) return; Object.keys(localStorage).forEach(k => { if(k.startsWith('pf_')) localStorage.removeItem(k); }); location.reload(); }); } // Allocation Simulator const allocAmountInput = document.getElementById('alloc_amount'); const allocPresetSelect = document.getElementById('alloc_preset'); const pctProfitInput = document.getElementById('pct_profit'); const pctOwnerInput = document.getElementById('pct_owner'); const pctTaxInput = document.getElementById('pct_tax'); const pctOpexInput = document.getElementById('pct_opex'); const allocTableBody = document.getElementById('alloc_table_body'); const allocSumPctEl = document.getElementById('alloc_sum_pct'); const allocSumAmtEl = document.getElementById('alloc_sum_amt'); const allocCalculateBtn = document.getElementById('alloc_calculate'); // Preset map const presetMap = { 'start': {profit:1, owner:20, tax:15, opex:64}, 'lean': {profit:5, owner:30, tax:15, opex:50}, 'small': {profit:10, owner:35, tax:15, opex:40}, 'mid': {profit:10, owner:10, tax:15, opex:65} }; // Save & load allocation function loadAlloc(){ const raw = localStorage.getItem('pf_alloc'); if(raw){ try { const s = JSON.parse(raw); if(s.amount) allocAmountInput.value = s.amount; if(s.profit !== undefined) pctProfitInput.value = s.profit; if(s.owner !== undefined) pctOwnerInput.value = s.owner; if(s.tax !== undefined) pctTaxInput.value = s.tax; if(s.opex !== undefined) pctOpexInput.value = s.opex; } catch(err) {} } else { allocAmountInput.value = '25.000'; } updateAllocation(); } function saveAlloc(){ const data = { amount: allocAmountInput.value, profit: parseNumber(pctProfitInput.value), owner: parseNumber(pctOwnerInput.value), tax: parseNumber(pctTaxInput.value), opex: parseNumber(pctOpexInput.value) }; localStorage.setItem('pf_alloc', JSON.stringify(data)); } function updateAllocation(){ const amt = parseNumber(allocAmountInput.value); const pP = parseNumber(pctProfitInput.value); const pO = parseNumber(pctOwnerInput.value); const pT = parseNumber(pctTaxInput.value); const pX = parseNumber(pctOpexInput.value); const sumPct = pP + pO + pT + pX; if(allocSumPctEl) allocSumPctEl.textContent = formatPercent(sumPct); if(allocSumAmtEl) allocSumAmtEl.textContent = formatCurrency(amt); const rows = [ {label:'Profit', pct:pP, val: amt * pP / 100}, {label:'Owner’s Comp', pct:pO, val: amt * pO / 100}, {label:'Tax', pct:pT, val: amt * pT / 100}, {label:'OpEx', pct:pX, val: amt * pX / 100} ]; // update table rows const tbody = allocTableBody; if(tbody){ const trList = tbody.querySelectorAll('tr'); rows.forEach((r, i) => { const cells = trList[i].cells; cells[1].textContent = formatPercent(r.pct); cells[2].textContent = formatCurrency(r.val); }); } } // attach listeners [allocAmountInput, pctProfitInput, pctOwnerInput, pctTaxInput, pctOpexInput].forEach(el => { if(el){ el.addEventListener('input', () => { updateAllocation(); }); el.addEventListener('blur', () => { saveAlloc(); showToast('Gespeichert'); }); } }); if(allocPresetSelect){ allocPresetSelect.addEventListener('change', function(){ const v = this.value; if(v !== 'custom' && presetMap[v]){ const p = presetMap[v]; pctProfitInput.value = p.profit; pctOwnerInput.value = p.owner; pctTaxInput.value = p.tax; pctOpexInput.value = p.opex; } updateAllocation(); }); } if(allocCalculateBtn){ allocCalculateBtn.addEventListener('click', function(){ updateAllocation(); saveAlloc(); showToast('Berechnet'); }); } // initial load loadAlloc(); // Instant Assessment const iaToplineInput = document.getElementById('ia_topline'); const iaSubsInput = document.getElementById('ia_subs'); const iaRealEl = document.getElementById('ia_real'); const iaBandSelect = document.getElementById('ia_band'); const iaTableBody = document.getElementById('ia_table_body'); const iaCalcBtn = document.getElementById('ia_calculate'); const iaIstInputs = { profit: document.getElementById('ia_ist_profit'), owner: document.getElementById('ia_ist_owner'), tax: document.getElementById('ia_ist_tax'), opex: document.getElementById('ia_ist_opex') }; // TAP mapping (percent values as decimals) const tapMap = { '1': {profit:0.05, owner:0.50, tax:0.15, opex:0.30}, '2': {profit:0.10, owner:0.35, tax:0.15, opex:0.40}, '3': {profit:0.15, owner:0.20, tax:0.15, opex:0.50}, '4': {profit:0.10, owner:0.10, tax:0.15, opex:0.65}, '5': {profit:0.15, owner:0.05, tax:0.15, opex:0.65}, '6': {profit:0.17, owner:0.03, tax:0.15, opex:0.65} }; function updateIA(){ const tl = parseNumber(iaToplineInput.value); const subs= parseNumber(iaSubsInput.value); const real= Math.max(0, tl - subs); if(iaRealEl) iaRealEl.textContent = formatCurrency(real); const band = tapMap[iaBandSelect.value] || tapMap['4']; const rows = iaTableBody ? iaTableBody.querySelectorAll('tr') : []; // categories order corresponds to row order const cats = ['profit','owner','tax','opex']; cats.forEach((key, idx) => { const row = rows[idx]; const targetPct = band[key]; const targetVal = real * targetPct; // cells: 0 label, 1 target%, 2 target€, 3 ist input cell (child), 4 delta (span.flag), 5 hint (span.muted) if(row){ const cells = row.cells; if(cells[1]) cells[1].textContent = formatPercent(targetPct*100); if(cells[2]) cells[2].textContent = formatCurrency(targetVal); const istVal = parseNumber(iaIstInputs[key].value); const diff = istVal - targetVal; // delta cell if(cells[4]){ const span = cells[4].querySelector('span'); if(span){ span.textContent = (diff >= 0 ? '+ ' : '– ') + formatCurrency(Math.abs(diff)); span.className = 'flag ' + (Math.abs(diff) 0 ? 'OpEx zu hoch – Kosten prüfen' : 'OpEx im Rahmen'; } if(hintSpan) hintSpan.textContent = hint; } } }); } function saveIA(){ const data = { topline: iaToplineInput.value, subs: iaSubsInput.value, band: iaBandSelect.value, ist: { profit: iaIstInputs.profit.value, owner: iaIstInputs.owner.value, tax: iaIstInputs.tax.value, opex: iaIstInputs.opex.value } }; localStorage.setItem('pf_ia', JSON.stringify(data)); } function loadIA(){ const raw = localStorage.getItem('pf_ia'); if(raw){ try{ const s = JSON.parse(raw); if(s.topline) iaToplineInput.value = s.topline; if(s.subs) iaSubsInput.value = s.subs; if(s.band) iaBandSelect.value = s.band; if(s.ist){ iaIstInputs.profit.value = s.ist.profit || ''; iaIstInputs.owner.value = s.ist.owner || ''; iaIstInputs.tax.value = s.ist.tax || ''; iaIstInputs.opex.value = s.ist.opex || ''; } } catch(err){} } updateIA(); } // attach listeners for IA [iaToplineInput, iaSubsInput, iaBandSelect].forEach(el => { if(el){ el.addEventListener('input', function(){ updateIA(); saveIA(); }); } }); Object.keys(iaIstInputs).forEach(key => { const input = iaIstInputs[key]; if(input){ input.addEventListener('input', function(){ updateIA(); saveIA(); }); } }); if(iaCalcBtn){ iaCalcBtn.addEventListener('click', function(){ updateIA(); saveIA(); showToast('Berechnet'); }); } // TAP info const tapBtn = document.getElementById('tap_info'); if(tapBtn){ tapBtn.addEventListener('click', function(){ alert( 'TAP‑Zielwerte (bezogen auf Real Revenue):\n'+ 'Band 1 (0–250k): Profit 5 %, Owner 50 %, Tax 15 %, OpEx 30 %\n'+ 'Band 2 (250–500k): Profit 10 %, Owner 35 %, Tax 15 %, OpEx 40 %\n'+ 'Band 3 (500k–1M): Profit 15 %, Owner 20 %, Tax 15 %, OpEx 50 %\n'+ 'Band 4 (1–5M): Profit 10 %, Owner 10 %, Tax 15 %, OpEx 65 %\n'+ 'Band 5 (5–10M): Profit 15 %, Owner 5 %, Tax 15 %, OpEx 65 %\n'+ 'Band 6 (10–50M): Profit 17 %, Owner 3 %, Tax 15 %, OpEx 65 %' ); }); } // init IA loadIA(); });

© All Copyrights 2025 by Thomas Jakel

imprintData protection | Blog