SaaS-Batch-Versender-Transkript
Dieses Transkript ist in sich geschlossen: mit jedem frischen Test-Token aus /dashboard/tokens Ende-zu-Ende reproduzierbar. Es wird kein Preset, kein Adressbuch-Eintrag und keine vorherige Konfiguration vorausgesetzt, jede Voraussetzung wird inline oder als früherer Schritt in genau diesem Transkript angelegt.
- Setup: eine Mahnwesen-SaaS-Plattform holt sich einen frischen Test-Token in /dashboard/tokens und lässt ihren nächtlichen Job für überfällige Rechnungen gegen die Sandbox laufen, statt gegen ein von Hand konfiguriertes Preset. Die Empfänger sind inline angegeben, keine Preset- und keine Adressbuch-Voraussetzung (Finding 12).
- Tool-Aufruf
mcp_health
- Ergebnis
{ "status": "ok", "code": "OK", "message": "Verbindung geprüft.", "data": { "healthy": true, "isTest": true }, "requestId": "req_6b0e2a19" } - Schritt 1: ein Dry-Run über den ganzen Stapel. Jeder Eintrag wird vollständig geprüft (Pflichtangaben, Adresse, Content-Filter), aber nichts wird berechnet und nichts versendet.
- Tool-Aufruf
order_send_batch { "dryRun": true, "items": [ { "clientOrderId": "mahnung-re-10231", "subject": "Zahlungserinnerung RE-10231", "content": "Sehr geehrte(r) Michael Bauer,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Michael Bauer", "recipientStreet": "Ahornweg 12", "recipientZip": "50667", "recipientCity": "Köln", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10245", "subject": "Zahlungserinnerung RE-10245", "content": "Sehr geehrte(r) Sabine Keller,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Sabine Keller", "recipientStreet": "Feldstraße 4", "recipientZip": "20095", "recipientCity": "Hamburg", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10250", "subject": "Zahlungserinnerung RE-10250", "content": "Sehr geehrte(r) Jan Novak,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Jan Novak", "recipientStreet": "Hauptstraße 77", "recipientZip": "70173", "recipientCity": "Stuttgart", "recipientCountry": "DE" } ] } - Ergebnis
{ "status": "ok", "code": "OK", "message": "Dry-Run abgeschlossen.", "data": { "items": [ { "clientOrderId": "mahnung-re-10231", "ok": true, "status": "would_send", "orderStatus": "would_send", "orderId": null, "isReplay": false, "costCents": null, "dryRunWouldHaveCost": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10245", "ok": true, "status": "would_send", "orderStatus": "would_send", "orderId": null, "isReplay": false, "costCents": null, "dryRunWouldHaveCost": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10250", "ok": true, "status": "would_send", "orderStatus": "would_send", "orderId": null, "isReplay": false, "costCents": null, "dryRunWouldHaveCost": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true } ], "summary": { "total": 3, "byStatus": { "would_send": 3 }, "costEuros": 0, "dryRunWouldHaveCostEuros": 10.47 } }, "requestId": "req_ba201d5c" } - dryRunWouldHaveCost pro Eintrag und dryRunWouldHaveCostEuros in der summary zeigen genau, was ein Live-Stapel kosten würde, während costEuros im Dry-Run bei 0 bleibt.
- Schritt 2: derselbe Stapel, diesmal als echter Sandbox-Versand (kein dryRun). Der volle Sechs-Gate-Send-Core läuft pro Eintrag, genau wie live.
- Tool-Aufruf
order_send_batch { "items": [ { "clientOrderId": "mahnung-re-10231", "subject": "Zahlungserinnerung RE-10231", "content": "Sehr geehrte(r) Michael Bauer,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Michael Bauer", "recipientStreet": "Ahornweg 12", "recipientZip": "50667", "recipientCity": "Köln", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10245", "subject": "Zahlungserinnerung RE-10245", "content": "Sehr geehrte(r) Sabine Keller,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Sabine Keller", "recipientStreet": "Feldstraße 4", "recipientZip": "20095", "recipientCity": "Hamburg", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10250", "subject": "Zahlungserinnerung RE-10250", "content": "Sehr geehrte(r) Jan Novak,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Jan Novak", "recipientStreet": "Hauptstraße 77", "recipientZip": "70173", "recipientCity": "Stuttgart", "recipientCountry": "DE" } ] } - Ergebnis
{ "status": "ok", "code": "OK", "message": "Stapel verarbeitet.", "data": { "items": [ { "clientOrderId": "mahnung-re-10231", "ok": true, "status": "sent", "orderStatus": "paid", "orderId": "a1e9c7d2-8f31-4b0a-9c6e-2d7a5f9b1001", "isReplay": false, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10245", "ok": true, "status": "sent", "orderStatus": "paid", "orderId": "b2f0d8e3-9042-4c1b-ad7f-3e8b6a0c2002", "isReplay": false, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10250", "ok": true, "status": "sent", "orderStatus": "paid", "orderId": "c3a1e9f4-a153-4d2c-be80-4f9c7b1d3003", "isReplay": false, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true } ], "summary": { "total": 3, "byStatus": { "sent": 3 }, "costEuros": 10.47 } }, "requestId": "req_1f6d9e77" } - summary.costEuros zeigt wieder den echten Preis, den der Stapel live gekostet hätte. Jeder Auftrag trägt is_test:true und jede Ledger-Zeile bucht 0 Cent, es wird also nichts wirklich abgebucht.
- Schritt 3: Replay-Nachweis. Ein erneuter Aufruf von order_send_batch mit DENSELBEN clientOrderId-Werten (wie ein Cron-Retry nach einem Absturz) löst nie einen doppelten Versand aus.
- Tool-Aufruf
order_send_batch { "items": [ { "clientOrderId": "mahnung-re-10231", "subject": "Zahlungserinnerung RE-10231", "content": "Sehr geehrte(r) Michael Bauer,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Michael Bauer", "recipientStreet": "Ahornweg 12", "recipientZip": "50667", "recipientCity": "Köln", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10245", "subject": "Zahlungserinnerung RE-10245", "content": "Sehr geehrte(r) Sabine Keller,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Sabine Keller", "recipientStreet": "Feldstraße 4", "recipientZip": "20095", "recipientCity": "Hamburg", "recipientCountry": "DE" }, { "clientOrderId": "mahnung-re-10250", "subject": "Zahlungserinnerung RE-10250", "content": "Sehr geehrte(r) Jan Novak,\n\nfür die oben genannte Rechnung ist der Zahlungseingang bislang nicht bei uns eingegangen. Bitte begleichen Sie den offenen Betrag innerhalb von 10 Tagen.\n\nMit freundlichen Grüßen", "recipientName": "Jan Novak", "recipientStreet": "Hauptstraße 77", "recipientZip": "70173", "recipientCity": "Stuttgart", "recipientCountry": "DE" } ] } - Ergebnis
{ "status": "ok", "code": "OK", "message": "Stapel verarbeitet.", "data": { "items": [ { "clientOrderId": "mahnung-re-10231", "ok": true, "status": "skipped", "orderStatus": "paid", "orderId": "a1e9c7d2-8f31-4b0a-9c6e-2d7a5f9b1001", "isReplay": true, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10245", "ok": true, "status": "skipped", "orderStatus": "paid", "orderId": "b2f0d8e3-9042-4c1b-ad7f-3e8b6a0c2002", "isReplay": true, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true }, { "clientOrderId": "mahnung-re-10250", "ok": true, "status": "skipped", "orderStatus": "paid", "orderId": "c3a1e9f4-a153-4d2c-be80-4f9c7b1d3003", "isReplay": true, "costCents": 349, "fulfillmentProvider": "letterxpress", "einlieferungsbelegPending": true } ], "summary": { "total": 3, "byStatus": { "skipped": 3 }, "costEuros": 0 } }, "requestId": "req_9c02fa48" } - isReplay:true und status:"skipped" pro Eintrag, dieselbe orderId wie zuvor, costEuros in der summary wieder bei 0. Genau das ist die Integrationstest-Geschichte, die ein Tier-4-SaaS-Entwickler braucht, Ende-zu-Ende reproduzierbar mit einem einzigen frischen Test-Token, ohne Preset, ohne Vorbereitung.
Verwendete Tools
Jedes Tool hier ist in der Tool-Referenz vollständig dokumentiert (Felder, Scope, dryRun).
Vertrauen und Live-Status
Maschinenlesbare Servicefakten und der aktuelle Betriebsstatus der Partner-Schnittstelle stehen jederzeit offen zur Verfügung, ohne Login.