Zum Inhalt

B2B-Intent Rollout — Change Log & Rollback

Datum: 2026-05-06 Ziel: B2B-klassifizierte Tickets bekommen automatisch Tag auto_b2b in Zendesk → Susi baut darauf eine View + Inbox-Skip. Kein Auto-Reply.


1. Was schon erledigt ist

1.1 Neuer Subworkflow [SUB] B2B Tag (NEU erstellt)

  • ID: JjHXvM7fIHPN4YFs
  • URL: https://ai-mokebo.app.n8n.cloud/workflow/JjHXvM7fIHPN4YFs
  • Projekt: Susi Projects (uK9eJgH0LF2SK87i)
  • Status: Erstellt, getestet mit Pin Data (Success-Path), noch nicht published.
  • Was er tut:
  • Trigger empfängt ticket_id
  • Add B2B Tag macht PUT https://mokebo.zendesk.com/api/v2/tickets/{id}.json mit Body { ticket: { additional_tags: ['auto_b2b'] } } (additive — Zendesk dedupliziert)
  • Bei Success: Set Result Taggedsub_action: 'b2b_tagged', sub_status: 'success'
  • Bei API-Fehler (Error-Output via onError: continueErrorOutput): Set Result Failedsub_action: 'b2b_tag_failed', sub_status: 'failed'
  • Beide Pfade convergieren in Merge Output
  • Output-Convention: { ticketId, sub_action, sub_status, sub_reason, sub_macro_id, sub_message } — exakt wie die anderen Subs liefern sollten.

1.2 ⚠️ Manuell in der UI zu erledigen (vor erstem produktiven Run!)

  • Credential setzen: Im Node Add B2B Tag ist das Zendesk-Credential leer. In der UI öffnen → Credential Zendesk Basic Auth (oder wie bei dir benannt — der httpBasicAuth den auch SUB Portalverweis nutzt) zuweisen.
  • Workflow aktivieren: Toggle oben rechts auf "Active".

2. Was du im Dispatcher noch ändern musst

⚠️ WICHTIG — laut CLAUDE.md zerstört update_workflow Credential-Bindungen. Deshalb mache ich die Patches NICHT per MCP — du musst die 4 Änderungen unten selbst in der UI vornehmen. Wenn du Hilfe willst, screensharen wir das.

Workflow: MOKI Dispatcher v2 (zikmLDiFPNI4bLmr)

Patch A — Google Sheet MOKI Config aktualisieren

Sheet: das Sheet, das vom Node Read MOKI Config gelesen wird.

Neue Zeile hinzufügen (oder bestehende b2b_anfrage-Zeile auf live: TRUE setzen):

intent live auto_send complexity
b2b_anfrage TRUE TRUE low

(auto_send muss TRUE sein damit Routing greift — der SUB schickt aber keinen Public Reply, er taggt nur.)

Patch B — Node Routing Decision (Code-Node) erweitern

Vorher (relevante Stellen):

const CONFIDENCE_THRESHOLD = 0.7;

const INTENT_TO_SUB = {
  rechnung: 'sub_rechnung',
  sendungsstatus: 'sub_sendungsstatus',
  reklamation: 'sub_portalverweis',
};

const URGENT_HOLD_INTENTS = ['adressaenderung'];

Nachher — drei Änderungen:

  1. Neue Konstante direkt nach CONFIDENCE_THRESHOLD:

    const B2B_CONFIDENCE_THRESHOLD = 0.8;
    

  2. INTENT_TO_SUB erweitern:

    const INTENT_TO_SUB = {
      rechnung: 'sub_rechnung',
      sendungsstatus: 'sub_sendungsstatus',
      reklamation: 'sub_portalverweis',
      b2b_anfrage: 'sub_b2b',
    };
    

  3. In der Entscheidungs-Kette einen Extra-Check für B2B-Threshold vor dem INTENT_TO_SUB[intent]-Branch einfügen. Konkret nach dem URGENT_HOLD_INTENTS-Block, vor else if (INTENT_TO_SUB[intent]):

// NEU: B2B braucht höheren Confidence-Threshold (0.8 statt 0.7)
// Grund: falscher B2B-Tag = Ticket aus Inbox raus, Kunde wartet ewig
else if (intent === 'b2b_anfrage' && conf < B2B_CONFIDENCE_THRESHOLD) {
  routeTarget = 'no_op';
  routeReason = 'b2b_confidence_below_threshold';
}
else if (INTENT_TO_SUB[intent]) {
  routeTarget = INTENT_TO_SUB[intent];
  routeReason = 'routed_to_sub';
}

Patch C — Node Route Switch neuer Output

In den Switch Rules am Ende ein 5. Rule hinzufügen: - outputKey: sub_b2b - leftValue: ={{ $json.route_target }} - rightValue: sub_b2b - operator: equals (string)

Patch D — Neuer Node Call SUB B2B Tag + Verkabelung

Neuer Node: Execute Workflow - Name: Call SUB B2B Tag - Workflow: [SUB] B2B Tag (JjHXvM7fIHPN4YFs) - Mode: Run once for each item - Inputs: ticket_id={{ $json.ticket_id }} - Setting: Always Output Data: true (analog zu den anderen Call-SUB-Nodes — Defense-in-Depth gegen Drops)

Verkabelung: - Route Switch Output sub_b2bCall SUB B2B Tag - Call SUB B2B TagMerge Branches (gleicher Merge-Input wie die anderen Subs nutzen)


3. Test-Plan nach Rollout

  1. Live-Smoke-Test: Eines der bekannten echten B2B-Tickets manuell durch den Workflow lassen (Manual Trigger statt Cron). Erwartet: Tag auto_b2b in Zendesk gesetzt, im Sheet Route: routed_to_sub + Sub Action: b2b_tagged.
  2. Borderline-Test: Ticket mit Confidence 0.7–0.8 (z.B. uneindeutige Kontaktformular-Nachricht mit B2B-Andeutung). Erwartet: Route: no_op, Reason: b2b_confidence_below_threshold — Tag wird nicht gesetzt.
  3. Vollständiger Cron-Run beobachten: 1 Tag laufen lassen, im Sheet B2B-Klassifikationen reviewen.

4. Rollback (falls B2B-Tagging Probleme macht)

Zwei Stufen — sanft und hart.

Sanfter Rollback (Routing aus, Sub bleibt)

Effekt: B2B-Tickets gehen wieder den alten Weg (sub_not_yet_built → no_op). Kein Tag mehr gesetzt. Sub bleibt unbenutzt aber existiert.

  1. Im Sheet MOKI Config: Zeile b2b_anfragelive: FALSE. Fertig.
  2. Routing Decision setzt dann routeTarget = 'no_op' mit routeReason = 'intent_not_live'.
  3. Switch und Sub-Aufruf bleiben unverändert, werden aber nicht mehr getriggert.

Wann nutzen: Wenn Tags falsch gesetzt werden, aber sonst läuft der Dispatcher fehlerfrei.

Harter Rollback (alle Patches rückgängig)

  1. Patch D rückgängig: Node Call SUB B2B Tag und seine Verbindung zu Route Switch und Merge Branches löschen.
  2. Patch C rückgängig: In Route Switch die 5. Rule (sub_b2b) löschen.
  3. Patch B rückgängig: Im Routing Decision-Code die drei Änderungen rückgängig machen:
  4. B2B_CONFIDENCE_THRESHOLD-Konstante löschen
  5. b2b_anfrage: 'sub_b2b' aus INTENT_TO_SUB raus
  6. else if (intent === 'b2b_anfrage' && conf < B2B_CONFIDENCE_THRESHOLD)-Block raus
  7. Patch A rückgängig: Sheet-Zeile b2b_anfrage wieder auf live: FALSE (oder Zeile löschen falls vorher nicht da).
  8. Sub archivieren oder löschen: [SUB] B2B Tag → Settings → Archive (nicht löschen — Audit-Trail).
  9. Bereits gesetzte Tags in Zendesk bleiben bestehen. Falls die weg sollen: Zendesk Bulk-Update über die View, die du sowieso baust.

5. Open Questions / Future Work

  • Confidence-Threshold-Tuning: 0.8 ist meine Empfehlung. Wenn du im Sheet siehst dass valide B2B-Tickets bei 0.75–0.79 hängen bleiben (b2b_confidence_below_threshold), kannst du runter auf 0.75. Wenn False-Positives auftauchen (Tag wo kein B2B), hoch auf 0.85.
  • Plenty-Pre-Check: Falls du eine Plenty-Kundenklasse B2B pflegst, könntest du im SUB nach Trigger einen optionalen Plenty-Lookup einbauen, der Hard-B2B-Kunden direkt taggt ohne auf den Confidence-Score zu warten. Out of scope für jetzt.
  • Loop-Schutz: Aktuell wird auto_b2b jedes Mal additive gesetzt — Zendesk dedupliziert, also harmlos. Falls du im Audit Log die wiederholten "Tag added"-Einträge stören, können wir analog zu SUB Portalverweis einen GET vor dem PUT einbauen.

6. Verlinkte Workflows