Dashboard
Umsatz = tatsächliche Shopify-Verkäufe. Einnahmen/Ausgaben/Saldo = echter Kontofluss dieses Jahr (Bank = Wahrheit). Detaillierte Gewinn-/Gruppen-Ansicht unter Übersicht, USt-Details folgen mit dem Steuer-Modul.
Übersicht
Sonstiges zuordnen · Ausgeblendete ({{ eur(ledger.totals.ignoriert || 0) }}) — Kachel anklicken zeigt & ordnet Buchungen zu.
Länderstatistiken
Wo läuft es gut? Verkäufe nach Land und Stadt aus Shopify, mit Karte. Zeitraum und Land filterbar.
{{ prodMode==='gesamt' ? 'Monat anklicken öffnet die Detail-Torte. ' : ('Pro Monat 2 Balken: links ' + ((prodDist.countryNames||{})[prodCmpA]||prodCmpA) + ', rechts ' + ((prodDist.countryNames||{})[prodCmpB]||prodCmpB) + '. Monat anklicken öffnet die Detail-Torten. ') }}Stand: {{ prodDist.lastSynced }}, 1x/Tag nachgeladen.
| {{ geoLevel==='land'?'Land':geoLevel==='bezirk'?'Bezirk':'Stadt' }} | Best. | Umsatz |
|---|---|---|
| {{ rowName(r) }} | {{ r.count }} | {{ eur(r.gross) }} |
{{ geoLevel==='land'?'Länder':geoLevel==='bezirk'?'Bezirke':'Städte' }} {{ geoCountry ? '· '+geoCountry : '' }}{{ geoLevel==='bezirk'&&geoBezirkCity ? ' · '+geoBezirkCity : '' }}
| {{ geoLevel==='land'?'Land':geoLevel==='bezirk'?'Bezirk':'Stadt' }} | {{ geoLevel==='bezirk'?'PLZ / Stadt':'Land' }} | Bestellungen | Umsatz | €/1000 Einw. |
|---|---|---|---|---|
| {{ rowName(r) }} | {{ geoLevel==='bezirk' ? (r.zip + (r.city && r.name!==r.city ? ' · '+r.city : '')) : r.country }} | {{ r.count }} | {{ eur(r.gross) }} | {{ r.pop ? eur(Math.round(r.gross/r.pop*1000)) : '—' }} |
| Keine Daten im Filter |
Bestandswert
Was wir gerade an Ware haben (Fertiglager aus chopperpost, ZEN + eigenes Lager) und was aufs Konto kommt, wenn wir verkaufen. Gib beliebig viele Stück ein.
| Produkt | Variante | Bestand | bestellt | gesamt | VK-Preis | Wert netto |
|---|---|---|---|---|---|---|
| {{ p.name }} | {{ p.variant }} | {{ p.onHand ?? p.stock }} | {{ p.stock }} | {{ eur(p.retail) }} | {{ eur(p.value) }} | |
| Kein Bestand gemeldet | ||||||
| Summe Fertigware | {{ inventory.finishedStock }} | {{ eur(inventory.totalValueNet) }} | ||||
Produktionslager (Material)
Alle Bauteile im Lager, bewertet zum Einkaufspreis. Gedruckte Plastikteile = Filament-Schätzung.
| Material | Farbe | Bestand | bestellt | gesamt | €/Stück | Wert | Art |
|---|---|---|---|---|---|---|---|
| {{ m.name }} | {{ m.color || '—' }} | {{ m.onHand ?? m.stock }} | {{ m.stock }} | {{ eur(m.pieceCost) }} | {{ eur(m.value) }} | {{ m.kind }} | |
| Summe Material | {{ eur(inventory.materialValue) }} | ||||||
Posteingang finance@straba.at
Mails werden automatisch abgerufen und eingeordnet. Rechnungen mit PDF landen direkt als Beleg (zum Erfassen).
| Datum | Konto | Von | Betreff | Kategorie | |
|---|---|---|---|---|---|
| {{ (m.date||'').slice(0,10) }} | {{ m.account }} | {{ m.from }} | {{ m.subject }} 📎 | {{ m.category }} | Beleg |
| Noch keine Mails abgerufen | |||||
Ausgangsrechnungen
Aus sevdesk (Händler- und Kundenrechnungen). Read-only, hier zur Übersicht + Zahlungsstatus.
| Nr. | Datum | Kontakt | Netto | USt | Brutto | Status |
|---|---|---|---|---|---|---|
| {{ i.number }} | {{ i.date }} | {{ i.contact }} | {{ eur(i.net) }} | {{ eur(i.tax) }} | {{ eur(i.gross) }} | {{ i.paid?'bezahlt':'offen' }} |
| {{ invoicesNote || 'Keine Rechnungen' }} | ||||||
Rechnung / Angebot erstellen
Händler wählen, Produkte mit Menge, fertig. Händlerpreis wird automatisch gerechnet, Dokument in sevdesk erstellt und optional gemailt.
Händlerrabatt: {{ doc.discount }}% · {{ doc.dealer.email }}
Produkte
| Produkt | Lager | Händler netto | Menge | Summe |
|---|---|---|---|---|
| {{ p.name }} {{ p.variant }} | {{ p.stock }} | {{ eur(p.dealerNet) }} | {{ eur((doc.qty[p.productId]||0)*p.dealerNet) }} | |
| Keine Produkte geladen | ||||
Rechnungen
Eingangsrechnungs-PDFs aus admin@catch.it (und den Finanz-Postfächern). Benannt Datum_FIRMA_Betrag, automatisch gegen die Bank-Umsätze abgeglichen (bezahlt / nicht gefunden). Export = ZIP der umbenannten PDFs + Abgleich-CSV.
{{ rechMsg.text }}
admin@catch.it ist noch nicht als Postfach hinterlegt (ADMIN_CATCHIT_IMAP_PASS in der .env). „Holen" findet dann nichts.
Belege & Eingangsrechnungen
Steuerfertig erfassen: Netto + USt-Satz + Kategorie. Export = ZIP mit allen Rechnungen des Monats, umbenannt „Monat_Firma_Betrag", plus Übersichts-CSV.
Bank (Oberbank)
| Datum | Gegenseite | Zweck | Betrag | Abgeglichen |
|---|---|---|---|---|
| {{ t.booking_date }} | {{ t.counterparty }} | {{ (t.purpose||'').slice(0,50) }} | {{ eur(t.amount) }} | {{ t.matched_type }}— |
| Noch keine Umsätze importiert | ||||
Produktionskosten
| Kostenposition | Quelle | € netto/Stück (mit Zoll und Versand) | |
|---|---|---|---|
| {{ r.label }} · inkl. Lieferung/Zoll | {{ r.source || '—' }} | {{ eur(r.costNet) }} | |
|
= {{ eur(r.costNet) }} netto / Stück
= {{ eur(r.costNet) }} / Stück
|
|||
| Kosten gesamt | {{ eur(calc.costTotal) }} | ||
Versand netto = unsere Kosten − was der Kunde an Versand zahlt. AT Post 4,50 (Kunde 0), DE Zenfulfillment 6,93 (Kunde 0), EU 9,60 (Kunde 7,00 → netto 2,60), CH 10,00 (Kunde ~14 → Gewinn), UK/Worldwide über die Kundengebühr gedeckt. Zielland oben umschalten, Details per ⓘ.
Material & Cashflow
Sobald der Material-Endpoint in chopperpost steht, siehst du hier Bestand, Wiederbeschaffungskosten und wann die nächste Bestellung fällig ist.
| Material | Bestand | Stückkosten | Nachkauf in | Nachkauf-Kosten |
|---|---|---|---|---|
| {{ m.name }} {{ m.color||'' }} | {{ m.quantity }} | {{ m.unitCost!=null?eur(m.unitCost):'—' }} | {{ m.reorderIn!=null?(m.reorderIn+' T'):'—' }} | {{ m.reorderCost!=null?eur(m.reorderCost):'—' }} |
Programmierer
Geht sich das Zahlungsziel an die Entwickler aus? Basis = Bestellungen der letzten {{ feas.windowDays || 90 }} Tage. Cash je Stück = Produktgewinn, aber vorhandener Warenwert wird gutgeschrieben: Fertiglager (alles bezahlt) und Material-Reserve (Display bezahlt) bringen mehr Cash als Neuproduktion.
| Ref | Fällig | Betrag | kumuliert | ≈ Stück nötig | Prognose Cash | reicht? | |
|---|---|---|---|---|---|---|---|
| {{ l.ref }} {{ l.label }} |
{{ l.due_date }} ({{ l.daysLeft }}T) | {{ eur(l.amount) }} | {{ eur(l.cumulativeDue) }} | {{ l.unitsNeeded }} {{ l.fromStock }} Lager · {{ l.fromMaterial }} Mat. · {{ l.fromNew }} neu |
{{ eur(l.projectedCash) }} brutto {{ eur(l.projectedGross) }} |
{{ l.covered ? 'ja' : ('fehlt '+eur(l.shortfall)) }} | |
| Keine offenen Verbindlichkeiten | |||||||
Details zu Bestand und „was kommt aufs Konto" im Tab Bestandswert.
Monatsplanung
Monatsziele für Umsatz und Fixkosten.
| Monat | Umsatzziel | Fixkosten | Plan-Gewinn | Notiz | |
|---|---|---|---|---|---|
| {{ p.ym }} | {{ eur(p.revenue_target) }} | {{ eur(p.fixed_costs) }} | {{ eur(p.revenue_target - p.fixed_costs) }} | {{ p.note }} | |
| Noch keine Planung | |||||
Zahlplan
Wann ist welches Material leer, was muss nachbestellt werden (in 1000er-Batches, Plastik läuft nebenbei und wird nicht geplant), und bleibt der Saldo mit den Programmierer-Raten im Plus? Verkäufe nach saisonaler Prognose (Weihnachts-Surge inklusive), Verdienst pro Produkt und vorhandener Bestand eingerechnet.
Nachbestell-Plan
Was im Zeitraum ausgeht und nachgekauft werden muss.
| Material | erstmals leer | Nachbestellungen | €/Stück | Kosten gesamt |
|---|---|---|---|---|
| {{ r.name }} | {{ r.firstEmpty }} | {{ r.reorders }}× {{ r.batch }} | {{ eur(r.pieceCost) }} | {{ eur(r.totalCost) }} |
| Im Zeitraum keine Nachbestellung nötig, Lager reicht. | ||||
Zeitplan (Ein-/Auszahlungen)
Alle geplanten Ausgaben (Material + Fixkosten + Programmierer-Raten). „Saldo davor" = geschätzter Kontostand direkt vor der Zahlung (60-Tage-Verkaufsschnitt + Bestand eingerechnet). Verkaufserlöse laufen täglich rein.
| Datum | Ereignis | Saldo davor (gesch.) | Betrag | Saldo danach |
|---|---|---|---|---|
| {{ e.date }} | {{ e.type==='payment'?'Rate':(e.type==='fix'?'Fixkosten':'Material') }}{{ e.label }} | {{ eur(e.balanceBefore) }} | {{ eur(e.amount) }} | {{ eur(e.balanceAfter) }} |
| Keine geplanten Ausgaben im Zeitraum. | ||||
Prognose
Vorjahresmonate vs. heuer → Wachstum, hochgerechnet auf die nächsten 12 Monate (Weihnachtssaison inklusive, weil der Vorjahresmonat als Basis dient).
Nachbestellung bis Weihnachten
Für die prognostizierten {{ forecast.unitsToChristmas }} Stück bis Dezember {{ forecast.decYm ? forecast.decYm.slice(0,4) : '' }} (Umsatz ca. {{ eur(forecast.xmasRevenue) }}). Bestellschluss ~Anfang November wegen Lieferzeit. Gesamt ca. {{ eur(forecast.reorderChristmasTotal) }}.
| Material | auf Lager | Bedarf | nachbestellen | Kosten |
|---|---|---|---|---|
| {{ r.name }} | {{ r.stock }} | {{ r.needed }} | {{ r.batches }}× 1000 | {{ eur(r.cost) }} |
| Lager reicht bis Weihnachten. | ||||
Nachbestellung nächste 12 Monate
Für die prognostizierten {{ forecast.forecastUnits12 }} Stück der nächsten 12 Monate (in 1000er-Batches, Plastik läuft nebenbei). Gesamt ca. {{ eur(forecast.reorderTotal) }}.
| Material | auf Lager | Bedarf | nachbestellen | Kosten |
|---|---|---|---|---|
| {{ r.name }} | {{ r.stock }} | {{ r.needed }} | {{ r.batches }}× 1000 | {{ eur(r.cost) }} |
| Lager reicht für die Prognose. | ||||
Werbekooperationen
Umsatz & Gewinn je Influencer, zugeordnet über den Rabattcode. Pro Influencer die Videos eintragen (Upload-Datum), dann wird der Umsatz je Video zugeordnet und im Tagesverlauf siehst du die Spikes.
| Influencer / Code | Umsatz | Stück | Gewinn | Kosten | ROI | |
|---|---|---|---|---|---|---|
| {{ c.name || c.display }} {{ c.display }} · {{ c.videos.length }} Video(s) | {{ eur(c.gross) }} | {{ c.units }} | {{ eur(c.profit) }} | {{ eur(c.cost) }} | {{ c.roi==null ? '—' : c.roi+'%' }} | |
| Noch keine Rabattcode-Bestellungen. | ||||||
{{ adCampaign().name || adCampaign().display }} {{ adCampaign().display }} · {{ adCampaign().orders }} Bestellungen
| Video | Upload | Umsatz | Stück | Gewinn | Kosten | |
|---|---|---|---|---|---|---|
| {{ v.title || '(ohne Titel)' }} Link | {{ v.publishedAt || '—' }} | {{ eur(v.gross) }} | {{ v.units }} | {{ eur(v.profit) }} | {{ eur(v.cost) }} | |
| vor erstem Video / ohne Zuordnung | {{ eur(adCampaign().beforeGross) }} | {{ adCampaign().beforeUnits }} | — | |||
| Noch keine Videos. „+ Video" anlegen (Upload-Datum), dann wird der Umsatz je Video zugeordnet und die Spikes passen zum Video. | ||||||
Meta Ads
Rechner: ab welchem CPA (Kosten pro Kauf) lohnt sich Werbung, und wie viel Budget braucht ein Gewinnziel. Darunter die laufenden Kampagnen mit echten Zahlen aus dem Werbeanzeigenmanager.
| CPA (Kosten/Kauf) | Gewinn/Stück | benötigte Verkäufe | Werbebudget | ≈ €/Tag (1 Jahr) | ROAS |
|---|---|---|---|---|---|
| {{ eur(r.cpa) }} | {{ eur(r.profitUnit) }} | {{ r.loss ? '—' : r.sales.toLocaleString('de-AT') }} | {{ r.loss ? 'Verlust' : eur(r.budget) }} | {{ r.loss ? '—' : eur(r.perDay) }} | {{ r.roas==null ? '—' : r.roas+'×' }} |
Break-even-ROAS = Verkaufspreis ({{ eur(adcalc.salesGross) }}) ÷ Deckungsbeitrag ({{ eur(adcalc.db) }}). Wichtigster Hebel ist der CPA, nicht das Budget: bessere Videos und Produktseite senken ihn.
Kampagnen (Ist) Live aus Meta
Live aus Meta (alle ~30 Min aktualisiert). Du kannst zusätzlich manuelle Kampagnen anlegen.
Noch manuell: Ausgegeben + Käufe aus dem Werbeanzeigenmanager eintragen → CPA, ROAS, Gewinn gegen den Break-even. Für automatischen Live-Abruf fehlt nur der Meta-Token (ads_read) + Werbekonto-ID.
| Kampagne | Budget/Tag | Ausgegeben | Käufe | CPA | Umsatz | ROAS | Gewinn | Verdict | |
|---|---|---|---|---|---|---|---|---|---|
| {{ c.name || '(ohne Name)' }} {{ c.platform }}live {{ c.impressions.toLocaleString('de-AT') }} Impr. · CTR {{ c.ctr }}% |
{{ eur(c.dailyBudget) }} | {{ eur(c.spend) }} | {{ c.purchases }} | {{ c.cpa==null?'—':eur(c.cpa) }} | {{ eur(c.revenue) }} | {{ c.roas==null?'—':c.roas+'×' }} | {{ eur(c.profit) }} | profitabelzu teuer— | |
| Noch keine Kampagne. „+ Kampagne" anlegen und Ausgegeben/Käufe aus Meta eintragen. | |||||||||
| Gesamt | {{ eur(adcalc.totals.spend) }} | {{ adcalc.totals.purchases }} | {{ adcalc.totals.cpa==null?'—':eur(adcalc.totals.cpa) }} | {{ eur(adcalc.totals.revenue) }} | {{ adcalc.totals.roas==null?'—':adcalc.totals.roas+'×' }} | {{ eur(adcalc.totals.profit) }} | |||