Skip to content

Test-mode (sandbox) send endpoints #139

Closed as not planned
Closed as not planned

Description

@clbotdev

Background

Platforms that provision tenants, and developers who integrate the transactional API (/emails, apps/api/src/transactional/routes.ts), need to test from dev, CI and QA without delivering real mail and without hurting sender reputation.

Waypoint mirrors every send endpoint with a sandbox one (/v1/sandbox/email_messages and the batch variants). Sandbox sends render the template and log the message but never deliver it. Waypoint also stores per-template test-data scenarios, and its hero copy says: "Test, debug, and preview emails with sandbox API endpoints" (API ref, home, docs index).

SendLit already has "send a test to yourself" (#34), which still delivers a real email. There is no way to send through the API without delivering.

Source: Waypoint competitor profile (Oct 2026), takeaway #4.

Proposed fix

  • Test mode for transactional sends. Use either test API keys (e.g. an sl_test_ prefix and a key-level mode: test) or a test: true flag / /emails/test route, whichever fits the API contract better.
    • Test-mode requests are validated and rendered exactly like live ones (template, merge tags, attachments).
    • They are logged in the activity log with a clear "test" badge.
    • They are never handed to the ESP.
    • They return the same response shape plus test: true and the rendered subject, HTML and text.
  • Excluded from accounting. Test sends don't count toward quota or billing, aren't in deliverability rates, don't trigger auto-pause (Auto-pause broadcasts and sequences on high bounce or complaint rates #25), and don't fire customer webhooks unless the receiver opts in (Signed (HMAC) outbound event webhooks to customers #52).
  • Saved test data. Each template can store named test-data scenarios (JSON) that are used for previews, "send test" and test-mode calls.
  • Tooling coverage. Add test mode to the API contract, the TS SDK (TypeScript SDK for SendLit (for CourseLit campaign sending; CLI-ready, MediaLit-style) #61) and the MCP tools. Document it in the API docs.

Acceptance criteria

  • A test-mode call returns 2xx with the rendered output, creates a log entry marked test, and no ESP transport call happens (asserted in tests).
  • Validation errors match live mode exactly (same status codes and messages).
  • Test sends are excluded from quota, billing, deliverability stats and auto-pause.
  • A test key can't send live, and a live key with test: true doesn't deliver.
  • Templates can save, edit and select test-data scenarios. The preview uses the selected one.
  • Docs page covers test mode, with curl and SDK examples.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestseverity: mediumNotable gap with a workaround, or competitive parity

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions