Summary
POST /api/v1/campaigns/{campaignId}/test always returns
200 { "success": true, "message": "Test email would be sent to ..." },
but the send is never actually queued. Calls made via API never
result in delivery, while clicking Send test in the dashboard
for the same campaign delivers normally.
This affects the MCP server's send_test_email tool
(src/tools/index.ts, line ~1562) and presumably the equivalent
method in sequenzy-typescript.
Steps to reproduce
-
POST /api/v1/campaigns with name, subject, html →
200, campaign saved as draft.
-
POST /api/v1/campaigns/{campaignId}/test with
{ "to": "your-own-address@example.com" }:
curl -X POST "https://api.sequenzy.com/api/v1/campaigns/{id}/test" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "x-company-id: $COMPANY_ID" \
-d '{"to": "your-own-address@example.com"}'
-
Response: 200 { "success": true, "message": "Test email would be sent to ...", "campaignId": "..." }
-
GET /api/v1/subscribers/{email} → no new send event in
activity, emailStats.sent unchanged.
-
No email arrives.
Expected
A send event in the subscriber activity log within seconds,
followed by delivery. Email arrives in inbox.
Actual
200 is returned, but nothing is recorded in the subscriber
activity log and no email is delivered. The endpoint behaves
like a stub.
Evidence that the same campaign delivers from the UI
Clicking Send test in the dashboard for the same campaign
produces a real send event in /email-sends/{id}:
isTestEmail: true
testSourceType: "campaign"
testSourceId: "<campaignId>"
- a separate
testEmailId field
API-triggered tests never produce that testEmailId. This may
be the root cause — the UI's Send test flow appears to create a
backing TestEmail entity that the public API endpoint skips.
What I tried
- Variable syntax:
{{firstName|there}} (matching the UI-stored
format), not {{FIRST_NAME}} — no change.
- Added
x-company-id header per the MCP server's apiRequest
helper — no change.
- Re-fired on a previously-delivered campaign (whose UI-triggered
test had delivered earlier the same day) — also silently no-ops.
Note on the OpenAPI spec
The example response string "Test email would be sent to you@example.com" is hardcoded in the OpenAPI spec at
/campaigns/{campaignId}/test, and the running endpoint returns
that string verbatim — which suggests the response may be a
placeholder rather than wired through to a real send path.
Suggested fix
Either:
- Make the endpoint actually create the
TestEmail entity and
queue the send (matching UI behavior), or
- Return a clear
4xx when a precondition is missing, instead
of 200 "would be sent".
The current behavior is particularly painful for AI agents using
the MCP send_test_email tool — there is no signal that the
send didn't happen.
Environment
- API:
https://api.sequenzy.com/api/v1
- Observed: 2026-05-14
Summary
POST /api/v1/campaigns/{campaignId}/testalways returns200 { "success": true, "message": "Test email would be sent to ..." },but the send is never actually queued. Calls made via API never
result in delivery, while clicking Send test in the dashboard
for the same campaign delivers normally.
This affects the MCP server's
send_test_emailtool(
src/tools/index.ts, line ~1562) and presumably the equivalentmethod in
sequenzy-typescript.Steps to reproduce
POST /api/v1/campaignswithname,subject,html→200, campaign saved as draft.POST /api/v1/campaigns/{campaignId}/testwith{ "to": "your-own-address@example.com" }:Response:
200 { "success": true, "message": "Test email would be sent to ...", "campaignId": "..." }GET /api/v1/subscribers/{email}→ no newsendevent inactivity,emailStats.sentunchanged.No email arrives.
Expected
A
sendevent in the subscriber activity log within seconds,followed by
delivery. Email arrives in inbox.Actual
200is returned, but nothing is recorded in the subscriberactivity log and no email is delivered. The endpoint behaves
like a stub.
Evidence that the same campaign delivers from the UI
Clicking Send test in the dashboard for the same campaign
produces a real
sendevent in/email-sends/{id}:isTestEmail: truetestSourceType: "campaign"testSourceId: "<campaignId>"testEmailIdfieldAPI-triggered tests never produce that
testEmailId. This maybe the root cause — the UI's Send test flow appears to create a
backing
TestEmailentity that the public API endpoint skips.What I tried
{{firstName|there}}(matching the UI-storedformat), not
{{FIRST_NAME}}— no change.x-company-idheader per the MCP server'sapiRequesthelper — no change.
test had delivered earlier the same day) — also silently no-ops.
Note on the OpenAPI spec
The example response string
"Test email would be sent to you@example.com"is hardcoded in the OpenAPI spec at/campaigns/{campaignId}/test, and the running endpoint returnsthat string verbatim — which suggests the response may be a
placeholder rather than wired through to a real send path.
Suggested fix
Either:
TestEmailentity andqueue the send (matching UI behavior), or
4xxwhen a precondition is missing, insteadof
200 "would be sent".The current behavior is particularly painful for AI agents using
the MCP
send_test_emailtool — there is no signal that thesend didn't happen.
Environment
https://api.sequenzy.com/api/v1