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.

FieldTypeRequiredDefaultConstraintsExample
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.
anyYes——ada@example.com
cc
Addresses to copy, in the same forms as 'to'.
anyNo———
bcc
Addresses to blind-copy, in the same forms as 'to'.
anyNo———
subject
Subject line of the message.
stringNo——Your receipt
from_email
Sender address; falls back to the connection's default from address.
stringNo—email format—
from_name
Display name shown beside the sender address.
stringNo———
tags
Tags to file the message under for stats; a comma-separated list is accepted. Tags may not start with an underscore.
arrayNo—array of string—
headers
Extra SMTP headers to add to the message, such as {"Reply-To": "ops@example.com"}.
objectNo——{"Reply-To":"ops@example.com"}
metadata
User metadata Mandrill stores with the message and returns on search and in webhooks.
objectNo———
global_merge_vars
Merge values used for every recipient, as {name: content}. Setting any turns Mandrill's merge processing on.
objectNo———
merge_vars
Per-recipient merge values, as Mandrill's array of {"rcpt": "a@x.io", "vars": [{"name": …, "content": …}]}.
arrayNo—array of object—
merge_language
Which merge-tag syntax the content uses.
stringNo—one of "mailchimp", "handlebars"—
attachments
Files to attach, each {type, name, content} with the content base64-encoded.
arrayNo—array of object—
images
Images to embed, each {type, name, content}; the name is the Content ID the HTML refers to.
arrayNo—array of object—
track_opens
Turn open tracking on for this message.
booleanNo———
track_clicks
Turn click tracking on for this message.
booleanNo———
important
Deliver ahead of the account's non-important messages.
booleanNo———
auto_text
Let Mandrill generate the plain-text part from the HTML.
booleanNo———
preserve_recipients
Show every recipient in the To header instead of sending one copy each.
booleanNo———
bcc_address
An address that receives an exact copy of each recipient's email.
stringNo—email format—
subaccount
Send on behalf of this existing subaccount; falls back to the connection's subaccount.
stringNo———
message_extra
Any other key of Mandrill's message struct, merged in last — the escape hatch for options this node does not name.
objectNo———
html
HTML body of the message. Required unless a plain-text body is given.
stringNo———
text
Plain-text body of the message. Required unless an HTML body is given.
stringNo———
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.
booleanNo———
ip_pool
Name of the dedicated IP pool to send from; falls back to the connection's pool, then to the account default.
stringNo———
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.
stringNo——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

FieldTypeExample
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.