Speisekarte, Artikel und Preise
Wozu dient das?#
Die Speisekarten- und Artikelverwaltung im Backoffice ist das zentrale Nervensystem Ihrer Betriebsdaten. Hier strukturieren Sie Ihr gesamtes Produktangebot in Kategorien, verwalten Verkaufsartikel, definieren Einzelpreise und Steuersätze, konfigurieren Produktvarianten und Modifikatoren (Extras/Abbestellungen) und steuern die Echtzeit-Verfügbarkeit an allen angebundenen Kassenterminals.
Ob Restaurant, Cafeteria, Bar oder Werkstattbetrieb – alle Verkaufsartikel, Jugendschutz-Vorgaben, Rezepturgrundlagen und Preisstrukturen werden an dieser Stelle einmalig angelegt und gepflegt.
Voraussetzungen#
- Ein betriebsbereiter Mandant mit mindestens einem eingerichteten Standort im Kassensystem.
- Ein aktiver Backoffice-Benutzerzugang mit administrativen Schreibrechten.
- Eine klare Übersicht der betrieblichen Produktkategorien, Verkaufspreise und der mit Ihrem Steuerberater geklärten Steuersätze.
Rollen & Berechtigungen#
| Rolle | Kategorien & Artikel | Preise & Steuersätze | Varianten & Extras | Status (In/Out of Stock) |
|---|---|---|---|---|
| Owner (Inhaber) | Anlegen, Bearbeiten, Löschen | Vollzugriff & Anpassung | Vollzugriff | Umschalten & Verwalten |
| Manager | Anlegen & Bearbeiten | Vollzugriff | Vollzugriff | Umschalten & Verwalten |
| Staff (Servicekraft) | Keine Rechte im Backoffice | Keine Rechte | Keine Rechte | Nur Ansicht an der Kasse |
| Accounting (Buchhaltung) | Leserechte | Leserechte | Leserechte | Leserechte |
Der Menü-Editor im Überblick#
Sie öffnen ihn im Backoffice mit MENÜ-EDITOR (→ Kapitel 20).
- 1 Neues Produkt hinzufügen öffnet das Formular für einen neuen Artikel.
- 2 Das Suchfeld Produkte nach Name oder Beschreibung suchen… filtert die Liste beim Tippen.
- 3 Die Kategorien: ALLE KATEGORIEN und je eine Schaltfläche pro Warengruppe. Das Zahnrad daneben öffnet die Kategorieverwaltung.
- 4 Die laufende Nummer der Zeile.
- 5 EINZELPREIS: der Verkaufspreis. Ein Tipp darauf öffnet die direkte Preisänderung.
- 6 STATUS: Die Schaltfläche zeigt Auf Lager oder Ausverkauft und schaltet den Artikel im Verkauf frei oder sperrt ihn.
- 7 AKTIONEN: Das Symbol mit den Reglern öffnet die ausführliche Bearbeitung, der Papierkorb archiviert den Artikel.
Bildschirm für Bildschirm#
1. Hauptübersicht: Produktinventar (MenuEditor.tsx)#
- Kopfzeile:
- Titel: Produktinventar (
product_inventory). - Untertitel: Verwalten Sie Ihre Menüartikel, Preise und Live-Terminal-Verfügbarkeit. (
manage_your_menu_items_pricing_and_live_). - Aktions-Schaltfläche: Neues Produkt hinzufügen (
add_new_product) mit Plus-Symbol (Plus) – öffnet das Erfassungsformular.
- Titel: Produktinventar (
- Such- und Filterleiste:
- Suchfeld:
search_products_placeholder(Produkte nach Name oder Beschreibung suchen…) – durchsucht Artikelnamen und Beschreibungen live während der Eingabe. - Kategorie-Schaltflächen:
- Alle Kategorien (
all_categories) – setzt alle Filter zurück und zeigt das gesamte Sortiment. - Dynamische Kategorie-Schaltflächen (z. B. "Vorspeisen", "Hauptgerichte", "Alkoholfreie Getränke").
- Zahnrad-Symbol (
Settings2) – aktiviert den Kategorie-Verwaltungsmodus (Umbenennen & Löschen von Kategorien). - Plus-Symbol (
Plus) im Verwaltungsmodus – öffnet den Prompt zur Eingabe eines neuen Kategorienamens. - Schließen-Symbol (
CloseIcon) – beendet den Kategorie-Verwaltungsmodus.
- Alle Kategorien (
- Suchfeld:
- Artikeltabelle:
- Spalte
#: Fortlaufende Zeilennummerierung. - Spalte
Produktdetails(product_details): Zeigt das Artikelbild (image_url) oder ein Platzhalter-Icon, den fettgedruckten Produktnamen sowie die zugewiesene Kategorie. Ein Klick auf den Produktnamen ermöglicht die direkte Inline-Textbearbeitung. - Spalte
Einzelpreis(unit_price): Zeigt den aktuellen Brutto-Verkaufspreis in Euro. Ein Klick auf den Preis öffnet ein Eingabefeld für die direkte Zeilen-Preisanpassung. - Spalte
Status(status): Interaktiver Status-Badge. Zeigt Auf Lager (t("in_stock"), grün hervorgehoben, im Verkauf) oder Ausverkauft (t("out_of_stock"), grau schattiert, ausverkauft). - Spalte
Aktionen(actions):- Detailbearbeitung (
detailed_edit) mit Zahnrad-Icon (Settings2) – öffnet das vollständige Artikel-Bearbeitungsmodal. - Archivieren/Löschen (
Trash2) – öffnet den Bestätigungsdialog zum Archivieren des Produkts.
- Detailbearbeitung (
- Spalte
2. Formular-Modal: Produkt bearbeiten (ProductEditorModal.tsx)#
- Kopfzeile: Titel Neues Produkt (
new_product) bzw. Produkt bearbeiten (edit_product) mit Untertitel Bestandsdetails und Preise aktualisieren. (update_inventory_details_and_pricing) und Schließen-Button (X). - Linker Formularbereich (Basisdaten):
- Produktname (
product_name): Pflichtfeld für die Artikelbezeichnung mit Platzhalter z. B. Club Mate (eg_club_mate). - Kategorie (
category): Dropdown-Auswahlfeld zur Zuweisung einer bestehenden Kategorie. - Preis (EUR) (
price_eur): Eingabefeld für den Brutto-Verkaufspreis in Euro (Eingabe in Euro, intern verarbeitet in Cents).
- Produktname (
- Rechter Formularbereich (Attribute & Steuern):
- MwSt.-Satz (%) (
vat_rate_percent): Drei Umschalt-Schaltflächen für 19%, 7% und 0%. - Barcode / SKU (
barcode_sku): Eingabefeld für EAN-Code oder Artikelnummer mit Platzhalter optional (optional). - Bild-URL (
image_url): Eingabefeld für einen Bild-Link mit Platzhalter https://... (https).
- MwSt.-Satz (%) (
- Unterer Formularbereich:
- Beschreibung (
description): Mehrzeiliges Textfeld für Inhaltsstoffe oder Hinweise für das Servicepersonal mit Platzhalter Kurze Details für das Personal... (brief_details_for_the_staff). - Verfügbar für den Verkauf (
available_for_sale): Schalter mit Statustext Blenden Sie diesen Artikel auf den Live-Terminals ein oder aus. (hide_or_show_this_item_on_the_live_termi).
- Beschreibung (
- Modal-Fußzeile:
- Abbrechen (
cancel): Schließt den Dialog ohne Speichern. - Produkt erstellen (
create_product) / Änderungen speichern (save_changes): Speichert den Artikel in der Datenbank.
- Abbrechen (
Schritt für Schritt (mit Verzweigungen)#
1. Kategorien verwalten#
- Navigieren Sie im Backoffice zum Bereich Produktinventar (
product_inventory). - Klicken Sie in der Kategorieleiste auf das Zahnrad-Symbol (
Settings2). - Neue Kategorie anlegen: Klicken Sie auf das Plus-Symbol (
+), geben Sie den gewünschten Namen ein und bestätigen Sie im Dialog. - Kategorie umbenennen: Fahren Sie mit der Maus über die Kategorie, klicken Sie auf das Stift-Symbol (
Edit2), passen Sie den Namen an und drücken Sie die Eingabetaste. - Kategorie löschen: Klicken Sie auf das Mülleimer-Symbol (
Trash2) an der Kategorie und bestätigen Sie im Sicherheitsdialog. > Verzweigung: Falls der Kategorie noch aktive Produkte zugeordnet sind, bricht das System das Löschen mit einer Fehlermeldung ab. Ordnen Sie die betroffenen Produkte zuerst einer anderen Kategorie zu.
2. Produkt manuell anlegen#
- Klicken Sie oben rechts auf Neues Produkt hinzufügen (
add_new_product). - Tragen Sie den Produktname (
product_name) ein. - Wählen Sie aus der Liste die passende Kategorie (
category). - Geben Sie den Verkaufspreis unter Preis (EUR) (
price_eur) ein (z. B.12.50). - Wählen Sie unter MwSt.-Satz (%) (
vat_rate_percent) den passenden Steuersatz (19%, 7% oder 0%). - Ergänzen Sie optional den Barcode / SKU (
barcode_sku) und eine Bild-URL (image_url). - Tragen Sie unter Beschreibung (
description) bei Bedarf Allergene oder Zubereitungshinweise ein. - Stellen Sie sicher, dass der Schalter Verfügbar für den Verkauf (
available_for_sale) aktiv ist. - Klicken Sie auf Produkt erstellen (
create_product).
3. Jugendschutz-Altersgrenze hinterlegen (min_age)#
- Für alkoholempfindliche Produkte oder Tabakwaren unterstützt das Backend das Feld
min_age(Altersgrenze in Jahren):- Bier, Wein, Schaumwein:
min_age = 16gemäß JuSchG § 9 Abs. 1 Nr. 2. - Spirituosen & holhaltige Mischgetränke:
min_age = 18gemäß JuSchG § 9 Abs. 1 Nr. 1. - Tabakwaren:
min_age = 18gemäß JuSchG § 10.
- Bier, Wein, Schaumwein:
- Wenn eine Servicekraft an der Kasse einen Artikel mit hinterlegtem
min_ageanboniert, zeigt das Kassenterminal eine Altersprüfungsmeldung an, die durch die Servicekraft bestätigt werden muss (→ Kapitel 13).
4. Schnellanpassung in der Liste (Tabellen-Editing)#
- Name direkt ändern: Klicken Sie in der Artikeltabelle direkt auf den Produktnamen in der Spalte Produktdetails (
product_details). Passen Sie den Text an und drücken Sie die Eingabetaste. - Preis direkt ändern: Klicken Sie auf den Euro-Betrag in der Spalte Einzelpreis (
unit_price), tragen Sie den neuen Wert ein und drücken Sie die Eingabetaste. - Verkaufsstopp umschalten: Klicken Sie in der Spalte Status (
status) auf den Button In Stock oder Out of Stock. Der Status wechselt sofort ohne Neuladen der Seite.
5. Produkt archivieren oder löschen#
- Klicken Sie in der Produktzeile auf das Mülleimer-Symbol (
Trash2) unter Aktionen (actions). - Bestätigen Sie die Warnmeldung im Dialog. Das Produkt wird archiviert, bleibt für historische Berichte und Belegprüfungen in der Datenbank erhalten, wird jedoch aus der aktiven Speisekarte entfernt.
Varianten und Optionen (Ausführliche Praxisbeispiele)#
Viele Gastronomie-Artikel bestehen nicht aus einem einzelnen Festpreis, sondern erfordern Entscheidungen bei der Bestellung (z. B. Größen, Garstufen, Beilagen oder Zusatzbeläge). Das Kassensystem unterscheidet hierbei strikt zwischen zwei Strukturen:
- Varianten-Gruppen (
CatalogVariantGroup): Erforderliche Ausführungen eines Produkts, die sich gegenseitig ausschließen (z. B. Portionsgröße oder Teigart). Eine Varianten-Gruppe besitzt die Eigenschaftis_required = True. - Modifikator-Gruppen (
CatalogModifierGroup): Optionale Zusatzwünsche, Beilagen oder Abbestellungen. Sie besitzen Mengengrenzen für Mindest- und Höchsteingaben (min_selections,max_selections).
Jede einzelne Variante oder Modifikator-Option kann einen relativen Preisaufschlag oder -abschlag (price_delta in Cents) besitzen.
Praxisbeispiel 1: Speisen – "Pizza Margherita" (Grundpreis: 8,50 €)#
- Varianten-Gruppe 1: "Größe" (
is_required = True, Auswahl genau 1)- Klein (26 cm):
price_delta = -150(-1,50 €) → Endpreis: 7,00 € - Normal (32 cm):
price_delta = 0(+0,00 €,is_default = True) → Endpreis: 8,50 € - Familie (45 cm):
price_delta = +650(+6,50 €) → Endpreis: 15,00 €
- Klein (26 cm):
- Varianten-Gruppe 2: "Teigart" (
is_required = True, Auswahl genau 1)- Klassik Weizen:
price_delta = 0(+0,00 €,is_default = True) - Dinkel-Vollkorn:
price_delta = +100(+1,00 €) - Glutenfrei:
price_delta = +200(+2,00 €)
- Klassik Weizen:
- Modifikator-Gruppe: "Extra-Belag" (
min_selections = 0,max_selections = 5)- Extra Käse:
price_delta = +150(+1,50 €) - Salami:
price_delta = +200(+2,00 €) - Parma-Schinken:
price_delta = +250(+2,50 €) - Knoblauchöl:
price_delta = +50(+0,50 €)
- Extra Käse:
- Modifikator-Gruppe: "Abbestellungen" (
min_selections = 0,max_selections = 3)- Ohne Oregano:
price_delta = 0(+0,00 €) - Ohne Knoblauch:
price_delta = 0(+0,00 €)
- Ohne Oregano:
Praxisbeispiel 2: Getränke – "Cappuccino" (Grundpreis: 3,80 €)#
- Varianten-Gruppe: "Milchart" (
is_required = True, Auswahl genau 1)- Vollmilch:
price_delta = 0(+0,00 €,is_default = True) - Hafermilch (Bio):
price_delta = +50(+0,50 €) - Laktosefrei:
price_delta = +30(+0,30 €)
- Vollmilch:
- Modifikator-Gruppe: "Extra Shots & Sirup" (
min_selections = 0,max_selections = 3)- Extra Espresso Shot:
price_delta = +120(+1,20 €) - Vanille-Sirup:
price_delta = +70(+0,70 €) - Karamell-Sirup:
price_delta = +70(+0,70 €)
- Extra Espresso Shot:
Ablauf an der Kasse (Was die Servicekraft sieht)#
- Die Servicekraft tippt auf dem Touch-Bildschirm der Kasse auf die Schaltfläche Pizza Margherita oder Cappuccino.
- Das Terminal öffnet sofort ein automatisches Auswahl-Pop-up.
- Die Kasse erzwingt zuerst die Auswahl der Pflicht-Varianten ("Größe", "Teigart" bzw. "Milchart"). Solange keine Ausführung gewählt ist, bleibt die Bestätigungs-Schaltfläche ausgegraut.
- Anschließend kann die Servicekraft beliebig viele Extras oder Abbestellungen antippen.
- Die Kasse berechnet den Gesamtwert dynamisch in Echtzeit (z. B. Cappuccino 3,80 € + Hafermilch 0,50 € + Extra Shot 1,20 € = 5,50 €) und übergibt die gewählten Optionen übersichtlich an das KDS (Küchendisplay) und den Bar-Drucker.
Steuersätze in der Praxis (Im-Haus vs. Außer-Haus)#
In Deutschland regelt das Umsatzsteuergesetz (§ 12 UStG) die Aufteilung in den Regelsteuersatz (19 %) und den ermäßigten Steuersatz (7 %). In der Gastronomie führt dies zu einer betrieblichen Besonderheit, die in der Praxis häufig zu Rückfragen führt: Derselbe Artikel kann je nach Verzehrort unterschiedlich besteuert werden.
Das praktische Beispiel:#
- Verzehr im Restaurant (Im Haus / Dine-in): Die Abgabe von Speisen gilt steuerlich als Dienstleistung und unterliegt grundsätzlich dem Regelsteuersatz von 19 % (vorbehaltlich temporärer gesetzlicher Sonderregelungen).
- Mitnahme / Lieferung (Außer Haus / Takeaway): Die Abgabe von Speisen zur Mitnahme gilt als Lieferung von Nahrungsmitteln und unterliegt dem ermäßigten Steuersatz von 7 %.
- Getränke: Unterliegen in Deutschland unabhängig vom Verzehrort (im Haus oder außer Haus) ausnahmslos dem Regelsteuersatz von 19 % (mit wenigen Ausnahmen wie reiner Milch).
Wie das Kassensystem dies steuert:#
Im Produktinventar hinterlegen Sie für jeden Artikel den Standard-Steuersatz (tax_rate). Bei der Bonierung an der Kasse wählt die Servicekraft die Auftragsart ("Im Haus" oder "Außer Haus"). Das System passt die Steuersätze für Speisen auf dem Beleg und im Fiskalspeicher automatisch an die gewählte Auftragsart an.
WICHTIGER STEUERRECHTLICHER HINWEIS: Das Kassensystem stellt die technischen Algorithmen zur dynamischen Steuerberechnung bereit. Das Programm führt jedoch keine steuerliche Beratung durch. Die konkrete Zuordnung der Steuersätze zu Ihren Produkten müssen Sie zwingend mit Ihrem Steuerberater oder Wirtschaftsprüfer abstimmen.
Preisänderungen und bestehende Bestellungen#
Betriebsinhaber gehen häufig davon aus, dass eine Stammdaten-Preisänderung im Backoffice alle Systemdaten rückwirkend anpasst.
Die tatsächliche Funktionsweise im Kassensystem:
- Ändern Sie den Preis eines Artikels im Backoffice (z. B. Erhöhung von Espresso von 2,50 € auf 2,80 €), gilt dieser neue Preis ausschließlich für zukünftig neu gebuchte Bestellpositionen.
- Offene Tischbestellungen: Bereits an Tischen gebuchte, aber noch nicht kassierte Positionen behalten exakt den Einzelpreis, der zum Zeitpunkt des Anbonierens gültig war.
- Gedruckte Küchenzettel & Bons: Bereits gedruckte Ausgabezettel behalten ihren historischen Wert.
- Fiskalprotokoll (TSE): Bereits signierte Transaktionen und abgeschlossene Tagesberichte (Z-Berichte) bleiben unverändert.
Dies stellt die rechtlich geforderte Unveränderbarkeit gemäß KassenSichV und GoBD sicher.
Gewichtsartikel und Tara (Preis pro kg)#
Für Artikel, die nach Gewicht verkauft werden (z. B. Steak nach Gramm, Kaffeebohnen oder Käse an der Bedientheke), unterstützt das System das Preismodell pricing_type = "weight".
- Preisangabe: Der im Feld Preis (EUR) (
price_eur) hinterlegte Wert gilt als Preis pro Kilogramm (EUR/kg). - Tara-Gewicht (
tare_weight_g): Im System kann das Eigengewicht der Verpackung, der Schale oder des Tellers in Gramm definiert werden (z. B.25für eine 25g-Verpackung). - Verarbeitung beim Wiegen: Bei der Bonierung an einer angebundenen Kassenwaage zieht das System das hinterlegte Tara-Gewicht automatisch vom Bruttogewicht ab und errechnet den exakten Netto-Verkaufspreis.
- Für die genaue Konfiguration von Kassenwaagen und eichrechtlichen Vorgaben beachten Sie den Querverweis
→ Kapitel 31.
Mehrere Standorte & Franchise-Katalog-Templates#
In Unternehmen mit mehreren Filialen oder Franchise-Strukturen ermöglicht das System die zentrale Bereitstellung von Katalog-Templates:
- Zentraler Stammkatalog: Änderungen an Produkten, Varianten oder Inhaltsstoffen werden vom Inhaber im Hauptkatalog gepflegt.
- Filialübergreifende Synchronisation: Die zentralen Produktdefinitionen können automatisiert auf alle zugewiesenen Filial-Standorte verteilt werden (→ Kapitel 34a).
Was passiert im Hintergrund#
- Die Eingaben im Backoffice werden über das
catalog-Modul der REST-API verarbeitet und in den PostgreSQL-Tabellenproducts,categories,catalog_variant_groups,catalog_variants,catalog_modifier_groups,catalog_modifiersundproduct_aliasesgespeichert. - Nach jedem Speichervorgang erzeugt das System ein Audit-Event im Outbox-Muster.
- Über den Redis-Pub/Sub-Kanal werden alle aktiven Kassenterminals des Standorts benachrichtigt, um den lokalen Artikel-Cache im Arbeitsspeicher der Kassen unverzüglich zu aktualisieren.
Häufige Probleme#
1. Fehlermeldung: Product not found#
- Ursache: Das aufgerufene Produkt wurde zwischenzeitlich von einem anderen Benutzer im Backoffice gelöscht oder archiviert.
- Lösung: Aktualisieren Sie die Ansicht im Browser mit
F5. Falls der Artikel benötigt wird, legen Sie ihn im Produktinventar neu an.
2. Fehlermeldung: Category not found or belongs to another tenant#
- Ursache: Die ausgewählte Kategorie existiert nicht mehr oder gehört zu einem abweichenden Mandanten.
- Lösung: Öffnen Sie das Bearbeitungsformular des Artikels und wählen Sie in der Klappliste Kategorie (
category) eine gültige Kategorie Ihres Standorts aus.
3. Fehlermeldung: Variant group not found#
- Ursache: Es wurde versucht, eine Variante einer Varianten-Gruppe zuzuweisen, die kurz zuvor entfernt wurde.
- Lösung: Erstellen Sie die Varianten-Gruppe im Produkt neu, bevor Sie einzelne Varianten hinzufügen.
4. Fehlermeldung: Variant not found#
- Ursache: Eine an der Kasse ausgewählte Variante wurde im Backoffice gelöscht, während das Kassenterminal noch ein altes Layout geladen hatte.
- Lösung: Starten Sie die Kassen-App am Terminal neu oder führen Sie eine Stammdaten-Synchronisation durch.
5. Fehlermeldung: Modifier group not found#
- Ursache: Die Modifikator-Gruppe wurde im Backoffice gelöscht, ist aber an Terminals noch verlinkt.
- Lösung: Prüfen Sie die Zuweisung der Modifikator-Gruppen im Artikelstammblatt.
6. Fehlermeldung: Modifier not found#
- Ursache: Ein spezifischer Zusatzstoff (z. B. "Extra Käse") wurde aus der Modifikator-Gruppe entfernt.
- Lösung: Aktualisieren Sie die Optionen der Modifikator-Gruppe im Backoffice.
7. Fehlermeldung: Product not found in your catalog#
- Ursache: Ein Terminal versucht, ein Produkt zu buchen, das nicht zum zugewiesenen Mandanten gehört (Mandantentrennungs-Konflikt).
- Lösung: Überprüfen Sie in den Geräteeinstellungen, ob das Kassenterminal dem korrekten Mandanten und Standort zugewiesen ist (→ Kapitel 22a).
8. Fehlermeldung: Coupon code already exists for this tenant#
- Ursache: Bei der Erstellung einer Rabattaktion oder eines Aktionscodes im Katalog wurde ein Gutscheincode eingegeben, der mandantenweit bereits vergeben ist.
- Lösung: Wählen Sie einen eindeutigen, noch nicht verwendeten Gutscheincode.
9. Fehlermeldung: Weight in grams (weight_g or gross_weight_g) is required for weight-priced items#
- Ursache: Ein gewichtsbasierter Artikel (
pricing_type = "weight") wurde an der Kasse gebucht, ohne dass ein Gewicht manuell eingegeben oder von der Waage übertragen wurde. - Lösung: Stellen Sie sicher, dass bei Gewichtsartikeln das Gewicht erfasst wird oder eine funktionierende Kassenwaage angebunden ist (→ Kapitel 31).
Grenzen#
- Keine rückwirkende Belegkorrektur: Nachträgliche Preis- oder Nameänderungen im Backoffice verändern keine historischen Tagesabschlüsse (Z-Berichte) oder bereits gedruckte Bons.
- Keine automatische Allergen-Berechnung: Nährwert- und Allergenangaben können im Beschreibungsfeld als Freitext hinterlegt werden; eine automatische Rezeptur-Nährwertberechnung ist nicht integriert.
Dieses Kapitel gehört zum Merkuron-Handbuch für Inhaber und Servicepersonal.