SaaS batch sender transcript
This transcript is self-contained: reproduce it end to end with any fresh test token from /dashboard/tokens. No preset, no address book entry, and no prior configuration are assumed; every precondition is created inline or as an earlier step in this same transcript.
- Setup: a dunning SaaS platform (Mahnwesen) mints a fresh test token in /dashboard/tokens and runs its nightly overdue-invoice job against the sandbox instead of a human-configured preset. Recipients are inline, no preset and no address book precondition (Finding 12).
- Tool call
mcp_health
- Result
{ "status": "ok", "code": "OK", "message": "Verbindung geprüft.", "data": { "healthy": true, "isTest": true }, "requestId": "req_6b0e2a19" } - Step 1: a dry run over the whole batch. Every item is fully validated (Pflichtangaben, address, the content filter) but nothing is charged and nothing is sent.
- Tool call
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" } ] } - Result
{ "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 per item and dryRunWouldHaveCostEuros in the summary show exactly what a live batch would cost, with costEuros staying 0 in the dry run.
- Step 2: the same batch, this time as a real sandbox send (no dryRun). The full six-gate Send Core runs per item, same as live.
- Tool call
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" } ] } - Result
{ "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 again shows the real price the batch would have cost live. Every order carries is_test:true and each ledger row books 0 cents, so nothing is actually charged.
- Step 3: replay proof. Calling order_send_batch again with the SAME clientOrderId values (as a cron retry after a crash would) never double-sends.
- Tool call
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" } ] } - Result
{ "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 and status:"skipped" per item, the same orderId as before, costEuros back to 0 in the summary. This is exactly the integration-test story a Tier-4 SaaS developer needs, reproducible end to end with one fresh test token, no preset, no setup.
Tools used
Every tool here is fully documented in the tool reference (fields, scope, dryRun).
Trust and live status
Machine-readable service facts and the current operational status of the partner interface are publicly available at all times, no login needed.