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.
Daten exportieren (JSON)
Zurücksetzen
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.
Voreinstellung
Eigene Prozente wählen
Starter – Profit 1 %, Owner 20 %, Tax 15 %, OpEx 64 %
Lean – Profit 5 %, Owner 30 %, Tax 15 %, OpEx 50 %
Band ≤ 500k Real Revenue – Profit 10 %, Owner 35 %, Tax 15 %, OpEx 40 %
Band 1–5 Mio Real Revenue – Profit 10 %, Owner 10 %, Tax 15 %, OpEx 65 %
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
Summe 0 % € 0,00
Berechnen
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.
Real Revenue € 0,00
TAP‑Band (Zielverteilung)
Band 1: 0–250k
Band 2: 250–500k
Band 3: 500k–1M
Band 4: 1–5M
Band 5: 5–10M
Band 6: 10–50M
TAP‑Werte
Berechnen
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
Notiz `;
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();
});