Send Message
mandrill.send_message
ActionEmailconnection required
Calls the Mandrill API with the connection's credentials.
Send a transactional message composed on this node through Mandrill, and report the outcome for every recipient.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Mandrill
- Secret shape
- the API key, or {"api_key": "…"}
- Config it needs
- base_url, from_email, from_name, subaccount, ip_pool
- Resolved by
- config.connection_id, else node.connection_id
Configuration
27 fields, 1 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
to Recipients: one address, a comma-separated list, or an array of addresses or {email, name, type} objects. 'Ada <ada@x.io>' is accepted, and a comma inside a quoted display name does not split the list. | any | Yes | — | — | ada@example.com |
cc Addresses to copy, in the same forms as 'to'. | any | No | — | — | — |
bcc Addresses to blind-copy, in the same forms as 'to'. | any | No | — | — | — |
subject Subject line of the message. | string | No | — | — | Your receipt |
from_email Sender address; falls back to the connection's default from address. | string | No | — | email format | — |
from_name Display name shown beside the sender address. | string | No | — | — | — |
tags Tags to file the message under for stats; a comma-separated list is accepted. Tags may not start with an underscore. | array | No | — | array of string | — |
headers Extra SMTP headers to add to the message, such as {"Reply-To": "ops@example.com"}. | object | No | — | — | {"Reply-To":"ops@example.com"} |
metadata User metadata Mandrill stores with the message and returns on search and in webhooks. | object | No | — | — | — |
global_merge_vars Merge values used for every recipient, as {name: content}. Setting any turns Mandrill's merge processing on. | object | No | — | — | — |
merge_vars Per-recipient merge values, as Mandrill's array of {"rcpt": "a@x.io", "vars": [{"name": …, "content": …}]}. | array | No | — | array of object | — |
merge_language Which merge-tag syntax the content uses. | string | No | — | one of "mailchimp", "handlebars" | — |
attachments Files to attach, each {type, name, content} with the content base64-encoded. | array | No | — | array of object | — |
images Images to embed, each {type, name, content}; the name is the Content ID the HTML refers to. | array | No | — | array of object | — |
track_opens Turn open tracking on for this message. | boolean | No | — | — | — |
track_clicks Turn click tracking on for this message. | boolean | No | — | — | — |
important Deliver ahead of the account's non-important messages. | boolean | No | — | — | — |
auto_text Let Mandrill generate the plain-text part from the HTML. | boolean | No | — | — | — |
preserve_recipients Show every recipient in the To header instead of sending one copy each. | boolean | No | — | — | — |
bcc_address An address that receives an exact copy of each recipient's email. | string | No | — | email format | — |
subaccount Send on behalf of this existing subaccount; falls back to the connection's subaccount. | string | No | — | — | — |
message_extra Any other key of Mandrill's message struct, merged in last — the escape hatch for options this node does not name. | object | No | — | — | — |
html HTML body of the message. Required unless a plain-text body is given. | string | No | — | — | — |
text Plain-text body of the message. Required unless an HTML body is given. | string | No | — | — | — |
async_send Send in Mandrill's bulk background mode, which returns 'queued' for every recipient immediately. Messages to more than 10 recipients are always sent this way. | boolean | No | — | — | — |
ip_pool Name of the dedicated IP pool to send from; falls back to the connection's pool, then to the account default. | string | No | — | — | — |
send_at Schedule the message for this UTC time, in YYYY-MM-DD HH:MM:SS format. A past time sends immediately; a future one is limited to a year out and requires a paid account. | string | No | — | — | 2026-10-01 09:00:00 |
- At least one of html, text must be set.
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"headers": {
"Reply-To": "ops@example.com"
},
"send_at": "2026-10-01 09:00:00",
"subject": "Your receipt",
"to": "ada@example.com"
}Output
One shape.
result
| Field | Type | Example |
|---|---|---|
results One entry per recipient, as Mandrill returned it: email, status, _id and reject_reason. | array | — |
count How many recipient results came back. | number | — |
accepted True when Mandrill took every recipient (sent, queued or scheduled) and rejected none. | boolean | — |
message_ids The _id Mandrill assigned to each recipient's message, rejected recipients included. | array | — |
status_counts How many recipients landed in each Mandrill status (sent, queued, scheduled, rejected, invalid). | object | — |
rejected The recipients Mandrill refused, each with its status and reject_reason. | array | — |
{
"accepted": false,
"count": 0,
"message_ids": [],
"rejected": [],
"results": [],
"status_counts": {}
}Notes
- Mandrill accepts a message per recipient: a rejected address does not fail the step, it comes back in 'rejected'.
- The from address must be on a domain the account has verified, or every recipient is rejected as 'invalid-sender'.
See Send Message run in a workflow.
In a technical demo we add the Mandrill connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.