02 Retouren-Check v2¶
ℹ️ v2 seit 14.05.2026 produktiv. Vorgängerversion v1 (
9qzWLsxK4GhEgrTN) ist abgelöst — sie hatte den n8n Cloud Starter 60s-Code-Node-Hardlimit gerissen sobald ≥60 fällige Sendungen anstanden (0 Items prozessiert, kein Sheet-Update, 3 Min Wall-Clock-Zeit). v2 löst das mit SplitInBatches+Wait-Pattern für DHL. Plus Prime-Branch für Amazon-RSA-Retouren. Liegt im Folder02 Retourencheckin Susi Projects.
Wird vom DAILY mokebo-ops Sync automatisch befüllt — bitte nicht manuell editieren.
Status: ✓ Live (v2) Letzter Erfolgs-Run: — Erfolgsquote 7d: — Trigger: Cron, täglich 9:00 Uhr Node-Count: —
🟢 Auf einen Blick¶
| Was tut der Workflow | Trackt alle offenen Retouren-Sendungen aus dem Tracking-Sheet bei GLS/DHL nach, aktualisiert den Status pro Item, und triggert bei drei End-Zuständen automatisch ein Zendesk-Ticket. Amazon-RSA-Retouren (GLS-Prime/DHL-Prime) laufen in einem Sonder-Branch ohne weiteres Tracking. |
| Wann greift er | Cron: täglich 9:00 Uhr (30 Min nach 01 Retouren-Erfassung). |
| Sichtbarer Effekt für CS | Status-Updates im Tracking-Sheet (pro Item, nicht batch). Bei 3 End-Zuständen: neues Zendesk-Ticket. Bei Prime-Items: status: amazon_extern + kein weiteres Tracking. |
| Symptom wenn kaputt | Sheet-letzter_check-Spalte zeigt heute kein Update. Oder einzelne fällige Sendungen bleiben in offen / in_transit hängen. Bei DHL-Rate-Limit (429): einzelne Items werden geskippt, fließen morgen wieder rein. |
| Owner | Susi (Backup: TBD) |
| Eskalation | Susi direkt anschreiben (Slack-DM). Mit Sendungsnummer einer hängenden Retoure als Beispiel. Alternative: Workflow 00 Error-Notifier (WEmKVe9EjmwVJzKa) postet automatisch in #03_customer-support bei Workflow-Crashes. |
| Link in n8n | 02 Retouren-Check v2 |
Architektur¶
flowchart TB
Cron[Cron 9:00] --> GLSToken[GLS Token holen
früh am Start]
GLSToken --> SheetRead[Fällige Checks holen
Sheet 'Tracking']
SheetRead --> Filter[naechster_check ≤ heute]
Filter --> Switch{Switch by Carrier}
Switch -- GLS --> GLSCode[GLS Tracking
parallel im Code-Node]
Switch -- DHL --> DHLLoop[SplitInBatches 1
+ HTTP + Code + Sheet + Wait]
Switch -- GLS-Prime / DHL-Prime --> Prime[Prime markieren
status: amazon_extern]
GLSCode --> Merge[GLS+DHL+Prime Sync
3-Input Merge]
DHLLoop --> Merge
Prime --> PrimeSheet[Prime Sheet-Update]
PrimeSheet --> Merge
Merge --> StatusDecide[Status entscheiden]
StatusDecide --> SheetUpd[Sheet pro Item updaten]
SheetUpd --> EndState{End-Zustand?}
EndState -- zugestellt --> ZdGutschrift[Zendesk: Gutschrift erstellen]
EndState -- in_transit_überfällig --> ZdNachfrage[Zendesk: Carrier-Nachfrage]
EndState -- nicht_versendet_geschlossen --> ZdAbgeschlossen[Zendesk: 21d nicht versendet]
ZdGutschrift --> ClearCheck[naechster_check leeren
für alle Gruppen-Pakete]
ZdNachfrage --> ClearCheck
ZdAbgeschlossen --> ClearCheck
ClearCheck --> WriteTicket[Ticket-ID zurück ins Sheet]
Subworkflow-Calls¶
Auto-generiert aus den executeWorkflow-Nodes — bitte nicht manuell editieren.
- (keine — eigenständiger Workflow)
Trigger & Datenfluss¶
- Trigger: Cron, täglich 9:00 Uhr.
- Quelle: Sheet Retouren-Tracking, Tab
Tracking(gleiches Sheet wie 01). - APIs:
- GLS:
POST https://api.gls-group.net/oauth2/v1/token(Token früh am Start), dannGET …/track-and-trace-v1/tracking/simple/trackids/{nr}?showEvents=true— alle GLS-Items in einem Code-Node sequenziell. - DHL:
GET https://api-eu.dhl.com/track/shipments?trackingNumber={nr}mitDHL-API-Key-Header — pro Item ein eigener Pipeline-Durchlauf viaSplitInBatches(1) → HTTP Request → Code → Sheet-Update → Wait(5.5s). - Zendesk: Ticket-Create bei drei End-Zuständen.
- Sheet-Update pro Item statt batch — committet Progress sofort, auch wenn der Workflow das 5-Min-Limit reißen würde.
Status-Lebenszyklus¶
stateDiagram-v2
[*] --> offen: 01 schreibt
offen --> in_transit: Carrier sagt 'transit'
offen --> nicht_versendet_geschlossen: 21 Tage + immer noch not_shipped
offen --> amazon_extern: GLS-Prime / DHL-Prime erkannt
in_transit --> zugestellt: delivered
in_transit --> in_transit_ueberfaellig: 10 Tage transit
zugestellt --> ticket_erstellt: Gutschrift-Ticket erzeugt
in_transit_ueberfaellig --> ticket_erstellt: Nachfrage-Ticket
nicht_versendet_geschlossen --> ticket_erstellt: Abschluss-Ticket
amazon_extern --> [*]: kein weiteres Tracking
ticket_erstellt --> [*]
Sieben Stati: offen, in_transit, zugestellt, in_transit_ueberfaellig, nicht_versendet_geschlossen, amazon_extern (neu in v2), ticket_erstellt.
Rate-Limit-Konstanten (aktueller Übergangs-Patch)¶
In Tracking prüfen + Status bestimmen Code-Node (Stand 13.05.2026):
| Konstante | Übergangs-Patch | Ziel nach DHL-Upgrade |
|---|---|---|
MAX_RUNTIME_MS |
240000 (4 Min) |
90000 (90 Sek) |
DHL_SLEEP_MS |
5500 (5.5 Sek) |
250 (0.25 Sek) |
RETRY_BACKOFFS_MS |
[6000, 12000, 30000] |
[2000, 5000, 10000] |
Grund: DHL Default Free Tier = 250 Calls/Tag + 1 Call/5s Spike Arrest. Vor Patch feuerten wir 10× zu schnell. Nach DHL-Upgrade-Approval (siehe Asana-Task) Konstanten zurückdrehen.
Bekannte Stolpersteine / Edge-Cases¶
- n8n Cloud Starter 60s-Code-Node-Hardlimit war der Grund für den v2-Refactor. Bei ≥60 fälligen Items lief der alte Mega-Code-Node ins Timeout. v2 löst das mit SplitInBatches+Wait-Pattern. Wichtig: Wenn du Logik in v2 zurück in einen einzigen Code-Node stopfst, kommt das Problem zurück.
- GLS
PREADVICE= Label registriert, Paket noch nicht abgegeben → not_shipped, NICHTtransit. War lange falsch klassifiziert. Fix 12.05.2026. InentscheideStatuszusätzlichinTransitSeit = ''Reset im not_shipped-Branch. - Carrier-Patch (12.05.):
(data.carrier || '').toUpperCase().startsWith('DHL'/'GLS')statt=== 'DHL'/'GLS'. Routet auchDHL-Prime,GLS-Prime,GLSShippingkorrekt — Prime-Items landen aber im neuen Prime-Branch (siehe Architektur). - Prime-Branch für GLS-Prime + DHL-Prime markiert Items mit
status: 'amazon_extern'und überspringt das Tracking. Verhindert ewige Filter-Schleifen für Amazon-RSA-Items. Wenn du Hermes als Prime-Variante hinzufügst (Phase 2 von SUB Retoure), müsstest du diesen Branch erweitern. - Amazon-Retouren werden öfter geprüft:
naechster_check = heute + 2für Referrer4.01(Amazon Germany),+7für Rest. Logik in 01 Retouren-Erfassung. - DHL-API-Key hardcoded im Code-Node (
YHUf5olNW7whASeQGu1HT99VpTmCqkJ0, Appmkb_retouren_tracking) → bei Rotation Code-Node manuell editieren. Empfehlung: nach n8n-Credential umziehen (siehe Empfehlungen-Section). - DHL 429-Behandlung in v2: Retry-Backoffs
[6000, 12000, 30000]ms — bei 429 werden bis zu 3 Retries mit zunehmenden Pausen gemacht. Wenn alle scheitern: Item bleibt unverändert, fließt morgen wieder rein. - Mapping-Resolver-Issue (14.05.): n8n's AI-Builder hatte beim ersten
create_workflow_from_code10 von 16 Sheet-Update-Mappings von$json.fooauf$('Fällige Checks holen').item.json.fooumgemodelt → Sheet-Update scheiterte mit "Paired item data unavailable". Fix: GLS Token holen ganz an den Workflow-Start verschoben + Sample-Outputs aller Code-Nodes auf alle 16 Felder erweitert + pairedItem-Tracking in jedem Code-Node. - Ticket-Erstellung leert
naechster_checkfür alle Pakete der Gruppe (v2-Feature). Vorher blieb das Datum stehen, sichtbar im Sheet als Inkonsistenz.
Empfehlungen — noch nicht umgesetzt¶
Aus retouren check/retouren-workflows-empfehlungen.md im Hauptordner. Priorisiert nach Aufwand/Wirkung:
| # | Empfehlung | Priorität | Aufwand |
|---|---|---|---|
| 1 | DHL-API-Key aus Code-Node in n8n-Credential umziehen | Hoch | 10 min |
| 2 | DHL-Retry-Bedingung um 5xx erweitern (aktuell nur 429) | Hoch | 5 min |
| 3 | n8n Error-Workflow 00 Error-Notifier an v2 hängen |
Hoch | 5 min |
| 4 | Multi-Paket-Aggregator: error/SKIPPED-Pakete nicht "mitrollen" | Hoch | 15 min |
| 5 | Dauer-error-Sendungen schließen — Cutoff für error-Branch |
Hoch | 5 min |
| 6 | Carrier-Erkennung um Hermes erweitern (Phase 2) | Mittel | 10 min |
| 7 | Stufe-2-Eskalation: Sheet-Spalte error_count, Auto-Eskalation nach N Retries |
Mittel | ~1h |
Debug-Anleitung¶
- n8n → 02 Retouren-Check v2 → Executions → Filter heute + Failed.
- Wenn Run grün aber Sheet nicht geupdatet pro Item: schau in einen DHL-Loop-Iteration ob die Sheet-Update-Mapping-Expressions als
$json.foo(nicht$('Fällige Checks holen').item.json.foo) stehen. Wenn umgemodelt → Mapping-Resolver-Issue (siehe Stolpersteine). - Wenn Carrier-spezifischer Fehler: schau, ob
GLS Token holenlief (am Start, vor Switch). - Wenn DHL-Calls 429 werfen: einzelne Items werden geskippt, fließen morgen wieder rein — sehen
letztes_tracking_event = "SKIPPED: DHL-API gedrosselt". - Bei Workflow-Crash:
00 Error-Notifier(WEmKVe9EjmwVJzKa) postet automatisch in#03_customer-support(sofern in Workflow-Settings als Error Workflow gesetzt).
Entscheidungen / Geschichte¶
- 2026-05-14: v2-Refactor live. SplitInBatches+Wait für DHL, GLS parallel, Sheet-Update pro Item, Prime-Branch für GLS-Prime/DHL-Prime →
amazon_extern. Workflow-IDOZV6aC8jzVAQMAESim Folder02 Retourencheck. Vorgängerversion v1 (9qzWLsxK4GhEgrTN) deprecated wegen 60s-Hardlimit. ZwischenversionsPGNJxFM8TUgkNiParchiviert. - 2026-05-14: Mapping-Resolver-Issue gefixt (GLS-Token an Start + pairedItem-Tracking + 16-Felder Sample-Outputs).
- 2026-05-14: Feature-Erweiterung Ticket-Erstellung — leert
naechster_checkfür alle Gruppen-Pakete (verhindert Inkonsistenz). - 2026-05-13: REASON_MAP
[OLD]-Markierung in 01 Retouren-Erfassung — Plenty hat Legacy-IDs markiert. - 2026-05-13: COUNTRY_MAP
21: 'NL — Niederlande'ergänzt (mokebo-spezifisch, weicht von Plenty-Default25ab). - 2026-05-13: Übergangs-Patch DHL Rate Limit (Konstanten siehe oben).
- 2026-05-12: Carrier-Patch (
startsWithstatt===) fürDHL-Prime/GLS-Prime-Unterstützung. - 2026-05-12: GLS
PREADVICEalsnot_shippedstatttransitklassifizieren. - (älter): 21 Tage als Cutoff für
nicht_versendet_geschlossen, 10 Tage transit alsin_transit_ueberfaellig-Schwelle.
Verwandte Workflows¶
- 01 Retouren-Erfassung — schreibt die Zeilen, die v2 dann trackt.
- SUB Retoure — legt Amazon-RSA-Retouren in Plenty an, die v1 dann als Prime-Items sieht.
00 Error-Notifier(WEmKVe9EjmwVJzKa) — zentraler Error-Handler. Postet bei Workflow-Crashes nach#03_customer-support. Liegt in Susi Projects, ggf. noch nicht in allen Workflow-Settings als Error Workflow gesetzt.