Skip to content

Send email from a flow

A great many automations end in an email: a payment reminder, a reply to an enquiry, a heads-up to a colleague. The Send email step does exactly that — a real, personalised message, sent from the right account, as a step in your flow.

Add a Send email step and fill in three fields:

  • To — the recipient address (or several — see below).
  • Subject — the subject line.
  • Body — the message.

Every field accepts template variables, so each email is written for its recipient rather than mass-produced. A reminder body might read:

Hi {{ loop.item.firstName }},
Invoice {{ loop.item.number }} for {{ loop.item.amount }} is now overdue.
Could you let us know when we can expect payment?
Thanks,
{{ user.firstName }}

{{ user.firstName }} is the person who ran the flow; {{ loop.item.* }} pulls fields off whatever record you’re looping over. See Template variables for everything in scope.

To is one field, but it takes any number of addresses. Separate them with commas:

ops@firma.cz, ucetni@firma.cz, {{ user.email }}

Semicolons and one-per-line both work too, and literal addresses mix freely with {{ references }}. You can also point the field at a single reference that resolves to a list of addresses — an upstream lookup that returns several contacts, for example:

{{ find_contacts.emails }}

Everyone named receives one email and sees the other recipients on the To line — this is a group email, not a mail merge. When each person should get their own copy (and shouldn’t see the others), loop with For each and send one email per recipient, with To set to {{ loop.item.email }}.

Anything in the field that isn’t an address fails the step immediately, naming the value — so a stray name or a {{ reference }} that resolved to prose shows up as a clear error on the run rather than a rejection from the mail provider.

Cc and Bcc sit under To and take exactly the same shapes — one address, several separated by commas, or a {{ reference }} that resolves to a list. Both are optional; leave one empty and no such line is sent at all.

  • Cc — copied and visible to everyone on the email. Use it when being copied is part of the point: a manager on an approval, a shared mailbox on a customer reply.
  • Bcc — copied and invisible to the other recipients. The usual use is an archive or compliance mailbox.

Blind means blind to the recipients, not to you: every send records its full recipient list — To, Cc and Bcc — on the mail.sent event, so an archive copy is always accountable. The flow canvas says so too, spelling out both copy lines on the step’s card, so a step that silently blind-copies someone never reads the same as one that doesn’t.

A configured Cc or Bcc that resolves to nothing fails the step, exactly like a broken attachment reference — a typo’d {{ ref }} must not quietly email fewer people than you asked for.

The optional Attachments field attaches stored documents to the email. It takes document ids — the id a Render document or Document store step outputs, or an incoming email attachment’s Memory id — as a comma-separated list (or a JSON list):

{{ render.document_id }}

attaches the PDF a Render document step just produced; several documents are separated with commas. Attachments work through every carrier — Resend, Gmail, and Microsoft 365 alike.

Two rules to know:

  • An unknown id fails the step — and so does a reference that resolves to nothing. A wrong document id, a typo’d {{ ref }}, or a reference to a step that never ran are all flow bugs, and the step says so rather than quietly sending the email without its attachment.
  • Total size is capped at ~10 MB. A document that would push the email past the cap is skipped with a warning — the email still goes out, and the step’s attachments_skipped output lists what was left off.

There is no way to attach an arbitrary URL or file path — attachments always come from stored documents, so what you attach is exactly what Memory holds.

The Send through setting decides which account the email actually goes out from:

Send throughWhat it means
Automatic (default)Routario picks the best available account for you
ResendRoutario’s built-in transactional sender
Gmaila connected Google Workspace mailbox
Microsoft 365a connected Microsoft 365 mailbox

Leave it on Automatic unless you have a reason not to. Automatic resolves in order: your workspace’s default carrier → the single account you’ve connected (Gmail or Microsoft 365) → Resend as the fallback.

Why connect Gmail or Microsoft 365? Sending through a real mailbox means the email comes from a person — replies land back in that inbox, the message threads naturally, and it doesn’t look machine-sent. Connect an account under Settings → Connections → Apps (Google or Microsoft). Resend is the zero-setup option: a reliable transactional sender, good for system-style notifications.

Configure the built-in (Resend) sender once, under Settings → Connections → Apps → Email:

  • From address — the address your automatic emails are sent from.
  • From name — the display name recipients see.
  • Reply-to — where replies should go, if different from the from address.

When you send through a connected Gmail or Microsoft 365 account instead, the email goes out from that mailbox’s address — the settings above apply to the built-in sender.

Pair sending with a scheduled flow to chase overdue invoices hands-off.

  1. Schedule trigger — every weekday at 08:00.
  2. Find records — the invoices that are now overdue. Label the list overdue.
  3. For each over {{ overdue }}.
  4. Send email — To is {{ loop.item.email }}, with a Subject and Body that name the invoice and amount (as above). Leave Send through on Automatic.

There’s a complete, follow-along version of this in Chase unpaid invoices automatically.