Meine Produkte
Klicke ein Produkt an · ✦ = KI-Daten · 🖼 = Bild
Live auf Etsy
0
Design bereit
0
Warteschlange
100+
Gespart
0 h
🚀 100+ Designs bereit. Im Workflow-Tab schaffst du jedes in ~15 Min.
← Alle Produkte
Neues Produkt anlegen
Fülle die Details aus. Mit API-Key werden alle Felder danach automatisch erstellt.
Optionale Datei-Analyse (maximale Genauigkeit)
Klicke den Button – Prompt wird kopiert, Claude.ai öffnet sich. Datei dort einfügen, Strg+V für den Prompt, JSON-Antwort unten eintragen.
Ideen-Board
Sammle Ideen – die KI bewertet Marktchance, Saisonalität und sagt dir wann du starten musst.
Neue Idee eintragen
KI-Bewertung ~0,01 €
Deine Ideen 0
Kalender
📅 Saisonübersicht –
▸
Wochenplaner
Deine Shop-Aufgaben für diese Woche – KI plant basierend auf Dringlichkeit.
Pinterest-Pin
Workflow-Schritt
Neues Produkt
Preis-Review
Saisonale Deadline
Mediathek & Pinterest-Bilder
Bilder hochladen, Format prüfen, Pins zuordnen und CSV für Pinterest exportieren.
Pinterest-Format: 1000×1500px, Verhältnis 2:3 (hochkant) · JPG oder PNG · max. 20 MB ·
Bilder müssen öffentlich erreichbar sein – Supabase Storage ist als öffentlicher Bucket eingerichtet.
Preisrechner & Strategie
Vollständige Kalkulation inkl. Etsy-Gebühren, MwSt-Effekt und Steuerrücklagen.
Wichtig zu verstehen: Du stellst z.B. € 3,50 ein. Der Käufer zahlt tatsächlich € 3,50 + MwSt (z.B. 19% DE = € 4,17). Die MwSt behält Etsy – du bekommst nur € 3,50 minus Etsy-Gebühren ausgezahlt. Zusätzlich fällt 19% MwSt auf die Etsy-Gebühren selbst an (Kleinunternehmer können diese nicht als Vorsteuer abziehen).
⚠ Kein Steuerberater – bei konkreten Steuerfragen bitte Fachberatung nutzen.
⚠ Kein Steuerberater – bei konkreten Steuerfragen bitte Fachberatung nutzen.
Eingaben
Was du auf Etsy einträgst – nicht was der Käufer zahlt
Ergebnis
Dein Listenpreis–
Käufer zahlt (inkl. 19% MwSt DE)–
– Transaktion 6,5%–
– Zahlung 3% + 0,25€–
– Listing (0,18€ ÷ Verk.)–
– 19% MwSt auf Gebühren–
– Ads–
Auszahlung netto–
Marge–
– Steuerrücklage 30%–
Verfügbar nach Steuer–
Monatlich (netto, vor Steuer)–
Monatlich (nach Steuerrücklage)–
Jahresprognose (nach Steuer)–
Nischen-Überblick
KI analysiert deine Nische – Chancen, Preisrange und Positionierungsempfehlung.
KI-Analyse basiert auf Marktkenntnis, keine Live-Daten. Für echte Suchvolumen:
eRank ↗ oder
Everbee ↗
Nische analysieren
Werbung & Ads
Wann lohnt sich Werbung – und wann nicht.
Regel: Ads verstärken nur was schon funktioniert. Erst optimieren, dann bewerben.
Etsy-Ads – Checkliste
✗
Nicht starten: unter 5 Bewertungen, Conversion unter 2%, Fotos nicht optimal
⏳
Vorbereiten: 5–15 Bewertungen, erste organische Verkäufe, alle Tags ausgefüllt
✓
Starten: 15+ Bewertungen, 3+ organische Verkäufe/Woche, Conversion über 3%
✓
Skalieren: ROAS über 3:1 (€1 Ads → €3 Umsatz)
Jetzt: Noch keine Etsy-Ads. Fokus: Listings aufbauen, Pinterest organisch, SEO optimieren.
Offsite-Ads & Rabatte
Offsite Ads: Etsy bewirbt auf Google/Facebook, du zahlst 15% nur bei Kauf. Drin lassen.
Pinterest Ads: Erst wenn organisch 200+ Impressionen/Pin. Saisonal €5–10/Tag.
Rabatte: 20–25% zu Schulanfang/Weihnachten für Etsy Deals-Tab.
Pinterest Ads: Erst wenn organisch 200+ Impressionen/Pin. Saisonal €5–10/Tag.
Rabatte: 20–25% zu Schulanfang/Weihnachten für Etsy Deals-Tab.
Einstellungen
API-Keys und Links – lokal in deinem Browser gespeichert.
🤖 Claude API-Key
Automatische KI-Analysen – ~0,01–0,02 € pro Analyse. Key erstellen ↗
Kein Key gespeichert
📊 Pinterest Trends API
Einmalige Einrichtung (5 Min.):
1. developers.pinterest.com/apps ↗ → „Create app“
2. Redirect URI eintragen:
3. App-ID, Secret und Code unten eintragen → Token generieren
1. developers.pinterest.com/apps ↗ → „Create app“
2. Redirect URI eintragen:
https://oauth.pstmn.io/v1/callback3. App-ID, Secret und Code unten eintragen → Token generieren
Kein Token gespeichert
🛍 Etsy-Shop
Gespeicherte Etsy-Listings
📌 Pinterest
Pinterest-Pinnwände
Deine Boards – klicke auf „Text“ um eine Beschreibung zu generieren.
🗂 Meine Boards verwalten
Trage hier deine echten Pinterest-Boards ein. Diese Liste wird überall in der App verwendet (Pin-Planung, Vorschläge, Textgenerierung).
Der Status „bei Pinterest existiert" wird noch nicht automatisch geprüft — das kommt in einer späteren Version, sobald die Pinterest-Anbindung steht.
Einrichtung: Pinterest → + Erstellen → Pinnwand → Öffentlich → Kategorie wählen → Beschreibung eintragen
Pin-Kalender
Welches Bild wann auf welche Pinnwand.
Pins diese Woche
5
Beste Zeit
18:30
Ziel/Monat
20
Nächster Peak
-
Regel: Bilder dürfen mehrfach gepinnt werden (mit anderem Board/Text), aber: max. 10 Boards pro Bild, mind. 2–3 Tage Abstand zwischen Wiederverwendungen desselben Bildes.
📅 Saisonkalender Deutschland –
▸
✦ Pin-Vorschläge –
▸
Kalender –
Tutorial
Lifestyle
Step-by-Step
Saisonal
Beste Posting-Zeiten DE
☀️
08–09 Uhr
Gut
🌼
12–13 Uhr
Sehr gut
🌇
18–20 Uhr
⭐ Peak
🌑
20:30–22 Uhr
Sehr gut
Pinterest Top-Trends DE ✓ Live
Pinterest Token einrichten um Live-Trends zu sehen.
Upload-Planer
Plane deine Pins – exportiere als CSV für Tailwind.
Datum
Pin-Titel
Pinnwand
Typ
Etsy-URL
Produkt
Status
Strategie: 1 Tutorial + 1 Lifestyle direkt nach Upload. Dann alle 2 Wochen 1 weiterer Pin (anderes Bild!). Peak: 3×/Woche in den 4 Wochen davor.
Workflow-Manager
Jedes Produkt in ~15 Min – Fortschritt wird gespeichert.
Heute
0
Diese Woche
0
Offen
-
Ø Min/Stück
18
Warteschlange
Ablaufdiagramm
Der komplette Weg einer Idee bis zum laufenden Verkauf – alle Status und Bedingungen im Überblick.
Hinweis: Ein Fund beim Erstellen dieses Diagramms: die Kalender-Phase „Design fertigstellen“ ist mit Workflow-Schritt 3 verknüpft, der aber tatsächlich „Titel & Tags prüfen“ heißt – im Diagramm unten korrekt so beschriftet, nicht wie der Phasenname vermuten lässt. Wurde dokumentiert, aber noch nicht korrigiert.
Legende
Ideen-Board
Produkt-Workflow (7 Schritte)
Etsy-Status
Pinterest / Kalender
SEO Checkliste
Maximale Sichtbarkeit auf Etsy und Pinterest.
🛍 Etsy
Titel: Keyword zuerst · max. 140Z · 3+ Keywords · keine Emojis
Tags: Alle 13 · max. 20Z · Mehrwort-Phrasen · keine Emojis
Beschreibung: Keyword im ersten Satz · Schritt-Liste · FAQ · max. 3–4 Emojis als Gliederung
Kategorie: Exakte Unterkategorie · Attribute immer ausfüllen
Fotos: Alt-Text für jedes Bild · Titelbild heller Hintergrund
Menge: Immer 999 → kein automatisches Renewal (€ 0,20/Mal)
📌 Pinterest
Titel: max. 100Z · Keyword am Anfang · kein Hashtag
Beschreibung: 150–300Z · Keywords natürlich · kein Stuffing
Hashtags: Nicht empfohlen. Pinterest rankt nach Keywords, nicht Hashtags. (Quelle: Tailwind 2025)
Ziel-URL: Direkt auf Etsy-Listing verlinken
Format: 1000×1500px · Text oben · Logo unten
Pinnwand: 1 Pin pro Board · nie dasselbe Bild doppelt
Etsy-Kategorien
Girlande/Banner → Banners & Garlands
Karten/Lesezeichen → Paper Prints
Adventskalender → Christmas Decorations
Zuckertüte → Paper Prints
Tortentopper → Cake Toppers
Karten/Lesezeichen → Paper Prints
Adventskalender → Christmas Decorations
Zuckertüte → Paper Prints
Tortentopper → Cake Toppers
Was du wissen musst
Die 10 wichtigsten Erkenntnisse.
1
Preis nie unter € 2,50
Bei € 2,00 bleiben nach Gebühren nur ~€ 0,90. Minimum € 2,50, Ziel € 3,50–4,90. Niedrige Preise signalisieren schlechte Qualität.
2
Bewertungen > Werbung
Erste 10–15 Bewertungen sind dein wichtigstes Asset. Persönliche Dankesnachricht nach jedem Kauf erhöht die Review-Quote deutlich.
3
Mehr Listings = mehr Traffic
Etsy bevorzugt aktive Shops. Ziel: 20 Listings in 3 Monaten. Du hast 100+ Designs – nutze diesen Vorteil.
4
Pinterest braucht 3–6 Monate
Pins haben 3–6 Monate Halbwertszeit. Jetzt starten für den Schulanfang-Peak im Juli.
5
Saisonalität 6 Wochen früher
Schulanfang-Listings spätestens Mitte Juni live. Adventskalender ab Oktober.
6
Das Titelbild entscheidet 80%
Kaufentscheidung fällt vor dem Lesen des Titels. Investiere die meiste Zeit in Bild 1.
7
Bundles sind dein Geheimtipp
5er-Bundle zu € 7,90 bringt mehr als 5 Einzelprodukte à € 2,50. Nach 5–8 Einzelprodukten starten.
8
Keine Ads ohne organische Verkäufe
Ads erst bei min. 3 organischen Verkäufen/Woche. € 1–2/Tag, nur auf Top-Listings.
9
Videos erhöhen Conversion 40–70%
15–30 Sek. Handyvideo. Echte Hände, echtes Papier. Authentisch schlägt perfekt.
10
Menge immer 999
Etsy berechnet € 0,20 bei jeder Erneuerung. Digitale Produkte immer 999.
Einstellungen
Zentrale Werte für die ganze App. Änderungen gelten sofort und global (auf allen Geräten).
📅 Planung: Workflow-Phasen (Wochen vor dem Anlass)
Steuert die Rückwärts-Terminplanung. Die Phasen sind Daten — künftige Phasen (z.B. weitere Kanäle) erscheinen hier automatisch.
💶 Etsy-Gebühren
Fließen in den Preisrechner ein. Anpassen, wenn Etsy die Gebühren ändert.
🖼 Bild-Mindestauflösung
🎄 Saison-Vorlaufzeiten
Wie viele Tage vor einem Anlass die Vorlaufphase im Kalender beginnt.
📌 Pinterest-Marketing
Wie viele unterschiedliche Pin-Varianten pro Produkt als "vollständig" gelten (Workflow-Schritt 6).
Hinweis: Änderungen werden sofort gespeichert. Saison-Vorlaufzeiten wirken sich erst nach "🔄 Saison-Termine neu erzeugen" (im Kalender) auf bestehende Termine aus.
Hilfe
Anleitung zu jeder Funktion. Klicke einen Bereich zum Aufklappen.
📅 Kalender
Deine Aufgaben (Cockpit): Ganz oben — auf der Startseite und im Kalender — siehst du, was überfällig ist, was diese Woche ansteht und was nächste Woche kommt. Mit ✓ hakst du eine Aufgabe ab; "→ Produkt" springt zum zugehörigen Produkt.
Ansichten: Oben zwischen 4 Wochen (Standard), Monat, 3 Monate, Woche und Tag wechseln. Mit ←/→ navigierst du vor und zurück, "Heute" springt zum aktuellen Datum.
Kategorien filtern: Die Buttons (Pins, Aufgaben, Steuer, Produkt, Wartung, Fix, Saison) zeigen nur Termine der gewählten Kategorie. "Alle" hebt den Filter auf.
Termin anlegen: "+ Termin" oben rechts. Titel, Datum (JJJJ-MM-TT), Kategorie und Dringlichkeit eingeben. Dringlichkeit: fix 🔒 (unverschiebbar), wichtig ⚡, verschiebbar.
Termin erledigen: Termin anklicken → OK markiert ihn als erledigt.
Kalender leer? 1. Prüfe ob das SQL-Update in Supabase ausgeführt wurde (Einrichtung → SQL-Update kopieren → Supabase SQL-Editor). 2. Klicke danach "🔄 Saison-Termine neu erzeugen" unter der Saisonübersicht.
Ansichten: Oben zwischen 4 Wochen (Standard), Monat, 3 Monate, Woche und Tag wechseln. Mit ←/→ navigierst du vor und zurück, "Heute" springt zum aktuellen Datum.
Kategorien filtern: Die Buttons (Pins, Aufgaben, Steuer, Produkt, Wartung, Fix, Saison) zeigen nur Termine der gewählten Kategorie. "Alle" hebt den Filter auf.
Termin anlegen: "+ Termin" oben rechts. Titel, Datum (JJJJ-MM-TT), Kategorie und Dringlichkeit eingeben. Dringlichkeit: fix 🔒 (unverschiebbar), wichtig ⚡, verschiebbar.
Termin erledigen: Termin anklicken → OK markiert ihn als erledigt.
Kalender leer? 1. Prüfe ob das SQL-Update in Supabase ausgeführt wurde (Einrichtung → SQL-Update kopieren → Supabase SQL-Editor). 2. Klicke danach "🔄 Saison-Termine neu erzeugen" unter der Saisonübersicht.
🎄 Saisonkalender & Saisonübersicht
Automatische Termine: Für jeden Anlass (Weihnachten, Schulanfang, Ostern …) erzeugt die App drei Kalendereinträge: Vorlaufphase (mehrtägig, wann du Pins & Produkte vorbereitest), Peak-Zeit 🔥 (letzte 7 Tage, intensiv pinnen) und den Haupttermin. Bewegliche Feiertage werden berechnet, nicht geschätzt.
Vorlaufzeiten: Große Anlässe 75 Tage, mittlere 45, kleine 30.
Saisonübersicht: Im Kalender-Tab aufklappbar — zeigt die nächsten 12 Anlässe mit Countdown und Status (Peak / Vorlauf aktiv / ruhig).
Eigene Anlässe: In der Übersicht "+ Eigenen Anlass hinzufügen". Datum einzelner Anlässe über "✎ Datum anpassen" ändern. Jede Änderung ist sofort im Kalender sichtbar — die 24h-Sperre gilt nur für die automatische Hintergrund-Synchronisation, nicht für deine manuellen Änderungen.
Export/Import: Als .ics für andere Kalender exportieren oder importieren.
KI-Jahresplanung: "🤖 Nächstes Jahr per KI vorausplanen" erzeugt einen Prompt zum Kopieren in claude.ai; das Ergebnis-JSON importierst du zurück.
Vorlaufzeiten: Große Anlässe 75 Tage, mittlere 45, kleine 30.
Saisonübersicht: Im Kalender-Tab aufklappbar — zeigt die nächsten 12 Anlässe mit Countdown und Status (Peak / Vorlauf aktiv / ruhig).
Eigene Anlässe: In der Übersicht "+ Eigenen Anlass hinzufügen". Datum einzelner Anlässe über "✎ Datum anpassen" ändern. Jede Änderung ist sofort im Kalender sichtbar — die 24h-Sperre gilt nur für die automatische Hintergrund-Synchronisation, nicht für deine manuellen Änderungen.
Export/Import: Als .ics für andere Kalender exportieren oder importieren.
KI-Jahresplanung: "🤖 Nächstes Jahr per KI vorausplanen" erzeugt einen Prompt zum Kopieren in claude.ai; das Ergebnis-JSON importierst du zurück.
📦 Produkte & Workflow
Neues Produkt: Tab "Neu" → Idee beschreiben → KI-Analyse liefert Titel, Beschreibung, Tags und benötigte Bildmotive. JSON aus claude.ai über "Import" einfügen.
Workflow: Jedes Produkt hat 7 Schritte von Marktrecherche bis Preisstrategie. In der Detailansicht Schritte abhaken; der Status (Entwurf → Design bereit → Live) folgt automatisch.
Saison-Planung: In der Produkt-Detailansicht wählst du bei "📅 Saison-Planung" einen Ziel-Anlass (z.B. Weihnachten). Die App zeigt sofort die berechneten Phasen-Termine als Vorschau. Mit "Termine planen" werden sie als Aufgaben in den Kalender gelegt – rückwärts vom Anlass, mit den Vorlaufzeiten aus deinen Einstellungen. "Plan löschen" entfernt sie wieder. Ist der Anlass zu nah, warnt die App "zeitlich knapp".
Soll/Ist-Bilder: Die Detailseite vergleicht die von der KI vorgeschlagenen Motive mit deinen hochgeladenen Bildern.
Etsy-Statistiken: Views, Besuche und Bestellungen je Produkt manuell nachtragen.
Workflow: Jedes Produkt hat 7 Schritte von Marktrecherche bis Preisstrategie. In der Detailansicht Schritte abhaken; der Status (Entwurf → Design bereit → Live) folgt automatisch.
Saison-Planung: In der Produkt-Detailansicht wählst du bei "📅 Saison-Planung" einen Ziel-Anlass (z.B. Weihnachten). Die App zeigt sofort die berechneten Phasen-Termine als Vorschau. Mit "Termine planen" werden sie als Aufgaben in den Kalender gelegt – rückwärts vom Anlass, mit den Vorlaufzeiten aus deinen Einstellungen. "Plan löschen" entfernt sie wieder. Ist der Anlass zu nah, warnt die App "zeitlich knapp".
Soll/Ist-Bilder: Die Detailseite vergleicht die von der KI vorgeschlagenen Motive mit deinen hochgeladenen Bildern.
Etsy-Statistiken: Views, Besuche und Bestellungen je Produkt manuell nachtragen.
🖼 Mediathek & Bildbearbeitung
Upload: Bilder hochladen und einem Produkt zuordnen. Typ (Hauptbild, Mockup, Detail) und Notizen pro Bild pflegbar.
Format-Zuschnitt: Ein Bild in mehrere Formate gleichzeitig schneiden (1:1, 4:5, 2:3 + eigene). Sicherer Bereich markieren, pro Format manuell nachjustieren (Größen-Regler), dann alle herunterladen oder in die Mediathek speichern.
Mindestauflösung: Etsy 2000px, Pinterest 1000px — zu kleine Ergebnisse werden hochskaliert und markiert.
Mockup-Prompts: Für Nischenprodukte ohne Standard-Mockups erzeugt der Generator fertige Midjourney/Canva-Prompts aus 6 Szenen-Vorlagen.
Format-Zuschnitt: Ein Bild in mehrere Formate gleichzeitig schneiden (1:1, 4:5, 2:3 + eigene). Sicherer Bereich markieren, pro Format manuell nachjustieren (Größen-Regler), dann alle herunterladen oder in die Mediathek speichern.
Mindestauflösung: Etsy 2000px, Pinterest 1000px — zu kleine Ergebnisse werden hochskaliert und markiert.
Mockup-Prompts: Für Nischenprodukte ohne Standard-Mockups erzeugt der Generator fertige Midjourney/Canva-Prompts aus 6 Szenen-Vorlagen.
📌 Pinterest-Planung
Pins planen: Kategorie "Pins" im Kalender oder Pin-Vorschläge nutzen.
Regeln: Die App überwacht max. 10 Boards pro Bild und mind. 3 Tage Abstand zwischen Wiederverwendungen.
Board-Texte: Beschreibungen für alle Boards auf einmal generieren.
CSV-Export: Geplante Pins als CSV für Pinterest-Bulk-Upload exportieren.
🔗 Rich Pins aktivieren (einmalig, empfohlen!): Rich Pins zeigen Preis und Verfügbarkeit automatisch direkt im Pin, aktualisieren sich bei Preisänderung/Ausverkauf von selbst. Für Etsy brauchst du dafür KEINEN Code — nur eine einmalige Verbindung: Pinterest-Business-Konto → Einstellungen → "Beanspruchen" ("Claim") → Etsy-Shop verbinden und bestätigen. Aktiviert sich automatisch innerhalb von 24 Std. für alle Pins, die auf einzelne Etsy-Listings verlinken (nicht auf deine Shop-Startseite). Kostenlos, kein App-Update nötig.
🔍 Für bessere Auffindbarkeit (SEO): Pinterest liest auch Text, der ins Bild eingefügt ist (nicht nur Titel/Beschreibung) als Suchsignal. 3-5 Ziel-Keywords pro Pin reichen — 1 im Titel, 2-3 natürlich im Beschreibungstext. Zu viele Keywords wirken unnatürlich und werden von Pinterest schlechter bewertet. Auch Board-Namen und Board-Beschreibungen zählen als eigenes Suchsignal, nicht nur der einzelne Pin.
⏱ Vorlaufzeit: Saisonale Pins sollten 8-12 Wochen vor dem Anlass beginnen (nicht erst 6) — Pinterest-Nutzer planen sehr früh, und neue Pins brauchen Zeit bis sie in der Suche gut platziert werden.
Regeln: Die App überwacht max. 10 Boards pro Bild und mind. 3 Tage Abstand zwischen Wiederverwendungen.
Board-Texte: Beschreibungen für alle Boards auf einmal generieren.
CSV-Export: Geplante Pins als CSV für Pinterest-Bulk-Upload exportieren.
🔗 Rich Pins aktivieren (einmalig, empfohlen!): Rich Pins zeigen Preis und Verfügbarkeit automatisch direkt im Pin, aktualisieren sich bei Preisänderung/Ausverkauf von selbst. Für Etsy brauchst du dafür KEINEN Code — nur eine einmalige Verbindung: Pinterest-Business-Konto → Einstellungen → "Beanspruchen" ("Claim") → Etsy-Shop verbinden und bestätigen. Aktiviert sich automatisch innerhalb von 24 Std. für alle Pins, die auf einzelne Etsy-Listings verlinken (nicht auf deine Shop-Startseite). Kostenlos, kein App-Update nötig.
🔍 Für bessere Auffindbarkeit (SEO): Pinterest liest auch Text, der ins Bild eingefügt ist (nicht nur Titel/Beschreibung) als Suchsignal. 3-5 Ziel-Keywords pro Pin reichen — 1 im Titel, 2-3 natürlich im Beschreibungstext. Zu viele Keywords wirken unnatürlich und werden von Pinterest schlechter bewertet. Auch Board-Namen und Board-Beschreibungen zählen als eigenes Suchsignal, nicht nur der einzelne Pin.
⏱ Vorlaufzeit: Saisonale Pins sollten 8-12 Wochen vor dem Anlass beginnen (nicht erst 6) — Pinterest-Nutzer planen sehr früh, und neue Pins brauchen Zeit bis sie in der Suche gut platziert werden.
💶 Preisrechner
Etsy-Gebühren: Gibt Listing-, Transaktions- und Zahlungsgebühren inkl. USt. auf Gebühren aus — du siehst Netto-Erlös und Marge pro Preis.
KI-Preisstrategie: Vorschläge auf Basis deiner Produkte und Kategorie.
KI-Preisstrategie: Vorschläge auf Basis deiner Produkte und Kategorie.
🔎 Marktrecherche & Ideen
Nischen-Analyse: Keyword eingeben → Trend-Check + KI-Bewertung. Ergebnisse als Idee speichern.
Ideen-Tab: Ideen sammeln, per KI bewerten lassen (Nachfrage, Konkurrenz, Saison) und mit einem Klick in ein Produkt umwandeln.
Ideen-Tab: Ideen sammeln, per KI bewerten lassen (Nachfrage, Konkurrenz, Saison) und mit einem Klick in ein Produkt umwandeln.
🔧 Einstellungen
Zweck: Alle Werte, die sich ändern können, an einem Ort – sie gelten sofort und auf allen Geräten.
Planung: Vorlaufzeiten je Phase (in Wochen vor dem Anlass) und deine Kapazität (Designs pro Woche). Diese Werte steuern die automatische Terminplanung.
Etsy-Gebühren: Transaktions-, Zahlungs- und Listing-Gebühren sowie MwSt. Änderst du sie, rechnet der Preisrechner sofort neu.
Bild-Auflösung & Saison: Mindestauflösungen und die Vorlauf-Tage für große/mittlere/kleine Anlässe.
Zurücksetzen: Der Button unten stellt alle Standardwerte wieder her.
Planung: Vorlaufzeiten je Phase (in Wochen vor dem Anlass) und deine Kapazität (Designs pro Woche). Diese Werte steuern die automatische Terminplanung.
Etsy-Gebühren: Transaktions-, Zahlungs- und Listing-Gebühren sowie MwSt. Änderst du sie, rechnet der Preisrechner sofort neu.
Bild-Auflösung & Saison: Mindestauflösungen und die Vorlauf-Tage für große/mittlere/kleine Anlässe.
Zurücksetzen: Der Button unten stellt alle Standardwerte wieder her.
⚙ Einrichtung, Versionen & Updates
Erste Einrichtung: Komplettes SQL-Schema kopieren → Supabase SQL-Editor → ausführen. Nutzer nur über Supabase Dashboard anlegen (Authentication → Users → Add user, "Auto Confirm User" aktivieren).
Updates: Bei neuer App-Version nur das Feld "SQL-Update (neueste Version)" ausführen — es enthält nur die Änderungen, keine Konflikte.
Versionierung: MAJOR.MINOR.PATCH — 3. Stelle Fehlerbehebung, 2. Stelle neue Funktionen, 1. Stelle grundlegende Umbauten. Aktuelle Version unten im Menü.
Deployment: Cloudflare Pages → Upload assets → ZIP mit index.html hochladen.
Updates: Bei neuer App-Version nur das Feld "SQL-Update (neueste Version)" ausführen — es enthält nur die Änderungen, keine Konflikte.
Versionierung: MAJOR.MINOR.PATCH — 3. Stelle Fehlerbehebung, 2. Stelle neue Funktionen, 1. Stelle grundlegende Umbauten. Aktuelle Version unten im Menü.
Deployment: Cloudflare Pages → Upload assets → ZIP mit index.html hochladen.
Einrichtung
Verbinde die App mit Supabase für dauerhaften, geräteübergreifenden Datenspeicher.
🩺 Kalender-Diagnose
Zeigt den Status ohne Entwicklerkonsole – funktioniert auch auf dem Tablet.
Noch nicht geprüft. Tippe unten auf „Diagnose ausführen".
Deine Daten (Produkte, KI-Texte, Bilder, Planer) werden in Supabase gespeichert – kostenlos, in der EU (Frankfurt), DSGVO-konform. Die App-Logik läuft weiterhin lokal in deinem Browser.
Supabase verbinden
Unter: Supabase Dashboard → Project Settings → API → Project API Keys → anon public
Nicht konfiguriert
Datenbank-Schema mit Login-Schutz
Führe dieses SQL im Supabase SQL-Editor aus (Dashboard → SQL Editor → New query). Aktiviert Row Level Security – nur eingeloggte Nutzer können lesen/schreiben.
-- Etsy Workflowmanager Schema mit Login-Schutz (RLS)
create table if not exists products (
id bigint primary key,
name text not null,
cat text,
status text default 'entwurf',
price text,
beschreibung text,
url text, -- öffentlicher Etsy-Listing-Link (Kaufen-Link, für Pins/Marketing)
etsy_edit_url text, -- privater Etsy-Shop-Manager-Link (nur zum Bearbeiten des Listings, nicht teilen)
eigene_url text,
has_img boolean default false,
bewertungen integer default 0,
preis_history jsonb default '[]',
workflow_steps jsonb default '{}',
ab_notiz text,
etsy_stats jsonb default '{}',
markt_analyse jsonb default '[]',
ai jsonb default '{}',
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create table if not exists plan (
id bigserial primary key,
date text,
title text,
board text,
type text,
url text,
status text default 'Entwurf',
prod_id bigint,
image_id bigint, -- bei Carousel-Pins: erstes/Titel-Bild, weitere in plan_bilder
pin_titel text,
pin_beschreibung text,
etsy_url text,
created_at timestamptz default now()
);
-- F32 (9.7.2026): mehrere Bilder pro Pin für Carousel-Pins. Bewusst als eigene
-- Zwischentabelle statt image_id in plan zum Array umzubauen — image_id wird an
-- vielen bestehenden Stellen als Einzelwert erwartet (Tutorial/Lifestyle-Pins etc.),
-- die sollen unverändert funktionieren. Nur Carousel-Pins nutzen diese Tabelle zusätzlich.
create table if not exists plan_bilder (
id bigserial primary key,
plan_id bigint not null references plan(id) on delete cascade,
image_id bigint not null,
reihenfolge integer default 0,
created_at timestamptz default now()
);
create table if not exists boards (
id bigserial primary key,
name text not null,
beschreibung text, -- z.B. "Hauptboard · Priorität 1"
sortierung integer default 0,
-- pinterest_status: 'ungeprueft'|'existiert'|'fehlt' — Live-Check folgt mit OAuth (F24b, Teil 2)
pinterest_status text default 'ungeprueft',
pinterest_geprueft_am timestamptz,
created_at timestamptz default now()
);
create table if not exists settings (
key text primary key,
value text
);
create table if not exists etsy_links (
id bigserial primary key,
name text,
url text,
created_at timestamptz default now()
);
create table if not exists images (
id bigserial primary key,
prod_id bigint references products(id) on delete cascade,
storage_path text not null,
public_url text,
typ text default 'titelbild',
breite integer,
hoehe integer,
ratio_ok boolean default false,
motiv_bezeichnung text,
notiz text,
created_at timestamptz default now()
);
-- Falls die Tabelle schon vor diesem Update existierte: Spalten nachträglich ergänzen
alter table images add column if not exists motiv_bezeichnung text;
alter table images add column if not exists notiz text;
alter table products add column if not exists saison_key text; -- z.B. 'weihnachten', 'schulanfang'
create table if not exists ideas (
id bigint primary key,
name text not null,
notiz text,
status text default 'neu',
bewertung jsonb default '{}',
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create table if not exists tasks (
id bigserial primary key,
datum text not null,
zeit text,
titel text not null,
typ text default 'aufgabe',
dauer_min integer default 30,
erledigt boolean default false,
ref_id bigint,
notiz text,
created_at timestamptz default now()
);
-- ===== VEREINHEITLICHTER KALENDER: events ersetzt plan+tasks =====
-- Eine zentrale Tabelle für ALLE Termine: Pins, Aufgaben, Steuertermine, Produktentwicklung,
-- Wartung, feste Termine, Saisonanlässe. Filter über "kategorie" statt getrennter Tabellen.
create table if not exists events (
id bigserial primary key,
titel text not null,
kategorie text not null default 'task', -- pin|task|steuer|produktentwicklung|wartung|fix_termin|saison_anlass
datum_start date not null,
datum_ende date, -- leer = Einzeltermin, gesetzt = Zeitraum
zeit_start text, -- z.B. "14:00", leer = ganztägig
zeit_ende text,
dauer_min integer,
dringlichkeit text default 'verschiebbar', -- fix|wichtig|verschiebbar
status text default 'offen', -- offen|in_arbeit|erledigt
quelle text default 'manuell', -- manuell|berechnet|ki_vorschlag
prod_id bigint,
image_id bigint,
board text,
pin_titel text,
pin_beschreibung text,
etsy_url text,
betrag numeric,
vorlauf_tage integer,
wiederholt_jaehrlich boolean default false,
ref_key text, -- eindeutiger Schlüssel für berechnete Einträge (z.B. 'ostern_2026'), verhindert Duplikate
notiz text,
wf_step integer, -- F22: Verknüpfung zum Produkt-Workflow-Schritt (1-7), null = kein Workflow-Bezug
-- Google Calendar Sync (für späteren Schritt vorbereitet, aktuell ungenutzt)
external_source text, -- google_calendar|ics_import|null
external_id text,
external_updated_at timestamptz,
sync_status text default 'nur_lokal', -- synced|lokal_geaendert|konflikt|nur_lokal
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create unique index if not exists events_ref_key_unique on events(ref_key); -- KEIN partial index (WHERE) — supabase-js/PostgREST kann WHERE-Klauseln bei upsert(onConflict) nicht mitsenden (bekannter Bug: github.com/supabase/postgrest-js/issues/403)
create table if not exists event_reminders (
id bigserial primary key,
event_id bigint references events(id) on delete cascade,
vorlauf_minuten integer not null,
kanal text default 'app_notification', -- app_notification|google_sync
ausgeloest boolean default false,
created_at timestamptz default now()
);
create table if not exists event_attachments (
id bigserial primary key,
event_id bigint references events(id) on delete cascade,
storage_path text not null, -- bei typ='link': die URL direkt
dateiname text,
typ text default 'pdf', -- pdf|bild|link
created_at timestamptz default now()
);
-- Storage Bucket fuer Bilder (oeffentlich, damit Pinterest sie laden kann)
insert into storage.buckets (id, name, public)
values ('product-images', 'product-images', true)
on conflict (id) do update set public = true;
-- ===== ROW LEVEL SECURITY: nur eingeloggte Nutzer =====
alter table products enable row level security;
alter table plan enable row level security;
alter table settings enable row level security;
alter table etsy_links enable row level security;
alter table images enable row level security;
alter table ideas enable row level security;
alter table tasks enable row level security;
alter table events enable row level security;
alter table event_reminders enable row level security;
alter table event_attachments enable row level security;
-- Je eine Policy pro Tabelle: erlaubt alles fuer jeden eingeloggten Nutzer
create policy "Eingeloggte Nutzer: alles erlaubt" on products
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on plan
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on settings
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on etsy_links
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on images
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on ideas
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on tasks
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on events
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on event_reminders
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on event_attachments
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
-- Storage: nur eingeloggte Nutzer duerfen hochladen/loeschen, Lesen bleibt oeffentlich (fuer Pinterest)
create policy "Oeffentlich lesbar" on storage.objects
for select using (bucket_id = 'product-images');
create policy "Eingeloggte Nutzer duerfen hochladen" on storage.objects
for insert with check (bucket_id = 'product-images' and auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer duerfen loeschen" on storage.objects
for delete using (bucket_id = 'product-images' and auth.role() = 'authenticated');
-- ===== NEUE TABELLEN (Kalender-Update) =====
-- NUR ausführen wenn diese Tabellen noch nicht existieren.
-- Falls du das komplette Schema oben bereits ausgeführt hast und den Fehler
-- "policy already exists" bekommst, führe NUR diesen Abschnitt aus.
create table if not exists events (
id bigserial primary key,
titel text not null,
kategorie text not null default 'task',
datum_start date not null,
datum_ende date,
zeit_start text,
zeit_ende text,
dauer_min integer,
dringlichkeit text default 'verschiebbar',
status text default 'offen',
quelle text default 'manuell',
prod_id bigint,
image_id bigint,
board text,
pin_titel text,
pin_beschreibung text,
etsy_url text,
betrag numeric,
vorlauf_tage integer,
wiederholt_jaehrlich boolean default false,
ref_key text,
notiz text,
external_source text,
external_id text,
external_updated_at timestamptz,
sync_status text default 'nur_lokal',
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create unique index if not exists events_ref_key_unique on events(ref_key); -- KEIN partial index (WHERE) — supabase-js/PostgREST kann WHERE-Klauseln bei upsert(onConflict) nicht mitsenden (bekannter Bug: github.com/supabase/postgrest-js/issues/403)
create table if not exists event_reminders (
id bigserial primary key,
event_id bigint references events(id) on delete cascade,
vorlauf_minuten integer not null,
kanal text default 'app_notification',
ausgeloest boolean default false,
created_at timestamptz default now()
);
create table if not exists event_attachments (
id bigserial primary key,
event_id bigint references events(id) on delete cascade,
storage_path text not null,
dateiname text,
typ text default 'pdf',
created_at timestamptz default now()
);
alter table images add column if not exists motiv_bezeichnung text;
alter table images add column if not exists notiz text;
alter table events enable row level security;
alter table event_reminders enable row level security;
alter table event_attachments enable row level security;
create policy "Eingeloggte Nutzer: alles erlaubt" on events
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on event_reminders
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
create policy "Eingeloggte Nutzer: alles erlaubt" on event_attachments
for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated');
-- Optimierung 5: Indizes für schnelle Kalender-Abfragen
-- Ohne diese macht Supabase bei jeder Kalenderansicht einen Full-Table-Scan.
create index if not exists events_datum_start_idx on events(datum_start);
create index if not exists events_kategorie_idx on events(kategorie);
create index if not exists events_datum_kategorie_idx on events(datum_start, kategorie);
Bestehende Datenbank: Falls du das Schema bereits ausgeführt hast und den Fehler „policy already exists“ bekommst, führe nur den Abschnitt „NEUE TABELLEN“ ganz unten im SQL aus – dort gibt es keine Konflikte mit bestehenden Policies.
🔐 Login-Konto verwalten
Aus Sicherheitsgründen werden Login-Konten ausschließlich direkt im Supabase-Dashboard erstellt – nicht über diese App. So kann niemand mit der App-URL allein ein eigenes Konto anlegen.
So erstellst du dein Konto:
1. Supabase-Dashboard öffnen → Authentication → Users
2. „Add user“ → „Create new user“
3. E-Mail und Passwort eintragen → Auto Confirm User aktivieren (kein Bestätigungslink nötig)
4. Speichern – danach kannst du dich in der App normal einloggen
Weitere Personen einladen: gleicher Weg – einfach eine weitere E-Mail-Adresse als Nutzer anlegen.
Supabase-Dashboard öffnen ↗
So erstellst du dein Konto:
1. Supabase-Dashboard öffnen → Authentication → Users
2. „Add user“ → „Create new user“
3. E-Mail und Passwort eintragen → Auto Confirm User aktivieren (kein Bestätigungslink nötig)
4. Speichern – danach kannst du dich in der App normal einloggen
Weitere Personen einladen: gleicher Weg – einfach eine weitere E-Mail-Adresse als Nutzer anlegen.
SQL-Update (neueste Version)
Nur ausführen wenn du von einer älteren Version aktualisierst. Enthält nur die Änderungen seit dem letzten Update – kein Konflikt mit bestehendem Schema.
-- === Update v1.1.0 → v1.2.0 === -- Vereinheitlichter Kalender: events, event_reminders, event_attachments create table if not exists events ( id bigserial primary key, titel text not null, kategorie text not null default 'task', datum_start date not null, datum_ende date, zeit_start text, zeit_ende text, dauer_min integer, dringlichkeit text default 'verschiebbar', status text default 'offen', quelle text default 'manuell', prod_id bigint, image_id bigint, board text, pin_titel text, pin_beschreibung text, etsy_url text, betrag numeric, vorlauf_tage integer, wiederholt_jaehrlich boolean default false, ref_key text, notiz text, external_source text, external_id text, external_updated_at timestamptz, sync_status text default 'nur_lokal', created_at timestamptz default now(), updated_at timestamptz default now() ); create unique index if not exists events_ref_key_unique on events(ref_key); -- KEIN partial index (WHERE) — supabase-js/PostgREST kann WHERE-Klauseln bei upsert(onConflict) nicht mitsenden (bekannter Bug: github.com/supabase/postgrest-js/issues/403) create table if not exists event_reminders ( id bigserial primary key, event_id bigint references events(id) on delete cascade, vorlauf_minuten integer not null, kanal text default 'app_notification', ausgeloest boolean default false, created_at timestamptz default now() ); create table if not exists event_attachments ( id bigserial primary key, event_id bigint references events(id) on delete cascade, storage_path text not null, dateiname text, typ text default 'pdf', created_at timestamptz default now() ); alter table images add column if not exists motiv_bezeichnung text; alter table images add column if not exists notiz text; alter table events enable row level security; alter table event_reminders enable row level security; alter table event_attachments enable row level security; create policy "Eingeloggte Nutzer: alles erlaubt" on events for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated'); create policy "Eingeloggte Nutzer: alles erlaubt" on event_reminders for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated'); create policy "Eingeloggte Nutzer: alles erlaubt" on event_attachments for all using (auth.role() = 'authenticated') with check (auth.role() = 'authenticated'); create index if not exists events_datum_start_idx on events(datum_start); create index if not exists events_kategorie_idx on events(kategorie); create index if not exists events_datum_kategorie_idx on events(datum_start, kategorie); -- === Update v1.2.0 → v1.3.0 === -- Saison-Key für Produkte (Kategorie als Standard, manuell überschreibbar) alter table products add column if not exists saison_key text; -- === Update v2.1.2 → v2.1.3 (KRITISCHER FIX) === -- Ursache für leeren Kalender gefunden: events_ref_key_unique war ein PARTIAL INDEX -- (mit WHERE ref_key is not null). supabase-js/PostgREST kann bei upsert(onConflict:...) -- keine WHERE-Klausel mitsenden — das ist ein seit 2023 bekannter, ungelöster Bug im -- Supabase-Client selbst (github.com/supabase/postgrest-js/issues/403), kein Fehler in -- deiner Datenbank. Lösung: Index OHNE WHERE-Klausel neu anlegen. Das ist unbedenklich: -- Postgres behandelt NULL-Werte in UNIQUE-Indizes standardmäßig immer als verschieden -- voneinander, ein normaler Index erlaubt also weiterhin beliebig viele Events ohne -- ref_key (z.B. deine manuell angelegten Termine). drop index if exists events_ref_key_unique; create unique index if not exists events_ref_key_unique on events(ref_key); -- === Update v2.2.1 → v2.3.0 (F22) === -- Bidirektionale Workflow-Kalender-Synchronisation: Termin ↔ Produkt-Workflow-Schritt alter table events add column if not exists wf_step integer; -- === Update v2.4.0 → v2.5.0 (F24b Teil 1) === -- Eigene, editierbare Board-Verwaltung statt hartcodierter Beispiel-Boardnamen create table if not exists boards ( id bigserial primary key, name text not null, beschreibung text, sortierung integer default 0, pinterest_status text default 'ungeprueft', pinterest_geprueft_am timestamptz, created_at timestamptz default now() ); -- === Update v2.5.1 → v2.6.0 === -- Trennung privater Bearbeiten-Link / öffentlicher Etsy-Listing-Link, -- Status wechselt automatisch auf 'live' sobald der öffentliche Link gesetzt wird alter table products add column if not exists etsy_edit_url text; -- === Update v2.6.0 → v2.7.0 (F32) === -- Carousel-Pins: mehrere Bilder pro Pin, eigene Tagesziel-Kennzahl create table if not exists plan_bilder ( id bigserial primary key, plan_id bigint not null references plan(id) on delete cascade, image_id bigint not null, reihenfolge integer default 0, created_at timestamptz default now() );
Version & Releasenotes
v2.8.0
Juli 2026
Versionierung (SemVer): MAJOR.MINOR.PATCH – die 1. Stelle ändert sich nur bei grundlegenden Umbauten, die 2. Stelle bei neuen Funktionen, die 3. Stelle bei Fehlerbehebungen. Jede Version ist einmalig.
v2.8.0 — Neuer Tab: Ablaufdiagramm
◆ Neuer Menüpunkt "Ablaufdiagramm" zeigt den kompletten Weg einer Idee bis zum laufenden Verkauf als grafisches Flussdiagramm — alle Status und Bedingungen auf einen Blick
◆ Zeigt die echten 7 Workflow-Schritt-Namen, die Etsy-Status-Logik (F34), die Pinterest-Zählung (F24) und die bidirektionale Kalender-Synchronisation (F22) — automatisch aus der echten App-Konfiguration erzeugt, nicht aus separat gepflegtem Text
◆ Fund beim Erstellen: die Kalender-Phase "Design fertigstellen" ist mit Workflow-Schritt 3 verknüpft, der aber tatsächlich "Titel & Tags prüfen" heißt — im Diagramm korrekt beschriftet und als Hinweis markiert, noch nicht behoben
◆ 23 neue Tests, u.a. ein Test der direkt gegen die echte WORKFLOW_STEPS-Liste prüft, damit das Diagramm nie veraltet
v2.7.0 — Carousel-Pins, Tagesziel, Pin-Arten bereinigt (F32 abgeschlossen)
◆ Nachgeholt: die bei der letzten Session unterbrochene Pinterest-Format-Recherche wurde vollständig zu Ende gebaut, nicht nur dokumentiert
◆ Neue Pin-Art "Carousel-Pin" mit echter Mehrbild-Verwaltung: mehrere Bilder aus der Produkt-Mediathek einem Pin zuordnen, im Upload-Planer direkt verwaltbar
◆ Das veraltete "Idea Pin" wurde entfernt (Pinterest hat dieses Format 2023/24 abgeschafft — siehe v2.5.1)
◆ Neue, eigenständige Kennzahl "Ziel-Pins pro Tag" (Einstellungen → Pinterest-Marketing) mit Live-Anzeige im Upload-Planer, getrennt von der bestehenden "Pins pro Produkt"-Regel
v2.6.0 — Getrennte Etsy-Links + automatischer Live-Status (F34)
◆ Neue Trennung in Workflow-Schritt 5: privater Bearbeiten-Link (Etsy-Shop-Manager) und öffentlicher Listing-Link (für Pins/Marketing) sind jetzt getrennte Felder
◆ Bugfix/neue Funktion: der Produktstatus (Entwurf/Bereit/Live) ließ sich bisher nirgends ändern außer beim Neuanlegen — jetzt wechselt er automatisch auf "live", sobald der öffentliche Listing-Link eingetragen wird
◆ Wird der öffentliche Link wieder entfernt, fällt der Status zurück auf "bereit" (nicht "entwurf") — die bereits geleistete Arbeit bleibt sichtbar
v2.5.1 — Pinterest-Experten-Korrekturen (F33)
◆ Neue Hilfe-Anleitung: Rich Pins aktivieren — automatische Preis-/Verfügbarkeitsanzeige direkt im Pin, einmalige kostenlose Einrichtung bei Pinterest, kein App-Update nötig
◆ Vorlaufzeit für die Pins-Phase korrigiert: 6 → 10 Wochen (recherchierte Empfehlung: 8-12 Wochen vor dem Anlass, nicht 6)
◆ KI-Textgenerierung für Board-Beschreibungen verschärft: konkrete 3-5-Keyword-Regel statt vager "natürlich eingebaut"-Anweisung
v2.5.0 — Eigene Pinterest-Boards verwalten (F24b Teil 1)
◆ Neue Board-Verwaltung im Pinnwände-Tab: eigene Board-Namen + Beschreibungen eintragen, ändern, löschen — ersetzt die 7 hartcodierten Beispiel-Boards
◆ Diese Liste wird jetzt überall in der App verwendet: Pin-Planung, automatische Vorschläge, KI-Textgenerierung
◆ Status-Spalte "existiert bei Pinterest" vorbereitet, wird in einer späteren Version automatisch geprüft (sobald die Pinterest-Anbindung steht) — bewusst als Live-Abfrage geplant, kein dauerhaftes Speichern der Pinterest-Daten (entspricht Pinterests Entwicklerrichtlinien)
◆ 14 neue Tests sichern die Board-Verwaltung ab, inklusive Absicherung gegen weniger als 7 Boards
v2.4.0 — Pins als Zeitraum + automatische Erledigt-Zählung (F24 Teil 2)
◆ "Pins erstellen" erscheint jetzt als durchgehender Zeitraum im Kalender und Cockpit, nicht mehr als Einzeltermin — von 6 Wochen vor dem Anlass bis zum Start der Peak-Phase
◆ Workflow-Schritt 6 (Pinterest-Pins) wird automatisch als erledigt markiert, sobald genug Pins im Upload-Planer für das Produkt angelegt sind — Zielanzahl einstellbar (Einstellungen → Pinterest-Marketing, Standard 3)
◆ Löschen einer Pin-Zeile oder Ändern der Produktzuordnung aktualisiert den Fortschritt automatisch in beide Richtungen
◆ Nutzt die bestehende F22-Synchronisation — kein neuer Mechanismus, nur ein weiterer Auslöser
◆ 15 neue Tests sichern Zeitraum-Berechnung, Zählung und den Produktwechsel-Sonderfall ab
v2.3.1 — Upload-Planer: Produkt-Zuordnung (F24 Teil 2, Schritt 1)
◆ Jede Pin-Zeile im Upload-Planer kann jetzt einem Produkt zugeordnet werden — Grundlage für die kommende automatische Erledigt-Zählung von Workflow-Schritt 6
◆ Bugfix: Änderungen im Upload-Planer (Datum, Titel, Board, Typ, URL, Status) wurden bisher nur lokal gespeichert, nie in die Datenbank geschrieben — jetzt korrekt synchronisiert auf allen Geräten
◆ 6 neue Tests sichern die Produkt-Zuordnung und deren Speicherung ab
v2.3.0 — Workflow ↔ Kalender bidirektional synchronisiert (F22, Teil 1)
◆ Workflow-Schritt im Produkt abhaken → zugehöriger Kalender-Termin wird automatisch erledigt markiert (Design/Fotos/Listing)
◆ Kalender-Termin als erledigt markieren → zugehöriger Workflow-Schritt im Produkt wird automatisch mitgezogen
◆ Kein doppeltes Abhaken mehr nötig — beide Richtungen bleiben synchron, mit Endlosschleifen-Schutz
◆ Jede Planungsphase hat jetzt eindeutig einen Workflow-Schritt zugeordnet (auch Pins/Peak, geteilt auf Schritt 6)
◆ Pins/Peak als Zeitraum + automatische Erledigt-Zählung über den Upload-Planer folgt als Teil 2
◆ 16 neue Tests sichern beide Sync-Richtungen und den Endlosschleifen-Schutz ab
v2.2.1 — FullCalendar-Umstellung nachbereinigt
◆ Bugfix: erledigte Termine im Kalender waren optisch nicht von offenen zu unterscheiden — fehlende CSS-Regel ergänzt (abgeblendet + durchgestrichen)
◆ Aufräumen: MONATE/WOCHENTAGE-Konstanten entfernt, die nur den durch FullCalendar ersetzten Funktionen dienten
◆ Vollständig geprüft: keine verwaisten Funktionsaufrufe, keine fehlenden CSS-Klassen, keine toten HTML-Element-Referenzen. Legacy-Pin-Kalender (noch aktiv genutzt) bewusst unangetastet gelassen — teilt sich .cal-day/.pslot-Klassen mit dem alten Code
v2.2.0 — Kalender läuft jetzt auf FullCalendar (F29)
◆ Grundlegender Architekturwechsel: das selbstgebaute Kalender-Gitter wurde durch FullCalendar ersetzt — ein etabliertes, kostenloses (MIT-Lizenz) Open-Source-Kalendermodul mit über 10 Jahren Entwicklung
◆ Mehrtägige Termine (Saison-Vorlauf, Peak-Zeiten) werden jetzt nativ korrekt dargestellt — keine selbstgebaute Auffächerungslogik mehr nötig
◆ Alle bisherigen Ansichten (4 Wochen/Monat/3 Monate/Woche/Tag) bleiben erhalten, jetzt auf robusterer Grundlage
◆ Datenquelle (dbGetEvents, Cache) unverändert — nur die Darstellung wurde ersetzt, keine Datenmigration nötig
◆ Kein Build-Prozess nötig: FullCalendar wird wie Supabase per CDN-Script eingebunden
◆ 25 neue Tests sichern den Adapter ab; Testsuite bereinigt (10 veraltete Render-Tests entfernt, redundante Testdatei gelöscht)
v2.1.4 — Kalender-Performance und fehlende Zeiträume behoben
◆ Bugfix: 3-Monats-Ansicht zeigte Saison-Zeiträume (Vorlauf/Peak) nur am ersten Tag, nicht über den ganzen Zeitraum — Ursache war eine eigene, fehlerhafte Datenladung statt der korrekten gemeinsamen Logik
◆ Performance-Bugfix: Jede Kalenderabfrage lud bisher pauschal 90 Tage zusätzliche Daten "auf Verdacht" — ersetzt durch zwei präzise, indexierte Abfragen. Wirkt sich mit wachsender Terminanzahl zunehmend spürbar aus
◆ 6 neue Regressionstests sichern beide Fixes dauerhaft ab
v2.1.3 — Kalender-Bug WIRKLICH behoben: Partial-Index-Inkompatibilität
◆ ECHTE URSACHE gefunden (mit Sues Hilfe, direkte pg_indexes-Abfrage): events_ref_key_unique war korrekt als PARTIAL INDEX angelegt (mit WHERE ref_key is not null) — aber supabase-js/PostgREST kann bei upsert(onConflict:...) keine WHERE-Klausel mitsenden. Bekannter, seit 2023 offener Bug im Supabase-Client selbst (github.com/supabase/postgrest-js/issues/403), keine Fehlkonfiguration
◆ Fix: Index ohne WHERE-Klausel neu angelegt — unbedenklich, Postgres erlaubt in normalen UNIQUE-Indizes immer beliebig viele NULL-Werte
◆ SQL-Update-Feld enthält den nötigen Migrations-Befehl (drop + neu anlegen)
◆ Diagnose-Meldung korrigiert: zeigt jetzt die echte Ursache statt fälschlich "Index fehlt"
v2.1.2 — Ursache des leeren Kalenders gefunden und Diagnose erweitert
◆ GEFUNDEN: Fehlender UNIQUE INDEX auf events.ref_key in der Datenbank verhinderte JEDEN Saison-Sync (Postgres-Fehler 42P10) — SQL-Schema war nicht vollständig ausgeführt
◆ Diagnose prüft jetzt zuerst die Datenbank-Struktur, bevor sie 32 Schreibversuche unternimmt — zeigt bei diesem Fehler sofort den nötigen SQL-Befehl zum Kopieren
◆ Falls dein Kalender leer ist: Einrichtung → Diagnose zeigt jetzt direkt ob dieser Fehler vorliegt, mit fertigem Reparatur-SQL
v2.1.1 — Diagnose testet jetzt die echte Sync-Funktion
◆ Bugfix: "Sync-Sperre zurücksetzen" rief bisher eine vereinfachte Nachbau-Logik auf statt der echten syncSeasonToEvents() – hätte fälschlich Erfolg zeigen können
◆ Diagnose zählt jetzt Zeilen in der Datenbank vor/nach dem Sync und meldet ehrlich, wenn trotz "kein Fehler" nichts geschrieben wurde
◆ Bei stillem Abbruch: automatischer isolierter Schreibtest zur Eingrenzung (Schreiben selbst vs. Schleife/Daten)
v2.1.0 — Kalender-Diagnose (Tablet-freundlich)
◆ Neue Diagnose-Karte im Einrichtungs-Tab: prüft Supabase-Verbindung, Datenbank-Zugriff und Sync-Sperren sichtbar – ohne Entwicklerkonsole
◆ "Sync-Sperre zurücksetzen & neu versuchen": setzt alle Sperren zurück, schreibt testweise Termine und zeigt jeden Fehler im Klartext
◆ Falls der Kalender leer bleibt: Einrichtung → Diagnose ausführen zeigt jetzt die genaue Ursache
v2.0.0 — Modulare Architektur
◆ App in 19 Dateien aufgeteilt (index.html + 18 JS-Module) — deutlich wartbarer und weniger fehleranfällig
◆ Deployment unverändert: ZIP mit index.html + js-Ordner zu Cloudflare
◆ Alle 95 Tests bestätigen: funktional identisch zur Vorversion
◆ Grundlage für die nächsten Ausbaustufen (Backup, Kapazitätsplaner, Google Calendar)
v1.8.0 — "Deine Aufgaben"-Cockpit
◆ Neues Cockpit auf Startseite UND im Kalender: Überfällig / Diese Woche / Nächste Woche
◆ Aufgaben direkt abhakbar, mit Sprung zum verknüpften Produkt
◆ Zeigt geplante Phasen-Termine, Pins, Aufgaben, Steuer- und Fixtermine (Saison-Zeiträume bleiben Info im Kalender)
v1.7.1 — Phasen-Fundament gehärtet
◆ Bugfix: Gespeicherte Einstellungen hätten künftige neue Workflow-Phasen verdeckt — Phasen-Struktur kommt jetzt immer aus der App, deine Wochen-Werte bleiben erhalten
◆ Workflow-Phasen sind vollständig Daten (Architektur Schritt 2a): neue Phasen/Kanäle künftig ohne Code-Umbau
v1.7.0 — Automatische Terminplanung
◆ Produkt einem Saison-Anlass zuordnen – die App plant alle Aufgaben-Termine rückwärts
◆ 5 Phasen automatisch: Design, Fotos, Etsy-Listing, Pins, Peak-Marketing
◆ Termine erscheinen im Kalender, verknüpft mit dem Produkt
◆ Warnung "zeitlich knapp", wenn ein Anlass zu nah ist
◆ Nutzt die einstellbaren Vorlaufzeiten aus den Einstellungen
◆ Bugfix: prod_id/image_id wurden bei Saison-Terminen nicht gespeichert (betraf Produkt-Verknüpfung)
◆ Bild-Mindestauflösung nutzt jetzt die Werte aus den Einstellungen
v1.6.0 — Zentrale Einstellungen
◆ Neuer Einstellungen-Tab: veränderliche Geschäftswerte zentral pflegen, global gültig
◆ Planungs-Vorlaufzeiten je Phase einstellbar (Design, Fotos, Listing, Pins, Peak, Kapazität)
◆ Etsy-Gebühren einstellbar – fließen direkt in den Preisrechner
◆ Saison-Vorlaufzeiten und Bild-Mindestauflösungen einstellbar
◆ Fundament für die kommende automatische Rückwärts-Terminplanung
v1.5.1 — Saison-Änderungen sofort sichtbar
◆ Bugfix: Datum ändern / Anlass hinzufügen / löschen aktualisiert jetzt sofort die Kalenderansicht (vorher nur die Übersichtsliste)
◆ Manuelle Änderungen umgehen die 24h-Sperre der Hintergrund-Synchronisation
◆ Verschobene Termine hinterlassen keine alten Einträge mehr (auch bei Jahreswechsel)
v1.5.0 — Hilfe & Sync-Fix
◆ Neuer Hilfe-Tab mit Anleitung zu jeder Funktion
◆ Bugfix: Saison-Sync blockierte sich 24h selbst, wenn die events-Tabelle beim ersten Versuch fehlte — Timestamp wird jetzt nur bei Erfolg gesetzt, Fehler werden sichtbar gemeldet
◆ Neuer Button "Saison-Termine neu erzeugen" für manuellen Sync
v1.4.0 — Versionierung & Feinschliff
◆ Versionsnummer unten im Navigationsmenü sichtbar
◆ Zentrale APP_VERSION-Konstante (Nav + Release Notes immer synchron)
◆ Semantische Versionierung nach Standard (MAJOR.MINOR.PATCH)
◆ Download-Dateien tragen die Versionsnummer im Namen
◆ Saisonübersicht in den neuen Kalender-Tab integriert
v1.3.0 — Saison-Kalender & Führung
◆ Kalender-Bugs behoben: doppelte Funktionsdefinitionen entfernt
◆ Saison-Events als echte Zeiträume: Vorlaufphase + Peak-Zeit + Haupttermin
◆ Neue Standardansicht: nächste 4 Wochen (mit Kalenderwochen-Anzeige)
◆ Cache-Bug behoben: Monat nach 3-Monate nutzt gecachte Daten
◆ Produkt-Saison-Zuordnung: saison_key Feld (Kategorie als Standard, manuell überschreibbar)
◆ Saison-Sync löscht alten Timestamp → Saison-Events werden beim nächsten Öffnen neu geschrieben
v1.2.0 — Vereinheitlichter Kalender
◆ Neuer Kalender-Tab ersetzt Wochenplaner + Pin-Kalender
◆ Vier Ansichten: Tag, Woche, Monat, 3 Monate (echtes Grid)
◆ 7 Kategorien: Pins, Aufgaben, Steuer, Produktentwicklung, Wartung, Fixtermine, Saisonanlässe
◆ Dringlichkeitsstufen: fix 🔒 / wichtig ⚡ / verschiebbar
◆ Automatische Migration bestehender Plan- und Aufgaben-Einträge
◆ Saisonkalender-Spiegelung als echte Kalendereinträge
◆ Performance: lokaler Cache, 24h-Throttle für Saison-Sync, Supabase-Indizes
◆ Cache-Bug behoben: Monat nach 3-Monate nutzt jetzt gecachte Daten
v1.1.0 — Modulare Architektur
◆ 238 Funktionen in 14 PC.*-Namespaces reorganisiert (PC.Medien, PC.KalenderPin, etc.)
◆ Echter JS-Parser (vm.Script) für Funktionsgrenzen statt Regex
◆ fmtDate-Duplikat-Bug behoben (stiller Fehler: zweite Definition überschrieb erste)
◆ Bootstrap-Reihenfolge korrigiert (checkAuthAndStart nach PC-Definition)
◆ Rückwärtskompatible globale Aliase für alle HTML onclick-Handler
v1.0.0 — Initiales Release
◆ Produktverwaltung mit KI-Analyse (Claude API)
◆ Mediathek mit Multi-Format-Bildbearbeitung (1:1, 4:5, 2:3)
◆ Saisonkalender mit Gauß'scher Osterformel, ICS Import/Export
◆ Pin-Planung mit Validierung (max. 10 Boards/Bild, min. 3 Tage Abstand)
◆ Mockup-Prompt-Generator für Midjourney/Canva
◆ Marktrecherche & Nischen-Analyse
◆ Supabase-Auth mit RLS, Cloudflare Pages Hosting
Bestehende Daten importieren
Hast du eine Backup-JSON-Datei aus der alten HTML-Version? Hier einladen: