Mail merge

Send up to 100 personalized messages in one call, each rendered and queued for its own recipient.

A mail merge sends one message per recipient in one call. Use it for bulk or personalized mail; for a single message, use a send.

  • Up to 100 entries per call.
  • Each entry becomes its own outbox entry, addressed to its to alone and rendered with its own params (see Templates).
  • Because every recipient gets their own message, tracking numbers are per recipient.

Send a merge

curl -X POST "https://api.workwae.com/v1/accounts/$ACCOUNT_ID/mail-merges" \
  -H "Authorization: Bearer $WORKWAE_API_KEY" \
  -H "content-type: application/json" \
  -d '{
  "template": "'"$TEMPLATE_ID"'",
  "listId": "weekly-news",
  "entries": [
    { "to": { "name": "Ada", "address": "ada@example.com" }, "params": { "firstName": "Ada" } },
    { "to": { "name": "Alan", "address": "alan@example.com" }, "params": { "firstName": "Alan" } }
  ]
}'

Request body

  • The body takes a send's fields except to, cc, bcc and render.
  • entries[].to is a single { name?, address }; entries[].params are its template values.
  • An entry may override sendAt or set its own RFC 5322 messageId.
  • listId names a suppression list: suppressed addresses are skipped and each message gets its own unsubscribe link.

Results

An entry that cannot be queued fails alone. The call returns 200 with one result per entry, in request order.

for (const result of items) {
  if (result.success) console.log(result.to.address, "queued as", result.outboxId);
  else console.warn(result.to.address, result.reason, result.error);
}

A failed entry's reason is one of the API's reasons (invalid_recipient, suppressed, template_render_failed, plan_limit_sends, ...) with the HTTP status a single send would have returned. Queued entries then follow the normal delivery events.

On this page