Fehlermeldungen
869 Meldungen aus dem laufenden Programm — was sie bedeuten und was zu tun ist. Suchen Sie nach dem Wortlaut oder nach der Kennung, die in der Meldung steht.
Apps und Erweiterungen
Apps und Erweiterungen (Installation, Zustimmung, Abrechnung, Auszahlung) · 16 Meldungen
app-zustimmung-fehltFür Betriebsinhaber · 403Erforderliche Zustimmung fehlt.
Die App ruft Daten ab, fuer die keine Zustimmung vorliegt — entweder wurde bei der Installation nie zugestimmt, oder eine neue Version verlangt ein Recht, das die alte Zustimmung nicht abdeckt.
app-unabhaengige-zustimmungFür Agenturen · 403Zustimmung durch unabhaengige Partei erforderlich.
Wer die App gebaut hat, darf ihr nicht selbst den Zugriff auf einen Betrieb erteilen. Die betreuende Agentur ist zugleich Anbieter der App — Zustimmung und Nutzen lagen damit in einer Hand.
app-nur-inhaberFür Betriebsinhaber · 403Sie muessen Eigentuemer sein, um diese Aktion durchzufuehren.
Apps installieren, deinstallieren, bezahlen und Datenschutzauskuenfte weitergeben sind Inhabersachen. Ein Mitarbeiterkonto — auch mit weiten Rechten — kommt hier nicht durch.
app-installation-inaktivFür Betriebsinhaber · 403Die Installation ist nicht aktiv.
Die Installation ist pausiert, deinstalliert oder wartet auf eine Zahlung. Zugriffstoken einer nicht aktiven Installation gelten nicht mehr.
app-plattform-deaktiviertFür Entwickler · 503Erweiterungen sind deaktiviert.
Die App-Plattform ist fuer diese Umgebung abgeschaltet (EXTENSIONS_ENABLED). Das ist der Notschalter — er wirkt fuer alle Betriebe gleichzeitig.
app-live-gesperrtFür Agenturen · 503Live-Betrieb derzeit gesperrt.
Eine Testfassung laesst sich im laufenden Betrieb gar nicht installieren — sie darf kein echtes Geld bewegen. Derselbe Fehler erscheint, solange die Plattform selbst fuer echte App-Zahlungen noch nicht freigegeben ist.
app-nicht-veroeffentlichbarFür Agenturen · 409Die App kann nicht veroeffentlicht werden.
Nur oeffentliche Apps gehen in die Pruefung. Eine individuelle App (von einem Betrieb fuer sich selbst gebaut) hat keinen Katalogplatz und keine Preise — sie ist ausdruecklich nicht weiterverkaeuflich.
app-versionszustandFür Agenturen · 409Ungueltiger Versionszustand.
Zur Pruefung eingereicht werden koennen nur Versionen im Entwurf oder solche, die abgelehnt wurden. Eine Version, die schon in Pruefung oder freigegeben ist, laesst sich nicht erneut einreichen.
app-nutzungslimitFür Betriebsinhaber · 400Ungueltiges Nutzungs-Limit.
Bei nutzungsbasierter Abrechnung muss die Obergrenze mindestens einen Einheitspreis betragen; bei jeder anderen Preisart darf gar keine Obergrenze gesetzt werden.
app-zahlung-nicht-verfuegbarFür Betriebsinhaber · 502Zahlungsdienst nicht verfuegbar.
Stripe hat keine Zahlungsseite zurueckgegeben. Meist eine Stoerung beim Zahlungsdienst, seltener eine unvollstaendige Einrichtung des Anbieterkontos.
app-gesperrtFür Betriebsinhaber · 403Diese App ist gesperrt.
Die Plattform hat die App gesperrt — etwa weil sie mehr Daten abgerufen hat, als ihr angegebener Zweck deckt, oder weil ihr Anbieter nicht erreichbar war.
app-eigentuemer-geaendertFür Betriebsinhaber · 403Eigentümer hat sich geändert.
Die Zustimmung haengt an der Person, die sie erteilt hat. Nach einer Betriebsuebergabe ist der zustimmende Inhaber nicht mehr der Inhaber — alle installierten Apps stehen damit still.
app-zugriff-abgelaufenFür Betriebsinhaber · 403Der Zugriff ist abgelaufen.
Die Installation hat ein Ende-Datum erreicht — gesetzt wird es bei der Deinstallation (sofort) und wenn ein Vertrag ausgelaufen ist.
app-modus-stimmt-nichtFür Entwickler · 403Test-/Produktivmodus stimmt nicht überein.
Die Installation gehoert zu einem anderen Modus als die App selbst — etwa eine Testfassung, die im Echtbetrieb angesprochen wird. Geld und Testgeld duerfen sich nicht vermischen.
app-schon-installiertFür Betriebsinhaber · 409Bereits installiert.
Diese App ist in diesem Betrieb schon aktiv oder wartet auf eine Zahlung. Eine zweite Installation daneben gibt es nicht — sonst waere unklar, welche Zustimmung gilt.
gaestesuche-plan-grenzeFür Betriebsinhaber · 402Feature "Gäste / CRM" ist im aktuellen Plan nicht enthalten. Verfügbar im Plan <Name>. / Die Testphase ist abgelaufen. Bitte wähle einen Plan, um "Gäste / CRM" weiter zu nutzen.
Die Gästesuche (GET /api/restaurants/[slug]/guests) verlangt das Plan-Feature 'guests'. Die Seite Apps → Datenschutz ist nur an den Eigentümer gebunden, nicht an einen Plan — ein Betrieb mit reinem Website-Plan erreicht sie also und stößt erst bei der Suche nach dem Gast an die Tarifgrenze. Früher stand dort nur 'Gäste konnten nicht geladen werden.'
Interne Administration
Interne Administration · 1 Meldungen
Kasse · Bedienung
Kasse · Bedienung · 2 Meldungen
pos-workflow-scopeFür Mitarbeiter · 423Dieser Vorgang gehört nicht zur bestätigten Aufgabe. Bitte die Aufgabe erneut öffnen.
Die Freigabe gehört zu einem anderen Tisch, Besuch, einer anderen Kasse oder einer anderen Bedienung.
pos-action-pin-requiredFür Mitarbeiter · 423Bitte diesen Vorgang mit der Bediener-PIN starten.
Der bestätigte Ablauf ist beendet oder abgelaufen, oder für diese Aktion wurde noch kein Kellnercode bestätigt.
KI-Agent · Live-Spracheingabe
KI-Agent · Live-Spracheingabe · 4 Meldungen
agent-live-connectionFür BetriebsinhaberDie Live-Verbindung konnte nicht aufgebaut werden. Bitte erneut versuchen.
Der WebRTC- oder Sideband-Verbindungsaufbau wurde unterbrochen oder hat sein Zeitlimit erreicht.
agent-live-providerFür BetriebsinhaberDie Live-Spracherkennung ist derzeit nicht verfügbar. Bitte erneut versuchen.
Der Anbieter hat die Anfrage abgewiesen oder eine nicht unterstützte Sitzungskonfiguration gemeldet.
agent-live-timeoutFür BetriebsinhaberDie maximale Aufnahmezeit ist erreicht. Der erkannte Text bleibt erhalten.
Die begrenzte Live-Aufnahme konnte nicht rechtzeitig finalisiert werden.
agent-live-finalizationFür BetriebsinhaberDie Spracheingabe wurde vor dem Abschluss getrennt. Der erkannte Text bleibt erhalten.
Der Abschluss oder die vom Anbieter bestätigte Nutzung fehlen. Unvollständige Transkripte werden nicht automatisch gesendet.
KI-Import, KI-Agent, E-Mail/Postfächer, Warenwirtschaft, Team/Einladungen, Abrechnung
KI-Import, KI-Agent, E-Mail/Postfächer, Warenwirtschaft, Team/Einladungen, Abrechnung · 169 Meldungen
abo-subscription-existsFür Betriebsinhaber · 409Du hast bereits ein Abo. Wechsle den Plan über „Plan wechseln“ – ein zweites Abo wird nicht angelegt.
Für den Betrieb läuft bereits ein Abo – laut eigener Abrechnung oder laut Stripe, etwa weil die Zahlung in einem anderen Tab gerade durchging. Ein zweiter Kauf legte ein zweites Abo an, das doppelt abgebucht würde.
abo-checkout-pendingFür Betriebsinhaber · 409Eine frühere Kasse für dein Abo wurde gerade bezahlt und wird noch bestätigt. Bitte buche nicht erneut – lade die Seite in ein paar Minuten neu.
Eine früher geöffnete Kasse wurde gerade bezahlt, Stripe bestätigt die Zahlung noch. Eine neue Kasse ergäbe ein zweites Abo.
abo-no-subscriptionFür Betriebsinhaber · 409Dafür brauchst du ein aktives, bezahltes Abo. Wähle zuerst einen Plan.
Ein Planwechsel oder das Zubuchen des Telefon-Agenten braucht ein bezahltes Abo bei Stripe mit einem Plan, den TacticTable kennt. Der Betrieb ist noch in der Testphase, wurde ohne Abo freigeschaltet, oder das Abo enthält keinen bekannten Planpreis. Beim Zubuchen des Telefon-Agenten heißt die Meldung „Dein Abo bei Stripe enthält keinen Plan, den TacticTable für die Buchung erkennt.“ – dort kommt sie nur noch vom unbekannten Planpreis (etwa ein alter oder rabattierter Preis).
abo-subscription-inactiveFür Betriebsinhaber · 409Dein Abo ist gerade nicht aktiv. Bitte kläre zuerst die offene Zahlung im Kundenportal.
Das Abo ist bei Stripe gerade nicht aktiv, meist wegen einer offenen oder fehlgeschlagenen Zahlung.
abo-payment-pendingFür Betriebsinhaber · 409Für dein Abo wartet noch eine Zahlung auf Bestätigung. Schließe sie zuerst ab.
Eine frühere Änderung am Abo wartet noch auf die Bestätigung der Zahlung, etwa per 3-D Secure.
abo-preview-expiredFür Betriebsinhaber · 409Die Vorschau ist abgelaufen. Bitte lade sie neu und prüfe die Beträge.
Die angezeigten Beträge gelten 10 Minuten. Danach rechnet Stripe die anteilige Verrechnung zu einem anderen Stichtag – bestätigt wird nie eine veraltete Vorschau.
abo-preview-changedFür Betriebsinhaber · 409Die Beträge haben sich seit der Vorschau geändert. Bitte prüfe die neue Vorschau.
Zwischen Vorschau und Bestätigung hat sich etwas geändert, das die Beträge beeinflusst – Preis, Abo oder Rabatt.
abo-payment-method-requiredFür Betriebsinhaber · 409Hinterlege im Kundenportal zuerst eine Karte oder ein SEPA-Lastschriftmandat als Standard-Zahlungsmittel.
Für das Abo ist kein Standard-Zahlungsmittel hinterlegt, mit dem Stripe den anteiligen Betrag sofort abbuchen kann (Karte oder SEPA-Lastschrift).
abo-schedule-unsupportedFür Betriebsinhaber · 409Für dein Abo ist bereits eine Änderung zum Laufzeitende geplant, die hier nicht sicher übernommen werden kann. Bitte wende dich an den Support.
Für das Abo ist bei Stripe schon eine Änderung zum Laufzeitende vorgemerkt (Abo-Zeitplan). Ein sofortiger Wechsel würde sie überschreiben oder verlieren.
abo-plan-unchangedFür Betriebsinhaber · 409Das ist bereits dein aktueller Plan mit diesem Abrechnungsintervall.
Gewählt wurde derselbe Plan mit demselben Zahlungsrhythmus, den das Abo schon hat.
abo-items-incompatibleFür Betriebsinhaber · 409Dein Abo enthält Positionen, die den Wechsel des Abrechnungsintervalls nicht mitmachen. Bitte wende dich an den Support.
Das Abo enthält weitere Positionen, die nur monatlich oder nur jährlich laufen. Stripe lehnt Abos mit gemischten Abrechnungsintervallen ab.
abo-price-not-configuredFür Entwickler · 503Der Preis ist auf dieser Umgebung nicht eingerichtet. Bitte wende dich an den Support.
Für den gewählten Plan fehlt auf dieser Umgebung die Stripe-Preis-ID, oder der hinterlegte Preis passt nicht zum Katalog (Betrag, Währung, Intervall).
abo-stripe-rejectedFür Betriebsinhaber · 402Stripe hat die Änderung abgelehnt. Prüfe dein Zahlungsmittel und versuche es erneut.
Stripe hat die Änderung abgelehnt, meist weil die Karte abgelehnt wurde. Am Abo hat sich nichts geändert.
abo-stripe-unavailableFür Betriebsinhaber · 502Stripe ist gerade nicht erreichbar. Bitte versuche es in einigen Minuten erneut – es wird nichts doppelt berechnet.
Stripe war nicht erreichbar, hat einen Serverfehler gemeldet oder die Anfrage wegen zu vieler Aufrufe gebremst. Ob die Änderung angekommen ist, klärt der automatische Abgleich – derselbe Vorgang wird nie doppelt berechnet.
abo-internalFür Betriebsinhaber · 500Die Abrechnung konnte wegen eines internen Fehlers nicht abgeschlossen werden. Bitte wende dich an den Support, bevor du es erneut versuchst.
Ein interner Fehler – etwa eine unerwartete Antwort von Stripe oder ein Datenbankfehler. Warten hilft hier nicht.
abo-conflictFür Betriebsinhaber · 409Der Vorgang wurde inzwischen geändert. Bitte lade die Seite neu.
Der Vorgang wurde inzwischen an anderer Stelle geändert, etwa in einem zweiten Tab. Beim Zubuchen des Telefon-Agenten heißt die Meldung „Dein Abo bei Stripe passt nicht zu dem, was TacticTable für deinen Betrieb gespeichert hat.“: Der Kunde bei Stripe passt nicht zum gespeicherten Abo.
ai-model-unavailable-agentFür BetriebsinhaberSSE-Ereignis type: "error" bzw. "notice", code: "ai_model_unavailable" (mit settingsUrl; reason: "chat_model_reset", wenn die Chatwahl zurückgesetzt wurde)
error: das Chat- oder Standardmodell fehlt beim Anbieter, der Lauf endet. War es die Chatwahl, steht die Unterhaltung danach wieder auf „Automatisch“. notice: ein gespeichertes Werkzeugmodell fehlt, der Schritt lief mit dem Standardmodell weiter (im selben Lauf wird es nicht erneut angefragt) – oder die Chatwahl wird nicht mehr angeboten und die Automatik hat übernommen.
unsupported-filesFür Betriebsinhaber · 400Mindestens eine Datei hat einen Typ, den der Import nicht lesen kann. Erlaubt sind Fotos (JPEG, PNG, WebP, GIF), PDF, CSV, TSV, Text und Excel (.xlsx). HEIC-Fotos vom iPhone und alte .xls-Dateien gehen nicht — bitte vorher als JPEG bzw. .xlsx oder CSV speichern.
Eine gewählte Datei hat einen MIME-Typ, der nicht in IMPORT_MIME_TYPES steht, oder sie ist größer als 20 MB (IMPORT_MAX_FILE_BYTES) bzw. es sind mehr als 20 Dateien.
unsupported-files-clientFür BetriebsinhaberNicht lesbar: <Dateinamen>. Erlaubt sind Fotos (JPEG, PNG, WebP, GIF), PDF, CSV, TSV, Text und Excel (.xlsx). HEIC-Fotos vom iPhone und alte .xls-Dateien gehen nicht …
Der Dialog prüft die aus der Mediathek gewählten Dateien schon im Browser gegen ERLAUBTE_TYPEN und lehnt sie vor dem Start ab.
unknown-filesFür Betriebsinhaber · 400Diese Dateien liegen nicht in der Mediathek dieses Betriebs: <Namen>
Die übergebenen Datei-URLs lassen sich keinem Medium dieses Betriebs zuordnen (fremder Betrieb oder Medium gelöscht).
upload-url-not-allowedFür BetriebsinhaberDiese Datei liegt nicht an einer erlaubten Upload-Adresse.
Die in filesJson gespeicherte Adresse besteht die Host-Prüfung (pruefeUploadUrl) nicht — typisch bei Altbestand vor der Verschärfung.
file-not-fetchableFür BetriebsinhaberDatei nicht abrufbar (HTTP <status>).
Der Abruf der Upload-Adresse antwortete nicht mit 2xx (Datei gelöscht, Speicher nicht erreichbar) oder wurde umgeleitet (redirect: 'error').
file-too-largeFür BetriebsinhaberDatei ist grösser als 20 MB.
Content-Length oder die tatsächlich geladenen Bytes überschreiten MAX_DOWNLOAD_BYTES (20 MB).
file-is-binaryFür BetriebsinhaberDiese Datei ist keine Textdatei (möglicherweise eine alte .xls-Datei oder ein anderes Binärformat). Bitte in Excel als .xlsx oder CSV speichern und erneut hochladen.
Über 5 % der ersten 8.000 Zeichen sind Steuerzeichen oder U+FFFD (istBinaer) — der Inhalt ist kein Text.
xlsx-unreadableFür BetriebsinhaberDiese Excel-Datei kann nicht gelesen werden. Alte .xls-Dateien werden nicht unterstützt: bitte in Excel als .xlsx oder CSV speichern und erneut hochladen.
JSZip kann die Datei nicht als ZIP öffnen — eine echte .xls ist BIFF, kein ZIP.
xlsx-no-sheetsFür BetriebsinhaberKeine Arbeitsblätter in der Datei gefunden.
Im ZIP liegt keine Datei xl/worksheets/sheetN.xml — die Arbeitsmappe ist beschädigt oder keine echte XLSX.
xlsx-first-sheet-emptyFür BetriebsinhaberDas erste Arbeitsblatt ist leer.
Gelesen wird nur das erste Blatt; steht die Liste auf Blatt 2, sieht der Import ein leeres Blatt.
file-no-readable-textFür BetriebsinhaberDie Datei enthält keinen lesbaren Text.
Nach dem Dekodieren bzw. der XLSX-Umwandlung bleibt kein Zeichen übrig — die Datei ist leer.
model-no-jsonFür BetriebsinhaberDas Modell antwortete ohne JSON: <erste 200 Zeichen>
In der Modellantwort steht keine geschweifte Klammernpaarung — die Antwort ist Prosa oder eine Ablehnung.
model-invalid-jsonFür BetriebsinhaberUngültiges JSON vom Modell: <Parserfehler>
JSON.parse scheitert am ausgeschnittenen Block — meist abgeschnittene Antwort bei sehr großen Dateien.
model-schema-mismatchFür BetriebsinhaberAntwort des Modells passt nicht zum Schema (<pfad>: <meldung>).
Das JSON des Modells verletzt extractionResultSchema (falsche Feldtypen, fehlende Pflichtfelder).
import-no-valid-filesFür BetriebsinhaberZu diesem Lauf sind keine gültigen Dateien gespeichert.
filesJson ist leer oder unlesbar, etwa nach einem Datenfehler an der Zeile.
import-file-incompleteFür BetriebsinhaberFür <n> Datei(en) fehlt das Ergebnis: ein Anlauf wurde mitten im Lesen beendet. Bitte diese Datei(en) in einem neuen Import erneut hochladen.
Gelesene Dateien plus Datei-Meldungen ergeben nicht die Zahl der Dateien — ein Anlauf wurde abgeschnitten (Laufzeitlimit).
refine-failedFür BetriebsinhaberNachbesserung fehlgeschlagen: <Meldung>
Der zweite Modellaufruf mit dem Hinweis des Wirts scheiterte; die vorige Vorschau bleibt gültig.
mapped-records-unreadableFür BetriebsinhaberDie zugeordneten Datensätze sind nicht mehr lesbar. Bitte den Import noch einmal starten.
mappedJson lässt sich nicht mehr parsen, obwohl totalCount > 0 ist — die LongText-Spalte wurde beschädigt.
extracted-json-conflictFür BetriebsinhaberDas Ergebnis der Auswertung konnte nicht gespeichert werden: die Zeile wurde laufend von einem anderen Anlauf verändert.
Der optimistische Spaltentausch schlug in allen Versuchen fehl, weil parallele Anläufe dieselbe Zeile schreiben.
import-stalledFür BetriebsinhaberDer Import kommt nicht voran. Möglich ist, dass der Hintergrundlauf nicht greift (CRON_SECRET fehlt oder der Zeitplan ist im Plan nicht enthalten) oder ein Schritt wiederholt abbricht. Du kannst ihn erneut starten.
Der Lauf steht länger als LAUF_TIMEOUT_MS auf PENDING/RUNNING; die Statusabfrage setzt ihn auf FAILED.
wrong-stateFür Betriebsinhaber · 409Dieser Lauf wartet nicht auf eine Freigabe.
Der Lauf steht nicht auf AWAITING_REVIEW — er wurde bereits freigegeben, abgebrochen oder arbeitet noch.
nothing-to-writeFür Betriebsinhaber · 400Es gibt keine Datensätze zum Übernehmen.
totalCount ist 0 — die Auswertung hat in den Dateien keine Gäste bzw. Reservierungen gefunden.
wrong-state-refineFür Betriebsinhaber · 409Nachbessern geht erst, wenn die Vorschau bereitsteht.
Nachbessern ist nur im Status AWAITING_REVIEW erlaubt; der Lauf arbeitet noch oder ist beendet.
import-start-failedFür BetriebsinhaberDer Import konnte nicht gestartet werden. / Die Nachbesserung konnte nicht gestartet werden. / Die Freigabe ist nicht durchgegangen. / Der Lauf konnte nicht abgebrochen werden.
Rückfall-Toasts, wenn die Anfrage netzwerkseitig scheitert oder die Antwort keine message/error trägt.
forbiddenFür Mitarbeiter · 403{"error":"forbidden","module":"guests|reservations","op":"..."}
Der angemeldeten Person fehlt das Modulrecht, das die Art des Laufs verlangt (Gäste bzw. Reservierungen).
not-found-importFür Mitarbeiter · 404{"error":"not_found"}
Der Lauf gehört zu einem anderen Betrieb oder existiert nicht — 404 statt 403, damit keine Kennungen preisgegeben werden.
ai-credits-exhausted-streamFür BetriebsinhaberDas KI-Guthaben ist aufgebraucht.
Der Lauf brach mit AiCreditsError ab; der Fehler geht als error-Ereignis mit Code AI_CREDITS_EXHAUSTED in den SSE-Strom.
agent-turn-limitFür BetriebsinhaberIch habe das Rundenlimit von 24 Schritten erreicht und höre hier auf. / _Abgebrochen: Rundenlimit von 24 Schritten erreicht._
state.turnCount erreicht MAX_MODEL_TURNS (24) — der Auftrag brauchte mehr Modell-Runden als erlaubt.
agent-run-errorFür Betriebsinhaber<Fehlermeldung des Laufs> (SSE-Ereignis type: 'error')
Ein Werkzeug oder der Modellaufruf warf; der Lauf wird auf status 'error' gesetzt und die Meldung in error gespeichert.
agent-unexpectedFür BetriebsinhaberUnerwarteter Fehler.
Rückfall im SSE-Transport, wenn der Handler mit einem Fehler ohne Message wirft.
agent-canceledFür BetriebsinhaberDer Auftrag wurde abgebrochen.
Verbindung weg (Tab geschlossen, Netzwechsel) oder AbortError; offene Teilaufgaben werden als failed geschlossen.
agent-step-errorFür BetriebsinhaberFehler: <Meldung> (im Schritt des Assistenten)
Ein einzelner Werkzeugaufruf warf; der Schritt wird mit status 'error' protokolliert und das Ergebnis als isError ans Modell gegeben.
attachment-not-foundFür Betriebsinhaber · 400Anhang gehört nicht zur Mediathek dieses Betriebs.
Eine mitgeschickte Anhang-URL lässt sich keinem Medium dieses Betriebs zuordnen.
conversation-not-foundFür Betriebsinhaber · 404Unterhaltung nicht gefunden
Die conversationId gehört nicht zu diesem Betrieb bzw. Nutzer oder wurde gelöscht.
empty-messageFür Betriebsinhaber · 400Leere Nachricht
Nach dem Trimmen bleibt kein Text und es sind keine Anhänge dabei.
run-not-awaiting-confirmationFür Betriebsinhaber · 409Dieser Lauf wartet auf keine Bestätigung.
Der Lauf steht nicht auf awaiting_confirmation — bereits bestätigt, abgelehnt oder abgebrochen.
undo-failedFür Betriebsinhaber · 500{"error":"undo_failed"}
Das Zurücknehmen warf einen unerwarteten Fehler (Datenbank, Theme-Datei).
undo-no-snapshotFür BetriebsinhaberKeine Momentaufnahme vorhanden. / Kein Datensatz vermerkt. / Datensatz existiert nicht mehr. / Keine Datei vermerkt. / Ein Restaurant wird nicht geloescht.
Im Rückgängig-Journal fehlt der Vorzustand oder der Datensatz wurde inzwischen anderweitig gelöscht; die Einträge landen in failed[].
undo-theme-missingFür BetriebsinhaberTheme nicht gefunden. / Kein aktives Theme gefunden.
Das zum Journaleintrag gehörende Theme existiert nicht mehr oder es ist kein Theme live gesetzt.
agent-tischplan-nicht-leerFür BetriebsinhaberAbgelehnt: An Tisch "…" hängt noch: … / Abgelehnt: Am Bereich "…" hängt noch: …
delete_table bzw. delete_area wurde für einen Datensatz aufgerufen, an dem noch Zeilen hängen, die die Datenbank kaskadierend mitlöschen würde (Reservierungs-Zuweisungen auch vergangener Reservierungen, Tischkombinationen, Tische, Sloteinstellungen, Sperren, Regeln). Das Rückgängig-Journal führt je Aufruf eine Zeile und könnte sie nicht zurückholen.
agent-undo-anhangFür BetriebsinhaberDaran hängt inzwischen: … Das Zurücknehmen würde es mitlöschen.
Ein vom Assistenten angelegter Bereich oder Tisch sollte zurückgenommen werden, trägt aber inzwischen Daten, die nicht aus diesem Lauf stammen (von Hand angelegte Tische, zugewiesene Reservierungen). Das Zurücknehmen wäre ein Löschen mit Kaskade. Der Satz steht in der Antwort der Rückgängig-Route (failed[].reason); die Oberfläche zeigt derzeit nur „x von y Änderungen zurückgenommen — n nicht.“
agent-tarif-fehltFür BetriebsinhaberNicht möglich: Feature "<Name>" ist im aktuellen Plan nicht enthalten.
Ein Einstellungs-Werkzeug des Assistenten (Öffnungszeiten, Reservierungseinstellungen, Sperren) prüft denselben Tarif wie die zugehörige Einstellungsseite. Der Assistent selbst ist in jedem Tarif enthalten, die Reservierungsfunktionen nicht.
agent-sperre-vergangenheitFür BetriebsinhaberNichts eingetragen: der <Datum> liegt in der Vergangenheit (heute ist der <Datum>).
Der Assistent sollte eine Sperre für einen vergangenen Tag eintragen — meist hat das Modell das Jahr falsch gewählt. Eine solche Sperre stünde in der Liste und sperrte nichts.
agent-sperre-falsche-felderFür BetriebsinhaberDiese Felder gehören nicht zur Sperr-Art "<Art>": <Felder>.
Das Modell hat die Felder einer anderen Sperr-Art geschickt (z. B. timeFrom/timeTo bei type day). Ungeprüft wäre daraus still eine Ganztagssperre geworden.
agent-keine-bereichssperreFür BetriebsinhaberBereichssperren legt der Assistent nicht an: die Seite Einstellungen → Sperren zeigt sie nicht, und eine Sperre, die dort niemand sieht, findet auch niemand wieder.
Die Sperren-Seite kennt nur Tage, Zeiten und Personenzahlen. Eine vom Assistenten angelegte Bereichssperre wäre wirksam, aber im Dashboard unsichtbar.
agent-offener-tag-ohne-zeitenFür BetriebsinhaberEin geöffneter Tag braucht Anfang und Ende — sonst gilt er als geschlossen.
Der Assistent sollte einen Wochentag öffnen, ohne dass beide Uhrzeiten feststanden. Die Buchungsstrecke bietet für einen solchen Tag nichts an.
agent-oeffnungszeiten-bereichszuordnungFür BetriebsinhaberNichts geändert: die Bereichszuordnung eines bestehenden Sets ändert der Assistent nicht — bitte unter Einstellungen → Öffnungszeiten.
Die Zuordnung Set ↔ Bereich lässt sich vom Rückgängig-Journal nicht sichern. Der Assistent ändert nur, was er auch zurücknehmen kann.
agent-personenzahl-widerspruchFür BetriebsinhaberNichts geändert: die kleinste online buchbare Personenzahl (<n>) läge über der größten (<m>) — online ließe sich dann gar nichts mehr buchen.
Die gewünschte Mindest- oder Höchstpersonenzahl widerspricht dem jeweils anderen, bereits gespeicherten Wert.
transcribe-not-configuredFür Entwickler · 503Die Spracherkennung ist noch nicht eingerichtet. Bitte wende dich an den Support.
Auf dem Server ist kein OPENAI_API_KEY gesetzt.
audio-too-largeFür Betriebsinhaber · 413Aufnahme zu groß. Bitte kürzer aufnehmen (max. 4 MB).
Die gesendete Audiodatei überschreitet 4 MB.
transcription-failedFür Betriebsinhaber · 502Die Spracherkennung konnte nicht erreicht werden. Bitte erneut versuchen.
Der Whisper-Aufruf antwortete mit einem Fehler oder brach ab.
transcription-provider-quota-exhaustedFür Entwickler · 503Die Spracherkennung ist wegen eines Abrechnungsproblems vorübergehend nicht verfügbar. Bitte kontaktiere den Support.
Der OpenAI-Zugang des Plattformbetreibers hat kein Guthaben oder keine verfügbare Quote mehr. Das KI-Guthaben des Restaurants ist davon unabhängig.
tts-not-configuredFür Entwickler · 501Sprachausgabe benötigt OPENAI_API_KEY (TTS).
Kein OPENAI_API_KEY auf dem Server gesetzt.
tts-failedFür Betriebsinhaber · 502Sprachausgabe fehlgeschlagen
Der TTS-Aufruf scheiterte oder lieferte kein Audio.
mailbox-blocked-hostFür Betriebsinhaber"<host>" kann nicht als Mailserver verwendet werden — die Adresse liegt im internen Netz. Bitte den Servernamen des E-Mail-Anbieters eintragen.
Der eingetragene Servername löst auf eine interne/private Adresse auf und wird vom host-guard gesperrt (SSRF-Schutz).
mailbox-timeoutFür BetriebsinhaberZeitüberschreitung nach <n> s zu <host:port>. Server und Port prüfen; oft blockiert auch eine Firewall den Port.
Der Verbindungsversuch lief in die Zeitgrenze (ETIMEDOUT, GREETING_TIMEOUT u. a.).
mailbox-connection-refusedFür BetriebsinhaberVerbindung abgelehnt von <host:port>. Dort nimmt kein SMTP/IMAP-Dienst an — meist ist die Portnummer falsch.
ECONNREFUSED: auf dem angegebenen Port lauscht kein Mail-Dienst.
mailbox-host-not-foundFür BetriebsinhaberServer "<host>" nicht gefunden. Bitte den Namen prüfen (Tippfehler, oder es fehlt z. B. "mail." davor).
DNS-Auflösung schlug fehl (ENOTFOUND, EAI_AGAIN).
mailbox-auth-rejectedFür BetriebsinhaberAnmeldung abgelehnt. Bei Gmail, Outlook und den meisten Anbietern braucht es ein eigenes App-Passwort statt des Kontopassworts. (Server: …)
EAUTH bzw. AUTHENTICATIONFAILED — Benutzername oder Passwort passt nicht, oder das Konto verlangt ein App-Passwort.
mailbox-cert-nameFür BetriebsinhaberDas Zertifikat von <host> passt nicht zu diesem Namen. Meist ist der Servername des Anbieters ein anderer als die eigene Domain.
ERR_TLS_CERT_ALTNAME_INVALID: eingetragen ist die eigene Domain statt des Anbieterservers.
mailbox-cert-expiredFür BetriebsinhaberDas Zertifikat von <host> ist abgelaufen. Das muss der Anbieter erneuern.
CERT_HAS_EXPIRED — das Serverzertifikat des Anbieters ist nicht mehr gültig.
mailbox-cert-untrustedFür BetriebsinhaberDas Zertifikat von <host> lässt sich nicht überprüfen (selbst ausgestellt oder unvollständige Kette).
Selbst ausgestelltes Zertifikat oder fehlendes Zwischenzertifikat auf dem Mailserver.
mailbox-no-starttlsFür Betriebsinhaber<host:port> bietet keine Verschlüsselung an (kein STARTTLS). Der Versuch wurde abgebrochen, weil die Zugangsdaten sonst im Klartext übertragen würden. Meist stimmt der Port nicht: IMAP 993 und SMTP 465 mit „SSL/TLS", SMTP 587 und IMAP 143 mit „STARTTLS".
requireTLS ist gesetzt, der Server kündigt STARTTLS aber nicht an — fast immer falscher Port oder falsche Verschlüsselungswahl.
mailbox-tls-mismatchFür BetriebsinhaberVerschlüsselung passt nicht zu <host:port>. Für Port 465 „SSL/TLS", für Port 587 und 143 „STARTTLS" wählen. (Server: …)
EPROTO/ESOCKET bzw. tlsFailed — die gewählte Verschlüsselung passt nicht zum Port.
mailbox-generic-failureFür BetriebsinhaberSMTP-/IMAP-Verbindung zu <host:port> fehlgeschlagen: <Servertext oder "Unbekannter Fehler.">
Rückfall für alle nicht eingeordneten Verbindungsfehler; der Fremdtext ist um Geheimnisse geschwärzt.
mailbox-secret-suppressedFür Betriebsinhaber[Meldung des Servers unterdrückt — sie könnte das Passwort enthalten]
Ein hinterlegtes Geheimnis ist kürzer als vier Zeichen; dann fällt der ganze Fremdtext weg statt halb geschwärzt zu werden.
credentials-undecryptableFür BetriebsinhaberDie hinterlegten Zugangsdaten lassen sich nicht entschlüsseln. Bitte das Passwort erneut eintragen.
Das verschlüsselte Passwort passt nicht zum aktuellen SECRETS_ENCRYPTION_KEY (Schlüssel gewechselt oder fehlt). Gleicher Text in imap.ts:31 und actions.ts:66.
smtp-config-missingFür BetriebsinhaberFür den Versand fehlen SMTP-Server und Port. / Für den Empfang fehlen IMAP-Server und Port.
Host leer oder Port 0 in der Postfach-Zeile (Empfang: src/lib/mail/sync.ts:85).
mailbox-no-passwordFür BetriebsinhaberFür dieses Postfach ist kein Passwort hinterlegt.
passwordEnc ist leer — das Postfach wurde ohne Passwort gespeichert.
crypto-unavailableFür Entwickler · 503Auf diesem Server fehlt der Schlüssel für die Passwortverschlüsselung (SECRETS_ENCRYPTION_KEY). Bis er eingerichtet ist, lassen sich keine Zugangsdaten speichern — bitte den Betreiber informieren.
SECRETS_ENCRYPTION_KEY fehlt oder hat die falsche Länge (MailboxCryptoUnavailableError). Gleiche Antwort in mailboxes/[id]/route.ts:154.
duplicateFür Betriebsinhaber · 409Dieses Postfach ist bereits verbunden.
Für diesen Betrieb existiert schon eine Verbindung mit derselben E-Mail-Adresse (Unique auf restaurantId+email). Gleiche Antwort beim Ändern: mailboxes/[id]/route.ts:63.
not-found-mailboxFür Betriebsinhaber · 404Postfach nicht gefunden.
Die Kennung gehört nicht zu diesem Betrieb oder das Postfach wurde gelöscht.
mailbox-inactiveFür Betriebsinhaber · 409Dieses Postfach ist abgeschaltet. Bitte in den Einstellungen aktivieren.
Das Postfach ist auf inaktiv gesetzt, es soll aber darüber gesendet werden.
send-failedFür Betriebsinhaber · 502Der Versand ist fehlgeschlagen. (bzw. die genaue SMTP-Diagnose)
sendViaMailbox kam nicht durch; die Meldung ist die geschwärzte SMTP-Diagnose aus describeMailError.
email-transport-not-configuredFür Entwickler{skipped: true, error: 'email_transport_not_configured'} — die Mail wurde NICHT versendet
Kein Standardpostfach vorhanden und kein RESEND_API_KEY gesetzt — es gibt keinen Versandweg.
mailbox-send-failedFür Betriebsinhaber{success: false, error: 'mailbox_send_failed'} (im EmailLog vermerkt)
Versand über das Kundenpostfach scheiterte oder warf; die Mail (z. B. Bestätigung) ist nicht raus.
resend-errorFür Entwickler[mailer] Resend error: <Meldung> (im EmailLog als error)
Resend lehnte den Versand ab — meist nicht verifizierte Absenderdomain oder ungültige Empfängeradresse.
sender-domain-unalignedFür Entwickler[mailer] Plattformadresse <adresse> liegt nicht auf der Domain von EMAIL_FROM (<from>) — sie ist bei Resend vermutlich nicht verifiziert und wird deshalb NICHT als Absender benutzt.
platformEmail und EMAIL_FROM liegen auf verschiedenen Domains; als Absender wird auf EMAIL_FROM zurückgefallen.
mail-message-unmappableFür BetriebsinhaberDie Nachricht lässt sich im Postfach nicht mehr zuordnen. Nach dem nächsten Abgleich stimmt die Ansicht wieder.
Zur lokalen Zeile fehlt eine Message-ID, mit der sie per IMAP SEARCH gefunden werden könnte.
mail-message-goneFür BetriebsinhaberDie Nachricht liegt nicht mehr in diesem Ordner — vermutlich wurde sie anderswo verschoben oder gelöscht.
Die IMAP-Suche findet keine UID mehr; die Nachricht wurde in einem anderen Programm bewegt.
mail-flag-rejectedFür BetriebsinhaberDer Server hat die Markierung nicht übernommen / nicht entfernt. Möglicherweise ist der Ordner schreibgeschützt.
messageFlagsAdd/Remove lieferte false — schreibgeschützter Ordner oder der Server speichert das Flag nicht dauerhaft.
mail-copy-failedFür BetriebsinhaberDie Nachricht liess sich nicht in den Zielordner kopieren. Sie steht unverändert im Ursprungsordner.
IMAP COPY scheiterte — Zielordner nicht beschreibbar oder Kontingent erschöpft.
mail-original-not-removedFür BetriebsinhaberDie Kopie liegt im Zielordner, das Original liess sich aber nicht entfernen. Nach dem nächsten Abgleich steht die Nachricht zweimal da.
Nach erfolgreicher Kopie schlug das Löschen im Ursprungsordner fehl.
mail-folder-missingFür BetriebsinhaberDieses Postfach hat keinen Ordner „<Ordner>". Nach dem nächsten Abgleich ist er bekannt.
Für die Zielrolle (Papierkorb, Entwürfe, …) ist lokal kein Ordner bekannt.
mail-move-not-confirmedFür BetriebsinhaberDer Server hat die Nachricht nicht verschoben.
IMAP MOVE bestätigte den Vorgang nicht; die Nachricht blieb, wo sie war.
mail-source-failedFür BetriebsinhaberDer Quelltext der Nachricht liess sich nicht erzeugen. / Der Server hat die Ablage abgelehnt.
Beim Ablegen eines Entwurfs/Gesendet-Eintrags scheiterte das Erzeugen oder das APPEND auf dem Server.
ai-output-menuFür Betriebsinhaber · 502Die KI hat keine brauchbare Karte geliefert. Bitte erneut versuchen.
Die Modellausgabe verletzt generatedMenuSchema; die Route antwortet mit error 'ai_output'.
ai-output-productFür Betriebsinhaber · 502Die KI hat kein brauchbares Produkt geliefert. Bitte erneut versuchen.
Die Modellausgabe verletzt generatedProductSchema.
ai-refusedFür Betriebsinhaber · 502Die KI hat die Anfrage abgelehnt. Bitte formuliere den Wunsch anders.
Das Modell endete mit einer Ablehnung (refusal) statt mit einem Ergebnis.
ai-truncatedFür Betriebsinhaber · 502Die Antwort der KI wurde abgeschnitten. Bitte den Wunsch enger fassen.
Das Token-Limit (max_tokens) war erreicht, bevor die Antwort vollständig war.
ai-no-parsable-outputFür Betriebsinhaber · 502Die KI hat keine auswertbare Antwort geliefert.
Die Antwort enthält kein auswertbares JSON zum vorgegebenen Schema.
forbidden-products-writeFür Mitarbeiter · 403Zu jedem Gericht entsteht ein Produkt in der Warenwirtschaft. Dafür fehlt Dir das Schreibrecht auf Produkte.
Die Karten-Erzeugung legt Produkte an; ohne Modulrecht products:write ist das gesperrt.
internal-warenwirtschaftFür Betriebsinhaber · 500{"error":"internal"}
Unerwarteter Serverfehler in den Warenwirtschafts-Routen (gleich in raw-materials:119, recipes:68, suppliers:75, warehouses:85, ai/product:172).
validation-warenwirtschaftFür Betriebsinhaber · 400{"error":"validation","issues":[…]}
Die gesendeten Felder verletzen das Zod-Schema (fehlende Pflichtfelder, falsche Einheiten/Zahlen).
not-found-categoryFür Betriebsinhaber · 404{"error":"not_found"}
Die angegebene Kategorie bzw. das Produkt gehört nicht zu diesem Betrieb oder wurde gelöscht.
staff-role-owner-onlyFür Mitarbeiter · 403Nur der Inhaber darf Administrator- oder Manager-Rollen vergeben.
Ein Nicht-Inhaber versucht, eine Rolle mit Verwaltungsrechten zu vergeben (auch beim Ändern: staff/[id]/route.ts:105).
staff-rights-escalationFür Mitarbeiter · 403Diese Rechte besitzen Sie selbst nicht.
Es werden Modulrechte vergeben, die der Einladende selbst nicht hat (auch staff/[id]/route.ts:120); die betroffenen Module stehen in modules.
staff-already-memberFür Betriebsinhaber · 409Dieser Nutzer ist bereits Mitglied.
Zur eingeladenen E-Mail existiert schon eine Mitgliedschaft in diesem Betrieb. Derselbe Satz kommt aus partners/[partnerId]/team/route.ts (POST; MembershipExistsError in src/lib/db-organizations.ts): wer schon Mitglied der Agentur ist, bekommt keine zweite Einladungsmail und keine stillschweigend geänderte Rolle — die Rolle Eigentümer vergibt die Teamroute ohnehin nicht mehr, Eigentum wechselt nur über die Übergabe.
staff-member-not-foundFür Betriebsinhaber · 404Mitglied nicht gefunden
Die Mitgliedschaft gehört nicht zu diesem Betrieb oder wurde bereits entfernt.
staff-owner-immutableFür Betriebsinhaber · 400Die Mitgliedschaft des Inhabers kann hier nicht geändert werden. / Der Inhaber kann nicht entfernt werden.
Der Inhaber ist gegen Rollenänderung und Entfernen geschützt (auch Zeile 189).
staff-self-changeFür Mitarbeiter · 403Die eigene Mitgliedschaft kann nur der Inhaber ändern.
Ein Nicht-Inhaber versucht, seine eigene Rolle oder Rechte zu ändern.
staff-invitation-not-foundFür Betriebsinhaber · 404Einladung nicht gefunden
Die Einladung gehört nicht zu diesem Betrieb oder wurde schon widerrufen bzw. angenommen.
team-user-not-registeredFür Betriebsinhaber · 404Zu dieser E-Mail-Adresse gibt es kein Konto. Die Person muss sich zuerst registrieren.
Team-Route und Übergabe verlangen ein bestehendes Konto zur E-Mail-Adresse. Derselbe Satz kommt aus restaurants/[slug]/transfer/route.ts, partners/[partnerId]/team/route.ts und partners/[partnerId]/transfer/route.ts (Konstante KEIN_KONTO_ZUR_EMAIL in src/lib/validations/team.ts).
team-manager-owner-onlyFür Mitarbeiter · 403Nur der Inhaber darf die Manager-Rolle vergeben.
Ein Nicht-Inhaber versucht, die Manager-Rolle zu setzen.
team-uebergabe-validationFür Betriebsinhaber · 400validation (mit message und issues), z. B. „E-Mail-Adresse: Bitte eine gültige E-Mail-Adresse angeben.“
Der Rumpf einer Team- oder Übergabe-Anfrage entspricht nicht dem Schema aus src/lib/validations/team.ts: keine oder ungültige E-Mail-Adresse, nicht vergebbare Rolle, unvollständiger Einladungslink oder kein JSON. Gilt für restaurants/[slug]/team, restaurants/[slug]/transfer, restaurants/[slug]/transfer-invite (ownershipTransferSchema), restaurants/transfer/accept, partners/[partnerId]/team und partners/[partnerId]/transfer. Früher endete das als 500 ohne Rumpf. Die Adresse wird vom Schema bereinigt (Leerzeichen, Grossschreibung), bevor sie gesucht oder eingeladen wird.
transfer-invite-betrieb-nicht-gefundenFür Agenturen · 404Betrieb nicht gefunden.
Der Wächter hat den Betrieb noch gefunden, die zweite Abfrage (Name und partnerId) nicht mehr — praktisch nur, wenn der Betrieb zwischen beiden Abfragen gelöscht wurde.
transfer-invite-ohne-agenturFür Betriebsinhaber · 400Dieser Betrieb wird von keiner Agentur betreut.
Die Übergabe per Einladung ist der Weg der Agentur: Sie setzt voraus, dass am Betrieb eine Agentur hängt (partnerId). Ohne Agentur gibt es keinen Agentur-Eigentümer, der einladen dürfte.
transfer-invite-agentur-nicht-gefundenFür Entwickler · 404Die betreuende Agentur wurde nicht gefunden.
Am Betrieb steht eine partnerId, zu der es keine Partner-Organisation mehr gibt — eine Waise ohne Fremdschlüssel (relationMode prisma), etwa nach dem Löschen der Agentur.
transfer-invite-nur-eigentuemerFür Agenturen · 403Nur der Eigentümer der Agentur kann Betriebe übergeben.
Der Aufrufer ist weder ownerId der Agentur noch Mitglied mit der Rolle PARTNER_OWNER. Administratoren der Agentur dürfen Betriebe bearbeiten, aber nicht übergeben — die Übergabe beendet die freie Nutzung und startet die Abrechnung beim Kunden. Der Rumpf wird vorher mit ownershipTransferSchema geprüft (team-uebergabe-validation). Eine neue Einladung widerruft offene Einladungen an dieselbe Adresse; bleibt die Mail aus, meldet die Karte „E-Mail NICHT verschickt“ (mailVerschickt: false).
transfer-accept-einladung-ungueltigFür Betriebsinhaber · 400Einladung ist nicht mehr gültig.
Die Übergabe-Einladung ist widerrufen oder beim Vollzug nicht mehr offen. Widerrufen wird sie durch eine neue Einladung an dieselbe Adresse und durch JEDE vollzogene Übergabe des Betriebs — direkt oder über eine andere angenommene Einladung: die Übergabe setzt acceptedAt in ihrer Transaktion und widerruft dabei alle übrigen offenen Einladungen des Betriebs. Dasselbe passiert, wenn dieselbe Einladung zweimal gleichzeitig angenommen wird; die zweite endet hier.
partner-team-eigentuemer-nicht-entfernbarFür Agenturen · 403Der Eigentümer kann nicht entfernt werden. Eigentum wird übergeben, nicht gelöscht.
DELETE …/team?userId= zeigte auf die ownerId der Agentur. ownerId bliebe auch ohne Mitgliedschaftszeile auf ihm — die Agentur hätte einen Eigentümer ohne Zugang zum Team. Eigentum verlässt eine Organisation nur über „Eigentümerschaft übertragen“.
partner-team-mitglied-nicht-gefundenFür Agenturen · 404Dieses Mitglied gehört nicht zur Organisation.
Zur userId gibt es in dieser Agentur keine Mitgliedschaft — meist eine veraltete Teamliste nach einem Entfernen in einem anderen Fenster.
partner-team-mitglied-unbekanntFür Entwickler · 400validation — „Dieses Mitglied ist unbekannt.“
Der Parameter userId der Entfernen-Anfrage fehlt oder ist keine UUID. Er kommt aus der Adresszeile; ohne Prüfung lief ein beliebiger String bis in die Abfrage. Über die Oberfläche nicht erreichbar, nur bei manipulierter Adresse.
invitation-not-foundFür Gäste · 404Einladung nicht gefunden.
Der Token im Link existiert nicht (Tippfehler, abgeschnittener Link, Einladung gelöscht).
invitation-revokedFür Gäste · 410Einladung wurde widerrufen.
revokedAt ist gesetzt — der Betrieb hat die Einladung zurückgezogen.
invitation-already-acceptedFür Gäste · 410Einladung wurde bereits angenommen.
acceptedAt ist gesetzt; der Link ist einmalig.
invitation-expiredFür Gäste · 410Einladung ist abgelaufen.
expiresAt liegt in der Vergangenheit.
invitation-no-longer-validFür Gäste · 410Einladung ist nicht mehr gültig.
Beim Annehmen ist die Einladung widerrufen, schon angenommen oder abgelaufen.
invitation-wrong-accountFür Gäste · 409Du bist mit einer anderen E-Mail angemeldet. Bitte melde dich ab und nimm die Einladung mit der eingeladenen Adresse an.
Die E-Mail der aktiven Sitzung stimmt nicht mit der eingeladenen Adresse überein.
invitation-account-existsFür Gäste · 401Für diese E-Mail existiert bereits ein Konto. Bitte melde dich an.
Zur eingeladenen Adresse gibt es schon ein Konto; requiresSignIn wird mitgeliefert.
invitation-signup-invalidFür Gäste · 400Name und Passwort (min. 8 Zeichen) sind erforderlich.
Beim Anlegen des Kontos über die Einladung fehlen Name oder ein Passwort mit mindestens 8 Zeichen.
invitation-load-failedFür GästeEinladung konnte nicht geladen werden. / Einladung konnte nicht angenommen werden.
Rückfalltexte der Einladungsseite, wenn die Antwort der API keinen eigenen Fehlertext trägt.
stripe-not-configuredFür Entwickler · 503{"error":"stripe_not_configured"}
Auf dem Server fehlen die Stripe-Schlüssel (auch portal/route.ts:41 und ai-credits/checkout/route.ts:31).
plan-price-missingFür Entwickler · 500Plan "<plan>" (<intervall>) ist nicht konfiguriert.
Für die Plan/Intervall-Kombination fehlt die Stripe-Price-ID in der Konfiguration.
stripe-errorFür Betriebsinhaber · 500Das Kundenportal von Stripe konnte nicht geöffnet werden. Bitte versuche es später erneut; hält es an, hilft dir der Support.
Stripe lehnte das Anlegen der Kundenportal-Sitzung ab (z. B. kein konfiguriertes Portal, unbekannter Customer).
portal-unavailableFür Betriebsinhaber · 502Das Kundenportal von Stripe konnte nicht geöffnet werden. Bitte versuche es später erneut; hält es an, hilft dir der Support.
Stripe lieferte für das Kundenportal eine Adresse, deren Host nicht in der Liste der Portal-Hosts steht (billing.stripe.com, checkout.tactictable.com). Weitergeleitet wird nur dorthin; das Server-Protokoll nennt den gelieferten Host.
kein-entwurfFür Betriebsinhaber · 422{"error":"kein_entwurf"}
Zu dieser Nachricht liess sich kein Antwortentwurf erstellen — meist, weil die Mail keinen auswertbaren Text hat (nur Bild, nur Anhang) oder das Modell nichts Brauchbares geliefert hat.
inbox-aiFür Betriebsinhaber · 422{"error":"inbox_ai"}
Die KI-Auswertung dieser Nachricht ist gescheitert — etwa weil der Nachrichtentext leer oder zu gross ist, oder weil die Antwort ihr Längenlimit erreicht hat („Die KI-Antwort hat ihr Längenlimit erreicht …“, stop_reason max_tokens; abgeschnittene Entwürfe werden nicht ausgegeben).
inbox-export-unvollstaendigFür Betriebsinhaber<X> von <Y> Nachrichten exportiert. Die übrigen wurden inzwischen verschoben oder gelöscht und fehlen in der Datei.
Der Export zählt, was der Server je Seite wirklich geliefert hat, und vergleicht es mit der Auswahl. Zwischen Auswählen und Exportieren (oder zwischen zwei Seiten) hat jemand Nachrichten verschoben oder gelöscht, oder der Mail-Abgleich hat den Ordner verändert.
inbox-export-deckelFür BetriebsinhaberDie Datei enthält die ältesten 10.000 von <Y> Nachrichten — ein Export endet bei 10.000. Für den Rest bitte über die Suche oder einen Unterordner eingrenzen.
Der Browser sammelt die Seiten des Exports im Speicher, bevor er die Datei anbietet. MAX_EXPORT_GESAMT (src/lib/mail/posteingang-grenzen.ts) deckelt deshalb einen Export bei 10.000 Nachrichten; exportiert werden die ältesten zuerst.
inbox-export-leerFür Betriebsinhaber · 404In dieser Auswahl liegt keine Nachricht. / Keine der Nachrichten gehört zu diesem Betrieb.
Der Filter des ganzen Ordners trifft auf der ersten Seite keine Nachricht (leerer Ordner, Suche ohne Treffer, fremder Ordner oder fremdes Postfach — restaurantId steckt immer im where), bzw. keine der übergebenen IDs gehört zum Betrieb.
inbox-export-cursorFür Entwickler · 400{"error":"validation","issues":[{"path":["cursor"],"message":"Die Fortsetzungsmarke ist ungültig."}]} (HTTP 400) / Blättern gibt es nur beim ganzen Ordner.
POST …/inbox/messages/export nimmt ENTWEDER ids (höchstens 500) ODER alleImOrdner (denselben Filter wie die Massenaktion) an; cursor ist nur zusammen mit alleImOrdner erlaubt und muss wörtlich aus dem Antwortkopf x-tt-naechster-cursor der vorigen Seite stammen. Ein unlesbarer Cursor gilt absichtlich NICHT als 'von vorn' — sonst stünde die erste Seite doppelt in der Datei.
inbox-export-antwort-unerwartetFür BetriebsinhaberDer Export hat eine unerwartete Antwort geliefert. Bitte die Seite neu laden.
Der Antwort fehlt der Zählerkopf x-tt-anzahl oder er ist keine Zahl — typisch direkt nach einem Deploy, wenn der Browser noch die alte Oberfläche oder der Server noch die alte Route ausliefert. Ohne Zähler ließe sich nicht sagen, ob die Datei vollständig ist; deshalb wird gar keine angeboten.
ungueltige-eingabeFür Betriebsinhaber · 400{"error":"ungueltige_eingabe","message":"<Feld>: <Grund>"}
Die in der Bestätigungskarte geänderten Werte passen nicht zum Werkzeug. Entweder stimmt die Form nicht (ein Pflichtfeld wurde geleert, eine Zahl ist keine Zahl, eine Auswahl liegt ausserhalb der Liste) oder — bei Reservierungen und Gästen — der Inhalt: eine Uhrzeit wie 25:99, eine Personenzahl unter 1 oder mit Komma, ein Datum, das es nicht gibt, eine E-Mail-Adresse ohne @ oder eine zu kurze Telefonnummer. `message` nennt das Feld und den Grund.
agent-karte-wert-abgelehntFür Betriebsinhaber<Feld>: <Grund> — z. B. „Uhrzeit: Ungültige Uhrzeit (HH:mm).“, „Personenanzahl: Mindestens 1 Person.“, „Personenanzahl: Bitte eine ganze Zahl angeben.“, „E-Mail-Adresse: Ungültige E-Mail-Adresse.“, „Telefonnummer: Diese Telefonnummer ist zu kurz.“, „Datum: Dieses Datum gibt es nicht.“
Ein in der Bestätigungskarte des Assistenten eingetragener Wert besteht die inhaltliche Prüfung nicht. Geprüft wird mit denselben Regeln wie im Dashboard: Uhrzeit 00:00 bis 23:59, ganze Personenzahl von 1 bis 200, ein Datum, das es im Kalender gibt, eine vollständige E-Mail-Adresse, eine Telefonnummer mit Ländervorwahl in plausibler Länge. Das gilt für Reservierung anlegen/ändern und Gast anlegen/ändern.
agent-werkzeug-eingabe-abgelehntFür BetriebsinhaberUngültige Eingabe — <Feld>: <Grund> Es wurde nichts angelegt. / Es wurde nichts geändert.
Der Assistent wollte eine Reservierung oder einen Gast mit einem Wert anlegen bzw. ändern, den das Dashboard auch nicht annähme (Uhrzeit ausserhalb 00:00–23:59, Personenzahl unter 1 oder nicht ganzzahlig, unmögliches Datum, unvollständige E-Mail-Adresse, Telefonnummer ohne Ländervorwahl oder zu kurz). Die Prüfung sitzt im Werkzeug selbst und greift deshalb auch dann, wenn der Wert vom Modell stammt und in der Karte nicht angefasst wurde. Der Satz steht als Ergebnis im aufgeklappten Schritt; der Assistent liest ihn ebenfalls und fragt nach oder korrigiert.
connect-not-enabledFür Entwickler · 409Stripe Connect ist für das Plattform-Konto noch nicht freigeschaltet.
Stripe beantwortet POST /v1/accounts mit 400 „You can only create new accounts if you've signed up for Connect". Connect ist ein einmaliger Schritt im Stripe-Dashboard des Plattform-Kontos und gilt für Test- und Live-Modus getrennt — keine fehlende Umgebungsvariable.
stripe-rejectedFür Entwickler · 409Stripe hat die Anfrage abgelehnt: <Wortlaut von Stripe>
Stripe hat geantwortet und die Anbindung abgelehnt (unzulässiges Land, fehlende Angabe, gesperrtes Konto). Der Wortlaut steht in der Meldung, der vollständige Fehler mit Request-ID im Server-Log.
stripe-unreachableFür Betriebsinhaber · 502Stripe konnte nicht erreicht werden. Bitte in einigen Minuten erneut versuchen.
Echter Netzfehler zu Stripe (StripeConnectionError/StripeAPIError). Bis September 2026 trug jeder Stripe-Fehler diesen Text — auch eine 400er-Ablehnung; seither sagt er wirklich nur „kein Weg zu Stripe".
stripe-authFür Entwickler · 503Der auf dem Server hinterlegte Stripe-Schlüssel wird von Stripe abgelehnt (STRIPE_SECRET_KEY).
Stripe weist den Schlüssel zurück (widerrufen, falscher Modus, eingeschränkte Rechte). Der Wortlaut von Stripe wird bewusst NICHT weitergereicht — er wiederholt den maskierten Schlüssel.
unknown-packageFür Betriebsinhaber · 400{"error":"unknown_package"}
Das gewählte Guthaben-Paket ist nicht (mehr) in der Paketliste enthalten.
auto-recharge-no-payment-methodFür BetriebsinhaberDie letzte automatische Aufladung ist fehlgeschlagen (<Datum>): Keine Zahlungsmethode hinterlegt. Bitte im Kundenportal eine Karte speichern.
Beim Off-Session-Abbuchen war keine Standard-Zahlungsmethode am Stripe-Customer hinterlegt; die Automatik pausiert 24 h.
auto-recharge-payment-incompleteFür BetriebsinhaberDie letzte automatische Aufladung ist fehlgeschlagen (<Datum>): Zahlung nicht abgeschlossen (Status: <status>).
Der PaymentIntent endete nicht auf 'succeeded' — meist verlangt die Karte eine Freigabe (3DS), die off-session nicht geht, oder sie wurde abgelehnt.
webhook-stripe-not-configuredFür Entwickler · 503Stripe not configured
Der Webhook-Endpunkt wird aufgerufen, obwohl keine Stripe-Konfiguration vorliegt.
webhook-secret-missingFür Entwickler · 503STRIPE_WEBHOOK_SECRET is not set
Ohne Webhook-Secret kann die Signatur nicht geprüft werden; Zahlungen werden nicht gutgeschrieben.
webhook-invalid-signatureFür Entwickler · 400Invalid signature / Missing signature
Der stripe-signature-Header fehlt oder passt zu keinem der konfigurierten Secrets — bezahltes Guthaben wird nicht gebucht.
webhook-handler-errorFür Entwickler · 500Handler error
Ein Event-Handler warf (Plan-Aktivierung, Guthabenbuchung, Connect); Stripe wiederholt das Event.
webhook-missing-restaurant-metadataFür Entwickler[stripe-webhook] checkout.session.completed without restaurantId metadata (bzw. ai-credits session/intent without restaurantId metadata)
Die Stripe-Sitzung trägt keine restaurantId in den Metadaten — die Zahlung lässt sich keinem Betrieb zuordnen.
webhook-payment-method-not-savedFür Betriebsinhaber[stripe-webhook] Zahlungsmethode konnte nicht gespeichert werden
Die Standard-Zahlungsmethode ließ sich nicht am Abo vermerken; die automatische Aufladung findet später keine Karte.
import-internalFür Betriebsinhaber · 500{"error":"Interner Fehler"}
Unerwarteter Serverfehler beim Starten oder Abfragen eines Importlaufs (auch GET, Zeile 248).
invalid-json-bodyFür Entwickler · 400{"error":"Invalid JSON body"}
Der Anfragerumpf ist kein gültiges JSON (auch confirm:44, undo:36, tts:43, settings:42).
mailbox-internalFür Betriebsinhaber · 500{"error":"Internal Server Error"}
Unerwarteter Serverfehler in den Postfach-Routen (auch [id]/route.ts:164 und [id]/test/route.ts:99).
Marketing
Marketing · 69 Meldungen
marketing-list-not-foundFür Mitarbeiter · 404Die Liste wurde nicht gefunden. Vielleicht wurde sie inzwischen gelöscht — bitte die Übersicht neu laden.
Die Liste gehört nicht zu diesem Betrieb oder wurde in einem anderen Tab bzw. von einer Kollegin gelöscht.
marketing-list-name-takenFür Mitarbeiter · 409Es gibt bereits eine Liste mit diesem Namen. Bitte einen anderen Namen wählen.
Listennamen sind je Betrieb eindeutig, damit die Auswahl in Kampagnen und Automatisierungen nicht verwechselt wird.
marketing-list-in-useFür Mitarbeiter · 409Die Liste wird noch verwendet (…). Bitte die Kampagnen erst abschließen oder abbrechen bzw. die Automatisierungen auf eine andere Liste umstellen.
Eine geplante, laufende oder pausierte Kampagne oder eine Automatisierung mit Zeitplan-Auslöser liest diese Liste noch — ohne sie wüsste der Versand nicht mehr, an wen er geht. In der Klammer stehen bis zu drei davon, etwa Kampagne „Herbstmenü".
marketing-list-materializingFür Mitarbeiter · 409Die Kampagne „…" bestimmt gerade ihre Empfänger aus dieser Liste. Bitte die Bedingungen erst ändern, wenn sie fertig ist, oder die Kampagne abbrechen.
Eine gestartete Kampagne sammelt ihre Empfänger schrittweise. Neue Bedingungen mitten im Durchgang würden die erste Hälfte nach alter, die zweite nach neuer Regel bestimmen.
marketing-list-segment-invalidFür Mitarbeiter · 409Die gespeicherte Zielgruppe dieser Liste ist ungültig. Bitte die Liste öffnen, die Bedingungen prüfen und neu speichern.
Die gespeicherten Bedingungen passen nicht mehr zum aktuellen Feldkatalog, etwa nach einer Änderung der Anwendung oder eines Handeingriffs in der Datenbank.
marketing-segment-reference-invalidFür Mitarbeiter · 422Die Zielgruppe verweist auf einen Bereich oder eine Kampagne, die es in diesem Betrieb nicht (mehr) gibt. Bitte die betroffene Bedingung neu auswählen.
Eine Reservierungs- oder Kampagnenbedingung nennt einen gelöschten Bereich bzw. eine gelöschte Kampagne — oder eine Kennung aus einem anderen Betrieb.
marketing-members-search-forbiddenFür Mitarbeiter · 403Die Suche nach Namen und Kontaktdaten ist nur mit dem Leserecht für Gäste möglich.
Die Mitgliedersuche durchsucht Namen, E-Mail-Adressen und Telefonnummern. Ohne Leserecht für Gäste bleiben diese Daten verborgen — auch über eine Suche.
marketing-segment-ai-outputFür Mitarbeiter · 502Die KI konnte aus der Beschreibung keine gültige Zielgruppe bauen. Bitte die Beschreibung genauer fassen oder die Bedingungen selbst zusammenstellen.
Die Antwort des Modells war kein gültiges Segment — unvollständig, mit unbekannten Feldern oder mit Bereichen und Kampagnen, die es im Betrieb nicht gibt. In Klammern steht der Grund.
marketing-template-not-foundFür Mitarbeiter · 404Die Vorlage wurde nicht gefunden. Vielleicht wurde sie inzwischen gelöscht — bitte die Übersicht neu laden.
Die Vorlage gehört nicht zu diesem Betrieb oder wurde inzwischen gelöscht.
marketing-template-in-useFür Mitarbeiter · 409Die Vorlage wird noch von … verwendet. Bitte die Kampagne abbrechen bzw. in der Automatisierung eine andere Vorlage wählen und die Vorlage danach löschen.
Eine geplante, laufende oder pausierte Kampagne oder eine aktive bzw. pausierte Automatisierung verschickt diese Vorlage noch, etwa „der Kampagne „Herbstmenü" (geplant, im Versand oder pausiert)". Die Antwort nennt sie zusätzlich im Feld usage.
marketing-template-channel-mismatchFür Entwickler · 400Diese Vorlage ist eine …-Vorlage; … gehört zum anderen Kanal. Den Kanal einer Vorlage kann man nicht ändern — bitte eine neue Vorlage anlegen.
Beim Speichern kamen Felder des anderen Kanals mit, etwa ein SMS-Text an eine E-Mail-Vorlage oder Betreff und Blöcke an eine SMS-Vorlage. Die Antwort nennt sie im Feld fields.
marketing-campaign-not-foundFür Mitarbeiter · 404Die Kampagne wurde nicht gefunden. Vielleicht wurde sie gerade gelöscht.
Die Kampagne gehört nicht zu diesem Betrieb oder wurde gelöscht. Beim Senden meldet der Versandstart denselben Fall knapper mit „Kampagne nicht gefunden."
marketing-campaign-list-missingFür Mitarbeiter · 422Bitte wählen Sie eine Liste aus, an die die Kampagne gehen soll.
Die Kampagne hat keine Liste, oder die gewählte Liste wurde gelöscht („Die gewählte Liste gibt es nicht mehr. Bitte wählen Sie eine andere Liste.").
marketing-campaign-template-missingFür Mitarbeiter · 422Bitte wählen Sie eine Vorlage aus.
Die Kampagne hat keine Vorlage, oder die gewählte wurde gelöscht („Die gewählte Vorlage gibt es nicht mehr."). Beim Testversand: „Bitte wählen Sie zuerst eine Vorlage und speichern Sie die Kampagne."
marketing-campaign-template-channelFür Mitarbeiter · 422Die Vorlage ist für …, die Kampagne für …. Bitte wählen Sie eine passende Vorlage.
Eine SMS-Vorlage an einer E-Mail-Kampagne oder umgekehrt — meist nach einem nachträglichen Wechsel des Kanals.
marketing-campaign-template-emptyFür Mitarbeiter · 422Die Vorlage enthält keine Inhalte. Bitte ergänzen Sie die Vorlage und versuchen Sie es erneut.
Die E-Mail-Vorlage hat keine Blöcke bzw. die SMS-Vorlage keinen Text. Beim Testversand lautet der Satz „Die Vorlage hat keinen Inhalt. Bitte ergänzen Sie sie zuerst."
marketing-campaign-subject-missingFür Mitarbeiter · 422Bitte geben Sie einen Betreff an.
Weder die Kampagne noch die E-Mail-Vorlage hat einen Betreff.
marketing-campaign-not-editableFür Mitarbeiter · 409Diese Kampagne wird gerade versendet oder ist abgeschlossen und lässt sich nicht mehr bearbeiten. Pausieren Sie den Versand, um Inhalte zu korrigieren.
Bearbeiten geht nur als Entwurf, geplant oder pausiert. Während des Versands und nach Abschluss oder Abbruch ist der Inhalt festgeschrieben.
marketing-campaign-audience-lockedFür Mitarbeiter · 409Liste und Kanal lassen sich nach dem Versandstart nicht mehr ändern. Brechen Sie die Kampagne ab und legen Sie eine neue an.
Nach dem Start hat die Kampagne bereits Empfänger aus Liste und Kanal bestimmt. Ein Wechsel mittendrin schickte eine Kampagne an zwei Zielgruppen.
marketing-campaign-not-deletableFür Mitarbeiter · 409Eine laufende Kampagne kann nicht gelöscht werden. Bitte pausieren oder brechen Sie den Versand zuerst ab.
Die Kampagne hat den Status „Wird versendet". Mitten im Versand ist offen, welche Nachrichten schon beim Versanddienst liegen — deren Protokoll muss bleiben, damit die Abmeldelinks darin weiter wirken.
marketing-campaign-changedFür Mitarbeiter · 409Die Kampagne wurde gerade an anderer Stelle geändert (zum Beispiel hat der Versand begonnen). Bitte laden Sie die Seite neu.
Zwischen Laden und Speichern hat sich der Status geändert — etwa weil eine geplante Kampagne gestartet ist oder jemand anderes sie pausiert hat.
marketing-guests-write-requiredFür Mitarbeiter · 403Für diese Aktion brauchen Sie zusätzlich Schreibrechte für Gäste. Bitte wenden Sie sich an den Inhaber.
„Kontakt entfernen" und „Gast löschen" ändern Gastdaten. Das Schreibrecht für Marketing reicht dafür nicht; der Marketing-Rolle fehlt guests:write ab Werk.
marketing-payment-method-requiredFür Betriebsinhaber · 422Bitte hinterlegen Sie eine gültige Karte, bevor Sie Marketing-Nachrichten versenden oder planen.
Für den gewählten Kanal ist noch keine gültige, über Stripe verifizierte Zahlungskarte hinterlegt. Diese Prüfung gilt auch im Testzeitraum, bei vorhandenem SMS-Guthaben und beim Aktivieren von Marketing-Automatisierungen.
marketing-campaign-not-sendableFür Mitarbeiter · 409Diese Kampagne wurde bereits gestartet. Eine pausierte Kampagne setzen Sie über „Fortsetzen“ fort.
Senden geht nur aus „Entwurf" oder „Geplant". Die Kampagne läuft schon, ist pausiert, abgeschlossen oder abgebrochen.
marketing-campaign-schedule-pastFür Mitarbeiter · 422Der geplante Zeitpunkt liegt in der Vergangenheit. Bitte einen späteren Zeitpunkt wählen oder sofort senden.
Datum und Uhrzeit unter „Geplant" liegen vor jetzt (Zeitzone des Betriebs) oder sind ungültig („Bitte einen gültigen Versandzeitpunkt angeben.").
marketing-campaign-schedule-too-farFür Mitarbeiter · 422Eine Kampagne lässt sich höchstens … Tage im Voraus einplanen.
Der gewählte Zeitpunkt liegt mehr als 365 Tage in der Zukunft.
marketing-campaign-invalid-transitionFür Mitarbeiter · 409Nur pausierte Kampagnen lassen sich fortsetzen.
Die Steueraktion passt nicht zum Status. Weitere Fassungen: „Nur geplante, laufende oder pausierte Kampagnen lassen sich abbrechen." und „Nur geplante oder laufende Kampagnen lassen sich pausieren."
marketing-email-quota-exhaustedFür Betriebsinhaber · 422Das E-Mail-Kontingent für diesen Monat ist ausgeschöpft (… von …). Richten Sie eine freigegebene Karte für Mehrverbrauch ein oder planen Sie die Kampagne für den nächsten Monat.
Die 100 enthaltenen E-Mails sind verbraucht und für den Betrieb ist keine Abrechnung zusätzlicher E-Mails über eine freigegebene Karte verfügbar.
marketing-email-not-configuredFür Betriebsinhaber · 422Der E-Mail-Versand ist gerade nicht verfügbar. Bitte versuchen Sie es später erneut oder wenden Sie sich an den Support.
Auf der Plattform ist kein Versanddienst für Werbemails eingerichtet (RESEND_API_KEY fehlt). Werbemails gehen nie über das eigene Postfach des Betriebs.
marketing-sms-not-readyFür Betriebsinhaber · 422Der SMS-Versand ist noch nicht eingerichtet. Bitte richten Sie SMS in den Einstellungen ein oder wenden Sie sich an den Support.
Der SMS-Anbieter der Plattform ist nicht vollständig eingerichtet (Zugangsdaten, Preisumrechnung oder Zustellberichte fehlen). Mit dem Guthaben des Betriebs hat das nichts zu tun; die Karte „SMS-Versand" in der Übersicht zeigt dann „Nicht eingerichtet".
marketing-sms-no-creditFür Betriebsinhaber · 422Lade dein SMS Guthaben auf um die SMS Kampagne zu versenden.
Das verfügbare SMS-Guthaben deckt den berechneten Höchstbetrag der Kampagne nicht. Eine eingerichtete automatische Aufladung gilt noch nicht als verfügbares Guthaben. Zum geplanten Versand wird erneut geprüft.
marketing-sms-price-unavailableFür Betriebsinhaber · 422Die SMS-Kosten konnten nicht zuverlässig berechnet werden. Bitte prüfen Sie die Telefonnummern und versuchen Sie es erneut.
Für mindestens einen erreichbaren Empfänger fehlt ein verlässlicher Länderpreis, die Nachricht ist zu lang oder die Preisliste ist vorübergehend nicht verfügbar.
marketing-sms-too-longFür Mitarbeiter · 422Die SMS ist mit Abmeldelink zu lang (höchstens 4 SMS-Teile). Bitte kürzen Sie den Text der Vorlage.
Text, eingesetzte Beispielwerte, Kurzlinks und die angehängte Zeile „Abmelden: …" ergeben mehr als vier SMS-Teile — bei Unicode-Zeichen wie Emojis schon ab 268 Zeichen.
marketing-test-no-emailFür Mitarbeiter · 422Ihr Benutzerkonto hat keine E-Mail-Adresse, an die der Test gehen könnte.
Test-E-Mails gehen ausschließlich an die Adresse des eigenen Kontos, und dort ist keine hinterlegt.
marketing-test-own-address-onlyFür Mitarbeiter · 422Test-E-Mails gehen nur an Ihre eigene Adresse. Für weitere Empfänger nutzen Sie bitte eine Liste.
Es wurde eine fremde Empfängeradresse angegeben. Ein Testversand an beliebige Adressen wäre Werbung ohne Einwilligung am Versand vorbei.
marketing-test-phone-requiredFür Mitarbeiter · 422Bitte geben Sie die Handynummer an, an die der SMS-Test gehen soll.
Beim SMS-Testversand fehlt die Zielnummer.
marketing-test-phone-invalidFür Mitarbeiter · 422Diese Telefonnummer ist zu kurz.
Die Nummer für den SMS-Test lässt sich nicht auswerten. Je nach Fall auch „Diese Telefonnummer ist zu lang.", „Diese Ländervorwahl kennen wir nicht." oder „Diese Telefonnummer enthält unzulässige Zeichen."
marketing-test-phone-suppressedFür Mitarbeiter · 422Diese Nummer steht auf der Sperrliste für Werbe-SMS. Auch eine Test-SMS geht nicht an sie.
Die angegebene Nummer steht auf der Sperrliste des Betriebs — gleich in welcher Schreibweise (+43 …, 0043 … oder 0664 …). Eine Test-SMS trägt den echten Werbetext; sie ginge sonst an jemanden, der keine Werbung will.
marketing-test-phone-no-consentFür Mitarbeiter · 422Diese Nummer gehört einem Gast ohne Einwilligung in Werbe-SMS. Senden Sie den Test an Ihre eigene Nummer.
In der Gästekartei des Betriebs steht ein Gast mit dieser Nummer, der Werbe-SMS nicht (oder nicht mehr) zugestimmt hat. Ohne diese Prüfung wäre der Testknopf ein Weg, echte Werbung an Gäste ohne Einwilligung zu schicken.
marketing-test-failedFür Mitarbeiter · 502Der Versanddienst ist gerade nicht erreichbar. Bitte versuchen Sie es in einigen Minuten erneut.
Der Versanddienst hat den Test nicht angenommen. Andere Fassungen nennen den Grund, etwa „Das SMS-Guthaben reicht nicht für die Test-SMS. Bitte laden Sie Guthaben auf.", „Die Test-E-Mail wurde vom Versanddienst abgelehnt." oder „Mit dem Kennzeichen „[Test]" passt die SMS nicht mehr in 4 Teile." — jede Test-SMS beginnt mit „[Test] ", was einige Zeichen kostet.
marketing-pause-quota-exceededFür Betriebsinhaber · —Die enthaltenen Marketing-E-Mails dieses Monats sind aufgebraucht. Richten Sie eine freigegebene Karte für zusätzliche E-Mails ein oder setzen Sie den Versand im nächsten Monat fort.
Die enthaltenen E-Mails wurden aufgebraucht und Mehrverbrauch kann aktuell nicht abgerechnet werden. Die restlichen Empfänger warten; niemand wird verworfen.
marketing-pause-email-not-configuredFür Betriebsinhaber · —Der E-Mail-Versand ist gerade nicht verfügbar. Bitte wenden Sie sich an den Support; danach können Sie den Versand fortsetzen.
Der Versanddienst der Plattform fiel während des Versands aus oder ist nicht eingerichtet. Die Kampagne hält an, statt Empfänger als fehlgeschlagen zu verbrauchen.
marketing-pause-sms-not-readyFür Betriebsinhaber · —Der SMS-Versand ist nicht eingerichtet. Richten Sie SMS unter Einstellungen ein und setzen Sie den Versand dann fort.
Während einer laufenden SMS-Kampagne ist der SMS-Anbieter der Plattform nicht mehr bereit. Die restlichen Empfänger warten; niemand wird verworfen.
marketing-pause-sms-no-creditFür Betriebsinhaber · —Das SMS-Guthaben reicht nicht. Laden Sie Guthaben auf (oder aktivieren Sie die automatische Aufladung) und setzen Sie den Versand dann fort.
Während einer SMS-Kampagne ist das SMS-Guthaben aufgebraucht: Es stand beim nächsten Versandschritt bei null ohne automatische Aufladung, oder SMS haben über mehrere Versuche vergeblich auf Guthaben gewartet. Eine gerade laufende automatische Aufladung wird abgewartet. Wartende SMS gehen zurück in die Warteschlange, niemand wird verworfen; die Glocke meldet die Pause.
marketing-pause-plan-inactiveFür Betriebsinhaber · —Ihr Plan enthält kein Marketing mehr. Nach einem Planwechsel können Sie den Versand fortsetzen.
Der Betrieb hat in einen Plan ohne Marketing gewechselt, oder die Testphase ist abgelaufen. Laufende Kampagnen halten an, Automatisierungen starten niemanden neu.
marketing-pause-restaurant-inactiveFür Betriebsinhaber · —Der Betrieb war archiviert oder in Schließung. Setzen Sie den Versand fort, sobald der Betrieb wieder aktiv ist.
Der Betrieb wurde archiviert oder seine Schließung hat begonnen, während eine Kampagne lief oder eingeplant war. Solche Kampagnen hält der Versand an, statt sie liegen zu lassen — sonst blockierten sie die Versandwarteschlange. Eine Glocke gibt es dafür nicht, weil der Betrieb geschlossen ist.
marketing-flow-not-foundFür Mitarbeiter · 404Automatisierung nicht gefunden.
Die Automatisierung gehört nicht zu diesem Betrieb oder wurde gelöscht.
marketing-flow-guests-write-requiredFür Mitarbeiter · 403Diese Automatisierung ändert Tags von Gästen. Speichern darf sie nur, wer Gäste bearbeiten darf.
Der Ablauf enthält „Tag hinzufügen" oder „Tag entfernen" und ändert damit Gastdaten. Beim Aktivieren lautet der Satz „… Aktivieren darf sie nur, wer Gäste bearbeiten darf."
marketing-flow-template-invalidFür Mitarbeiter · 422Eine gewählte Vorlage gibt es nicht mehr. Bitte im betroffenen Versand-Schritt eine andere Vorlage wählen.
Ein Versand-Schritt nennt eine gelöschte Vorlage — oder eine Vorlage des falschen Kanals („Die Vorlage „…" ist keine E-Mail-Vorlage. Bitte eine passende Vorlage wählen.").
marketing-flow-list-invalidFür Mitarbeiter · 422Die gewählte Liste gibt es nicht mehr. Bitte beim Auslöser eine andere Liste wählen.
Der Zeitplan-Auslöser nennt eine gelöschte Liste oder eine aus einem anderen Betrieb.
marketing-flow-reference-invalidFür Mitarbeiter · 422Eine Bedingung nennt einen Bereich, den es in diesem Betrieb nicht gibt. Bitte die Bedingung neu auswählen.
Eine Wenn/Sonst-Bedingung oder der Filter „Nur bestimmte Gäste" nennt einen gelöschten Bereich bzw. eine gelöschte Kampagne („… eine Kampagne, die es in diesem Betrieb nicht gibt …").
marketing-flow-limitFür Mitarbeiter · 409Ein Betrieb kann höchstens … Automatisierungen anlegen. Bitte nicht mehr benötigte löschen.
Die Obergrenze von 100 Automatisierungen je Betrieb ist erreicht. Sie hält den minütlichen Automatisierungslauf für alle Betriebe schnell.
marketing-flow-invalidFür Mitarbeiter · 422Die Automatisierung ist unvollständig. Bitte im Editor prüfen und erneut speichern.
Auslöser oder Schritte des gespeicherten Arbeitsstands lassen sich nicht lesen — etwa nach einer Änderung der Anwendung.
marketing-flow-emptyFür Mitarbeiter · 422Bitte mindestens einen Schritt hinzufügen, bevor die Automatisierung aktiviert wird.
Die Automatisierung hat keinen einzigen Schritt; aktiviert täte sie nichts.
marketing-flow-conflictFür Mitarbeiter · 409Die Automatisierung wurde gerade anderweitig geändert. Bitte die Seite neu laden und erneut versuchen.
Zwischen Laden und Speichern bzw. Aktivieren hat jemand anderes die Automatisierung geändert oder ihren Status gewechselt.
marketing-flow-not-activeFür Mitarbeiter · 409Nur aktive Automatisierungen lassen sich pausieren.
Die Automatisierung ist ein Entwurf oder bereits pausiert.
marketing-tracking-all-forbiddenFür Mitarbeiter · 403Den Tracking-Modus „Alle Empfänger" dürfen nur Inhaber und Personen mit Schreibrecht auf die Einstellungen aktivieren. Bitte wenden Sie sich an die Inhaberin oder den Inhaber des Betriebs.
„Alle Empfänger" misst auch Gäste, die der Auswertung nicht zugestimmt haben; die Rechtsgrundlage dafür verantwortet der Betrieb. Umstellen darf deshalb nur, wer auch die übrigen Betriebseinstellungen verantwortet: der Inhaber, eine betreuende Agentur oder wer settings:write hat. marketing:write allein reicht nicht. Steht der Modus schon auf „Alle Empfänger", lassen sich Absendername und Antwortadresse weiter speichern.
marketing-suppression-address-invalidFür Mitarbeiter · 422Bitte eine gültige E-Mail-Adresse angeben.
Die Adresse lässt sich nicht als E-Mail-Adresse lesen. Bei SMS: „Bitte eine gültige Telefonnummer mit Ländervorwahl angeben (z. B. +43 660 1234567)."
marketing-suppression-existsFür Mitarbeiter · 409Diese Adresse steht bereits auf der Sperrliste.
Für diesen Kanal gibt es schon einen Eintrag mit derselben Adresse — etwa durch einen früheren Bounce, eine Beschwerde oder eine manuelle Sperre. Eine Sperre mit dem Grund „Vom Gast abgemeldet" meldet diesen Fehler nicht: Sie wird zu „Manuell gesperrt", damit eine spätere Neuanmeldung des Gastes sie nicht mehr aufhebt.
marketing-suppression-not-foundFür Mitarbeiter · 404Dieser Eintrag der Sperrliste wurde nicht gefunden. Bitte die Liste neu laden.
Die Sperre wurde bereits aufgehoben oder gehört zu einem anderen Betrieb.
marketing-unsubscribe-invalidFür Gäste · 404Dieser Abmeldelink ist ungültig. Bitte verwenden Sie den Link aus der zuletzt erhaltenen Nachricht.
Der Link ist beschädigt (etwa beim Kopieren abgeschnitten), oder die Daten zur Nachricht wurden nach Ablauf der Aufbewahrungsfrist bzw. auf Löschwunsch entfernt. Die Seite zeigt „Link ungültig".
marketing-unsubscribe-too-largeFür Gäste · 413Die Anfrage ist zu groß. Bitte verwenden Sie den Abmeldeknopf auf der Seite.
An die Abmeldeadresse kam eine ungewöhnlich große Anfrage — nicht der Knopf der Abmeldeseite und nicht der Abmeldeknopf eines Postfachs.
marketing-unsubscribe-unavailableFür Gäste · 500Die Abmeldung ist gerade nicht möglich. Bitte versuchen Sie es in ein paar Minuten erneut.
Eine vorübergehende Störung beim Speichern der Abmeldung. Die Seite zeigt „Abmeldung gerade nicht möglich"; die Schnittstelle antwortet mit internal („Die Abmeldung konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.").
marketing-link-unavailableFür Gäste · 404Dieser Link ist ungültig oder nicht mehr verfügbar. Bitte verwenden Sie den Link aus der Originalnachricht.
Ein Link aus einer Werbemail oder Werbe-SMS ist beschädigt, oder die Nachricht wurde nach Ablauf der Aufbewahrungsfrist bzw. mit dem Gast gelöscht. Links aus Testnachrichten landen dagegen auf „Link aus einer Testnachricht". Die Seite heißt „Link nicht verfügbar".
marketing-link-temporarily-unavailableFür Gäste · 503Der Link kann gerade nicht geöffnet werden. Bitte versuchen Sie es in ein paar Minuten erneut.
Eine vorübergehende Störung beim Auflösen des Links. Die Seite heißt „Vorübergehend nicht erreichbar".
marketing-webhook-not-configuredFür Entwickler · 503Der Resend-Webhook ist nicht eingerichtet: RESEND_WEBHOOK_SECRET fehlt.
Die Umgebungsvariable RESEND_WEBHOOK_SECRET ist leer. Ohne sie lässt sich keine Zustellmeldung prüfen — Kampagnen zeigen dann keine Zustellrate, und harte Bounces landen nie auf der Sperrliste.
marketing-webhook-too-largeFür Entwickler · 413Das Webhook-Ereignis ist größer als 256 kB.
Der Rumpf der Anfrage überschreitet 256 kB. Echte Resend-Ereignisse sind wenige Kilobyte groß; der Endpunkt liest größere Anfragen nicht erst ein.
marketing-webhook-signatureFür Entwickler · 400Die Signatur des Resend-Webhooks fehlt oder ist ungültig. Prüfen Sie RESEND_WEBHOOK_SECRET.
Die Kopfzeilen svix-id, svix-timestamp oder svix-signature fehlen, sind zu alt oder passen nicht zum hinterlegten Geheimnis — oft, weil nach dem Neuanlegen des Webhooks das alte Secret gesetzt blieb.
marketing-webhook-not-readyFür Entwickler · 409Die Nachricht wird gerade noch versendet. Resend stellt das Ereignis erneut zu.
Die Zustellmeldung kam, bevor der Versand die Nachricht als versendet vermerkt hatte. Mit 409 bittet der Endpunkt Resend um eine spätere Wiederholung, damit keine Meldung verloren geht.
Reservierungen, Widget und Gast-Sicht
Reservierungen, Widget und Gast-Sicht · 137 Meldungen
subscription-inactive-configFür Betriebsinhaber · 403subscription_inactive (403) → Widget zeigt "Online-Reservierung derzeit nicht verfügbar / Bitte kontaktieren Sie das Restaurant direkt"
getRestaurantEntitlements meldet features.reservations = false, also kein aktives Reservierungs-Paket bzw. abgelaufenes Abo.
subscription-inactive-daysFür Betriebsinhaber · 403subscription_inactive
Kein aktives Reservierungs-Paket; die Tagesabfrage des Kalenders wird abgewiesen.
subscription-inactive-availabilityFür Betriebsinhaber · 403subscription_inactive
Kein aktives Reservierungs-Paket; das Widget schaltet auf den Hinweisschirm um (use-booking-flow.ts:246).
subscription-inactive-bookingFür Betriebsinhaber · 403subscription_inactive
Buchung wird blockiert, weil kein aktives Reservierungs-Paket vorliegt.
subscription-inactive-inquiryFür Betriebsinhaber · 403subscription_inactive
Auch die Gruppen-Anfrage braucht das Reservierungs-Paket.
restaurant-nicht-gefunden-configFür Betriebsinhaber · 404Restaurant nicht gefunden
Der slug im Einbettungs-Code (data-slug) passt zu keiner RestaurantOrganization.
restaurant-nicht-gefunden-daysFür Betriebsinhaber · 404Restaurant nicht gefunden
Unbekannter slug in der Tagesabfrage.
restaurant-nicht-gefunden-availabilityFür Betriebsinhaber · 404Restaurant nicht gefunden
Unbekannter slug in der Verfügbarkeitsabfrage.
restaurant-nicht-gefunden-bookingFür Betriebsinhaber · 404Restaurant nicht gefunden
Unbekannter slug beim Absenden der Buchung.
restaurant-nicht-gefunden-inquiryFür Betriebsinhaber · 404Restaurant nicht gefunden
Unbekannter slug beim Absenden der Anfrage.
invalid-query-daysFür Entwickler · 400invalid_query (mit issues aus Zod)
from/to/partySize fehlen oder haben falsches Format; auch ein Zeitraum über MAX_DAY_RANGE Tage fällt hier durch.
invalid-query-availabilityFür Entwickler · 400invalid_query (mit issues aus Zod)
date/partySize/area/inquiry passen nicht zum availabilityQuerySchema.
invalid-body-bookingFür Entwickler · 400invalid_body (mit issues aus Zod)
widgetReservationSchema abgelehnt: date/time-Format, partySize außerhalb 1–100, name leer oder >100, email >320 oder unzulässig, notes >1000, locale nicht in der Aufzählung, area keine UUID (src/lib/validations/reservations.ts:72).
invalid-body-group-answersFür Entwickler · 400invalid_body (mit issues aus Zod)
Der answers-Umschlag (groupAnswersEnvelopeSchema) passt nicht: mehr als MAX_ANSWERS Antworten oder falsche Feldform.
invalid-body-inquiryFür Entwickler · 400invalid_body (mit issues aus Zod)
widgetInquirySchema abgelehnt: partySize außerhalb 1–500, name leer, E-Mail/Telefon unzulässig, notes >1000 (src/lib/validations/inquiries.ts:48).
email-erforderlich-bookingFür Gäste · 400E-Mail erforderlich
ReservationWidgetSettings.requireEmail ist an, das Feld kam aber leer an.
telefon-erforderlich-bookingFür Gäste · 400Telefon erforderlich
ReservationWidgetSettings.requirePhone ist an, das Feld kam leer an.
telefon-erforderlich-inquiryFür Gäste · 400Telefon erforderlich
requirePhone ist an, die Anfrage kam ohne Nummer.
email-erforderlich-inquiryFür Gäste · 400E-Mail erforderlich
requireEmail ist an, die Anfrage kam ohne E-Mail.
kontaktweg-fehlt-inquiryFür Gäste · 400E-Mail oder Telefonnummer erforderlich
Weder E-Mail noch Telefon angegeben — der Betrieb könnte sich nicht zurückmelden.
field-invalid-pflichtfrageFür Gäste · 400Bitte beantworten Sie „<Frage>".
Eine als required markierte Zusatzfrage (GroupInquiryField) gilt ab dieser Personenzahl und blieb leer.
field-invalid-zahlFür Gäste · 400Bitte geben Sie bei „<Frage>" eine Zahl ein.
Zusatzfrage vom Typ NUMBER hat eine nicht-numerische Antwort erhalten.
field-invalid-auswahlFür Gäste · 400Bitte wählen Sie bei „<Frage>" eine der angebotenen Möglichkeiten.
Bei einer SELECT-Zusatzfrage kam ein Wert an, der nicht in options steht — oft eine im Dashboard gelöschte Option bei offenem Formular.
field-invalid-clientFür GästeBitte beantworten Sie diese Frage.
Client-Prüfung: Pflicht-Zusatzfrage offen; der Klick auf Absenden zeigt die Meldung am Feld statt zu senden (step-booking.tsx:151).
slot-unavailable-generischFür Gäste · 409Diese Uhrzeit wurde soeben vergeben. Bitte wählen Sie eine andere. (Text-Schlüssel slotTakenHint)
Jede 409-Antwort der Buchungsroute landet hier — der präzise Servertext (guard.message) wird verworfen und pauschal ersetzt.
unavailable-409Für Gäste · 409{ error: "unavailable", reason, message } — message ist bereits deutscher Klartext
assertBookable hat beim erneuten, verbindlichen Prüfen in der Transaktion abgelehnt (SlotUnavailableError, Zeile 315).
invalid-dateFür Entwickler · 409Das Datum passt nicht zur Anfrage.
Das gesendete Datum stimmt nicht mit dem geladenen Verfügbarkeitskontext überein — praktisch nur bei nachgebauten Requests.
invalid-timeFür Gäste · 409Diese Uhrzeit wird für den gewählten Tag nicht angeboten.
Die Uhrzeit wird für diesen Tag und Bereich nicht angeboten: Sie liegt weder im üblichen Intervall noch in einer passenden Freigabe unter „Uhrzeiten beschränken", oder Öffnungszeiten beziehungsweise Sperren schließen sie aus.
invalid-rangeFür Gäste · 409Die Endzeit muss nach der Startzeit liegen.
Die übermittelte Endzeit liegt vor oder auf der Startzeit (end-times.ts:86).
end-time-requiredFür Gäste · 409Bitte eine Endzeit wählen.
Für Datum und Uhrzeit greift eine Sloteinstellung mit Endzeit-Pflicht, es kam aber keine Endzeit an.
invalid-end-timeFür Gäste · 409Diese Endzeit ist für die gewählte Uhrzeit nicht verfügbar.
Die Endzeit steht nicht im Endzeit-Raster der gewählten Startzeit (getEndTimeGrid).
closedFür Gäste · 409An diesem Tag ist keine Online-Reservierung möglich.
Keine Öffnungszeit für Tag/Bereich hinterlegt, der Tag ist als Ruhetag angelegt — oder eine Freigabeliste („Uhrzeiten beschränken") nennt nur Uhrzeiten, die der Tag gar nicht anbietet, sodass keine einzige übrig bleibt.
blockedFür Gäste · 409Dieser Zeitraum ist gesperrt.
Eine Sperrzeit/Schließung (Betriebsfeier, Urlaub) deckt den Zeitraum ab.
limitFür Gäste · 409Für diesen Zeitraum sind bereits alle Reservierungen vergeben.
Das Kontingent (maximale Reservierungen je Zeitfenster) ist erschöpft.
capacityFür Gäste · 409Für diese Personenzahl ist zu dieser Zeit kein Tisch mehr frei.
findBestAssignment findet keine (kombinierbare) Tischgruppe für partySize inklusive Puffer.
advanceFür Gäste · 409Diese Uhrzeit liegt außerhalb des Buchungszeitraums.
minAdvanceHours, maxAdvanceDays oder sameDayCutoffTime schließen den Zeitpunkt aus.
party-sizeFür Gäste · 409Für diese Personenzahl ist keine Online-Reservierung möglich.
partySize liegt außerhalb minPartySizeOnline / maxPartySizeOnline.
unknown-areaFür Gäste · 400Dieser Bereich steht nicht zur Auswahl.
Die areaId gehört zu keinem Bereich dieses Betriebs (fremd, gelöscht, nie existiert — bewusst nicht unterschieden).
area-not-bookableFür Gäste · 400Dieser Bereich kann online nicht reserviert werden.
RestaurantArea.onlineBookable ist false.
sub-area-not-selectableFür Gäste · 400In diesem Bereich lässt sich kein Unter-Bereich wählen.
Der Hauptbereich hat allowSubAreaSelection = false, es wurde aber ein Unterbereich gesendet.
followup-unavailableFür Gäste · 409Für den Anschluss ist zu dieser Zeit leider kein Platz mehr frei.
Die angehakte Folgereservierung („noch an die Bar") ist nicht buchbar; die Transaktion nimmt die Hauptbuchung mit (reservations/route.ts:375).
followup-endzeit-fehltFür GästeBitte wählen Sie eine Endzeit, damit wir den Anschluss reservieren können.
Client-Prüfung: der Folgereservierungs-Haken ist gesetzt, der Slot bietet Endzeiten an, es ist aber keine gewählt (step-booking.tsx:124).
reservierung-fehlgeschlagenFür Entwickler · 500Reservierung fehlgeschlagen
Unerwarteter Fehler in der Buchungstransaktion (DB nicht erreichbar, Prisma-Fehler). Details nur im Serverlog.
anfrage-fehlgeschlagenFür Entwickler · 500Anfrage fehlgeschlagen
Unerwarteter Fehler beim Anlegen der Gruppen-Anfrage.
interner-fehler-configFür Entwickler · 500Interner Fehler → im Widget als "Widget nicht verfügbar"
Config-Route wirft (DB/Prisma). Das Widget setzt daraufhin flow.error und zeigt nur den Text in Rot (book/[slug]/page.tsx:142).
interner-fehler-availabilityFür Entwickler · 500Interner Fehler → im Widget als "Verfügbarkeit konnte nicht geladen werden"
Verfügbarkeitsberechnung wirft; use-booking-flow.ts:252 setzt den Ersatztext.
interner-fehler-daysFür Entwickler · 500Interner Fehler — vom Kalender STILL verschluckt
Bei nicht-ok Antwort bricht loadMonth ohne Meldung ab (date-field.tsx:75); der Monat bleibt einfach ohne Tagesstatus.
widget-nicht-verfuegbarFür EntwicklerWidget nicht verfügbar
Die Config-Antwort war nicht ok (oder 403 ohne subscription_inactive).
rate-limited-bookingFür Gäste · 429rate_limited (Retry-After-Header) — der Gast sieht den rohen Schlüssel "rate_limited"
Mehr als 10 Buchungen pro Stunde je IP und Betrieb (rate-limit.ts:267). Der 429-Zweig fehlt in use-booking-flow, deshalb landet der Schlüssel als Fehlertext im Formular.
rate-limited-inquiryFür Gäste · 429rate_limited
Mehr als 10 Anfragen pro Stunde je IP und Betrieb. CORS-Header werden hier bewusst nachgesetzt, damit keine Netzwerkfehler-Meldung entsteht.
rate-limited-availabilityFür Gäste · 429rate_limited — im Widget als "Verfügbarkeit konnte nicht geladen werden"
Mehr als 60 Verfügbarkeitsabfragen pro Minute je IP und Betrieb, etwa durch sehr schnelles Durchklicken.
rate-limited-daysFür Gäste · 429rate_limited — vom Kalender still verschluckt
Mehr als 60 Tagesabfragen pro Minute je IP und Betrieb (schnelles Monats-Blättern).
rate-limited-payment-statusFür Gäste · 429rate_limited
Zu häufiges Nachfragen des Zahlungsstands (Knopf "Erneut prüfen").
payment-not-foundFür Gäste · 404not_found → Seite zeigt "Zahlung nicht abgeschlossen"
Die paymentId existiert nicht oder gehört nicht zu diesem Betrieb. Bewusst nicht unterschieden, weil die Kennung in einer URL steht.
payment-status-unavailableFür Gäste · 500status_unavailable → Seite zeigt "Stand nicht abrufbar"
Abgleich mit Stripe bzw. DB-Zugriff scheiterte.
zahlung-nicht-abgeschlossenFür GästeZahlung nicht abgeschlossen — "Die Zahlung wurde abgebrochen oder abgelehnt … Reservierung ist damit nicht verbindlich"
Rückkehr mit ?status=abbruch oder der Zahlungsstand ist nicht PENDING/PAID/AUTHORIZED (FAILED, CANCELED).
zahlung-noch-nicht-bestaetigtFür GästeZahlung noch nicht bestätigt
Der Zahlungsstand steht nach dem Nachfassen weiterhin auf PENDING; Stripe hat den Webhook noch nicht geliefert.
payment-amount-out-of-rangeFür Betriebsinhaber(keine Gast-Meldung) skipped: "amount_out_of_range"
Der Betrag der Anzahlungs-/Gebührenregel liegt außerhalb des zulässigen Bereichs; es wird keine Zahlung angelegt.
payment-kein-stripe-kontoFür Betriebsinhaber[payments] no active Stripe connection — booking without charge (nur Serverlog)
Eine Anzahlungs-/Gebührenregel greift, aber kein aktives Stripe-Konto ist verbunden.
payment-stripe-errorFür Betriebsinhaberskipped: "stripe_error"; Zahlung wird auf FAILED mit failureReason gesetzt
Das Anlegen der Stripe-Kassenseite scheiterte. Die Buchung bleibt bestehen, checkoutUrl ist null.
requires-reviewFür BetriebsinhaberrequiresReview: true → neutrale "vorgemerkt"-Bestätigung statt Zusage
Der Gast ist als gesperrt eingestuft (upsertGuestFromReservation, Zeile 427) oder eine Anzahlung ist offen; autoConfirm wird unterdrückt.
risiko-einstufung-nicht-moeglichFür Entwickler[widget] Risiko-Einstufung nicht moeglich: <Fehlername> (nur Serverlog)
getGuestRiskLevel warf; riskLevel bleibt null und risikogebundene Anzahlungsregeln greifen nicht.
reservation-email-failedFür Betriebsinhaber[widget] reservation email failed (Reservierung <ID>) (nur Serverlog)
Beim Versand der Bestätigungs-/Vormerk-Mail nach einer Widget-Buchung ist eine AUSNAHME aufgetreten. Die Buchung steht trotzdem.
widget-gastmail-nicht-verschicktFür Betriebsinhaber[widget] Gastmail NICHT verschickt (Reservierung <ID>): <Grund> (nur Serverlog)
Die Bestätigungs- bzw. Eingangsmail nach einer Widget-Buchung ging nicht raus (kein Versandweg, Störung bei Resend oder im Postfach des Betriebs). Die Buchung steht; im Dashboard ist der Ausfall derzeit NICHT sichtbar, nur im Serverlog und als EmailLog-Zeile mit status „failed“.
newsletter-optin-failedFür Entwickler[widget] newsletter opt-in failed (nur Serverlog)
Beim Newsletter-Haken einer Widget-Buchung ist eine AUSNAHME aufgetreten (Datenbank, unerwarteter Fehler) — nicht der Mailversand, der meldet sich eigens.
newsletter-optin-mail-nicht-verschicktFür Betriebsinhaber[widget] Newsletter-Bestätigungsmail NICHT verschickt: <Grund> (nur Serverlog)
Die Double-Opt-in-Mail zum Newsletter-Haken einer Widget-Buchung konnte nicht verschickt werden. Der Gast hat seine Buchungsantwort schon — eine Oberfläche, die es ihm sagen könnte, gibt es an dieser Stelle nicht.
newsletter-invalid-jsonFür Entwickler · 400Invalid JSON body
Der Request-Body ist kein gültiges JSON.
newsletter-validationFür Gäste · 400validation (mit issues aus Zod)
E-Mail-Adresse oder Name entspricht nicht dem Schema.
newsletter-restaurant-nicht-gefundenFür Betriebsinhaber · 404Restaurant nicht gefunden
Unbekannter slug in der Newsletter-Anmeldung.
newsletter-bestaetigungsmail-nicht-verschicktFür Gäste · 502Die Bestätigungsmail konnte gerade nicht verschickt werden. Bitte versuche es in einigen Minuten erneut.
Die Anmeldung wurde angenommen, aber der Versand der Double-Opt-in-Mail scheiterte (kein Versandweg, Störung bei Resend oder im Postfach des Betriebs). Ohne bestätigte Mail ist die Anmeldung nicht wirksam. Die Anfrage wird dabei wieder aufgehoben — sonst zählte sie zehn Minuten lang als „gerade verschickt“, und ein erneuter Versuch bekäme wieder keine Mail; so erzeugt der nächste Versuch sofort einen neuen Link. Im Serverlog steht „[newsletter] Bestätigungsmail konnte nicht verschickt werden: <Grund>“ (src/lib/guests/newsletter.ts).
newsletter-interner-fehlerFür Entwickler · 500Die Anmeldung ist fehlgeschlagen. Bitte versuche es später erneut.
Unerwarteter Fehler beim Anlegen des Gastes oder beim Versand. Der Gast sieht bewusst nur diesen festen Satz; die volle Ausnahme steht im Serverlog unter „[widget-newsletter] Anmeldung fehlgeschlagen:“.
rate-limit-newsletterFür Gäste · 429HTTP 429 rate_limited (Newsletter-Anmeldung, mit CORS-Headern)
Zwei Bremsen: höchstens 5 Anmeldungen je Stunde und IP (Schlüssel newsletter:<ip>) und höchstens 3 je Stunde, Betrieb und Empfängeradresse (Schlüssel newsletter-an:<restaurantId>:<SHA-256 der Adresse> — im geteilten Zähler liegt die Adresse nur als Hash). Die zweite fängt Bots, die aus vielen Netzen dieselbe fremde Adresse eintragen und so Dritten Bestätigungsmails zuschicken. Innerhalb von 10 Minuten nach einer Anfrage mit denselben Kanälen geht ohnehin keine zweite Mail hinaus: der erste Link bleibt gültig, die Route antwortet { ok: true } (intern alreadyRequested: true). Beide Absagen tragen die CORS-Kopfzeilen, damit eine Website auf eigener Domain „Zu viele Anfragen“ zeigen kann statt eines Netzwerkfehlers.
newsletter-confirm-link-unvollstaendigFür GästeDer Bestätigungslink ist unvollständig. Bitte melde dich erneut an.
Der token-Parameter fehlt in der URL, meist durch einen vom Mailprogramm abgeschnittenen Link.
newsletter-confirm-restaurant-fehltFür GästeDas Restaurant wurde nicht gefunden.
Der slug im Bestätigungslink gehört zu keinem Betrieb mehr.
newsletter-confirm-token-ungueltigFür GästeDieser Bestätigungslink ist ungültig oder wurde bereits verwendet.
Kein Gast mit diesem newsletterToken — Token schon verbraucht oder falsch.
newsletter-confirm-abgelaufenFür GästeDieser Bestätigungslink ist abgelaufen. Bitte melde dich erneut zum Newsletter an.
newsletterTokenExpiresAt liegt in der Vergangenheit; die Gültigkeit beträgt 7 Tage (newsletter/route.ts:93).
newsletter-abmeldelink-unvollstaendigFür GästeDer Abmeldelink ist unvollständig. Bitte verwende den Link aus einer unserer E-Mails.
Der token-Parameter fehlt in der Abmelde-URL.
newsletter-abmelde-restaurant-fehltFür GästeDas Restaurant wurde nicht gefunden.
Der slug im Abmeldelink gehört zu keinem Betrieb.
newsletter-abmeldelink-ungueltigFür GästeDieser Abmeldelink ist ungültig. Möglicherweise bist du bereits abgemeldet.
Kein Gast zu diesem Abmelde-Token gefunden — meist weil die Abmeldung bereits erfolgt ist.
storno-invalid-bodyFür Entwickler · 400invalid_body
Der Request-Body ist kein gültiges JSON.
storno-invalid-inputFür Entwickler · 400{ error: "validation", issues }
Der Body passt nicht zum guestCancelRequestSchema: hash fehlt oder hat das falsche Format, oder „Option ablehnen" kommt ohne confirm: true bzw. mit unbekanntem action. issues ist parsed.error.flatten(). Die Verwaltungsseite prüft dasselbe Schema vor dem Senden (cancel-button.tsx, handleCancel) und schickt einen solchen Body nie; die Antwort trifft nur eigene Aufrufer der Schnittstelle.
storno-not-foundFür Gäste · 404not_found → der Gast sieht "Dieser Link ist nicht mehr gültig. Bitte wenden Sie sich an das Restaurant."
Die Kennung im Link hat keine gültige Form, die Reservierung ist unbekannt, der changeHash stimmt nicht oder der Betrieb ist archiviert bzw. in Löschung – bewusst nicht unterschieden, ein verstümmelter Link sieht aus wie ein unbekannter. Die Client-Meldung nennt den Grund nicht (cancel-button.tsx, failureMessage).
storno-already-finalizedFür Gäste · 409already_finalized → "Diese Reservierung kann nicht mehr storniert werden."
Die Reservierung ist abgeschlossen oder als No-Show markiert. Die Antwort trägt kein message, deshalb zeigt die Seite ihren allgemeinen Satz (cancel-button.tsx, failureMessage). Eine bereits stornierte Reservierung gilt dagegen als Erfolg (erneuter Klick nach verlorener Antwort). Eine inzwischen bestätigte Option meldet option_closed.
storno-bereits-begonnenFür Gäste · 409not_cancelable → "Die Reservierung hat bereits begonnen. Bitte wenden Sie sich direkt an das Restaurant."
Der Beginn ist erreicht, der Gast ist platziert oder sitzt bereits. Ab dann sagt nur noch das Team ab – sonst könnte sich ein nicht erschienener Gast nachträglich aus der No-Show-Gebühr stornieren.
storno-gleichzeitig-geaendertFür Gäste · 409conflict → "Die Reservierung wurde gerade geändert. Die Seite zeigt jetzt den aktuellen Stand – bitte prüfen Sie die Angaben, bevor Sie es erneut versuchen."
Die Reservierung wurde zwischen Lesen und Absage geändert (etwa vom Team im Dashboard); die Absage trifft nur den gelesenen Stand. Die Seite lädt sofort selbst neu (cancel-button.tsx, handleCancel) und zeigt statt des Satzes der Route („Bitte laden Sie die Seite neu.") ihren eigenen. Der Storno-Knopf bleibt stehen, einen Knopf „Seite neu laden" gibt es hier nicht. Hat das Team auch den Status gewechselt, erklärt die frische Seite den neuen Stand selbst.
storno-option-inzwischen-bestaetigtFür Gäste · 409option_closed → "Ihre Option wurde inzwischen bestätigt. Laden Sie die Seite neu, um die Reservierung zu stornieren." (mit Knopf „Seite neu laden")
Der Gast hat „Option ablehnen" getippt, während das Team die Option schon bestätigt hatte. Eine Ablehnung sagt nie eine bestätigte Reservierung ab; die Reservierung bleibt bestehen und lässt sich gewöhnlich stornieren. Steht die Reservierung nicht auf Bestätigt (etwa wieder als Anfrage), heißt es „inzwischen geändert". Hat der Besuch schon begonnen, kommt stattdessen not_cancelable.
storno-link-unvollstaendigFür GästeDieser Link ist unvollständig. Bitte öffnen Sie den Link aus Ihrer E-Mail erneut.
Die Seite prüft den Änderungs-Token aus dem Link vor dem Senden mit guestCancelRequestSchema; er ist zu kurz oder zu lang, etwa weil der Link beim Kopieren abgeschnitten wurde. Es wird nichts gesendet.
storno-internFür Gäste · 500internal → "Stornierung fehlgeschlagen. Bitte versuchen Sie es erneut."
Die Absage scheiterte in der Datenbanktransaktion und wurde vollständig zurückgerollt: keine Stornierung, keine Mail, keine Zahlungsaktion. Protokoll: [guest-cancel] Stornierung fehlgeschlagen.
reservierung-nicht-gefunden-wirtFür Betriebsinhaber · 404Die Reservierung wurde nicht gefunden. (error: reservation_not_found bzw. „Reservation not found“)
Zur Kennung gibt es in diesem Betrieb keine Reservierung — gelöscht, einem anderen Betrieb zugeordnet oder ein veralteter Link. Jede Fehlerantwort dieser Routen trägt neben error (Maschinencode) ein deutsches message; Oberflächen zeigen message ?? error. /confirm und /cancel antworten mit reservation_not_found, GET/PUT/DELETE /reservations/[id] vorerst noch mit dem englischen Code „Reservation not found“ (bzw. „Restaurant not found“ für den Betrieb).
reservierung-aktion-validationFür Betriebsinhaber · 400validation (mit message und issues.fieldErrors), z. B. „Optionszeit von: Uhrzeit im Format HH:mm angeben.“ oder „Persönliche Nachricht: Höchstens 2000 Zeichen.“
Der Rumpf von Bestätigen, Stornieren oder Bearbeiten verletzt das Zod-Schema. message nennt den ersten Feldfehler mit deutschem Feldnamen (Optionszeit von/bis, Nachrichtenvorlage, Persönliche Nachricht, Grund, Tischzuweisung, Tischauswahl, Bisherige Tischauswahl); issues.fieldErrors führt alle Felder. Weitere Standardfälle: „Nachrichtenvorlage: Ungültige Vorlage. Bitte erneut auswählen.“, „Grund: Höchstens 500 Zeichen.“, „Tischzuweisung: Höchstens 200 Zeichen.“, „Tischauswahl: Höchstens 30 Tische.“
reservierung-aktion-internFür Betriebsinhaber · 500Die Reservierung konnte nicht bestätigt werden. Bitte erneut versuchen. / … nicht storniert werden … / … nicht geladen, gespeichert oder gelöscht werden … (error: internal bzw. „Internal Server Error“)
Unerwarteter Fehler beim Schreiben der Reservierung; die Ausnahme steht im Serverlog, nach aussen geht nur der feste Satz. Ein Versandfehler allein erzeugt KEINEN 500: dann antwortet die Route mit 200 und emailSent: false, und die Oberfläche warnt „… aber die Bestätigungsmail ging NICHT raus. Bitte den Gast selbst verständigen.“ Fehlt dem Gast eine Adresse (emailError no_email), gibt es weder Warnung noch Fehler — die App meldet neutral „Reservierung bestätigt.“
storno-rate-limitedFür Gäste · 429Zu viele Anfragen. Bitte versuchen Sie es später erneut.
Mehr als 10 Storno-Versuche pro Stunde je IP (cancel/route.ts, POST: limit).
storno-netzwerkfehlerFür GästeNetzwerkfehler. Bitte versuchen Sie es erneut.
Der fetch selbst warf — keine Verbindung oder abgebrochene Anfrage.
manage-link-404Für Gäste · 404(Next.js-404-Seite, keine eigene Erklärung)
notFound() bei fehlendem hash-Parameter (Zeile 35), nicht passender Reservierung (46) oder fehlendem Betrieb (54).
vorschlag-link-ungueltig-seiteFür GästeDieser Link ist nicht mehr gültig — "Der Vorschlag wurde möglicherweise bereits angenommen, ist abgelaufen oder wurde durch einen neueren ersetzt."
Ein Sammelbildschirm für Token-Formatfehler (Zeile 29), Seiten-Bremse (40), unbekanntes Token (44), evaluateProposal-Absage (47) und fehlenden Betrieb (60).
vorschlag-invalidFür Gäste · 404{ error: "invalid", message: "Dieser Link ist nicht mehr gültig." }
Neutrale Absage für Token-Formatfehler, unbekanntes Token oder abgelehnte acceptProposal (verbraucht, abgelaufen, Reservierung geschlossen — proposals.ts:134-139).
vorschlag-invalid-inputFür Entwickler · 400invalid_input
Der Body entspricht nicht dem proposalAcceptSchema (confirm: true fehlt).
vorschlag-annahme-ungueltigFür GästeDieser Link ist nicht mehr gültig. Bitte wenden Sie sich an das Restaurant.
Jede nicht-ok Antwort außer 429 wird hier zusammengefasst (abgelaufen, verbraucht, unbekannt).
vorschlag-rate-limitedFür Gäste · 429Zu viele Versuche. Bitte versuchen Sie es später erneut.
20 Annahmen pro Stunde je IP oder 10 je Token überschritten (route.ts:47, 59).
vorschlag-netzwerkfehlerFür GästeNetzwerkfehler. Bitte versuchen Sie es erneut.
Der fetch warf — keine Verbindung.
vorschlag-mail-failedFür Betriebsinhaber[proposal-accept] confirmation email failed (nur Serverlog)
Die Bestätigungsmail nach angenommenem Vorschlag scheiterte; die Annahme bleibt bewusst bestehen.
erinnerung-nicht-verschicktFür Entwickler[guest-notifications] Zeitsteuerung fehlgeschlagen (Serverlog)
Der gemeinsame Lauf für Erinnerungen und weitere automatische Benachrichtigungen ist abgebrochen. Einzelne Zustellungen werden in GuestNotificationDelivery mit Versuchszahl und letztem Fehler festgehalten; der Lauf versucht sie höchstens dreimal innerhalb von 24 Stunden erneut.
loader-data-slug-missingFür Betriebsinhaber[TacticTable Widget] data-slug attribute missing
Das Script-Tag hat kein oder ein leeres data-slug; der Loader bricht sofort ab und rendert nichts.
loader-config-unreachableFür Betriebsinhaber[TacticTable Widget] Konfiguration nicht erreichbar — nutze Inline-Modus.
Der fetch auf /api/widget/<slug>/config warf (CORS, Netz, Content-Security-Policy der Wirt-Seite). Der Loader fällt still auf den Inline-Modus zurück.
loader-config-unlesbarFür Betriebsinhaber[TacticTable Widget] Konfiguration nicht lesbar — nutze Inline-Modus.
Die Config-Antwort war ein Fehlerobjekt (404 Restaurant, 403 subscription_inactive) — erkannt an raw.error (Zeile 367).
loader-zielbereich-nicht-gefundenFür Betriebsinhaber[TacticTable Widget] Zielbereich "<selector>" nicht gefunden — Formular am Seitenende eingefuegt.
data-target zeigt auf ein Element, das es nicht gibt (oder der Selektor ist ungültig und querySelector warf).
loader-script-im-headFür Betriebsinhaber[TacticTable Widget] Das Script-Tag steht im <head>; dort waere das Formular unsichtbar. Es wurde am Seitenende eingefuegt — mit data-target="#auswahl" platzieren Sie es genau.
CMS-Erweiterungen (Joomla, Shopware, TYPO3, Contao) hängen das Script in den <head>; dort gilt display:none.
loader-kein-einfuegepunktFür Betriebsinhaber[TacticTable Widget] Kein Einfuegepunkt gefunden — Formular am Seitenende eingefuegt.
Das Script-Tag hat keinen parentNode (etwa dynamisch eingefügt und wieder entfernt).
loader-kein-bodyFür Betriebsinhaber[TacticTable Widget] Kein <body> vorhanden — Formular nicht eingefuegt.
Weder data-target noch document.body vorhanden; es wird nichts gerendert.
loader-unbekannter-modeFür Betriebsinhaber[TacticTable Widget] Unbekannter data-mode "<wert>" — nutze die Dashboard-Einstellung.
data-mode enthält einen Wert, den der Loader nicht kennt (Tippfehler).
cors-origin-nullFür Betriebsinhaber(keine Meldung — der Browser blockt; die Wirt-Seite sieht nur einen CORS-Fehler)
Ist allowedOrigins gefüllt und die aufrufende Herkunft nicht darin, liefert der Header Access-Control-Allow-Origin: null.
frame-ancestors-blockiertFür Betriebsinhaber(keine Meldung — leerer iFrame; Browser meldet frame-ancestors-Verstoß in der Konsole)
Die CSP auf /book/<slug> erlaubt nur bekannte Herkünfte als Einbettung; eine nicht eingetragene Domain sieht ein leeres Frame.
widget-frame-unavailableFür Entwickler · 503{ error: "unavailable" }
Der Nachschlag der frame-ancestors-Regel scheiterte (DB). Bewusst 503 statt null, damit die Middleware es nur 10 Sekunden merkt.
phone-emptyFür GästeBitte eine Telefonnummer angeben.
Pflichtfeld Telefon ist leer (requirePhone aktiv); angezeigt am Feld, sobald es berührt wurde (phone-field.tsx:123).
phone-invalidFür GästeDiese Telefonnummer enthält unzulässige Zeichen.
Die Eingabe enthält Zeichen außerhalb des erlaubten Musters (phone.ts:167).
phone-unknown-countryFür GästeDiese Ländervorwahl kennen wir nicht.
Die Vorwahl passt zu keinem Eintrag der Länderliste (phone.ts:188, 194).
phone-too-shortFür GästeDiese Telefonnummer ist zu kurz.
Die nationale Nummer bleibt unter der Mindestlänge des Landes (phone.ts:204).
phone-too-longFür GästeDiese Telefonnummer ist zu lang.
Die nationale Nummer überschreitet die Höchstlänge des Landes oder MAX_PHONE_INPUT.
absenden-still-gesperrtFür Gäste(keine Meldung — der Absenden-Knopf ist einfach deaktiviert)
canSubmit ist false: Uhrzeit oder Pflicht-Endzeit fehlt, Name leer, Pflicht-E-Mail leer oder die Telefonnummer nicht parsebar (Zeile 126-139).
slot-label-closedFür Gäste<HH:mm> — geschlossen
Die Verfügbarkeitsroute liefert reason "closed" für diese Startzeit.
slot-label-blockedFür Gäste<HH:mm> — gesperrt
Eine Sperrzeit überdeckt die Startzeit.
slot-label-limitFür Gäste<HH:mm> — Kontingent erreicht
Das Reservierungskontingent des Zeitfensters ist ausgeschöpft.
slot-label-capacityFür Gäste<HH:mm> — ausgebucht
Kein passender Tisch für die Personenzahl frei.
slot-label-advanceFür Gäste<HH:mm> — zu kurzfristig
minAdvanceHours bzw. sameDayCutoffTime schließt die Uhrzeit aus.
slot-label-nicht-verfuegbarFür Gäste<HH:mm> — nicht verfügbar
Der Server schickte keinen oder einen unbekannten reason-Wert.
tag-blockedFür GästeNicht buchbar (Tooltip/Vorlesetext am Kalendertag)
Der Tag hat den Status "blocked"; ein Freitext des Betriebs ersetzt diesen Standardtext, wenn vorhanden (date-field.tsx:121).
tag-closedFür GästeGeschlossen
Für diesen Wochentag bzw. Bereich ist keine Öffnungszeit hinterlegt.
tag-pastFür GästeVergangen
Der Tag liegt vor heute (date-field.tsx:117).
tag-fullFür GästeAusgebucht
Der Tag bietet für diese Personenzahl keine freie Startzeit mehr.
tag-ausserhalb-buchungszeitraumFür GästeAußerhalb des Buchungszeitraums (Text-Schlüssel dateOutOfWindow)
Der Tag liegt jenseits von maxAdvanceDays.
unknown-area-dashboardFür Mitarbeiter · 400Dieser Bereich gehört nicht zu diesem Betrieb.
Der Bereichsfilter der Reservierungsliste oder der Reservierungsstatistik verweist auf einen fremden oder gelöschten Bereich — meist aus einem gespeicherten Filter.
reservation-area-stats-too-largeFür Mitarbeiter · 422Für diesen Zeitraum sind es zu viele Reservierungen für die Auswertung nach Bereich. Bitte den Zeitraum eingrenzen.
Die Auslastung nach Bereich zählt jede Reservierung einzeln samt Tischen; mehr als 50.000 Treffer wertet sie nicht aus, statt eine abgeschnittene Zahl zu zeigen.
reservation-area-stats-failedFür Mitarbeiter · 500Die Auslastung nach Bereich konnte nicht geladen werden.
Die Auswertung im Statistik-Fenster ist gescheitert (Verbindung, Server oder eine ungültige Antwort). Die Kennzahlen darüber und die Liste sind davon nicht betroffen.
unknown-table-dashboardFür Mitarbeiter · 400Mindestens ein Tisch gehört nicht zu diesem Betrieb.
Eine gesendete tableId gehört zu einem anderen Betrieb oder wurde gelöscht.
conflict-dashboardFür Mitarbeiter · 409{ error: "conflict", conflicts: [...] }
Die gewählten Tische sind im Zeitfenster bereits belegt (Doppelbuchungsschutz).
vorschlag-text-fehltFür Mitarbeiter · 400Bitte einen Text für den Gast schreiben.
messageHtml ist leer; ohne Text erhielte der Gast eine nackte Mail.
bestaetigung-zahlung-offen-vorlage-nicht-verwendetFür BetriebsinhaberReservierung bestätigt — es ist aber noch eine Zahlung offen: Der Gast bekam die Zahlungsmail mit Zahllink. Die im Bestätigungsfenster gewählte Vorlage wurde dafür nicht verwendet.
Für die Reservierung steht eine Anzahlung oder Kartenhinterlegung aus. In diesem Fall ersetzt die dafür unter Gästebenachrichtigungen gewählte Standardvorlage die normale Bestätigung. Ist dort keine Vorlage zugeordnet, verwendet TacticTable das feste sichere Zahlungslayout. Die persönliche Nachricht steht in beiden Varianten trotzdem in der Mail.
Reservierungsassistent
Reservierungsassistent · 3 Meldungen
reservation-assistant-unavailableFür Betriebsinhaber · 402 / 503Der Assistent ist gerade nicht verfügbar.
KI-Guthaben fehlt, das eingestellte Modell ist beim Anbieter nicht mehr verfügbar oder der Modellanbieter ist vorübergehend nicht erreichbar. Fehlt das Modell oder liefert es keine Antwort bzw. lehnt jede Anfrage ab, meldet die Glocke das höchstens einmal am Tag mit Link zur Modellauswahl.
reservation-assistant-limitFür Gäste · 429Das Nachrichtenlimit ist erreicht.
Das vom Restaurant gesetzte Fragenlimit oder die kurzfristige Anfragebegrenzung ist erreicht.
reservation-assistant-handoffFür Betriebsinhaber · 400 / 409 / 503Die Anfrage konnte nicht weitergeleitet werden.
Der Name des Gasts, eine gültige Gast- oder Restaurant-E-Mail-Adresse fehlt, der Chat antwortet noch oder der Mailversand ist fehlgeschlagen. Fragen stellen geht auch ohne Namen, die Weiterleitung ans Team nicht.
Sicherheitsprüfung und Sicherheitsmethoden
Sicherheitsprüfung und Sicherheitsmethoden (Anmeldung, Passkey, Codes) · 9 Meldungen
sicherheit-pruefung-offenFür Betriebsinhaber · 403{"error":"mfa_required"} (HTTP 403)
Die Sitzung hat ihre zweite Stufe noch nicht bestaetigt. Der Waechter laesst sie nur auf die Sicherheitsseiten; jeder andere Aufruf wird abgewiesen, API-Aufrufe mit dieser Meldung.
sicherheit-keine-methodeFür Betriebsinhaber · —Richte zuerst eine Sicherheitsmethode ein.
Die Pruefung verlangt eine bestaetigte Methode, es ist aber keine hinterlegt. Bei Agenturkonten ist mindestens eine Pflicht.
sicherheit-sitzung-ungueltigFür Betriebsinhaber · 401{"error":"Unauthorized"} (HTTP 401)
Die Sitzung ist nicht mehr brauchbar — widerrufen, abgelaufen, oder alle Sitzungen wurden ungueltig (etwa nach einem Passwortwechsel oder einer E-Mail-Aenderung).
sicherheit-code-abgelaufenFür Betriebsinhaber · 410The verification request has expired.
Die Anfrage zur Pruefung ist zu alt, schon benutzt, oder es wurde zu oft geraten. Codes gelten nur kurz — das ist der Schutz gegen Durchprobieren.
anmeldung-google-unsere-seiteFür Betriebsinhaber · —Die Anmeldung ist auf unserer Seite fehlgeschlagen. Bitte versuche es noch einmal — klappt es wieder nicht, schreib uns kurz, wir sehen den Fehler in unserem Protokoll.
Auf dem Rueckweg von Google ist bei uns etwas schiefgegangen (Adresse endet auf ?error=Configuration). Das ist der Sammelfall fuer alles, was serverseitig wirft — etwa eine Datenbank, die gerade nicht antwortet. Frueher stand man danach wortlos wieder vor dem Formular.
anmeldung-google-andere-anmeldeartFür Betriebsinhaber · —Zu dieser E-Mail-Adresse gibt es bereits ein Konto mit einer anderen Anmeldeart. Bitte melde dich so an wie beim ersten Mal.
Die Adresse gehoert schon zu einem Konto, das auf anderem Weg angelegt wurde, und die Verknuepfung wurde abgelehnt (?error=OAuthAccountNotLinked).
anmeldung-google-nicht-bestaetigtFür Betriebsinhaber · —Google hat die Anmeldung nicht bestätigt. Bitte versuche es erneut.
Im Google-Fenster wurde abgebrochen oder die Freigabe verweigert (?error=OAuthCallbackError).
anmeldung-cookie-nicht-angenommenFür Betriebsinhaber · —Dein Browser hat ein für die Anmeldung nötiges Cookie nicht angenommen. Bitte erlaube Cookies für diese Seite und versuche es noch einmal.
Vor jedem Anmeldeversuch setzt die Seite ein kurzlebiges Schutz-Cookie. Kommt es nicht an — Cookies gesperrt, strenger Privatmodus, ein Werbeblocker —, lehnt der Server den Versuch ab (?error=MissingCSRF). Neuladen allein hilft nicht.
anmeldung-google-passwort-verfallenFür Betriebsinhaber · —Ungültige E-Mail oder Passwort
Das Konto wurde mit E-Mail und Passwort angelegt, die Adresse aber nie bestaetigt — und danach zum ersten Mal mit Google angemeldet. Google bestaetigt die Adresse; das bis dahin hinterlegte Passwort verfaellt dabei, weil niemand belegen kann, dass es vom Inhaber der Adresse stammt. Alle vorher offenen Sitzungen enden.
Telefon-Agent
Telefon-Agent · 199 Meldungen
telefon-betrieb-disabledFür Betriebsinhaber · 503Der Telefon-Agent ist auf dieser Umgebung ausgeschaltet.
Der Hauptschalter des Telefon-Agenten ist auf dieser Umgebung nicht gesetzt: Die Funktion ist für Ihr Konto noch nicht freigeschaltet oder wurde vorübergehend abgeschaltet. Anrufe werden dann abgewiesen; Kündigungen, Freigaben und Löschfristen laufen weiter.
telefon-betrieb-missing-public-base-urlFür Entwickler · 503Die öffentliche Adresse für Provider-Webhooks ist nicht eingerichtet.
`PHONE_AGENT_PUBLIC_BASE_URL` fehlt oder ist keine https-Adresse ohne Pfad, Abfrage und Schrägstrich am Ende. Ohne sie entstehen keine Rückruf-Adressen für Twilio und ElevenLabs, und Signaturen lassen sich nicht prüfen.
telefon-betrieb-missing-tool-secretFür Entwickler · 503Das Geheimnis für die Agenten-Werkzeuge ist nicht eingerichtet.
`PHONE_AGENT_TOOL_SECRET` fehlt oder besteht nicht aus genau 64 Hex-Zeichen. Werkzeugaufrufe des Sprachdienstes werden dann mit 503 abgelehnt – der Agent kann weder Tische prüfen noch buchen.
telefon-betrieb-missing-twilioFür Entwickler · 503Der Telefonie-Anbieter ist nicht eingerichtet.
`TWILIO_ACCOUNT_SID` (`AC` + 32 Hex) oder `TWILIO_AUTH_TOKEN` (32 Hex, primärer Token des Hauptkontos) fehlt oder hat das falsche Format.
telefon-betrieb-missing-elevenlabsFür Entwickler · 503Der Sprachdienst ist nicht eingerichtet.
`ELEVENLABS_API_KEY` fehlt oder ist ein Platzhalter, oder `ELEVENLABS_API_BASE_URL` nennt keinen offiziellen ElevenLabs-Host.
telefon-betrieb-missing-webhook-secretFür Entwickler · 503Das Geheimnis für Gesprächsauswertungen ist nicht eingerichtet.
`ELEVENLABS_WEBHOOK_SECRET` oder `ELEVENLABS_POST_CALL_WEBHOOK_ID` fehlt. Ohne sie nimmt `/api/webhooks/elevenlabs/post-call` keine Auswertung an – Gespräche werden weder protokolliert noch endgültig abgerechnet.
telefon-betrieb-missing-private-bucketFür Entwickler · 503Der private Dokumentenspeicher ist nicht eingerichtet.
`R2_PRIVATE_BUCKET` fehlt oder ist derselbe Bucket wie der öffentliche `R2_BUCKET`. Nachweise und Stimmproben dürfen nie öffentlich liegen.
telefon-betrieb-missing-rate-limit-storeFür Entwickler · 503Der geteilte Zähler der Missbrauchsbremse ist nicht eingerichtet.
In der Produktion fehlen `RATE_LIMIT_REDIS_URL` und `RATE_LIMIT_REDIS_TOKEN` (Upstash-REST-Zugang) oder sind keine https-Adresse. Ein Zähler je Instanz hieße bei mehreren Instanzen ein Vielfaches der erlaubten Anrufe, Codes und Links; TacticTable lehnt deshalb ab, statt ungebremst Kosten zu erzeugen.
telefon-betrieb-not-live-approvedFür Betriebsinhaber · 503Kostenpflichtige Telefonfunktionen sind auf dieser Umgebung nicht freigegeben.
Nummernkauf, echte Einreichung der Unterlagen, Stimmklon, Prüfanrufe und kostenpflichtige Hörproben brauchen eine ausdrückliche Freigabe der Umgebung; in der Produktion zusätzlich die rechtliche und die Betriebsfreigabe.
telefon-betrieb-forbidden-transitionFür Betriebsinhaber · 409Dieser Schritt ist im aktuellen Zustand nicht erlaubt.
Der Vorgang passt nicht zum aktuellen Stand, etwa weil ein Schritt in einem anderen Fenster schon erledigt oder zurückgenommen wurde.
telefon-betrieb-cas-conflictFür Betriebsinhaber · 409Der Datensatz wurde inzwischen geändert. Bitte neu laden und erneut versuchen.
Zwischen dem Laden und dem Speichern hat jemand anderes – oder ein Hintergrundlauf – denselben Datensatz geändert. TacticTable überschreibt nie still einen neueren Stand.
telefon-betrieb-cas-table-not-allowedFür Entwickler · 500Interner Fehler: Tabelle ist für Zustandswechsel nicht freigegeben.
Ein Programmteil wollte einen Zustand in einer Tabelle wechseln, die nicht auf der Freigabeliste der Zustandswechsel steht.
telefon-betrieb-cas-column-not-allowedFür Entwickler · 500Interner Fehler: Spalte ist für Zustandswechsel nicht freigegeben.
Ein Zustandswechsel wollte eine Spalte setzen, die für diese Tabelle nicht freigegeben ist.
telefon-betrieb-cas-expectation-missingFür Entwickler · 500Interner Fehler: Zustandswechsel ohne erwarteten Stand.
Ein Zustandswechsel ohne erwarteten Vorzustand – das wäre ein Überschreiben ohne Vergleich.
telefon-betrieb-lock-order-violationFür Entwickler · 500Interner Fehler: Sperren in falscher Reihenfolge angefordert.
Eine Transaktion wollte Zeilen in einer anderen Reihenfolge sperren als festgelegt; das könnte zu Verklemmungen führen.
telefon-betrieb-job-payload-invalidFür Entwickler · 400Der Hintergrundauftrag enthält ungültige Daten.
Ein Hintergrundauftrag besteht die Schemaprüfung seiner Art nicht – etwa nach einer Änderung des Schemas.
telefon-betrieb-job-scope-invalidFür Entwickler · 400Der Hintergrundauftrag passt nicht zu seinem Geltungsbereich.
Ein Auftrag ohne bzw. mit Restaurant, obwohl seine Art das Gegenteil verlangt.
telefon-betrieb-job-not-registeredFür Entwickler · 503Für diesen Hintergrundauftrag ist noch keine Verarbeitung hinterlegt.
Für die Auftragsart ist kein Handler registriert. Ein leeres Register meldet das, statt Erfolg vorzutäuschen.
telefon-betrieb-provider-operation-not-registeredFür Entwickler · 503Für diese Anbieteraktion ist noch keine Verarbeitung hinterlegt.
Für die Art der Anbieteraktion ist kein Ausführer registriert.
telefon-betrieb-provider-operation-preflight-missingFür Entwickler · 503Kostenpflichtige Anbieteraktion ohne Vorabprüfung – nicht ausgeführt.
Eine kostenpflichtige Anbieteraktion sollte ohne die Vorabprüfung von Freigabe, Guthaben und Zustand laufen. Sie wurde nicht ausgeführt, es entstanden keine Kosten.
telefon-betrieb-body-too-largeFür Entwickler · 413Die Anfrage ist zu groß.
Der Anfragekörper überschreitet die Grenze der Route (Webhooks, Werkzeuge, Formulare).
telefon-betrieb-body-invalidFür Entwickler · 400Die Anfrage ist ungültig.
Der Körper ist kein gültiges JSON bzw. Formular oder besteht die Schemaprüfung nicht.
telefon-betrieb-receipt-busyFür Entwickler · 409Dieses Ereignis wird gerade verarbeitet.
Dasselbe Anbieterereignis kam doppelt, und die erste Zustellung läuft noch.
telefon-betrieb-receipt-mismatchFür Entwickler · 409Dieses Ereignis wurde bereits mit anderem Inhalt empfangen.
Ein Ereignis mit derselben Kennung, aber anderem Inhalt – ein Hinweis auf eine Fälschung oder einen Anbieterfehler.
telefon-betrieb-session-invalidFür Entwickler · 401Die Gesprächssitzung ist ungültig oder abgelaufen.
Ein Werkzeugaufruf des Sprachdienstes trug kein gültiges Sitzungs-Token oder gehört zu einem beendeten bzw. fremden Gespräch.
telefon-betrieb-rate-limitedFür Betriebsinhaber · 429Zu viele Anfragen. Bitte später erneut versuchen.
Eine Missbrauchsbremse hat gegriffen – etwa zu viele Anrufe je Stunde, Werkzeugaufrufe im Gespräch oder Anbieteraktionen in kurzer Zeit.
telefon-betrieb-rate-limit-unavailableFür Entwickler · 503Die Missbrauchsbremse ist gerade nicht erreichbar; aus Sicherheitsgründen abgelehnt.
Der Zählerspeicher der Bremse (Redis, `RATE_LIMIT_REDIS_*`) antwortet nicht – oder ist in der Produktion gar nicht eingerichtet. TacticTable lehnt dann ab, statt ungebremst Kosten zu erzeugen; der Betrieb bekommt einen Alarm.
telefon-betrieb-audit-secret-missingFür Entwickler · 503Das Audit-Geheimnis fehlt; ohne Audit werden keine Änderungen gespeichert.
Der Schlüssel für die Fingerabdrücke des Fachaudits (`AUTH_SECRET`) fehlt. Ohne Audit speichert der Telefon-Agent keine Änderung.
telefon-zugang-session-expiredFür Mitarbeiter · 401Deine Sitzung ist abgelaufen. Bitte melde dich erneut an.
Die Anmeldung ist abgelaufen oder wurde auf einem anderen Gerät beendet.
telefon-zugang-mfa-requiredFür Mitarbeiter · 403Bitte richte zuerst die Zwei-Faktor-Anmeldung ein (Konto → Sicherheit).
Für diesen Bereich ist die Zwei-Faktor-Anmeldung Pflicht, etwa für Agenturzugänge.
telefon-zugang-email-unverifiedFür Mitarbeiter · 403Bitte bestätige zuerst deine E-Mail-Adresse.
Die E-Mail-Adresse des Kontos ist noch nicht bestätigt.
telefon-zugang-forbiddenFür Mitarbeiter · 403Dafür fehlt dir die Berechtigung.
Ihrer Rolle fehlt das nötige Recht – etwa „Telefon-Agent“ schreiben, „Gesprächsinhalte (sensibel)“ oder die Abrechnung. Manche Ansichten nennen das fehlende Recht ausdrücklich.
telefon-zugang-status-402Für Betriebsinhaber · 402Diese Funktion ist in deinem Tarif nicht enthalten.
Der Telefon-Agent oder die Funktion setzt das gebuchte Add-on bzw. ein Guthaben voraus.
telefon-zugang-status-404Für Mitarbeiter · 404Das gibt es nicht (mehr) oder es ist hier nicht verfügbar. Bitte lade die Seite neu.
Das Element wurde gelöscht, gehört zu einem anderen Betrieb, oder der Telefon-Agent ist auf dieser Umgebung nicht verfügbar.
telefon-zugang-status-413Für Mitarbeiter · 413Die Anfrage ist zu groß.
Ein Text oder eine Auswahl überschreitet die Grenze des Formulars.
telefon-zugang-status-415Für Mitarbeiter · 415Die Anfrage wurde aus Sicherheitsgründen abgelehnt. Bitte lade die Seite neu.
Die Anfrage kam ohne die erwarteten Sicherheitsmerkmale an, etwa aus einem veralteten Tab.
telefon-zugang-status-429Für Mitarbeiter · 429Zu viele Anfragen in kurzer Zeit. Bitte versuche es gleich noch einmal.
Eine Bremse gegen zu viele Aufrufe hat gegriffen.
telefon-zugang-networkFür MitarbeiterKeine Verbindung zum Server. Bitte prüfe deine Internetverbindung und versuche es erneut.
Der Browser hat den Server nicht erreicht.
telefon-zugang-unexpected-responseFür MitarbeiterDie Antwort des Servers hat ein unerwartetes Format. Bitte lade die Seite neu.
Die Antwort passte nicht zum erwarteten Schema, meist nach einem Update während die Seite offen war.
telefon-zugang-genericFür MitarbeiterDas hat nicht geklappt. Bitte versuche es erneut.
Der Server hat abgelehnt, ohne einen verwertbaren Satz zu schicken.
telefon-einrichtung-step-lockedFür Betriebsinhaber · 409Dieser Schritt ist erst erreichbar, wenn die vorigen begonnen sind.
Der Assistent öffnet höchstens den Schritt nach dem weitesten begonnenen. Ein Lesezeichen oder ein älterer Tab wollte weiter springen.
telefon-einrichtung-answers-incompleteFür Betriebsinhaber · 409Bitte zuerst Variante, Land und – bei bestehender Nummer – Nummer, Anbieter, Gerät und Umleitungsart angeben.
Für den Anschluss fehlen Angaben aus Schritt 1.
telefon-einrichtung-connection-existsFür Betriebsinhaber · 409Es gibt schon einen laufenden Anschluss. Beende ihn zuerst, um einen anderen anzulegen.
Für den Betrieb ist bereits ein Anschluss angelegt, etwa in einem anderen Tab.
telefon-einrichtung-connection-missingFür Betriebsinhaber · 409Es gibt noch keinen Anschluss. Bitte lege ihn im ersten Schritt an.
Ein späterer Schritt braucht einen Anschluss, der noch nicht angelegt ist.
telefon-einrichtung-connection-not-replaceableFür Betriebsinhaber · 409Für diesen Anschluss ist schon eine Rufnummer bestellt. Eine andere Nummer geht über „Nummer ersetzen“ in den Einstellungen.
Eine bestellte Nummer kostet Miete; der Assistent verwirft sie deshalb nicht nebenbei.
telefon-einrichtung-number-kind-unsupportedFür Betriebsinhaber · 409Bitte eine Mobil- oder Festnetznummer angeben – Service- und Sondernummern lassen sich nicht anbinden.
Die angegebene Nummer ist eine Service-, Mehrwert-, Sammel- oder Kurzwahlnummer.
telefon-einrichtung-delay-not-supportedFür Betriebsinhaber · 409Diese Klingeldauer ist für deinen Anbieter nicht offiziell belegt. Wähle eine belegte Dauer oder „bei Nichtannahme“ ohne eigene Dauer.
TacticTable bietet nur Klingeldauern an, die Ihr Anbieter selbst veröffentlicht; eine andere Dauer könnte den Code ungültig machen.
telefon-einrichtung-forwarding-not-readyFür Betriebsinhaber · 409Die Rufumleitung aktivierst du erst, wenn Nummer und Agent für den Test bereit sind.
Die Zielnummer ist noch nicht aktiv oder der Agent ist nicht testbereit (Einstellungen nicht gespeichert, Stimme nicht bereit oder nicht übertragen). Sonst landeten Gäste bei einem Agenten, der nicht antwortet.
telefon-einrichtung-forwarding-lockedFür Betriebsinhaber · 409Die Umleitung ist schon bestätigt. Anbieter oder Umleitungsart lassen sich jetzt nicht mehr hier ändern – bitte wende dich an den Support.
Nach der Bestätigung hängen Prüfanrufe und Anleitung an diesen Angaben.
telefon-einrichtung-forwarding-not-inconclusiveFür Betriebsinhaber · 409Eine Bestätigung ist nur nötig, wenn die Weiterleitungsprobe deine Umleitung nicht prüfen konnte.
Der Prüfanruf hat ein eindeutiges Ergebnis geliefert oder läuft noch.
telefon-einrichtung-fallback-invalidFür Betriebsinhaber · 400Bitte eine gültige Telefonnummer mit Ländervorwahl angeben.
Das Weiterleitungsziel lässt sich nicht als Telefonnummer lesen.
telefon-einrichtung-fallback-countryFür Betriebsinhaber · 400Als Weiterleitungsziel sind nur Nummern aus Österreich, Deutschland oder der Schweiz möglich.
Weiterleitungen ins Ausland verursachen unkalkulierbare Kosten.
telefon-einrichtung-fallback-kindFür Betriebsinhaber · 400Bitte eine normale Festnetz- oder Mobilnummer angeben – keine Mehrwert-, Service- oder Sammelnummer.
Mehrwert-, Service- und Sammelnummern verursachen Fremdkosten oder lassen sich nicht prüfen.
telefon-einrichtung-fallback-own-numberFür Betriebsinhaber · 400Das Ziel darf keine Nummer dieses Telefon-Agenten sein, sonst klingelt der Anruf im Kreis.
Das Ziel ist die Nummer für Ihre Gäste oder die Zielnummer der Umleitung.
telefon-einrichtung-fallback-missingFür Betriebsinhaber · 409Bitte zuerst ein Weiterleitungsziel eintragen.
Der Prüfanruf des Weiterleitungsziels wurde ohne gespeichertes Ziel gestartet.
telefon-einrichtung-test-kind-unsupportedFür Betriebsinhaber · 409Diese Prüfung passt nicht zu diesem Anschluss oder Schritt.
Etwa ein Prüfanruf der Umleitung bei einer neuen Nummer oder ein SMS-Code, wo nur der Rückruf passt.
telefon-einrichtung-forwarding-unconfirmedFür Betriebsinhaber · 409Bitte bestätige zuerst, dass du die Rufumleitung eingerichtet hast – erst dann lässt sie sich prüfen.
Ein Prüfanruf vor der Bestätigung hätte nichts zu prüfen.
telefon-einrichtung-connection-not-testingFür Betriebsinhaber · 409Der Anschluss ist gerade in keinem Zustand, in dem sich diese Prüfung starten lässt – etwa solange die Nummer noch eingerichtet oder der Anschluss beendet wird. Bitte lade die Seite neu.
Die Nummer wird noch eingerichtet, der Anschluss wird beendet, oder der Stand hat sich in einem anderen Tab geändert.
telefon-einrichtung-routing-number-missingFür Betriebsinhaber · 409Die Rufnummer von TacticTable für diesen Anschluss ist noch nicht aktiv. Sobald sie bereitsteht, kannst du die Prüfung starten.
Die Zielnummer ist bestellt, aber noch nicht eingerichtet.
telefon-einrichtung-test-limitFür Betriebsinhaber · 429Für diesen Anschluss wurden in den letzten 24 Stunden schon drei Prüfanrufe gestartet. Bitte versuche es später erneut.
Prüfanrufe kosten Telefonie; je Anschluss sind höchstens drei in 24 Stunden erlaubt.
telefon-einrichtung-test-not-foundFür Betriebsinhaber · 404Diese Prüfung gibt es nicht.
Die Prüfung gehört zu einem anderen Anschluss oder wurde durch eine neuere ersetzt.
telefon-einrichtung-test-expiredFür Betriebsinhaber · 409Die Prüfung ist abgelaufen. Bitte starte sie neu.
Prüfungen und Testfenster gelten nur kurz (Testfenster 15 Minuten).
telefon-einrichtung-test-code-invalidFür Betriebsinhaber · 400Der Code stimmt nicht.
Der eingetragene Code passt nicht zu dem, den der Agent bzw. der Prüfanruf genannt hat.
telefon-einrichtung-test-lockedFür Betriebsinhaber · 409Zu viele Fehlversuche. Bitte starte die Prüfung neu.
Nach mehreren falschen Codes wird die Prüfung gesperrt, damit niemand Codes durchprobieren kann.
telefon-einrichtung-test-target-changedFür Betriebsinhaber · 409Das Weiterleitungsziel wurde inzwischen geändert. Bitte prüfe die neue Nummer.
Seit dem Start der Prüfung wurde das Weiterleitungsziel geändert; eine alte Prüfung bestätigt nie eine neue Nummer.
telefon-einrichtung-agent-not-readyFür Betriebsinhaber · 409Der Agent ist noch nicht bereit. Bitte erledige zuerst die offenen Punkte.
Es fehlen Voraussetzungen für den Testbetrieb, etwa Add-on, gespeicherte Einstellungen, eine bereite Stimme, die Übertragung zum Sprachdienst oder die eingerichtete Nummer. Die Meldung listet die Punkte mit Zuständigkeit.
telefon-einrichtung-agent-stateFür Betriebsinhaber · 409Der Agent ist dafür im falschen Zustand. Bitte lade die Seite neu.
Etwa Pausieren eines nicht laufenden Agenten oder Live-Schalten eines schon laufenden – oft nach einer Änderung in einem anderen Tab.
telefon-einrichtung-go-live-blockedFür Betriebsinhaber · 409Der Telefon-Agent kann noch nicht live gehen. Bitte erledige zuerst die offenen Punkte.
Vor dem Live-Schalten fehlt etwas – typischerweise der bestandene Audiotest, die geprüfte oder bestätigte Rufumleitung, Guthaben oder die Freigabe der Unterlagen. Die Meldung nennt die Punkte.
telefon-einrichtung-compensation-unavailableFür Betriebsinhaber · 409Eine Gutschrift-Kündigung ist hier nicht möglich – sie gibt es nur, wenn die Rufnummer nicht geliefert werden kann.
Die Kündigung mit Gutschrift ist der Ausweg für nicht lieferbare Nummern, keine allgemeine Kündigung.
telefon-einrichtung-reactivation-unavailableFür Betriebsinhaber · 409Eine Reaktivierung ist nur nach dem Ende des Telefon-Agenten möglich.
Der Telefon-Agent läuft noch oder ist gekündigt, aber noch nicht beendet.
telefon-einrichtung-reactivation-not-offeredFür Betriebsinhaber · 409Der Telefon-Agent ist für deinen Betrieb derzeit nicht buchbar.
Reaktivierung nach dem Ende des Add-ons, obwohl TacticTable den Telefon-Agenten für diesen Betrieb derzeit nicht zum Buchen freigegeben hat. Verlauf, Guthaben und Einstellungen bleiben erreichbar, neu buchen lässt er sich aber erst mit Freigabe. Der Assistent zeigt den Knopf dann gar nicht erst – die Meldung trifft einen veralteten Tab oder einen direkten Aufruf. Gestartet und geprüft wurde nichts.
telefon-einrichtung-fresh-mfa-requiredFür Betriebsinhaber · 403Bitte bestätige diesen Schritt mit deinem zweiten Faktor.
Bestellen und Kündigen mit Gutschrift verlangen einen frisch bestätigten zweiten Faktor; die Bestätigung fehlte oder war abgelaufen.
telefon-einrichtung-owner-onlyFür Betriebsinhaber · 403Das darf nur der Inhaber des Betriebs.
Angebot annehmen, bestellen, live schalten und Kündigen mit Gutschrift erzeugen Kosten im Namen des Betriebs.
telefon-verfuegbarkeit-mno-exclusiveFür BetriebsinhaberNeue Schweizer Mobilnummern mit Sprachempfang vergeben nur Swisscom, Sunrise und Salt per Geschäftskundenvertrag; du kannst deine bestehende Nummer anbinden.
Schweizer Mobilnummern (+41 75–79) liegen exklusiv bei den drei Netzbetreibern; kein angebundener Anbieter liefert sie mit Sprachempfang (live bestätigt am 5. Oktober 2026: keine einzige). Dafür wird nichts berechnet. Als neue Nummer bietet TacticTable in der Schweiz deshalb eine Ortsnummer (Festnetz) an; die Meldung erscheint nur, wenn auch diese gerade nicht lieferbar ist.
telefon-verfuegbarkeit-voice-unverifiedFür BetriebsinhaberOb neue Mobilnummern dieses Landes Anrufe annehmen können, ist noch nicht live bestätigt. Du kannst deine bestehende Nummer anbinden.
Die Angaben des Anbieters zu Mobilnummern mit Sprachempfang in diesem Land widersprechen sich oder fehlen; freigegeben wird erst nach einer Live-Prüfung. Für Österreich ist diese Prüfung erledigt: Dort gibt es derzeit keine neuen Mobilnummern mit Sprachempfang.
telefon-verfuegbarkeit-no-voice-numbersFür BetriebsinhaberUnser Telefonanbieter hat für neue Mobilnummern in diesem Land derzeit keine Nummern, die Anrufe annehmen können. Du kannst deine bestehende Nummer anbinden.
Betrifft neue österreichische Mobilnummern: Die Live-Prüfung beim Anbieter am 4. Oktober 2026 fand keine einzige Mobilnummer mit Sprachempfang, passend zu seiner Preisliste („Voice Enabled = No“). Eine reine SMS-Nummer bietet TacticTable nicht als Mobilnummer an. Dafür wird nichts berechnet. Als neue Nummer bietet TacticTable in Österreich deshalb eine Ortsnummer (Festnetz) an; die Meldung erscheint nur, wenn auch diese gerade nicht lieferbar ist.
telefon-verfuegbarkeit-provider-not-offeredFür BetriebsinhaberDiese Nummernart bietet unser Telefonanbieter in diesem Land derzeit nicht an. Bitte wende dich an den Support – TacticTable prüft die Nummernart.
Der Anbieter führt die Nummernart im Land gar nicht – so österreichische „National“-Nummern (+43 720): Seine Nummernsuche antwortet dafür mit „nicht vorhanden“ (Live-Prüfung am 4. Oktober 2026). Die Zielnummer ist in Österreich deshalb eine Ortsnummer, und diese Art bietet der Assistent gar nicht erst an. Erscheint die Meldung bei der Suche nach einer Art, die TacticTable als lieferbar führt, schreibt der Server eine Warnung für den TacticTable-Support. Eine andere Art sucht der Assistent dann nicht von selbst.
telefon-verfuegbarkeit-not-offeredFür BetriebsinhaberDiese Nummernart bietet TacticTable für diesen Anschluss nicht an.
Die Nummernart passt nicht zur gewählten Variante, etwa eine Mobilnummer als Ziel einer Rufumleitung.
telefon-verfuegbarkeit-gate-disabledFür BetriebsinhaberDiese Option ist derzeit abgeschaltet.
TacticTable hat die Option für diese Umgebung abgeschaltet.
telefon-verfuegbarkeit-gate-blockedFür BetriebsinhaberDiese Option ist beim Anbieter derzeit nicht lieferbar.
Eine Prüfung beim Anbieter hat keine passenden Nummern gefunden.
telefon-verfuegbarkeit-gate-unverifiedFür BetriebsinhaberDiese Option wird gerade geprüft und ist noch nicht freigegeben.
Die Lieferbarkeit ist noch nicht live bestätigt.
telefon-verfuegbarkeit-gate-missingFür BetriebsinhaberDiese Funktion ist noch nicht freigegeben.
Für die Option gibt es auf dieser Umgebung keine Freigabe; ohne Freigabe gilt sie als gesperrt.
telefon-verfuegbarkeit-production-numbers-disabledFür BetriebsinhaberRufnummern werden in dieser Umgebung noch nicht vergeben.
Die Vergabe echter Rufnummern ist für die Produktion noch nicht freigegeben.
telefon-nummer-not-foundFür Betriebsinhaber · 404Nicht gefunden.
Unterlage, Nachweis, Angebot oder Prüfung gehört nicht zu diesem Betrieb oder wurde inzwischen ersetzt.
telefon-nummer-conflictFür Betriebsinhaber · 409Die Daten wurden inzwischen geändert. Bitte lade die Seite neu.
Zwischen Laden und Speichern hat sich der Stand geändert, etwa in einem zweiten Tab oder durch eine Rückmeldung des Anbieters.
telefon-nummer-bundle-not-editableFür Betriebsinhaber · 409Diese Unterlagen sind eingereicht und lassen sich gerade nicht ändern.
Der Anbieter prüft die Unterlagen; Änderungen während der Prüfung würden sie verfälschen.
telefon-nummer-bundle-incompleteFür Betriebsinhaber · 409Es fehlen noch Angaben oder Nachweise.
Für das Einreichen fehlen Firmendaten oder verlangte Nachweise.
telefon-nummer-addon-requiredFür Betriebsinhaber · 409Das geht erst, wenn der Telefon-Agent gebucht und bezahlt ist.
Einreichen, Bestellen und Eigentumsnachweis kosten Geld bzw. lösen Anbieteraktionen aus und setzen das bezahlte Add-on voraus.
telefon-nummer-country-mismatchFür Betriebsinhaber · 400Die Geschäftsadresse muss im Land der Nummer liegen.
Der Anbieter verlangt für Nummern in Österreich, Deutschland und der Schweiz eine Adresse im jeweiligen Land.
telefon-nummer-document-type-unknownFür Betriebsinhaber · 400Diesen Nachweis verlangt die Prüfung für diese Nummer nicht.
Der Nachweistyp gehört nicht zu den Anforderungen des Anbieters für diese Nummernart.
telefon-nummer-document-limitFür Betriebsinhaber · 409Für diese Unterlagen sind schon zu viele Dateien hochgeladen.
Je Unterlagenpaket ist die Zahl der Dateien begrenzt.
telefon-nummer-upload-missingFür Betriebsinhaber · 409Die Datei ist noch nicht vollständig hochgeladen.
Der Upload wurde abgebrochen oder ist noch nicht im Speicher angekommen.
telefon-nummer-upload-rejectedFür Betriebsinhaber · 400Die Datei passt nicht zu Typ oder Größe und wurde verworfen. Bitte lade sie erneut hoch.
Die Datei ist kein echtes PDF, JPEG oder PNG, größer als 10 MB oder kam unvollständig an.
telefon-nummer-document-lockedFür Betriebsinhaber · 409Eingereichte Nachweise lassen sich nicht löschen.
Der Nachweis liegt beim Anbieter zur Prüfung vor.
telefon-nummer-document-requiredFür Betriebsinhaber · 409Lade zuerst einen Ersatz hoch – sonst fehlt dieser Nachweis.
Der Nachweis ist der einzige für eine Pflichtanforderung.
telefon-nummer-storage-unavailableFür Entwickler · 503Der private Dokumentenspeicher ist nicht eingerichtet.
Der private Bucket für Nachweise fehlt oder ist nicht erreichbar (`R2_PRIVATE_BUCKET`).
telefon-nummer-provider-not-configuredFür Entwickler · 503Der Telefonie-Anbieter ist nicht eingerichtet.
Die Zugangsdaten des Twilio-Hauptkontos fehlen auf dieser Umgebung.
telefon-nummer-account-unavailableFür Betriebsinhaber · 409Das Telefonie-Konto dieses Betriebs ist gesperrt oder geschlossen.
Das Unterkonto des Betriebs beim Telefonie-Anbieter ist gesperrt oder wurde geschlossen, etwa nach einer Kontolöschung.
telefon-nummer-provider-unavailableFür Betriebsinhaber · 503Der Telefonie-Anbieter ist gerade nicht erreichbar. Bitte versuche es in einigen Minuten erneut.
Der Anbieter hat nicht oder mit einem Serverfehler geantwortet.
telefon-nummer-regulation-missingFür Betriebsinhaber · 409Für diese Nummernart veröffentlicht der Anbieter derzeit keine Prüfanforderungen.
Ohne veröffentlichte Anforderungen lässt sich kein Unterlagenpaket bilden.
telefon-nummer-capability-blockedFür Betriebsinhaber · 409Diese Nummernart ist derzeit nicht lieferbar.
Die Option ist für dieses Land gesperrt (etwa neue Schweizer Mobilnummern) oder noch nicht freigegeben.
telefon-nummer-rate-limitedFür Betriebsinhaber · 429Zu viele Anfragen. Bitte warte einen Moment.
Nummernsuche, Angebote und Uploads sind je Betrieb gebremst.
telefon-nummer-quote-expiredFür Betriebsinhaber · 409Das Angebot ist abgelaufen. Bitte fordere ein neues an.
Angebote gelten nur wenige Minuten, weil sich Preise und Verfügbarkeit ändern können.
telefon-nummer-quote-not-acceptedFür Betriebsinhaber · 409Bitte bestätige zuerst das Angebot.
Bestellt wird nur zu einem angenommenen Angebot.
telefon-nummer-number-unavailableFür Betriebsinhaber · 409Diese Nummer ist inzwischen vergeben. Bitte wähle eine andere.
Der Anbieter hat die Nummer zwischen Angebot und Bestellung anderweitig vergeben.
telefon-nummer-price-changedFür Betriebsinhaber · 409Der Preis hat sich geändert. Bitte bestätige das neue Angebot.
Das frische Angebot vor der Bestellung weicht vom angenommenen ab; bestellt wird nie zu einem anderen als dem bestätigten Preis.
telefon-nummer-currency-unsupportedFür Entwickler · 503Der Anbieter rechnet in einer Währung ab, die TacticTable noch nicht umrechnen kann.
Die Preisliste des Anbieters nennt eine Währung ohne hinterlegten Wechselkurs.
telefon-nummer-insufficient-balanceFür Betriebsinhaber · 409Dein Telefon-Guthaben reicht nicht für Einrichtung, erste Miete und Mindestguthaben. Bitte lade Guthaben auf.
Einrichtung und erste Monatsmiete werden bei der Bestellung aus dem Guthaben bezahlt, dazu muss das Mindestguthaben bleiben.
telefon-nummer-number-takenFür Betriebsinhaber · 409Diese Nummer ist bereits einem Anschluss zugeordnet.
Die Nummer gehört schon zu einem Anschluss in TacticTable.
telefon-nummer-order-in-progressFür Betriebsinhaber · 409Für diesen Anschluss läuft schon eine Bestellung oder es ist bereits eine Nummer eingerichtet. Eine zweite wird nicht gekauft.
Ein zweiter Klick oder ein zweiter Tab wollte erneut bestellen.
telefon-nummer-paid-blockedFür Betriebsinhaber · 503Kostenpflichtige Bestellungen sind in dieser Umgebung nicht freigegeben.
Kostenpflichtige Anbieteraktionen sind auf dieser Umgebung gesperrt, bis sie freigegeben sind.
telefon-nummer-connection-stateFür Betriebsinhaber · 409Der Anschluss ist dafür im falschen Schritt.
Der Vorgang passt nicht zum Stand des Anschlusses, etwa eine Eigentumsprüfung bei einer neuen Nummer.
telefon-nummer-compliance-pendingFür Betriebsinhaber · 409Die Unterlagen sind noch nicht freigegeben.
Bestellt wird erst nach der endgültigen Freigabe durch den Anbieter.
telefon-nummer-ownership-not-mobileFür Betriebsinhaber · 409Einen SMS-Code gibt es nur für Mobilnummern. Nutze die Prüfung per Rückruf.
Festnetznummern empfangen keine SMS.
telefon-nummer-ownership-limitFür Betriebsinhaber · 429Für diese Nummer wurden heute schon drei Prüfungen gestartet. Bitte versuche es morgen erneut.
Je Nummer und Tag sind höchstens drei Eigentumsprüfungen erlaubt.
telefon-nummer-ownership-code-invalidFür Betriebsinhaber · 400Der Code stimmt nicht.
Der eingegebene Code passt nicht zum verschickten.
telefon-nummer-ownership-expiredFür Betriebsinhaber · 409Der Code ist abgelaufen. Bitte fordere einen neuen an.
Codes gelten nur kurz.
telefon-nummer-ownership-lockedFür Betriebsinhaber · 409Zu viele Fehlversuche. Bitte fordere einen neuen Code an.
Nach mehreren falschen Codes wird die Prüfung gesperrt.
telefon-nummer-sms-unavailableFür Betriebsinhaber · 409Die SMS ließ sich nicht verschicken (kein SMS-Guthaben oder Versand nicht eingerichtet). Nutze die Prüfung per Rückruf.
Der SMS-Code geht über Ihr SMS-Guthaben; es ist leer oder der SMS-Versand ist nicht eingerichtet.
telefon-nummer-internalFür Betriebsinhaber · 500Interner Fehler. Bitte versuche es später erneut.
Ein unerwarteter Fehler; Details stehen ohne personenbezogene Daten im Serverprotokoll.
telefon-guthaben-phone-agent-disabledFür Betriebsinhaber · 404Der Telefon-Agent ist hier nicht verfügbar.
Der Telefon-Agent ist auf dieser Umgebung bzw. für dieses Konto nicht freigeschaltet.
telefon-guthaben-stripe-not-configuredFür Entwickler · 503Die Zahlungsanbindung ist auf dieser Umgebung nicht eingerichtet.
Stripe-Schlüssel fehlen auf dieser Umgebung.
telefon-guthaben-stripe-tax-not-readyFür Entwickler · 503Die Steuerberechnung der Plattform ist noch nicht eingerichtet. Aufladungen sind erst danach möglich.
Aufladungen berechnen die Umsatzsteuer über Stripe Tax; die Steuereinstellungen bzw. Registrierungen der Plattform fehlen.
telefon-guthaben-addon-requiredFür Betriebsinhaber · 409Telefon-Guthaben kannst du aufladen, sobald der Telefon-Agent gebucht ist.
Ohne gebuchtes Add-on gibt es nichts, wofür das Guthaben gebraucht würde.
telefon-guthaben-payment-method-requiredFür Betriebsinhaber · 409Hinterlege und bestätige zuerst eine Karte für das Telefon-Guthaben.
Die automatische Aufladung bucht über eine hinterlegte, bestätigte Karte ab.
telefon-guthaben-auto-topup-busyFür Betriebsinhaber · 409Gerade läuft eine automatische Aufladung. Bitte versuche es in ein paar Minuten erneut.
Während eine automatische Aufladung läuft, lassen sich ihre Einstellungen nicht ändern.
telefon-guthaben-checkout-invalidFür Betriebsinhaber · 400Diese Zahlung gehört nicht zu deinem Telefon-Guthaben oder ist unvollständig.
Die Rückkehr von Stripe passt zu keiner offenen Aufladung dieses Betriebs, etwa ein alter Link.
telefon-guthaben-conflictFür Betriebsinhaber · 409Das Guthaben wurde inzwischen geändert. Bitte lade die Seite neu.
Zwischen Laden und Speichern hat sich das Guthaben geändert, etwa durch ein Gespräch oder eine Aufladung.
telefon-guthaben-stripe-unavailableFür Betriebsinhaber · 502Stripe ist gerade nicht erreichbar. Bitte versuche es in einigen Minuten erneut – es wird nichts doppelt berechnet.
Stripe hat nicht oder mit einem Fehler geantwortet.
telefon-guthaben-internalFür Betriebsinhaber · 500Das Telefon-Guthaben konnte wegen eines internen Fehlers nicht geladen werden. Bitte wende dich an den Support.
Ein unerwarteter Fehler beim Laden oder Buchen.
telefon-guthaben-customer-link-conflictFür Betriebsinhaber · 409Das Abrechnungskonto konnte nicht eindeutig zugeordnet werden. Bitte wende dich an den Support.
Für den Betrieb gibt es bei Stripe mehr als eine passende Kundenzuordnung; TacticTable bucht dann nicht auf Verdacht.
telefon-guthaben-customer-has-subscriptionFür Betriebsinhaber · 409Die Stripe-Kundenzuordnung passt nicht zum bestehenden Abo. Bitte wende dich an den Support.
Die Kundenzuordnung für das Guthaben widerspricht dem Kunden, an dem Ihr Abo hängt.
telefon-guthaben-customer-auto-payment-pendingFür Betriebsinhaber · 409Eine automatische Aufladung wird noch verarbeitet. Bitte versuche es danach erneut.
Eine automatische Aufladung ist noch nicht abgeschlossen.
telefon-guthaben-rate-limit-unavailableFür Entwickler · 503Die Missbrauchsbremse ist gerade nicht erreichbar. Bitte später erneut versuchen.
Der Zählerspeicher der Bremse antwortet nicht; Aufladungen werden dann aus Sicherheitsgründen abgelehnt.
telefon-kuendigung-not-cancelableFür Betriebsinhaber · 409Der Telefon-Agent ist gerade nicht aktiv gebucht und kann deshalb nicht gekündigt werden.
Das Add-on ist nicht gebucht, schon gekündigt oder beendet, oder die Zahlung steht noch aus.
telefon-kuendigung-generation-changedFür Betriebsinhaber · 409Der Stand hat sich inzwischen geändert, etwa in einem anderen Fenster. Bitte lade die Seite neu.
Seit dem Öffnen des Dialogs wurde gekündigt, zurückgenommen oder reaktiviert.
telefon-kuendigung-impact-changedFür Betriebsinhaber · 409Die Auswirkungen der Kündigung haben sich geändert. Bitte prüfe sie erneut, bevor du bestätigst.
Freigabetermin, Nummern oder fällige Mieten haben sich seit der Berechnung geändert; bestätigt wird nie eine veraltete Auswirkung.
telefon-kuendigung-fresh-mfa-requiredFür Betriebsinhaber · 403Bitte bestätige die Kündigung erneut mit deinem zweiten Faktor.
Die Kündigung verlangt einen frisch bestätigten zweiten Faktor.
telefon-kuendigung-not-cancel-scheduledFür Betriebsinhaber · 409Es ist keine Kündigung vorgemerkt, die sich zurücknehmen lässt.
Die Kündigung wurde schon zurückgenommen oder ist bereits wirksam.
telefon-kuendigung-undo-main-subscriptionFür Betriebsinhaber · 409Die Kündigung kommt von deinem Hauptabo. Nimm sie dort zurück, dann läuft der Telefon-Agent automatisch weiter.
Gekündigt wurde das ganze Abo (etwa im Kundenportal), nicht nur das Add-on.
telefon-kuendigung-undo-too-lateFür Betriebsinhaber · 409Die bezahlte Laufzeit ist bereits vorbei. Buche den Telefon-Agenten neu, um ihn wieder zu nutzen.
Die Kündigung ist wirksam geworden.
telefon-kuendigung-release-startedFür Betriebsinhaber · 409Die Rufnummer wird bereits freigegeben; die Kündigung lässt sich nicht mehr zurücknehmen. Du kannst den Telefon-Agenten nach dem Ende neu buchen.
Eine begonnene Freigabe beim Anbieter lässt sich nicht zurückholen.
telefon-kuendigung-admin-grantedFür Betriebsinhaber · 409Den Telefon-Agenten hat TacticTable für deinen Betrieb freigeschaltet. Beenden kann ihn nur der Support – schreib uns, wenn du ihn nicht mehr brauchst.
Der Telefon-Agent läuft ohne Stripe-Buchung („Von TacticTable freigeschaltet“). Es gibt kein Add-on im Abo, das sich kündigen oder dessen Kündigung sich zurücknehmen ließe.
telefon-abo-phone-agent-disabledFür Betriebsinhaber · 404Der Telefon-Agent ist hier nicht verfügbar.
Beim Buchen oder Ändern des Abos mit Telefon-Agent: Die Funktion ist auf dieser Umgebung bzw. für dieses Konto nicht freigeschaltet.
telefon-abo-addon-existsFür Betriebsinhaber · 409Der Telefon-Agent ist bereits gebucht oder wird gerade gebucht.
Ein zweiter Klick oder ein zweites Fenster wollte das Add-on erneut buchen; doppelt gebucht wird nie.
telefon-gespraech-not-foundFür Mitarbeiter · 404Dieses Gespräch gibt es nicht (mehr).
Der Link gehört zu einem anderen Betrieb, oder das Gespräch ist mit einer Kontolöschung entfernt worden.
telefon-gespraech-subject-not-foundFür Mitarbeiter · 404Das kommentierte Element gibt es nicht (mehr).
Gespräch, Rückfrage oder Freigabe, an die der Kommentar sollte, gehört nicht (mehr) zu diesem Betrieb.
telefon-gespraech-follow-up-not-foundFür Mitarbeiter · 404Diese Rückfrage gibt es nicht (mehr).
Die Rückfrage gehört zu einem anderen Gespräch oder Betrieb.
telefon-gespraech-cursor-invalidFür Mitarbeiter · 400Die Liste ist veraltet. Bitte lade sie neu.
Die Seitenmarke beim Nachladen ist abgelaufen oder beschädigt.
telefon-gespraech-cursor-mismatchFür Mitarbeiter · 400Die Filter haben sich geändert. Bitte lade die Liste neu.
Beim Nachladen passten Filter, Sortierung oder Ihre Rechte nicht mehr zur ersten Seite.
telefon-gespraech-cost-sort-forbiddenFür Mitarbeiter · 403Nach Kosten sortieren kann nur, wer die Abrechnung sehen darf.
Kosten sehen nur Personen mit Abrechnungsrecht, nie eine Agentur.
telefon-gespraech-too-manyFür Mitarbeiter · 400Höchstens 500 Gespräche auf einmal. Bitte grenze die Filter weiter ein.
Sammelaktionen und Export sind auf 500 Gespräche begrenzt.
telefon-gespraech-invalid-filtersFür Mitarbeiter · 400Die Filter sind ungültig. Bitte lade die Seite neu.
Die Filter in der Adresse passen nicht zum erwarteten Format, etwa nach einem alten Lesezeichen.
telefon-gespraech-invalid-assigneeFür Mitarbeiter · 400Diese Person kann keine Gespräche oder Rückfragen übernehmen.
Die gewählte Person ist kein Mitglied des Betriebs oder hat kein Recht auf den Telefon-Agenten.
telefon-gespraech-forbiddenFür Mitarbeiter · 403Dafür fehlt dir die Berechtigung.
Ihrer Rolle fehlt das Recht auf den Telefon-Agenten (Lesen bzw. Schreiben).
telefon-gespraech-transcript-forbiddenFür Mitarbeiter · 403Transkripte darf nur exportieren, wer Gesprächsinhalte lesen darf.
Der Export mit Transkripten verlangt das Recht „Gesprächsinhalte (sensibel)“.
telefon-gespraech-emptyFür Mitarbeiter · 400Es ist kein Gespräch ausgewählt.
Die Sammelaktion bzw. der Export wurde ohne Auswahl ausgelöst.
telefon-gespraech-transcript-purgedFür Mitarbeiter · 409Das Transkript wurde nach Ablauf der Aufbewahrungsfrist gelöscht.
Die eingestellte Frist ist abgelaufen oder das Transkript wurde gelöscht; Anmerkungen und Übersetzungen gibt es dann nicht mehr.
telefon-gespraech-segment-not-foundFür Mitarbeiter · 400Diesen Abschnitt des Transkripts gibt es nicht.
Die Anmerkung bezog sich auf einen Abschnitt, der nicht (mehr) existiert.
telefon-gespraech-version-conflictFür Mitarbeiter · 409Inzwischen hat jemand anderes eine neuere Fassung gespeichert. Bitte lade neu und versuche es erneut.
Eine Anmerkung oder ein Gespräch wurde gleichzeitig von jemand anderem geändert.
telefon-gespraech-forbidden-transitionFür Mitarbeiter · 409Dieser Schritt ist im aktuellen Zustand der Rückfrage nicht möglich.
Etwa „In Arbeit nehmen“ einer erledigten Rückfrage.
telefon-gespraech-not-applicableFür Mitarbeiter · 409Für dieses Gespräch ist das gerade nicht möglich – zum Beispiel, weil es noch läuft.
Laufende Gespräche lassen sich weder übersetzen noch löschen; manche Aktionen passen nicht zum Stand.
telefon-gespraech-nothing-to-translateFür Mitarbeiter · 400Für dieses Gespräch gibt es noch nichts zu übersetzen.
Es liegt (noch) kein Transkript vor.
telefon-gespraech-too-longFür Mitarbeiter · 413Das Gespräch ist zu lang für eine Übersetzung.
Die Übersetzung ist auf eine Höchstlänge begrenzt.
telefon-gespraech-credits-exhaustedFür Betriebsinhaber · 402Dein KI-Guthaben ist aufgebraucht. Lade es in der Abrechnung auf, um zu übersetzen.
Übersetzungen verbrauchen KI-Guthaben, nicht das Telefon-Guthaben.
telefon-gespraech-rate-limitedFür Mitarbeiter · 429Zu viele Übersetzungen in kurzer Zeit. Bitte versuche es später erneut.
Übersetzungen sind je Betrieb gebremst.
telefon-gespraech-invalid-outputFür Mitarbeiter · 502Die Übersetzung ist fehlgeschlagen. Bitte versuche es erneut.
Die Antwort des Modells war unbrauchbar; abgerechnet wird nur der tatsächliche Verbrauch.
telefon-gespraech-internalFür Mitarbeiter · 500Das hat nicht geklappt. Bitte versuche es erneut.
Ein unerwarteter Fehler.
telefon-einstellungen-version-conflictFür Betriebsinhaber · 409Die Einstellungen wurden inzwischen geändert. Bitte prüfe den aktuellen Stand und speichere erneut.
Jemand anderes hat die Einstellungen gespeichert, während Sie bearbeitet haben. Jede Speicherung ist eine Version; überschrieben wird nie still.
telefon-einstellungen-settings-unreadableFür Betriebsinhaber · 500Die gespeicherte Konfiguration ist unlesbar. Bitte den Support kontaktieren.
Die gespeicherte Version passt nicht zum erwarteten Schema, etwa nach einem Eingriff direkt in der Datenbank.
telefon-einstellungen-internalFür Betriebsinhaber · 500Die Einstellungen konnten nicht verarbeitet werden.
Ein unerwarteter Fehler beim Laden oder Speichern.
telefon-stimme-not-foundFür Betriebsinhaber · 404Diese Stimme gibt es nicht.
Die Stimme gehört nicht zu Ihrem Betrieb oder wurde entfernt.
telefon-stimme-not-selectableFür Betriebsinhaber · 409Diese Stimme kann gerade nicht gewählt werden.
Die Stimme wird noch übernommen bzw. erstellt, verlangt eine Prüfung beim Anbieter oder ist nicht mehr verfügbar.
telefon-stimme-not-entitledFür Betriebsinhaber · 402Stimmen aus der Bibliothek gibt es nur mit aktivem Telefon-Agenten.
Übernehmen, Hörproben und Klonen verursachen Kosten beim Sprachdienst und setzen das aktive Add-on voraus. Je nach Vorgang auch „Hörproben gibt es nur mit aktivem Telefon-Agenten.“ oder „Stimmklone gibt es nur mit aktivem Telefon-Agenten.“
telefon-stimme-voice-not-offeredFür Betriebsinhaber · 400Diese Stimme wird nicht angeboten.
Die Stimme steht nicht (mehr) in der Auswahl des Sprachdienstes für Ihr Konto.
telefon-stimme-provider-unavailableFür Betriebsinhaber · 503Der Sprachdienst ist gerade nicht erreichbar. Bitte versuche es gleich noch einmal.
Der Sprachdienst hat nicht oder mit einem Fehler geantwortet. Beim Laden der Auswahl heißt es „Die Stimmenauswahl ist gerade nicht erreichbar. Bitte versuche es gleich noch einmal.“
telefon-stimme-voice-busyFür Betriebsinhaber · 409Die Stimme wird gerade übernommen. Bitte versuche es in einer Minute erneut.
Während die Übernahme läuft, lässt sich die Stimme nicht entfernen.
telefon-stimme-forbiddenFür Betriebsinhaber · 403Eine geklonte Stimme kann nur der Inhaber entfernen.
Geklonte Stimmen sind biometrische Daten mit Einwilligung; nur der Inhaber entscheidet über sie.
telefon-stimme-consent-outdatedFür Betriebsinhaber · 409Der Einwilligungstext hat sich geändert. Bitte neu laden und erneut bestätigen.
Seit dem Öffnen des Dialogs gibt es eine neue Fassung des Einwilligungstextes; bestätigt wird nur die aktuelle.
telefon-stimme-secret-missingFür Entwickler · 503Die Einwilligung kann gerade nicht gespeichert werden.
Der Schlüssel für den Nachweis der Einwilligung (`AUTH_SECRET`) fehlt auf dieser Umgebung.
telefon-stimme-fresh-mfa-requiredFür Betriebsinhaber · 403Bitte bestätige den Vorgang erneut mit deinem zweiten Faktor.
Das Klonen verlangt einen frisch bestätigten zweiten Faktor.
telefon-stimme-paid-blockedFür Betriebsinhaber · 403Stimmklone sind in dieser Umgebung noch nicht freigegeben.
Kostenpflichtige Schritte beim Sprachdienst sind auf dieser Umgebung gesperrt. Bei der Hörprobe heißt es „Kostenpflichtige Telefonfunktionen sind auf dieser Umgebung nicht freigegeben.“
telefon-stimme-gate-closedFür Betriebsinhaber · 403Stimmklone sind noch nicht freigeschaltet.
Stimmklone sind ein eigener Freigabeschritt und für diese Umgebung noch nicht freigeschaltet.
telefon-stimme-sample-foreignFür Betriebsinhaber · 400Eine Aufnahme gehört nicht zu diesem Restaurant.
Eine Aufnahme stammt aus einem anderen Betrieb oder Upload.
telefon-stimme-sample-missingFür Betriebsinhaber · 400Eine Aufnahme wurde nicht vollständig hochgeladen. Bitte erneut hochladen.
Ein Upload wurde abgebrochen.
telefon-stimme-clone-limitFür Betriebsinhaber · 409Höchstens … geklonte Stimmen je Betrieb. Bitte entferne zuerst eine; eine gerade entfernte zählt mit, bis der Sprachdienst die Löschung bestätigt hat.
Je Betrieb sind zwei geklonte Stimmen möglich: eine im Einsatz und eine zum Wechseln.
telefon-stimme-missing-private-bucketFür Entwickler · 503Der private Speicher ist nicht eingerichtet.
Stimmproben liegen nur im privaten Bucket; er fehlt auf dieser Umgebung.
telefon-stimme-upload-rejectedFür Betriebsinhaber · 400Dieser Dateityp ist hier nicht erlaubt.
Die Aufnahme ist keine MP3-, WAV-, WebM- oder M4A-Datei. Je nach Fall auch „Die Datei ist leer oder größer als … MB.“
telefon-stimme-ticket-invalidFür Betriebsinhaber · 400Der Upload ist abgelaufen oder gehört nicht zu dir. Bitte erneut hochladen.
Die Upload-Freigabe ist abgelaufen oder wurde für eine andere Person ausgestellt.
telefon-stimme-upload-missingFür Betriebsinhaber · 400Die Aufnahme ist nicht angekommen. Bitte erneut hochladen.
Die Datei liegt nicht im Speicher, meist nach einem Verbindungsabbruch.
telefon-stimme-upload-size-mismatchFür Betriebsinhaber · 400Die Aufnahme ist unvollständig angekommen. Bitte erneut hochladen.
Die angekommene Datei ist kleiner oder größer als angekündigt.
telefon-stimme-upload-type-mismatchFür Betriebsinhaber · 400Der Dateityp passt nicht zur Angabe. Bitte als MP3, WAV, WebM oder M4A hochladen.
Dateiendung bzw. Typangabe und Inhalt passen nicht zusammen.
telefon-stimme-upload-signature-mismatchFür Betriebsinhaber · 400Die Datei ist keine gültige Audiodatei. Bitte als MP3, WAV, WebM oder M4A hochladen.
Der Dateiinhalt ist keine Audiodatei der erlaubten Formate.
telefon-stimme-price-missingFür Betriebsinhaber · 503Für die Hörprobe ist noch kein Preis hinterlegt. Bitte versuche es später erneut.
Ohne hinterlegten Tarif wird keine kostenpflichtige Hörprobe erzeugt – TacticTable schätzt keine Preise.
telefon-stimme-voice-not-readyFür Betriebsinhaber · 409Diese Stimme ist noch nicht bereit.
Die Stimme wird noch übernommen oder erstellt.
telefon-stimme-insufficient-fundsFür Betriebsinhaber · 402Dein Telefon-Guthaben reicht für diese Hörprobe nicht. Bitte lade Guthaben auf.
Die Hörprobe wird vor dem Erzeugen aus dem Telefon-Guthaben reserviert.
telefon-stimme-provider-failedFür Betriebsinhaber · 502Die Hörprobe konnte nicht erzeugt werden. Es wurde nichts berechnet.
Der Sprachdienst hat keine Hörprobe geliefert; die Reservierung wurde aufgehoben.
telefon-stimme-rate-limitedFür Betriebsinhaber · 429Zu viele Anfragen. Bitte versuche es in ein paar Minuten erneut.
Übernehmen, Klonen und Hörproben sind je Betrieb gebremst, weil sich alle Betriebe das Kontingent des Sprachdienstes teilen.
telefon-stimme-internalFür Betriebsinhaber · 500Die Stimmen konnten nicht geladen werden.
Ein unerwarteter Fehler. Je nach Vorgang auch „Die Stimme konnte nicht übernommen werden.“ oder „Der Stimmklon konnte nicht gestartet werden.“
Waechter, Rechte, Plaene, Ratenbegrenzung
Waechter, Rechte, Plaene, Ratenbegrenzung (401/402/403/404/429, KI-Guthaben, Middleware) · 69 Meldungen
unauthorizedFür Entwickler · 401{"error":"unauthorized"} (HTTP 401)
Der zentrale Waechter fuer /api/restaurants/[slug]/... fand keine angemeldete Sitzung (currentUser() ist null).
not-found-restaurantFür Betriebsinhaber · 404{"error":"not_found"} (HTTP 404)
Kein Betrieb mit diesem Slug bzw. dieser ID vorhanden; der Waechter sucht ueber OR: [{slug},{id}].
partner-link-keine-verbindungFür Betriebsinhaber · 409Dieser Betrieb ist mit keiner Agentur verbunden.
Der Eigentuemer wollte die Betreuung beenden, am Betrieb haengt aber gar keine Agentur (partnerId ist null) — meist eine veraltete Seite.
partner-link-geaendertFür Betriebsinhaber · 409Die Betreuung hat sich gerade geändert. Bitte laden Sie die Seite neu.
Zwischen dem Laden der Seite und dem Klick auf 'Verbindung loesen' hat sich partnerId geaendert; der Schreibbefehl traegt die erwartete Agentur im where und hat deshalb nichts getroffen.
link-request-nur-kennungFür Agenturen · 400Bitte geben Sie die Kennung des Betriebs an — eine E-Mail-Adresse ist hier nicht möglich.
Die Agentur hat eine Mailadresse als Ziel angegeben. Der Weg ueber die Adresse ist abgeschaltet: er verriet zu jeder fremden Adresse Name und Kennung des zugehoerigen Betriebs.
link-request-sperrfristFür Agenturen · 409Dieser Eigentümer hat eine Anfrage von Ihnen bereits abgelehnt.
Nach einer Ablehnung gilt eine Sperrfrist von 90 Tagen fuer dasselbe Paar Agentur/Betrieb (LINK_DECLINE_COOLDOWN_DAYS).
forbidden-owner-onlyFür Mitarbeiter · 403{"error":"forbidden"} (HTTP 403)
Die Route ist mit ownerOnly: true markiert (zerstoerende Vorgaenge, Eigentum, Abrechnung) und der Aufrufer ist nicht der Eigentuemer — auch ein Mitarbeiter und ein Mitglied der betreuenden Agentur nicht. Bis zur Korrektur wurde die Marke im Agentur-Zweig gar nicht geprueft.
forbidden-moduleFür Mitarbeiter · 403{"error":"forbidden","module":"<modul>","op":"read|write"} (HTTP 403)
hasPermission() verneint: die Rolle bzw. die gespeicherten granularen Rechte der Mitgliedschaft deckten Modul + Operation nicht.
forbidden-no-membershipFür Mitarbeiter · 403{"error":"forbidden"} (HTTP 403)
Angemeldet, aber weder Eigentuemer noch Mitglied des Betriebs noch Mitglied der verwaltenden Agentur.
forbidden-partner-excluded-moduleFür Mitarbeiter · 403{"error":"forbidden","module":"inbox|emailAccounts","op":"..."} (HTTP 403)
Agentur-Zugang hat Vollzugriff, ausser auf PARTNER_EXCLUDED_MODULES ('inbox', 'emailAccounts') — dort liegen fremde Personendaten.
unauthorized-partnerFür Entwickler · 401{"error":"unauthorized"} (HTTP 401)
guardPartnerApi ohne angemeldete Sitzung aufgerufen.
not-found-partnerFür Betriebsinhaber · 404{"error":"not_found"} (HTTP 404)
Keine PartnerOrganization mit dieser ID oder diesem Slug.
forbidden-partner-roleFür Mitarbeiter · 403{"error":"forbidden"} (HTTP 403)
Drei Faelle: ownerOnly und nicht Eigentuemer der Agentur (216), keine PartnerMembership (223), Rolle unter minRole (Standard PARTNER_ADMIN, 227).
validation-partner-bearbeitenFür Agenturen · 400{"error":"validation","message":"…","issues":{…}} — Titel im Toast: Ungültige Angaben
PUT /api/partners/[partnerId] prüft den Rumpf mit partnerBearbeitenSchema (src/lib/validations/partners.ts). Ein Feld verletzt das Schema: Website oder Logo ohne http/https, Primärfarbe ohne Hex-Wert, unlesbare Telefonnummer, ungültige E-Mail-Adresse, Überlänge (Textspalten fassen 191 Zeichen) — oder der Rumpf ist kein JSON. message nennt Feld und Grund, issues trägt den Zod-Baum.
partner-bearbeiten-fremdfeldFür Entwickler · 400Diese Felder lassen sich hier nicht ändern: connectAccountId.
Der Rumpf enthält Schlüssel, die partnerBearbeitenSchema nicht kennt; das Schema ist .strict() und weist die GANZE Anfrage ab, auch ihre gültigen Teile. Häufigster Fall: connectAccountId — das Stripe-Konto ließ sich früher über die Stammdaten frei überschreiben und ist dort absichtlich entfernt. Auch ownerId, slug oder state gehören nicht hierher. Genannt werden höchstens fünf Namen.
partner-bearbeiten-websiteFür Agenturen · 400Bitte eine vollständige Adresse mit https:// angeben.
Die Website der Agentur beginnt nicht mit http:// oder https:// (z. B. nur 'agentur.at') oder trägt ein fremdes Schema wie javascript: oder ftp:. Die Adresse wird als Link ausgegeben, deshalb sind nur Web-Adressen erlaubt. Dieselbe Meldung erscheint bei mehr als 191 Zeichen. Bestandsdaten ohne https:// zeigen den Fehler beim ersten Speichern nach der Umstellung.
partner-bearbeiten-primaerfarbeFür Agenturen · 400Bitte einen Hex-Farbwert angeben, z. B. #1a2b3c.
Die Primärfarbe der Agentur ist kein Hex-Wert (#RGB, #RRGGBB oder #RRGGBBAA). Farbnamen wie 'red' und CSS-Ausdrücke werden nicht angenommen.
partner-bearbeiten-eingaben-pruefenFür Agenturen · —Bitte Eingaben prüfen — Die markierten Felder sind noch nicht gültig.
Beim Klick auf 'Änderungen speichern' prüft das Formular 'Agentur bearbeiten' alle Felder mit demselben Schema wie die Route. Mindestens ein Feld ist ungültig; es wurde nichts gesendet und nichts gespeichert.
action-nicht-angemeldetFür Betriebsinhaber · 401Nicht angemeldet.
Server-Action-Waechter ohne Sitzung; wird per throwIfDenied als Toast gezeigt.
action-restaurant-nicht-gefundenFür Betriebsinhaber · 404Restaurant nicht gefunden.
Der Slug/die ID der Server-Action zeigt auf keinen bestehenden Betrieb.
action-keine-berechtigungFür Mitarbeiter · 403Keine Berechtigung.
Server-Action verweigert: fehlendes Modul-Recht (79) oder gar keine Mitgliedschaft/Agentur-Zugang (88). Der Fall ownerOnly (67) traegt eine eigene Meldung: 'Das darf nur der Eigentuemer des Betriebs.'
trial-expiredFür Betriebsinhaber · 402Die Testphase ist abgelaufen. Bitte wähle einen Plan, um weiterzuarbeiten. / Antwort: {"error":"trial_expired","reason":"trial_expired","feature":…,"requiredPlan":…} (HTTP 402)
Die 30-Tage-Testphase ist vorbei und es wurde kein Plan gebucht (ent.requiresPlanSelection). Alle Plan-Features fallen weg.
plan-upgrade-requiredFür Betriebsinhaber · 402Feature "<Label>" ist im aktuellen Plan nicht enthalten. / Antwort: {"error":"plan_upgrade_required","feature":…,"label":…,"requiredPlan":…} (HTTP 402)
Ein Abo laeuft, aber isFeatureOnPlan() verneint das Feature fuer den gebuchten Plan (Matrix in src/lib/plan-features.ts:57-148).
plan-guard-not-foundFür Entwickler · 404{"error":"not_found"} (HTTP 404)
requireFeatureBySlug fand keinen Betrieb zu diesem Slug (findUnique auf slug, ohne ID-Fallback).
plan-auswahl-weiterleitungFür BetriebsinhaberWeiterleitung auf /restaurant/<slug>/select-plan
ent.requiresPlanSelection ist true und der Aufrufer ist der echte Eigentuemer (kein Agentur-Mitglied, kein Mitarbeiter).
testphase-abgelaufen-bannerFür BetriebsinhaberDeine Testphase ist abgelaufen. Wähle jetzt einen …
ent.trialExpired ist true — kein Abo und trialEndsAt liegt in der Vergangenheit.
feature-gate-seiteFür BetriebsinhaberDeine Testphase ist abgelaufen / "<Label>" freischalten — Verfügbar im Plan <Name>.
Serverseitige bzw. clientseitige Feature-Sperre: ent.features[feature] ist false; der Text unterscheidet abgelaufene Testphase von fehlendem Plan-Feature.
rate-limitedFür Entwickler · 429Zu viele Anfragen. Bitte in … Sekunden erneut versuchen.
Der Sliding-/Fixed-Window-Zaehler fuer den Schluessel hat max ueberschritten. Speicher ist Upstash-Redis, sonst prozesslokal. Ab einer Minute Wartezeit nennt der Satz Minuten statt Sekunden. Die Antwort ist {"error":"rate_limited","message":…,"retryAfterSeconds":<n>} mit Header Retry-After.
rate-limit-widget-bookingFür Gäste · 429HTTP 429 rate_limited (Buchung)
Mehr als 10 Buchungsversuche pro Stunde je IP und Betrieb (Schluessel widget-booking:<ip>:<slug>).
rate-limit-widget-inquiryFür Gäste · 429HTTP 429 rate_limited (Tisch-Anfrage, mit CORS-Headern)
Mehr als 10 Gruppen-Anfragen pro Stunde je IP und Betrieb.
rate-limit-widget-availabilityFür Gäste · 429HTTP 429 rate_limited (Verfügbarkeit/Tage)
Mehr als 60 Abrufe pro Minute je IP und Betrieb — meist eine Schleife im einbettenden Code, nicht ein Gast.
rate-limit-widget-paymentFür Gäste · 429HTTP 429 rate_limited (Zahlungsstatus)
Mehr als 40 Abrufe in 15 Minuten je IP und Betrieb waehrend der Anzahlung.
rate-limit-guest-cancelFür Gäste · 429HTTP 429 rate_limited (Stornierung durch den Gast)
Mehr als 10 Storno-Versuche pro Stunde je IP.
rate-limit-proposal-acceptFür Gäste · 429HTTP 429 rate_limited (Terminvorschlag annehmen)
Zwei Eimer: 20 Versuche/Stunde je IP und 10 Versuche/Stunde je Token-Hash.
vorschlag-link-ungueltigFür GästeDieser Link ist nicht mehr gültig — Der Vorschlag wurde möglicherweise bereits angenommen, ist abgelaufen oder wurde durch einen neueren ersetzt.
Auch der Seitenaufruf ist gebremst (60/Stunde je IP); bei Ueberschreitung zeigt die Seite denselben neutralen Text wie bei ungueltigem Token — absichtlich, um Token-Durchprobieren nicht zu verraten.
rate-limit-trackFür Entwickler · 204HTTP 204 (stille Verwerfung, keine Meldung)
Mehr als 240 Reichweiten-Beacons pro Minute je IP; die Route antwortet absichtlich 204 statt 429.
rate-limit-dashboardFür Betriebsinhaber · 429HTTP 429 rate_limited (Dashboard-Karten)
Mehr als 240 Abrufe pro Minute je Nutzerkennung (Echtzeit- und Protokollkarte teilen den Eimer). Die Echtzeitkarte fragt alle 5 Sekunden.
rate-limit-notificationsFür Betriebsinhaber · 429HTTP 429 rate_limited (Glocke)
Mehr als 240 Abrufe pro Minute je Nutzerkennung ueber Liste, Zaehler und "gesehen" zusammen.
rate-limit-ai-agentFür Betriebsinhaber · 429HTTP 429 rate_limited (Assistent)
Je Betrieb und Nutzer: 20 Chat-Laeufe, 60 Bestaetigungen, 60 Sprach-Aufrufe pro 5 Minuten.
rate-limit-ww-aiFür Betriebsinhaber · 429HTTP 429 rate_limited (KI Produkt/Speisekarte)
15 KI-Produkte bzw. 5 KI-Speisekarten pro Stunde je Betrieb. Die Bremse steht bewusst VOR der Guthabenpruefung.
rate-limit-theme-aiFür Betriebsinhaber · 429HTTP 429 rate_limited (KI-Theme)
Mehr als 5 KI-Theme-Generierungen in 30 Minuten je Betrieb.
rate-limit-website-importFür Betriebsinhaber · 429Zu viele Analysen. Bitte kurz warten. / Zu viele Imports. Bitte kurz warten. (HTTP 429)
Mehr als 3 Website-Analysen in 10 Minuten je Betrieb (Schluessel website-import:<restaurantId>).
rate-limit-data-importFür Betriebsinhaber · 429HTTP 429 rate_limited (Datenimport)
Mehr als 5 Importlaeufe in 10 Minuten je Betrieb.
rate-limit-website-inspirationsFür Betriebsinhaber · 429HTTP 429 rate_limited (Inspirationen)
Mehr als 30 Speichervorgaenge in 10 Minuten je Betrieb.
rate-limit-proposal-createFür Mitarbeiter · 429HTTP 429 rate_limited (Terminvorschlag verschicken)
Mehr als 30 Vorschlaege pro Stunde je Nutzer und Betrieb — verhindert das Zumuellen eines Gast-Postfachs unter dem Namen des Betriebs.
rate-limit-mailbox-testFür Betriebsinhaber · 429HTTP 429 rate_limited (Postfach-Test)
Zwei Eimer: 10 Tests je Postfach und 30 Tests je Nutzer in 10 Minuten.
rate-limit-domain-host-guideFür BetriebsinhaberKeine Fehlermeldung — die KI-Ergaenzung entfaellt still
Mehr als 3 KI-Ergaenzungen in 24 Stunden je Betrieb; bei Ueberschreitung wird nur der bezahlte Aufruf uebersprungen, die Anleitung kommt trotzdem.
rate-limit-registerFür Gäste · 429HTTP 429 rate_limited (Registrierung)
Mehr als 5 Registrierungen pro Stunde je IP.
rate-limit-resend-verificationFür Gäste · 429Zu viele Anfragen. Bitte kurz warten. (HTTP 429)
Eine Bestaetigungsmail alle 30 Sekunden je Adresse und 20 pro Stunde je IP.
rate-limit-forgot-reset-passwordFür Gäste · 429HTTP 429 rate_limited (Passwort vergessen / zuruecksetzen)
10 Anfragen/Stunde je IP und 3/Stunde je E-Mail-Adresse; Zuruecksetzen 10/Stunde je IP.
rate-limit-restaurant-createFür Betriebsinhaber · 429HTTP 429 rate_limited
Mehr als 3 Betriebsanlagen pro Stunde je Nutzerkonto.
restaurant-create-harte-grenzeFür Betriebsinhaber · 429Du hast in kurzer Zeit sehr viele Betriebe angelegt. Bitte melde dich bei uns, wenn du mehr brauchst. (HTTP 429)
Zusaetzliche Zaehlung in der Datenbank: 5 Betriebe im Bremsfenster. Sie greift auch, wenn die prozesslokale Bremse nach einem Kaltstart leer ist.
ai-credits-exhaustedFür Betriebsinhaber · 402Dein KI-Guthaben ist aufgebraucht. Lade Guthaben auf, um KI-Funktionen weiter zu nutzen. / {"error":"ai_credits_exhausted","balanceMicros":…,"topUpUrl":…} (HTTP 402)
checkAiCredits fand balanceMicros <= 0; jeder KI-Aufruf prueft das Guthaben vorab. Partner-verwaltete Betriebe sind ausgenommen.
ai-credits-error-actionFür Entwickler · 402Dein KI-Guthaben ist aufgebraucht. Bitte lade KI-Guthaben auf, um fortzufahren.
Server Actions koennen keinen Status 402 setzen; sie geben deshalb ein AiCreditsExhaustedResult zurueck statt zu werfen.
ai-credits-exhausted-agentFür BetriebsinhaberDas KI-Guthaben ist aufgebraucht. (SSE-Ereignis type: "error", code: "ai_credits_exhausted")
Das Guthaben ist mitten im laufenden Assistenten-Lauf leer; der Lauf wird auf status 'error' gesetzt.
ai-model-unavailableFür Betriebsinhaber · 424Das KI-Modell „…“ ist beim Anbieter nicht mehr verfügbar. Wähle unter Einstellungen → KI ein anderes Modell. / {"error":"ai_model_unavailable","provider":…,"model":…,"source":…,"settingsUrl":…} (HTTP 424)
Der Anbieter kennt das angefragte Modell nicht (mehr): Anthropic 404 not_found_error zum Modell, OpenAI 404/400 model_not_found bzw. „model … does not exist“. 400er wegen Werkzeugwahl oder Denken zählen nicht dazu. Für den gescheiterten Aufruf wird kein Guthaben abgezogen.
ai-model-unavailable-actionFür EntwicklerDas KI-Modell „…“ ist beim Anbieter nicht mehr verfügbar. Wähle unter Einstellungen → KI ein anderes Modell.
Server Actions geben statt eines geworfenen Fehlers ein AiModelUnavailableResult zurück – Next.js maskierte die Meldung sonst in Produktion.
ai-credits-lowFür BetriebsinhaberKI-Guthaben wird knapp — nur noch … / KI-Guthaben aufgebraucht. KI-Funktionen sind pausiert, bis du Guthaben auflädst.
ent.ai.low (Guthaben unter AI_CREDIT_LOW_WARNING_CENTS) bzw. ent.ai.exhausted (<= 0).
unauthenticatedFür Entwickler · 401{"error":"unauthenticated"} (HTTP 401)
Die Middleware sieht keine Sitzung und der Pfad ist nicht in PUBLIC_PATHS (src/middleware.ts:160-231). API-Pfade bekommen JSON statt einer Weiterleitung.
signin-redirectFür BetriebsinhaberWeiterleitung auf /restaurant/sign-in bzw. /partners/sign-in mit ?callbackUrl=…
Nicht angemeldeter Seitenaufruf (kein /api-Pfad). Auf einer Mandanten-Subdomain zeigt der Link auf APP_URL, weil dort keine Anmeldeseite existiert.
email-not-verifiedFür Betriebsinhaber · 403{"error":"email_not_verified"} (HTTP 403) bzw. Weiterleitung auf /restaurant/verify-notice | /partners/verify-notice
Angemeldet, aber session.user.emailVerified === false. Erlaubt bleiben nur die Hinweisseite, /api/auth und oeffentliche Pfade.
unauthorized-seiteFür MitarbeiterKein Zugriff — Du hast für diesen Bereich des Restaurants keine Berechtigung.
Dem angemeldeten Konto fehlt der Zugang zum ausgewählten Betrieb oder das benötigte Modulrecht in diesem Betrieb. Rechte eines anderen Restaurants werden nicht übertragen.
subscription-inactiveFür Gäste · 403{"error":"subscription_inactive"} (HTTP 403) — Gast sieht: Online-Reservierung derzeit nicht verfügbar. Bitte kontaktieren Sie das Restaurant direkt, um einen Tisch zu reservieren.
ent.features.reservations ist false — abgelaufene Testphase oder ein Plan ohne Reservierungen. Trial und Partner-Verwaltung gelten als aktiv.
cron-unauthorizedFür Entwickler · 401{"error":"Unauthorized"} (HTTP 401)
Der Authorization-Header war nicht exakt `Bearer <CRON_SECRET>`. Die Middleware laesst /api/cron bewusst durch, damit die Route selbst pruefen kann.
cron-secret-not-configuredFür Entwickler · 503{"error":"CRON_SECRET is not configured"} (HTTP 503)
Die Umgebungsvariable CRON_SECRET fehlt; ohne Geheimnis verweigert die Route den Dienst, statt offen zu antworten.
rate-limit-redis-url-invalidFür Entwickler[rate-limit] RATE_LIMIT_REDIS_URL ist keine https-REST-URL — es wird prozesslokal gebremst (nur Log)
Es wurde die rediss://-TCP-Adresse statt der Upstash-REST-URL eingetragen; Platzhalter aus .env.example gelten als nicht gesetzt (:181-189).
rate-limit-store-unreachableFür Entwickler[rate-limit] geteilter Speicher nicht erreichbar, prozesslokaler Rückfall (nur Log)
Upstash antwortete nicht binnen 1000 ms oder mit einem Fehler. Bewusste Entscheidung: der Ausfall laesst durch, statt zu sperren.
client-ip-unknownFür EntwicklerBremsschluessel enthaelt 'unknown' — alle Aufrufer teilen einen Eimer
Weder CF-Connecting-IP noch X-Real-IP noch X-Forwarded-For vorhanden (Betrieb ohne Proxy, lokale Entwicklung).
ww-access-deniedFür Mitarbeiter · 403Nicht angemeldet. / Keine Berechtigung. / Restaurant nicht gefunden.
assertRestaurantWriteAccess liefert unauthenticated | forbidden | not_found; die drei Gruende werden zu genau diesen drei Saetzen als Toast.
Website und Themes
Website und Themes · 18 Meldungen
github-conflictFür Betriebsinhaber · 409Theme wurde auf GitHub geändert
Der verbundene Branch oder die lokale Theme-Revision hat sich seit dem Laden geändert.
github-invalid-themeFür Betriebsinhaber · 422Der GitHub-Stand ist kein gültiges TacticTable-Theme.
Pflichtdateien, Liquid-Syntax, JSON oder Abschnittsschemas fehlen oder sind fehlerhaft.
github-authorizationFür Betriebsinhaber · 401Bitte verbinden Sie Ihr GitHub-Konto erneut.
Die kurzlebige Benutzerautorisierung fehlt oder ist abgelaufen.
installation-stateFür Betriebsinhaber · 400Die GitHub-Installation ist abgelaufen oder gehört zu einem anderen Browser.
Der kurzlebige Installationszustand oder der zugehörige Browser-Cookie fehlt, ist abgelaufen oder wurde bereits verwendet.
github-busyFür Betriebsinhaber · 409Dieses Theme wird gerade mit GitHub abgeglichen.
Ein anderer Speicher- oder Synchronisierungsvorgang besitzt die Verbindungssperre.
github-already-linkedFür Betriebsinhaber · 409Dieser Repository-Branch ist bereits mit einem Theme verbunden.
Ein Branch kann nicht gleichzeitig mehrere Theme-Stände synchronisieren.
github-local-changesFür Betriebsinhaber · 409Der lokale Theme-Stand wurde außerhalb der GitHub-Synchronisierung geändert.
Ein Wartungs- oder Wiederherstellungsvorgang hat den lokalen Stand separat verändert.
not-a-websiteFür Betriebsinhaber · 400Das Archiv enthält keine erkennbare Website und kein Theme.
Die KI hat in den geprüften Quelldateien keine Website erkannt. Die API meldet `not_a_website`.
ai-theme-invalidFür Betriebsinhaber · 422Der KI-Umbau ist noch kein gültiges Liquid-Theme.
Die KI-Ausgabe besteht die Struktur-, Inhalts- oder Liquid-Prüfung auch nach der begrenzten Nachbesserung nicht. Die API meldet `ai_theme_invalid`.
ai-theme-too-largeFür Betriebsinhaber · 400Die Website-Quelldateien sind für einen KI-Import zu umfangreich.
Die auswertbaren Quelldateien überschreiten 350.000 Zeichen. Die API meldet `ai_theme_too_large`.
ai-credits-insufficientFür Betriebsinhaber · 402Dein KI-Guthaben reicht voraussichtlich nicht für den vollständigen Theme-Umbau.
Das Guthaben reicht nicht für den geschätzten vollständigen Modellaufruf. Die API meldet `ai_credits_insufficient`.
ai-theme-timeoutFür Betriebsinhaber · 422Der KI-Umbau hat das Zeitlimit erreicht.
Der vollständige Modelllauf oder seine Prüfung konnte nicht innerhalb der verfügbaren Laufzeit abgeschlossen werden. Die API meldet `ai_theme_timeout`.
ai-theme-providerFür Betriebsinhaber · 502Der KI-Anbieter konnte den Theme-Umbau nicht abschließen.
Der KI-Anbieter hat den Modellaufruf nicht erfolgreich beantwortet. Die API meldet `ai_theme_provider`.
ai-theme-busyFür Betriebsinhaber · 409Für dieses Restaurant läuft bereits ein KI-Theme-Import.
Die Datenbank-Sperre verhindert parallele kostenpflichtige Imports für denselben Betrieb. Die API meldet `ai_theme_busy`.
upload-ticket-requiredFür Betriebsinhaber · 400KI-Importe benötigen ein einmaliges Upload-Ticket.
Die ZIP-Datei wurde über den alten Formularweg statt über den bestätigten Direkt-Upload übergeben. Die API meldet `upload_ticket_required`.
upload-ticket-invalidFür Betriebsinhaber · 400/403Der Upload ist abgelaufen oder ungültig.
Das Upload-Ticket ist abgelaufen, verändert oder gehört zu einem anderen Benutzer oder Restaurant. Die API meldet `upload_ticket_invalid`.
upload-invalidFür Betriebsinhaber · 400Die hochgeladene ZIP-Datei fehlt oder ist unvollständig.
Dateigröße, Typ oder gespeicherte Bytes stimmen nicht mit den bestätigten Upload-Daten überein. Die API meldet `upload_invalid`.
upload-already-usedFür Betriebsinhaber · 409Dieses Archiv wird bereits verarbeitet oder wurde schon importiert.
Ein einmaliges Upload-Ticket wurde erneut verwendet. Die API meldet `upload_already_used`.
Website, Themes, Domains, Medien
Website, Themes, Domains, Medien · 172 Meldungen
cloudflare-konfiguration-unvollstaendigFür EntwicklerCloudflare-Konfiguration unvollstaendig: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_ZONE_ID
Mindestens eine der drei Cloudflare-Umgebungsvariablen fehlt oder ist leer. Die Subdomain wird dann gar nicht erst angelegt.
cloudflare-env-nicht-gesetztFür EntwicklerCLOUDFLARE_API_TOKEN is not set
requireEnv() wirft, sobald eine Cloudflare-Variable im laufenden Aufruf fehlt.
cloudflare-10000-token-darf-zone-nichtFür Entwickler · 403Cloudflare API /zones/... failed: 10000: Authentication error — Der Token ist GUELTIG, darf aber diese Zone nicht. Ihm fehlt „Zone > DNS > Bearbeiten" fuer genau diese Zone, oder er gehoert zu einem anderen Cloudflare-Konto als die Zone.
/user/tokens/verify bestaetigt den Token, die Zone ist aber nicht abgedeckt oder liegt in einem anderen Konto.
cloudflare-10000-token-ungueltigFür Entwickler · 403... — Cloudflare erkennt den Token NICHT an: falsch kopiert, abgelaufen oder widerrufen. Im richtigen Konto neu erzeugen (Zone > DNS > Bearbeiten und Zone > Zone > Lesen).
Der Token ist ungueltig, abgelaufen oder widerrufen.
cloudflare-10000-gegenpruefung-unerreichbarFür Entwickler... — Der Token wird abgelehnt; die Gegenpruefung bei Cloudflare war selbst nicht erreichbar.
Cloudflare lehnt ab, und /user/tokens/verify war nicht erreichbar — die Ursache bleibt offen.
cloudflare-zone-nicht-gefundenFür EntwicklerCloudflare zone "tactictable.com" not found
CLOUDFLARE_ZONE_ID enthaelt einen Zonennamen, den das Konto nicht kennt.
subdomain-geschuetzter-hostnameFür EntwicklerAbbau von "tactictable.com" verweigert — geschuetzter Hostname.
Es wurde versucht, den DNS-Eintrag der Apex-Domain oder von www abzubauen.
subdomain-vercel-token-fehltFür EntwicklerVercel: VERCEL_TOKEN fehlt — Domain nicht am Projekt registriert
Ohne VERCEL_TOKEN entfaellt Schritt 2; der CNAME steht, Vercel kennt den Host aber nicht.
subdomain-einrichtung-unvollstaendigFür BetriebsinhaberEinrichtung unvollständig.
provisionRestaurantSubdomain lieferte provisioned=false; der Grund steht im Feld error der Antwort.
subdomain-einrichtung-fehlgeschlagenFür BetriebsinhaberEinrichtung fehlgeschlagen
Der Aufruf der Subdomain-Route brach ab (Netzwerk oder 500).
subdomain-adresse-doppelt-p2002Für Entwickler[subdomain] Adresse ist einer anderen Zeile zugeordnet: <host>
Prisma P2002: die Spalte subdomain traegt den Wert schon bei einem anderen Betrieb.
cf-zonen-api-token-fehltFür EntwicklerCLOUDFLARE_API_TOKEN fehlt.
Zonenverwaltung fuer gekaufte Domains ist ohne Token nicht moeglich.
cf-zonen-account-id-fehltFür EntwicklerCLOUDFLARE_ACCOUNT_ID fehlt.
Ohne Konto-ID kann keine Zone gesucht oder angelegt werden.
cloudflare-nicht-erreichbarFür EntwicklerCloudflare /zones nicht erreichbar: <Grund>
fetch scheiterte oder das 20-Sekunden-Zeitlimit griff.
cloudflare-9109-token-auf-zone-beschraenktFür Entwickler · 403Cloudflare /zones fehlgeschlagen: 9109: ... — Das Cloudflare-Token ist auf eine BESTIMMTE Zone eingeschränkt. Für neue Zonen braucht es „Zone : Zone : Edit" UND „Zone : DNS : Edit" jeweils auf „Alle Zonen eines Kontos".
Die Token-Berechtigung haengt an einer festen Zone-ID; neu angelegte Zonen sind nicht abgedeckt.
cloudflare-1049-domain-noch-nicht-aufloesbarFür EntwicklerCloudflare /zones fehlgeschlagen: 1049: ... is not a registered domain
Die gerade gekaufte Domain hat noch keine gueltigen NS-/SOA-Einträge; die Registry braucht Minuten bis Stunden.
cloudflare-1105-zu-viele-versucheFür EntwicklerCloudflare /zones fehlgeschlagen: 1105: ...
Zu viele Zonen-Anlageversuche fuer dieselbe Domain; Cloudflare sperrt sie drei Stunden.
vercel-api-fehlerFür EntwicklerVercel API error: <status> <Rohtext>
Vercel antwortete nicht mit 2xx — meist fehlender/ungueltiger Token, falsches Projekt oder Team.
vercel-token-fehlt-externe-domainFür EntwicklerVERCEL_TOKEN fehlt — Domain kann nicht registriert werden.
Ohne Token antwortet Vercel mit nacktem 403; das ist ein Konfigurationsfehler auf unserer Seite.
domain-bei-anderem-vercel-projektFür BetriebsinhaberDiese Domain ist bereits bei einem anderen Vercel-Projekt registriert. Sie muss dort zuerst entfernt werden.
Vercel meldet domain_already_in_use/conflict — die Domain haengt an einem fremden Projekt oder Konto.
vercel-token-fehlt-trennenFür EntwicklerVERCEL_TOKEN fehlt.
Ohne Token kann die Domain nicht vom Projekt genommen werden.
vercel-token-fehlt-zertifikatFür EntwicklerVERCEL_TOKEN fehlt.
Zertifikatsstand und Ausstellungs-Anstoss brauchen den Vercel-Token.
vercel-certs-abfrage-fehlerFür EntwicklerVercel API 403
GET /v8/certs antwortete nicht mit 2xx; der Zertifikatsstand bleibt „weiss ich nicht".
vercel-domain-konfiguration-fehlgeschlagenFür EntwicklerDomain configuration failed: <Grund> / Domain creation failed: <Grund>
addRestaurantDomain lieferte success=false, die Subdomain haengt nicht am Vercel-Projekt.
domain-ungueltigFür Betriebsinhaber · 400Ungültige Domain.
Die Eingabe erfuellt fqdnSchema nicht (Tippfehler, Leerzeichen, fehlende Endung).
tactictable-adresse-nicht-erlaubtFür Betriebsinhaber · 400Das ist eine TacticTable-Adresse. Trage hier die Domain ein, die dir gehört — deine TacticTable-Adresse steht oben auf der Seite.
Es wurde tactictable.com oder eine Subdomain davon als eigene Domain eingetragen.
domain-bereits-anderem-betriebFür Betriebsinhaber · 409Diese Domain ist bereits mit einem anderen Betrieb verbunden.
Die Domain-Zeile traegt eine andere restaurantId; die Eindeutigkeit liegt auf dem Namen.
domain-nicht-gefundenFür Betriebsinhaber · 404Domain nicht gefunden.
Es wurde der Stand einer Domain abgefragt, die diesem Betrieb nicht gehoert.
domain-verbinden-fehlgeschlagenFür BetriebsinhaberDomain konnte nicht verbunden werden.
Die POST-Antwort war kein 2xx oder der Aufruf brach ab.
domain-nicht-registriertFür BetriebsinhaberDie Domain konnte nicht registriert werden. <Grund>
Vercel hat die Domain nicht angenommen (vercelRegistriert=false).
dns-noch-nicht-sichtbarFür BetriebsinhaberNoch nicht sichtbar. DNS-Änderungen brauchen oft einige Minuten.
Vercel meldet die Domain noch als nicht verifiziert bzw. misconfigured.
domain-stand-nicht-abfragbarFür BetriebsinhaberDer Stand dieser Domain konnte nicht abgefragt werden. Prüfe die Lade später erneut.
Die Statusabfrage lieferte keinen Stand (Fehler oder 404).
domain-trennen-fehlgeschlagenFür BetriebsinhaberDomain konnte nicht getrennt werden.
DELETE auf die externe Domain schlug fehl.
cloudflare-proxy-muss-grau-seinFür BetriebsinhaberLiegt deine Domain bei Cloudflare: die Wolke muss grau sein (Proxy aus). Hinter dem orangefarbenen Proxy kann das Zertifikat nicht ausgestellt werden, und die Seite bleibt unerreichbar.
Hinter dem Cloudflare-Proxy scheitert Vercels Zertifikatspruefung; die Domain bleibt „Invalid Configuration".
zertifikat-wird-ausgestelltFür BetriebsinhaberZertifikat wird ausgestellt — Die Einträge stimmen. Bis das Zertifikat da ist, dauert es in der Regel weniger als eine Minute; bis dahin kann der Browser noch warnen.
DNS stimmt, Vercel hat das Zertifikat noch nicht ausgestellt.
zertifikat-fehlt-dns-offenFür BetriebsinhaberDas Zertifikat kommt automatisch, sobald die DNS-Einträge stehen. Vorher lässt es sich nicht ausstellen — es wird über genau diese Einträge geprüft.
Die DNS-Einträge stimmen noch nicht, daher ist kein Zertifikat moeglich.
ssl-fehler-badgeFür BetriebsinhaberSSL-Fehler
Domain.sslStatus steht auf FAILED oder EXPIRED.
zertifikat-anstoss-fehlgeschlagenFür Entwickler[ssl] Anstoss für <domain> fehlgeschlagen: <Grund>
POST /v8/certs bei Vercel scheiterte; der Versuch wird trotzdem vermerkt.
dns-wurzel-kein-cnameFür BetriebsinhaberAn der Wurzel einer Domain erlaubt das DNS keinen CNAME — dort muss ein A-Eintrag stehen.
Hinweistext zum verlangten A-Eintrag auf 76.76.21.21 fuer die Wurzeldomain.
dns-www-fehltFür BetriebsinhaberDamit `www.` auf dieselbe Seite zeigt. Ohne diesen Eintrag läuft nur die Adresse ohne `www` ins Ziel.
Der CNAME fuer www fehlt beim Anbieter.
host-guide-domain-ungueltigFür Entwickler · 400Ungültige Domain.
Der Query-Parameter domain bzw. anbieter erfuellt das Schema nicht.
host-guide-anbieter-unbekanntFür Betriebsinhaber(leere Nameserver, erkannt = null — Auswahlliste statt Erkennung)
Die Domain gehoert dem Betrieb nicht oder die NS-Abfrage lieferte nichts; die Erkennung schweigt.
host-guide-ki-fehlversuchFür Betriebsinhaber[domain-guide] Fehlversuch nicht vermerkt: <Grund>
KI-Analyse des unbekannten Anbieters scheiterte (Guthaben, Modellfehler, kaputtes JSON).
stripe-nicht-konfiguriertFür Entwickler · 503Stripe ist auf dieser Umgebung nicht konfiguriert.
isStripeConfigured() ist false — Domainkauf/Broker-Anfrage ist ohne Stripe nicht moeglich.
domain-warenkorb-leerFür Betriebsinhaber · 400Der Domain-Warenkorb ist leer.
Checkout wurde ohne Positionen ausgeloest.
domain-warenkorb-waehrungen-gemischtFür Betriebsinhaber · 400Alle Domains im Warenkorb müssen die gleiche Währung haben.
Positionen tragen unterschiedliche currency-Werte; Stripe braucht eine Waehrung je Sitzung.
broker-anfrage-ohne-empfaengerFür Entwickler[domains] BEZAHLTE Broker-Anfrage <Domain> (<ID>) ohne Empfänger — ADMIN_EMAIL fehlt, niemand ist informiert (nur Serverlog)
Eine Broker-Anfrage wurde bezahlt und steht auf PAID, aber die Umgebungsvariable ADMIN_EMAIL ist nicht gesetzt. Die Mail an den Betreiber ist der EINZIGE Auslöser dafür, dass ein Mensch die Vermittlung übernimmt — ohne sie arbeitet niemand, obwohl der Wirt bezahlt hat.
broker-meldung-nicht-verschicktFür Entwickler[domains] BEZAHLTE Broker-Anfrage <Domain> — Benachrichtigung NICHT verschickt, niemand ist informiert: <Grund> (nur Serverlog)
Die Mail an den Betreiber über eine bezahlte Broker-Anfrage konnte nicht verschickt werden. Es gibt genau einen Versuch und keine Admin-Ansicht — der Stand PAID steht danach nur in der Datenbank.
unsupported-tldFür Betriebsinhaber · 400unsupported_tld
Die gesuchte Endung steht nicht in DEFAULT_TLDS.
dns-eintrag-gesperrt-lebenswichtigFür BetriebsinhaberDieser Eintrag ist die Adresse von <zone> selbst. Ohne ihn ist die Website unter dieser Domain nicht mehr erreichbar — sofort und für alle Besucher. Deshalb lässt er sich nicht löschen.
Loeschen des Wurzel-Adresseintrags wuerde die Domain vom Netz nehmen.
dns-eintrag-gesperrt-nameserverFür BetriebsinhaberDas sind die Nameserver der Zone. Werden sie entfernt, antwortet für diese Domain niemand mehr — auch nicht für E-Mail.
NS-Einträge an der Wurzel sind gegen Loeschen gesperrt.
dns-eintrag-warnung-wwwFür BetriebsinhaberOhne diesen Eintrag ist www.<zone> nicht mehr erreichbar. Die Adresse ohne „www" funktioniert weiter.
Warnung vor dem Loeschen des www-Adresseintrags.
dns-aenderung-gesperrt-typFür BetriebsinhaberEin <TYP>-Eintrag an der Wurzel von <zone> ersetzt die Adresse der Domain nicht — die Website wäre danach nicht erreichbar. Das ist ein Löschen mit Umweg und deshalb gesperrt.
Der Typ eines Wurzel-Adresseintrags sollte auf einen Nicht-Adresstyp geaendert werden.
dns-aenderung-gesperrt-umbenennenFür BetriebsinhaberWird dieser Eintrag von <zone> weg umbenannt, hat die Wurzel der Domain keine Adresse mehr und die Website ist nicht erreichbar. Lege stattdessen einen zweiten Eintrag an.
Umbenennen des Wurzeleintrags entspricht seinem Loeschen.
dns-aenderung-warnung-fremdes-zielFür BetriebsinhaberDanach zeigt <zone> nicht mehr auf die bei TacticTable gehostete Website, sondern auf <ziel>.
Das Ziel des Wurzeleintrags wird von unserem erwarteten Ziel weg gestellt.
dns-anlage-warnung-cname-wurzelFür BetriebsinhaberAn der Wurzel einer Domain erlaubt das DNS keinen CNAME — dort stehen schon NS- und SOA-Einträge, und ein CNAME duldet keine Geschwister. Nimm einen A-Eintrag.
Ein CNAME an der Zonenwurzel widerspricht RFC 1034; Cloudflare weist ihn ab.
website-nicht-erreichbarFür BetriebsinhaberWebsite nicht erreichbar: <url>
Die Startseite lieferte kein HTML — Adresse falsch, Seite offline, oder der Abruf wurde blockiert.
tracking-eigener-code-nur-inhaberFür Betriebsinhaber · 403Eigenen Code im Kopf- oder Rumpfbereich darf nur der Inhaber des Betriebs ändern.
Die Felder „Eigener Code (Kopf)" und „Eigener Code (Rumpf)" enthalten beliebiges JavaScript, das auf der oeffentlichen Gastseite ausgefuehrt wird. Schreibrecht auf das Modul Tracking haben aber auch die Rollen Marketing und Backoffice sowie Mitglieder einer betreuenden Agentur — fuer die waere das ein Weg, fremden Code in die Website zu stellen und dort Reservierungs- oder Zahlungseingaben mitzulesen. Alle anderen Tracking-Felder bleiben fuer diese Rollen offen: eine Container- oder Pixel-Kennung ist eine Zeichenkette in festem Format, kein Code.
website-zertifikatskette-unvollstaendigFür Betriebsinhaber<host> ist erreichbar, liefert das Sicherheitszertifikat aber unvollstaendig aus: das Zwischenzertifikat zur Stammstelle fehlt. Browser gleichen das still aus, automatische Abrufe koennen es nicht.
Der fremde Server sendet nur sein eigenes Zertifikat, nicht die Zwischenstelle, die es mit einer bekannten Stammstelle verbindet (Node-Fehlercode UNABLE_TO_VERIFY_LEAF_SIGNATURE). Ein haeufiger Konfigurationsfehler. TacticTable laedt die fehlende Stelle seit dieser Meldung selbst nach (src/lib/net/aia-kette.ts) — diese Meldung erscheint erst, wenn AUCH das nicht gelingt: die Zertifizierungsstelle ist nicht erreichbar, oder das Nachgeladene liess sich nicht bis zu einer vertrauenswuerdigen Stammstelle zurueckverfolgen.
import-url-schema-nicht-unterstuetztFür Betriebsinhaber · 400Nur http- und https-Adressen werden unterstützt.
Die Eingabe traegt ein fremdes Schema (ftp:, mailto:, javascript:).
import-url-ungueltigFür BetriebsinhaberBitte eine gültige Web-Adresse eingeben.
Die Eingabe laesst sich nicht als URL lesen.
ki-keine-json-antwortFür BetriebsinhaberKeine JSON-Antwort vom Modell
Das Modell antwortete ohne verwertbares JSON; die Auswertungsphase bricht ab.
ki-antwort-ungueltigFür BetriebsinhaberAI-Antwort ungültig: <Feldfehler>
Die Modellantwort verletzt das Zod-Schema der Extraktion.
design-analyse-abgelehntFür EntwicklerModell hat die Design-Analyse abgelehnt
stop_reason = refusal; die Gestaltungsanalyse faellt auf Heuristik zurueck (source: heuristic).
crawl-ergebnis-fehltFür BetriebsinhaberCrawl-Ergebnis fehlt — der Lauf kann nicht fortgesetzt werden.
contentJson ist leer oder unlesbar; ein fortgesetzter Lauf findet die gelesenen Seiten nicht.
auswertung-fehltFür BetriebsinhaberAuswertung fehlt — der Lauf kann nicht abgeschlossen werden.
extractedJson fehlt in der Persist-Phase.
persist-restaurant-nicht-gefundenFür EntwicklerRestaurant nicht gefunden
Die Restaurant-Zeile existiert beim Schreiben der Ergebnisse nicht mehr.
analyse-haengtFür BetriebsinhaberDie Analyse hängt beim Lesen der Seiten. Du kannst sie fortsetzen oder neu starten — deine Eingaben bleiben erhalten.
Seit ueber 5,5 Minuten kein Lebenszeichen; der Lauf ist fortsetzbar (Cron fehlt, Instanz abgeraeumt).
analyse-abgebrochenFür BetriebsinhaberDie Analyse wurde abgebrochen bei der Gestaltungsanalyse. Starte sie neu, oder überspringe sie und trage die Angaben selbst ein.
Ueber 30 Minuten Stille — der Lauf wird auf FAILED gesetzt.
analyse-fehlgeschlagenFür BetriebsinhaberAnalyse fehlgeschlagen.
Rueckfalltext, wenn der Import FAILED ist und kein eigener Fehlertext vorliegt.
import-kein-import-vorhandenFür Betriebsinhaber · 404Kein Import vorhanden.
Fortsetzen wurde aufgerufen, ohne dass je ein Import existierte.
import-bereits-fertigFür Betriebsinhaber · 409Die Analyse ist bereits fertig.
Der letzte Import steht auf COMPLETED.
import-laeuft-geradeFür Betriebsinhaber · 409Die Analyse läuft gerade. Bitte einen Moment warten.
beurteileLauf sagt „laeuft"; zwei Ausfuehrungen auf derselben Zeile sind gesperrt.
import-anderweitig-fortgesetztFür Betriebsinhaber · 409Die Analyse wurde gerade von anderer Stelle fortgesetzt.
Anspruch per updateMany verloren — ein zweiter Tab hat zuerst fortgesetzt.
import-validationFür Entwickler · 400validation (mit issues)
Der Rumpf erfuellt websiteImportStartSchema nicht.
import-interner-fehlerFür Entwickler · 500Interner Fehler
Unerwarteter Fehler in POST bzw. GET des Imports.
import-rate-limitFür Betriebsinhaber · 429(Rate-Limit-Antwort mit resetAt)
Mehr als 3 Import-Starts je Betrieb in 10 Minuten.
import-ki-guthaben-aufgebrauchtFür Betriebsinhaber · 402(KI-Guthaben-Antwort, Aufladen-Modal)
requireAiCredits schlug fehl — kein KI-Guthaben fuer die Analyse.
theme-ki-guthaben-aufgebrauchtFür BetriebsinhaberDas KI-Guthaben ist aufgebraucht oder reicht für diesen Lauf nicht — das Theme bleibt beim funktionierenden Basis-Design. Bitte Guthaben aufladen und erneut starten.
AiCreditsError während der Theme-Generierung (runMeteredAiCall lehnt den Modellaufruf ab); der Lauf endet im Status fallback, das Basis-Design bleibt live. Trifft auch den Klon-Modus: der Spiegel-Klon selbst kostet kein Guthaben und wird nicht vorab geprüft — scheitert er aber und greift der Modell-Nachbau mit den Basis-Abschnitten, braucht dieser Guthaben und endet sonst hier.
theme-json-ungueltigFür BetriebsinhaberAntwort des Modells war kein gültiges Theme-JSON: <Feldfehler>
Die Antwort des Gestaltungslaufs enthielt kein lesbares JSON-Objekt; der Lauf endet als fallback. Bis September 2026 stand hier „Expected object, received null“ auch dann, wenn die Antwort nur am Ausgabelimit ABGESCHNITTEN war — das traf jeden Klon-Lauf einer mittelgrossen Website, weil alle Seitentexte in einer einzigen Antwort zurückkommen mussten. Heute entstehen die Unterseiten in eigenen Läufen, und eine abgeschnittene Antwort wird auf ihren vollständigen Teil gekürzt statt verworfen. Im Klon-Modus kippt eine unlesbare Gestaltungsantwort den Lauf gar nicht mehr: die Seiten erscheinen dann im Grunddesign.
klon-crawl-fehltFür Entwickler · 409{"error":"crawl_fehlt"} (HTTP 409)
„Bestehende Website klonen“ wurde für eine Adresse gestartet, zu der kein ausgelesener Stand vorliegt (nie importiert, oder eine andere Adresse als bei der Einrichtung). Kein Fehler im engeren Sinn: die Oberfläche liest die Website daraufhin zuerst aus und startet den Nachbau erneut — der Wirt sieht „Schritt 1 von 2“.
theme-ai-generate-import-nicht-gefundenFür Entwickler · 404Der Website-Import wurde nicht gefunden. (error: import_not_found)
Der Rumpf trug ein importId, zu dem es in DIESEM Betrieb keinen Website-Import gibt — die Kennung eines fremden oder inzwischen gelöschten Imports. Ohne diese Prüfung hinge ein fremder Import an der Theme-Zeile. Im Klon-Modus (klonen: true) antwortet die Route in demselben Fall — und wenn der eigene Import nicht COMPLETED ist — stattdessen mit 409 crawl_fehlt (klon-crawl-fehlt), damit der Lauf nicht mangels Stand still in den Modell-Nachbau fällt, der Guthaben kostet.
klon-keine-seitenFür Betriebsinhaber · —Auf dieser Website haben wir keine Seiten gefunden, die sich nachbauen lassen. Prüfe die Adresse — oder wähle „Neu gestalten“.
Die Adresse wurde ausgelesen, aber der Crawl enthält keine übernehmbaren Seiten — meist eine Bot-Sperre, eine reine Weiterleitung oder eine Seite, die ihren Inhalt erst im Browser per Skript aufbaut.
klon-spiegel-nicht-moeglichFür Betriebsinhaber · —Originalgetreuer Klon nicht möglich (<Grund>) — die Seiten wurden stattdessen mit den Abschnitten des Basis-Themes nachgebaut.
Der Spiegel-Klon (Aufbau, Stylesheets, Schriften und Bilder der Originalseite bleiben erhalten) kam nicht durch; in der Klammer steht der Grund aus src/lib/theme/spiegel: die Startseite liess sich nicht abrufen, leitet auf eine fremde Adresse weiter, hat keinen erkennbaren Inhaltsbereich (meist Bot-Sperre oder eine Seite, die sich erst im Browser per Skript aufbaut), die gespiegelte Startseite liess sich nicht rendern, oder Markup, Stylesheets und Skripte sind zusammen zu gross für einen Theme-Stand (klon-theme-stand-zu-gross vor dem Spiegeln, theme-commit-zu-gross vor dem Festschreiben). Die in diesem Lauf gespiegelten Dateien werden bei einem solchen Abbruch wieder gelöscht. Der Lauf ist damit NICHT gescheitert: er geht den zweiten Weg und baut die ausgelesenen Seiten mit den Abschnitten des Basis-Themes nach — gleiche Texte und Bilder, aber im Aussehen des Basis-Themes. Dieser Weg nutzt ein KI-Modell und kostet KI-Guthaben; ohne Guthaben endet der Lauf im Status fallback (theme-ki-guthaben-aufgebraucht). Die Meldung steht nach dem Lauf auf der KI-Theme-Karte unter „Hinweise zu diesem Lauf“.
klon-theme-stand-zu-grossFür Betriebsinhaber · —Markup, Stylesheets und Skripte der Originalseite sind zusammen zu gross für einen Theme-Stand (<X> MB, höchstens 40,0 MB).
Vor dem Spiegeln zählt der Lauf zusammen, was in einen Theme-Stand müsste: das Markup aller Seiten (Kopf, Fuss, Blöcke) sowie alle abgerufenen und eingebetteten Stylesheets und Skripte — jede Datei einmal, in Bytes. Liegt die Summe über MAX_BUENDEL_BYTES (40 MB), bricht der Spiegel-Klon ab, BEVOR Bilder, Schriften oder Videos hochgeladen werden: ein Stand, den GitHub ohnehin ablehnt, soll keinen Speicher kosten. Der Lauf ist damit nicht gescheitert — er geht den zweiten Weg und baut die Seiten mit den Abschnitten des Basis-Themes nach; der Satz steht als Grund im Hinweis „Originalgetreuer Klon nicht möglich (…)“ (klon-spiegel-nicht-moeglich).
theme-commit-zu-grossFür Betriebsinhaber · —Das Theme ist mit <X> MB zu groß für einen Commit (erlaubt sind 40,0 MB). Grosse Stylesheets oder Skripte verkleinern oder den Klon mit weniger Seiten wiederholen.
Die Summe der Dateiinhalte eines Theme-Stands (in Bytes, so misst GitHub) liegt über MAX_BUENDEL_BYTES (40 MB). Die Vorabsumme in lauf.ts ist eine Schätzung vor dem Umschreiben der Stylesheets und ohne Hüllen und Schemata; erst hier liegen die fertigen Dateien vor. Im Spiegel-Klon trifft die Prüfung entweder vor dem ersten Festschreiben — dann bricht der Klon ab, die in diesem Lauf gespiegelten Dateien werden wieder gelöscht, und der Satz erscheint als Grund in klon-spiegel-nicht-moeglich; die Seiten entstehen mit den Basis-Abschnitten — oder vor dem zweiten Stand mit nur erreichbaren Seiten; dann bleibt der erste Stand (klon-zweiter-stand-nicht-geschrieben).
klon-einbettung-geparktFür Betriebsinhaber · —Eine Einbettung von <Host> (<iframe|embed|object>) lädt erst, wenn der Besucher im Cookie-Banner „Marketing“ zustimmt.
Kein Fehler, erwartetes Verhalten: <iframe>, <embed> und <object> der Originalseite (auch mit srcdoc — dann heisst es „von eigenem HTML“) werden nicht lebendig übernommen, sondern als Text geparkt. Karten- und Videodienste setzen Cookies und verfolgen Besucher über Seiten hinweg; vor der Einwilligung wäre das ein Verstoss auf Seiten des Wirts. Die Laufzeit des Zustimmungsbanners (assets/tt-consent.js) setzt die Einbettung an Ort und Stelle ein, sobald der Gast die Kategorie „Marketing“ erlaubt; bis dahin bleibt die Stelle auf der veröffentlichten Seite leer — in der angemeldeten Vorschau steht dort ein beschrifteter Platzhalter (vorschau-einbettung-platzhalter). Ein iframe mit srcdoc wird immer geparkt, auch mit eigener Adresse, und bekommt ein sandbox ohne allow-same-origin: sein Skript läuft nach der Zustimmung, kommt aber weder an Cookies noch an die Elternseite. Einbettungen der eigenen geklonten Seiten laden sofort, Zähl-Frames von Messdiensten werden entfernt. Dieselbe Behandlung und derselbe Hinweis gelten für Einbettungen in Kopf- und Fussmenüs: die Menü-Schablone und ihr Fallback (navigation.ts) parken mit demselben Parker.
klon-einbettung-entferntFür Betriebsinhaber · —Eine Einbettung (<iframe|embed|object>) der Originalseite hatte keine übernehmbare Adresse und wurde entfernt.
Die Adresse der Einbettung hat die Erlaubnisliste (src/lib/theme/safe-url.ts) nicht bestanden — ein data:-Dokument, javascript:, ein Wert mit Anführungszeichen oder eine Nicht-Adresse, aus der der Umschreiber „#“ gemacht hätte (ein iframe mit src="#" lüde die eigene Seite in sich selbst). Eine Einbettung ganz ohne Adresse und ohne srcdoc bleibt dagegen stehen, weil ein Skript der Seite sie füllen mag.
vorschau-einbettung-platzhalterFür Betriebsinhaber · —Eingebetteter Inhalt (Karte, Video) — erscheint auf der veröffentlichten Seite nach Zustimmung zu „Marketing“.
Kein Fehler: In der sitzungsgebundenen Vorschau — Theme-Studio wie Knopf „Vorschau“ (/preview/<id>) ohne signiertes Merkmal — lädt die Plattform keine Fremdeinbettungen. Die Vorschau läuft unter derselben Herkunft wie die angemeldete Sitzung; ein nach „Alle akzeptieren“ eingesetztes srcdoc-Dokument mit Skript erreichte dort die Elternseite (gemessen in Chrome). Deshalb ersetzt der Renderer am fertigen Dokument jede geparkte Einbettung durch diesen sichtbaren Platzhalter, setzt <meta name="tt-vorschau" content="1"> in den <head> — assets/tt-consent.js liest das Merkmal NUR dort (document.head.querySelector) und setzt dann nichts ein; ein gleichnamiges <meta> im Rumpf der Originalseite zählt nicht, mit einer dokumentweiten Suche galt sonst die veröffentlichte Seite als Vorschau und Karte, Video und Tracking blieben lautlos tot (das Härten entfernt solche Metas ohnehin) — und parkt in der Vorschau auch kein Tracking — GTM, GA4, Meta Pixel und eigener Code werden weder eingebaut noch nach Zustimmung geladen, und keine Vorschau zählt als Besuch. Der Zustimmungsbanner selbst bleibt sichtbar und bedienbar, damit der Wirt ihn im Studio gestalten kann.
klon-formular-nicht-uebernommenFür Betriebsinhaber · —Ein Formular der Originalseite sendet an sein altes Ziel oder ins Leere — die neue Website verarbeitet es nicht. Ersetze es im Theme-Editor durch einen Kontakt- oder Reservierungs-Abschnitt.
Das Formular bleibt als Markup im Abschnitt stehen, aber niemand nimmt seine Daten entgegen: sein action zeigt auf den alten Server — oder wird, wenn es keine erlaubte Form hat (etwa javascript:), vom Umschreiber (verweise.ts) zu „#“ und sendet ins Leere —, und TacticTable hat keinen Empfänger dafür. Dasselbe gilt für formaction an Knöpfen — und für Formulare in Kopf- und Fussmenüs, etwa ein Suchfeld: die Menü-Schablone schreibt action und formaction mit demselben Umschreiber um (spiegleHolder in navigation.ts), einen eigenen Hinweis gibt es dort aber nicht; ein Suchformular sendet also weiter an den alten Host oder ins Leere. Erkannte Reservierungsformulare sind davon ausgenommen — sie werden durch das Reservierungswidget ersetzt.
klon-zeichenflaeche-leerFür Betriebsinhaber · —Eine Zeichenfläche (<canvas>) der Originalseite bleibt leer — ihre Animation lief in JavaScript, das sich nicht übernehmen lässt.
Ein <canvas> hat keinen Inhalt im HTML; was darauf zu sehen war, zeichnete ein Skript der Originalseite. Solche Skripte laufen entweder gar nicht mit (Framework-Laufzeit) oder nur im Layout der veröffentlichten Seite — die Zeichenfläche selbst bleibt ein leeres Rechteck.
klon-klickziel-umgeschriebenFür Betriebsinhaber · —(kein Fehlertext) Ein Link, Formularziel oder Knopf der Originalseite führt nach dem Klon auf „#“ — auch innerhalb einer Formel (<math>) oder einer SVG-Grafik.
Jedes Klick- oder Sendeziel der Originalseite — href und xlink:href an a/area, action an form, formaction an button/input — geht durch den sicheren Umschreiber: javascript: und andere nicht erlaubte Formen werden zu „#“ (ein toter, aber harmloser Verweis; eine leere Zeichenkette lüde die Seite neu). Unter <math> gilt das für das href/xlink:href JEDES Elements, auch von button/form/input zusätzlich zu formaction/action, weil Firefox MathML-Elemente anlegt und ihrem href folgt (gemessen: <math><mi href="javascript:…"> lief beim Klick). Ein <svg> unter mrow, mfrac und Co. bleibt dabei MathML; erst unter mi/mo/mn/ms/mtext oder einem annotation-xml mit encoding text/html bzw. application/xhtml+xml beginnt echtes SVG. Breakout-Tags in Formeln sind bewusst nicht modelliert — im Zweifel wird eher mehr zu „#“, die sichere Richtung.
klon-seitentitel-reiner-textFür Betriebsinhaber · —(kein Fehlertext) Seitentitel oder SEO-Beschreibung der Originalseite erscheinen einzeilig, ohne Anführungszeichen und spitze Klammern, der Titel auf 191 Zeichen gekürzt.
Titel und Meta-Beschreibung der Originalseite gehen über die Seitenanlage als title/seoTitle/seoDescription in die Datenbank und von dort ins Layout — am Härten vorbei. Deshalb werden sie beim Lesen auf reinen Text beschränkt: Entities dekodiert, < > " entfernt, Steuerzeichen und Leerraum zu einem Leerzeichen kollabiert (ein mehrzeiliger <title> wird einzeilig), Titel höchstens 191 Zeichen (WebsitePage.title ist VARCHAR(191)), Beschreibung höchstens 500. Gemessen: content='Kaffeehaus"><script>…' aus einer Meta-Beschreibung lief öffentlich, in der Vorschau und im Studio, solange ältere Layouts den Wert roh ins Attribut schrieben; das Layout maskiert jetzt zusätzlich mit | escape.
klon-zweiter-stand-nicht-geschriebenFür Betriebsinhaber · —Der Entwurf konnte nicht auf den Stand mit nur erreichbaren Seiten gehoben werden — Menüpunkte auf fehlende Seiten bitte unter „Website › Navigation“ prüfen (<Grund>).
Der Spiegel-Klon schreibt zwei Stände: den ersten mit allen Seiten, danach — wenn nicht jede Seite angelegt werden konnte — einen zweiten, in dem die Menüs nur auf vorhandene Seiten zeigen. Scheitert dieser zweite Schritt (Menüimport, Grössengrenze theme-commit-zu-gross, Konflikt beim Festschreiben), bleibt der erste Stand als Entwurf bestehen; die gespiegelten Dateien werden NICHT gelöscht, weil der Entwurf schon auf sie verweist. Ein Datenbankfehler bricht den Lauf dagegen ganz ab.
klon-dateien-ohne-zeitFür Betriebsinhaber · —<n> Stylesheets wurden nicht mehr abgerufen, weil die Zeit des Laufs aufgebraucht war — die betroffenen Seiten erscheinen ohne diese Stile: <Adressen>. / <n> Skripte wurden nicht mehr abgerufen, weil die Zeit des Laufs aufgebraucht war: <Adressen>.
Der Spiegel-Klon arbeitet mit einem festen Zeitbudget. War es aufgebraucht, bevor alle Stylesheets und Skripte der Originalseite geholt waren, fehlen diese Dateien im Theme; der Hinweis nennt bis zu drei Adressen. Seiten, deren Stile dazugehören, sehen dann anders aus als das Original. Derselbe Grund steht je Seite als „<Adresse>: nicht gespiegelt, die Zeit des Laufs war aufgebraucht.“
klon-zuordnung-nicht-gespeichertFür Betriebsinhaber · —Die Zuordnung der neu gespiegelten Dateien konnte nicht am Website-Import gespeichert werden — ein erneuter Klon spiegelt sie noch einmal.
Nach dem ersten Festschreiben trägt der Klon die Zuordnung Original → gespiegelte Datei in designJson.imageMap des Website-Imports nach, damit ein Wiederholungslauf nichts doppelt ablegt. Das misslang: der Import wurde nicht gefunden (ohne übergebene Kennung sucht der Klon den jüngsten abgeschlossenen Import derselben Adresse), sein designJson war nicht lesbar, oder die Datenbank antwortete nicht. Das Theme selbst ist vollständig.
klon-ersatzverhaltenFür Betriebsinhaber · —Die Originalseite läuft mit einer JavaScript-Laufzeit (React/Next o. ä.), die sich nicht mitnehmen lässt. Menü, Untermenüs und Einblenden übernimmt ein Ersatzskript; eigene Animationen der Originalseite fehlen.
Kein Fehler: Das Verhalten einer React-, Next- oder Nuxt-Seite steckt in einer Laufzeit, die nur auf dem Originalserver läuft. Das Ersatzskript hält sich an den Vertrag im HTML (aria-controls, aria-expanded, hidden): Menü auf und zu, Untermenüs aufklappen, Einblenden beim Scrollen. Ein Elternpunkt, der selbst eine Seite ist (etwa „Speisekarte“ mit Untermenü), bleibt anklickbar und führt zur Seite — das Untermenü öffnet der Pfeil oder Knopf daneben. Ein Menü, das nur über CSS statt über das Attribut hidden geschlossen ist, kann das Ersatzskript nicht öffnen; es wird aber auch nicht mehr versehentlich eingeblendet, und eine geschlossene Mobil-Schublade bleibt zu. In jeder angemeldeten Vorschau übernimmt das Ersatzskript ohnehin, weil dort kein Skript der Originalseite läuft.
theme-antwort-abgeschnittenFür BetriebsinhaberDie Antwort des Modells wurde am Ausgabelimit abgeschnitten und liess sich nicht retten.
Das Modell hat sein Ausgabelimit erreicht, bevor auch nur die Einstellungen oder eine Vorlage vollständig waren — praktisch nur bei einem sehr grossen Eingabeumfang ohne Klon-Modus. Der Lauf endet als fallback, der Verbrauch ist trotzdem abgerechnet.
theme-rauchtest-gescheitertFür BetriebsinhaberKein generiertes Template hat den Render-Rauchtest bestanden
Alle erzeugten Templates scheiterten beim Probe-Rendern; das funktionierende Theme bleibt live.
theme-r2-nicht-konfiguriertFür EntwicklerDer private Theme-Speicher ist nicht eingerichtet. R2_THEME_BUCKET und die R2-Zugangsdaten prüfen; der Medien-Bucket darf nicht verwendet werden.
Die private R2-Konfiguration fehlt oder der Zugriff auf den Theme-Bucket schlug fehl.
theme-fallback-standard-designFür BetriebsinhaberWir konnten nicht alles übernehmen — das Theme wurde mit dem Standard-Design angelegt und ist trotzdem voll bearbeitbar.
aiGenerationStatus = fallback; Detailgrund steht darunter aus aiGenerationError.
theme-generierung-fehlgeschlagenFür BetriebsinhaberDie Theme-Generierung ist fehlgeschlagen. Dein bisheriges Theme ist unverändert live.
aiGenerationStatus = failed.
theme-aktivierung-fehlgeschlagenFür BetriebsinhaberAktivierung fehlgeschlagen
Der Aktivierungs-Aufruf antwortete nicht mit 2xx.
theme-ohne-basetemplateFür EntwicklerTheme hat kein baseTemplate und kann nicht provisioniert werden
Die Theme-Zeile traegt kein baseTemplate; es gibt keine Vorlage zum Pushen.
basetemplate-ohne-dateienFür EntwicklerBase template "fine-dining" enthält keine Dateien unter theme-templates/
Der Vorlagenordner theme-templates/<name> ist leer oder fehlt im Deployment.
agent-theme-not-foundFür Betriebsinhaber · 404HTTP 404 agent_theme_not_found — Das ausgewählte Theme wurde nicht gefunden. Bitte öffne es erneut über die Theme-Bibliothek und starte den Auftrag noch einmal.
Der KI-Auftrag wurde aus einem Theme-Editor gestartet, dessen Theme inzwischen gelöscht wurde oder nicht zu diesem Betrieb gehört. Aus Sicherheitsgründen fällt der Auftrag nicht auf das Live-Theme zurück.
agent-theme-context-invalidFür Betriebsinhaber · 409HTTP 409 agent_theme_context_invalid — Der gespeicherte Theme-Bezug ist ungültig. Bitte starte den Auftrag aus dem Theme-Editor erneut.
Der gespeicherte Auftrag enthält keinen vollständig gültigen Editor-Kontext mehr, etwa nach beschädigten oder veralteten Laufdaten. Er wird gesperrt, damit eine alte Bestätigung niemals ein anderes oder das Live-Theme verändert.
agent-theme-preview-unavailableFür BetriebsinhaberBrowser-Check nicht verfügbar / Vorschau konnte nicht gerendert werden
Die automatische Desktop- und Mobilprüfung konnte Chromium nicht starten, erreichte ihr Zeit- oder Größenlimit oder konnte den gespeicherten Theme-Stand nicht rendern. Blockierte externe Ressourcen werden ebenfalls als Einschränkung gemeldet, weil der sichere Prüfbrowser keine Netzwerkzugriffe zulässt.
theme-nicht-gefundenFür BetriebsinhaberTheme nicht gefunden / Theme not found for this restaurant
Die themeId existiert nicht oder gehoert einem anderen Betrieb.
theme-datei-ist-verzeichnisFür EntwicklerDatei "<pfad>" ist ein Verzeichnis
Der angeforderte Pfad zeigt auf einen Ordner statt eine Datei.
aktives-theme-nicht-loeschbarFür Betriebsinhaber · 400Das aktive Theme kann nicht gelöscht werden. Aktiviere zuerst ein anderes Theme.
Das zu loeschende Theme ist live; sonst haette die Website keine Vorlage.
starter-theme-unbekanntFür Entwickler · 400Unknown starter template: <name>
Der uebergebene baseTemplate-Slug steht nicht in STARTER_THEMES.
starter-theme-nicht-verfuegbarFür Betriebsinhaber · 400Starter template "<name>" is not yet available.
Die Vorlage ist als available=false markiert.
template-nicht-im-themeFür EntwicklerTemplate "index" not found in theme
Das angeforderte Template fehlt im Theme (nach Import oder fehlerhaftem Commit).
asset-liquid-nicht-gefundenFür EntwicklerAsset liquid not found: theme.css.liquid
Die Liquid-Asset-Datei fehlt im Theme.
theme-kontext-restaurant-nicht-gefundenFür EntwicklerRestaurant not found: <id>
Beim Aufbau des Render-Kontexts fehlt die Restaurant-Zeile.
auth-secret-fehlt-vorschauFür EntwicklerAUTH_SECRET fehlt — Vorschau-Merkmal nicht erzeugbar.
Ohne AUTH_SECRET kann kein signiertes Vorschau-Token erzeugt werden.
theme-zip-keine-dateiFür Betriebsinhaber · 400Keine Datei hochgeladen
Das Formular enthielt kein file-Feld.
theme-zip-zu-grossFür Betriebsinhaber · 400Datei ist zu groß (max. 50MB)
Das ZIP ueberschreitet 50 MB.
theme-zip-falscher-typFür Betriebsinhaber · 400Nur .zip Dateien sind erlaubt
Die Datei ist kein ZIP-Archiv.
theme-zip-keine-gueltigen-dateienFür Betriebsinhaber · 400Keine gültigen Theme-Dateien in der ZIP gefunden
Im Archiv fanden sich nur Binaer-/Systemdateien oder eine falsche Ordnerstruktur.
theme-upload-fehlgeschlagenFür Entwickler · 500Theme-Upload fehlgeschlagen
Unerwarteter Fehler beim Entpacken oder Speichern.
themes-nicht-ladbarFür Betriebsinhaber · 500Themes konnten nicht geladen werden
Die Abfrage der Theme-Liste schlug fehl.
theme-id-fehltFür Entwickler · 400Theme ID fehlt
Aktion ohne themeId gesendet.
theme-unbekannte-aktionFür Entwickler · 400Unbekannte Aktion
Das Feld action traegt einen nicht unterstuetzten Wert.
theme-operation-fehlgeschlagenFür Entwickler · 500Theme-Operation fehlgeschlagen
Sammel-Rueckfall fuer alle Fehler der Theme-Aktionen.
theme-not-foundFür Betriebsinhaber · 404not_found
Theme existiert nicht oder gehoert einem anderen Betrieb.
theme-update-fehlgeschlagenFür Betriebsinhaber · 500Failed to update theme
Das Speichern der Theme-Metadaten schlug fehl.
theme-loeschen-fehlgeschlagenFür Betriebsinhaber · 500Failed to delete theme
Der Löschauftrag konnte nicht gespeichert werden. Private R2-Dateien werden mit Wiederholungsversuchen bereinigt.
theme-datei-pfad-fehltFür Entwickler · 400Bitte geben Sie einen Dateipfad an oder verwenden Sie list=true
Der Aufruf nennt weder path noch list=true.
theme-datei-inhalt-fehltFür Entwickler · 400Dateipfad und Inhalt sind erforderlich
Speichern ohne filePath oder content.
theme-datei-speichern-fehlgeschlagenFür Betriebsinhaber · 500Theme-Datei konnte nicht gespeichert werden
Das Speichern der R2-Revision scheiterte oder ein anderer Bearbeiter änderte den Entwurf.
theme-uebersetzungen-nicht-ladbarFür Entwickler · 500Übersetzungen konnten nicht geladen werden
Die locales-Dateien liessen sich nicht lesen oder sind kein gueltiges JSON.
theme-sprache-erforderlichFür Entwickler · 400Sprache und Übersetzungen erforderlich / Sprache erforderlich
Der Aufruf nennt den Sprachcode (bzw. die Uebersetzungen) nicht.
theme-sprache-hinzufuegen-fehlgeschlagenFür Betriebsinhaber · 500Sprache konnte nicht hinzugefügt werden
Die neue locales-Datei liess sich nicht anlegen.
theme-screenshot-fehlgeschlagenFür Betriebsinhaber · 502screenshot_failed
Die Vorschau-Aufnahme lieferte kein Bild: der Browser startete nicht (Chromium fehlt in der Funktion), die Rohansicht antwortete nicht mit 200 oder wurde umgeleitet (Zugangsmerkmal in der Middleware abgelehnt — AUTH_SECRET verschieden?), oder die R2-Revision konnte nicht geladen werden.
theme-screenshot-veraltetFür Betriebsinhaber · 409screenshot_stale
Waehrend der Aufnahme wurde das Theme erneut gespeichert — ein neuerer Stand hat gewonnen, das eben aufgenommene Bild wurde verworfen.
theme-screenshot-bremseFür Betriebsinhaber · 429rate_limited
Mehr als fuenf Vorschaubild-Aufnahmen je Minute — jede startet einen Browser auf dem Server.
theme-vorschau-entwurf-zu-grossFür Betriebsinhaber · 413too_large
Der ungespeicherte Entwurf einer Vorlage ist groesser als 512 KB.
theme-vorschau-entwurf-medientypFür Entwickler · 415unsupported_media_type
Die Live-Vorschau nimmt nur JSON an (Schutz gegen fremde Formular-Aufrufe).
theme-vorschau-entwurf-renderfehlerFür Betriebsinhaber · 422render
Der ungespeicherte Stand liess sich nicht rendern — meist ein Liquid-Fehler in einem Textfeld ({{ oder {% nicht geschlossen). Im Editor steht dann „Vorschau nicht aktuell" mit dem Grund im Tooltip.
theme-download-keine-emailFür Betriebsinhaber · 400Keine E-Mail-Adresse gefunden
Am Konto haengt keine E-Mail-Adresse, der Download wird per Mail verschickt.
theme-download-keine-dateienFür Betriebsinhaber · 404Keine Theme-Dateien gefunden
Für diese Version liegt kein lesbares R2-Dateipaket vor.
theme-download-email-fehlgeschlagenFür Betriebsinhaber · 500E-Mail-Versand fehlgeschlagen
Der Mailversand mit dem Archiv scheiterte.
theme-asset-not-foundFür Entwickler · 404Asset not found
Die Datei existiert weder als assetLiquid noch als assetStatic im Theme.
theme-asset-theme-not-foundFür Entwickler · 404Theme not found
Die themeId in der Asset-Adresse existiert nicht.
theme-install-invalid-jsonFür Entwickler · 400Invalid JSON body
Der Rumpf war kein gueltiges JSON.
theme-install-basetemplate-fehltFür Entwickler · 400baseTemplate is required
Installation ohne Vorlagen-Slug aufgerufen.
theme-ai-generate-internalFür Entwickler · 500internal
Unerwarteter Fehler beim Starten oder Abfragen der KI-Generierung.
theme-ai-generate-rate-limitFür Betriebsinhaber · 429(Rate-Limit-Antwort mit resetAt)
Mehr als 5 KI-Theme-Generierungen je Betrieb in 30 Minuten.
theme-ai-generate-guthabenFür Betriebsinhaber · 402(KI-Guthaben-Antwort, Aufladen-Modal)
requireAiCredits schlug fehl vor dem Start der Generierung — nur im freien Lauf („Neu gestalten“). Im Klon-Modus (klonen: true) entfällt die Vorabprüfung: der Spiegel-Klon kostet kein Guthaben, und ein Wirt mit leerem Guthaben soll seine Website trotzdem klonen können. Scheitert der Spiegel-Klon und greift der Modell-Nachbau, prüft runMeteredAiCall selbst; der Lauf endet dann im Status fallback mit der Guthaben-Meldung (theme-ki-guthaben-aufgebraucht).
upload-adresse-nicht-erlaubtFür BetriebsinhaberDiese Datei liegt nicht an einer erlaubten Upload-Adresse.
Die Datei-URL zeigt nicht auf den eigenen Auslieferungs-Host (R2_PUBLIC_BASE_URL) oder den Altbestand utfs.io / *.ufs.sh — Schutz gegen Abruf interner Adressen.
upload-datei-nicht-abrufbarFür BetriebsinhaberDatei nicht abrufbar (HTTP 404).
Der Upload-Speicher antwortete nicht mit 2xx; Umleitungen werden bewusst nicht gefolgt.
upload-datei-zu-grossFür BetriebsinhaberDatei ist grösser als 20 MB.
Die abgerufene Datei ueberschreitet MAX_DOWNLOAD_BYTES.
upload-url-schema-nicht-erlaubtFür EntwicklerSchema http: ist nicht erlaubt
Nur https ist zugelassen; ueber http kaeme der Inhalt im Klartext.
upload-url-mit-anmeldedatenFür EntwicklerAdresse mit Anmeldedaten ist nicht erlaubt
Adressen der Form https://nutzer:pass@host taeuschen den Hostvergleich.
upload-url-fremde-herkunftFür EntwicklerHerkunft <host> ist keine Upload-Adresse
Der Host steht nicht in der Zulassungsliste und nicht in UPLOAD_ALLOWED_HOSTS.
upload-url-keine-gueltige-adresseFür Entwicklerkeine gültige Adresse
Der Wert liess sich nicht als URL lesen.
upload-datei-muss-ueber-uploadFür Betriebsinhaber · 400Die Datei muss über den Upload dieser Anwendung hochgeladen werden.
Die im Import genannte Datei-URL liegt nicht an einer erlaubten Upload-Adresse.
upload-unauthorizedFür Mitarbeiterunauthorized
Der Upload wurde ohne angemeldete Sitzung ausgeloest. (Frueher src/app/api/uploadthing/core.ts:8 — der alte Anbieter ist ausgebaut, der Fall ist derselbe.)
upload-batch-fehlgeschlagenFür Betriebsinhaber[website-import] Stapel fehlgeschlagen: <Grund>
Ein Stapel von Bildern/Videos liess sich nicht in die Mediathek spiegeln; der Import laeuft weiter.
theme-override-nicht-anwendbarFür Entwickler[theme-loader] failed to apply override "<pfad>": <Grund>
Eine Theme-Datei enthält ungültiges JSON. Die letzte bestätigte Version wiederherstellen.
externe-domain-dns-nicht-gesetztFür Betriebsinhaber[externe-domain] DNS konnte nicht gesetzt werden: <Grund>
Die Zone liegt in unserem Cloudflare-Konto, das Setzen der Einträge scheiterte trotzdem.
cloudflare-zonensuche-fehlgeschlagenFür Entwickler[cloudflare] Zonensuche fehlgeschlagen: <Grund>
Ein auf eine Zone beschraenkter Token darf die fremde Zone nicht abfragen.
schrift-nicht-abrufbarFür Entwickler · 502Die Schrift ist gerade nicht abrufbar.
Der Schriftspiegel (/api/public/fonts/…) konnte das Stylesheet oder die Schriftdatei nicht bei Google holen (Zeitgrenze, Ausfall), oder die Antwort wurde verworfen: kein @font-face, eine fremde Adresse im Stylesheet, Datei größer als 5 MB oder kein Schriftformat. Antwortcode font_unavailable; dieselbe Meldung kommt aus src/app/api/public/fonts/file/[...path]/route.ts.
schrift-anfrage-ungueltigFür Entwickler · 400{"error":"validation","issues":…} (HTTP 400) auf /api/public/fonts/…
Der Schriftspiegel kennt nur die Endpunkte css2, css und icon; keine der family-Angaben passte ins Raster (erlaubt: Buchstaben, Ziffern, Leerzeichen und , ; : @ . | -), es waren mehr als 8, display hatte einen unbekannten Wert — oder der Dateipfad entsprach nicht s/<familie>/v<version>/<name>.(woff2|woff|ttf|otf), wahlweise mit einer Teilnummer vor der Endung (src/app/api/public/fonts/file/[...path]/route.ts).
schrift-bremseFür Entwickler · 429{"error":"rate_limited","retryAfterSeconds":<n>} (HTTP 429) auf /api/public/fonts/…
Von einer IP-Adresse kamen in einer Minute mehr als 40 Stylesheet- bzw. 120 Datei-Anfragen, die NICHT aus dem Speicher beantwortet werden konnten, also einen Abruf bei Google ausgelöst hätten. Treffer aus dem Speicher zählen nicht.
rechtsseiten-angaben-nicht-gespeichertFür Betriebsinhaber · 500Ihre Angaben konnten nicht gespeichert werden. Bitte versuchen Sie es in einer Minute erneut.
PUT /api/restaurants/[slug]/legal-pages konnte die rechtlichen Angaben nicht ins metadata-JSON des Betriebs schreiben (mergeMetadata ist gescheitert, meist eine kurz nicht erreichbare Datenbank). Antwortcode legal_details_not_saved. Es wurde NICHTS gespeichert und keine Seite verändert.
rechtsseiten-nicht-erzeugtFür Betriebsinhaber · 500Ihre Angaben sind gespeichert, die Rechtsseiten konnten aber nicht neu erzeugt werden. Bitte klicken Sie in einer Minute noch einmal auf „Speichern".
Die Angaben wurden gespeichert, aber erzeugeRechtsSeiten() ist danach gescheitert (Datenbankfehler beim Lesen des Profils oder beim Schreiben von Impressum, Datenschutzerklärung oder AGB). Antwortcode legal_pages_not_generated. Die Seiten stehen noch auf dem alten Stand.
rechtsseiten-spitze-klammernFür Betriebsinhaber · 400Spitze Klammern (< >) sind hier nicht erlaubt.
In einem Feld der rechtlichen Angaben steht < oder >. Der Text dieser Felder landet unverändert auf der öffentlichen Website, und die Theme-Engine maskiert nichts — deshalb lehnt das Schema die Zeichen ab (im Formular und in der Route; dort als {"error":"validation"} mit issues).
rechtsseiten-antwort-unlesbarFür BetriebsinhaberIhre Angaben wurden übermittelt, die Antwort des Servers war aber unlesbar. Bitte laden Sie die Seite neu, um den Stand der Rechtsseiten zu sehen.
Die Route antwortete mit 200, der Körper bestand die Prüfung gegen rechtsErgebnisSchema im Browser aber nicht (z. B. ein Proxy hat die Antwort ersetzt). Der Client meldet das bewusst nicht als Erfolg, weil er nicht weiß, was aus den Seiten wurde.
theme-download-mail-nicht-verschicktFür Betriebsinhaber · 502Die E-Mail mit dem Theme konnte nicht verschickt werden. Bitte versuche es in einigen Minuten erneut.
Das Theme-Archiv wird je Anfrage neu gebaut und ausschliesslich per Mail zugestellt. Ging die Mail nicht raus, ist das Archiv weg — es liegt nirgends. Frueher meldete die Route in diesem Fall faelschlich Erfolg.