Send email with n8n

An HTTP Request node, and the whole API is available to a workflow.

You need a verified sending domain and an API key from Settings › API Keys. If neither exists yet, the quickstart covers both in a couple of minutes.

Send

{
  "method": "POST",
  "url": "https://sending.dev/api/v1/emails",
  "authentication": "genericCredentialType",
  "genericAuthType": "httpHeaderAuth",
  "sendBody": true,
  "specifyBody": "json",
  "jsonBody": "={{ JSON.stringify({
  from: 'Acme <[email protected]>',
  to: $json.email,
  subject: 'Welcome',
  html: '<p>You are in.</p>',
  idempotencyKey: 'welcome-' + $json.id
}) }}"
}

A successful call answers 202 with the message id: accepted and queued, not yet delivered. Delivery, opens, bounces and complaints arrive later, on webhooks or in the dashboard.

What changes in n8n

Create a Header Auth credential with name Authorization and value Bearer sk_..., so the key lives in the credential store rather than inside the workflow JSON people export and share.

The thing that catches people

n8n re-runs a workflow from the failed node when you retry it. Build the idempotency key from a field of the item, never from a timestamp or a random value, or every retry is another email.

Next

  • All the fields: cc and bcc, reply-to, attachments, templates, scheduling.
  • Webhooks: delivery, bounce and complaint events, signed with HMAC.
  • Domains: SPF, DKIM and MAIL FROM, and why sending is refused until they are in place.
  • MCP: the same operations as tools, when the one writing the code is an agent.

Nearby: No-code automation

All 30 stacks