Outlook

Put an Outlook mailbox in a flow: send, reply to, forward and search emails, and file them into folders and categories with the action node, and fire a flow when a new email arrives with the trigger. The action node can also be handed to an AI Node as an AI toolkit.

Connect a mailbox

Click Connect Outlook — in the node's credential picker or in Settings → Credentials — and sign in with Microsoft. A personal account (outlook.com, hotmail.com, live.com) and a work or school account both work. Microsoft asks you to allow HostWebhook to read, send and organize the mailbox's email, and to read its settings (for the categories); after that the credential is saved with the account's address. One credential is one mailbox.

ℹOnly email. Connecting Outlook gives HostWebhook access to the mailbox and nothing else — not the calendar, not OneDrive. Each Microsoft 365 service is connected on its own, with its own consent.
  • Work accounts whose organization requires an administrator to approve new apps show a request screen instead: an admin approves HostWebhook once, in Microsoft Entra.
  • Revoking. Remove HostWebhook from account.microsoft.com → Privacy → Apps and services (personal) or myapps.microsoft.com (work), and the credential stops working; Reconnect it from Settings → Credentials.

The action node

Twenty operations, in four groups.

GroupOperationWhat it doesMailbox
SendSend emailFrom the connected mailbox, with attachments from the flow. A copy stays in Sent Items.sends
SendSend and wait for responseWith Approve / Disapprove buttons; the flow waits for the click.sends
SendReplyTo the sender or to everyone, with the original quoted below.sends
SendForwardWith its attachments, to other people.sends
SendCreate draftSaved in Drafts, not sent.writes
SendSend draftIt moves from Drafts to Sent Items.sends
Find & readFind emailsBy words, sender, subject, attachments or date — newest first.reads
Find & readGet emailOne email whole: sender, recipients, body, attachments list and flags.reads
Find & readGet conversationEvery email in a thread, oldest first.reads
Find & readDownload attachmentsSaves an email's files in HostWebhook, for the next node.reads
OrganizeMove emailTo another folder. Its ID changes: the output has the new one.writes
OrganizeMark as read / unreadTwo operations, one each.writes
OrganizeFlag emailFlag it for follow-up, mark it complete, or clear it.writes
OrganizeAdd / remove categoryThe categories it already had stay.writes
OrganizeList categoriesThe mailbox's categories and their colors.reads
OrganizeDelete emailTo Deleted Items — or for good.deletes
FoldersList foldersWith their IDs and how many emails and unread each has.reads
FoldersCreate folderAt the top level or inside another one.writes

Every field takes a template: {{payload.email}} from a webhook, {{payload.id}} for the email that fired the Outlook trigger. Addresses are comma-separated.

Sending

Body format is HTML by default; pick plain text to send it as written. Attachments take the files of the flow — {{payload._files}} for everything a webhook uploaded, {{payload._file}} for one file, {{payload.attachments}} for what Download attachments saved — up to 25 MB in total. Past 3 MB the email is built as a draft and the files go up in pieces before it is sent; that email always keeps its copy in Sent Items, even with Save to Sent Items off.

⚠An HTML template escapes what it inserts. Every {{ }} in an HTML body comes out as text, so a value from the payload can't add tags or links to your email. To insert HTML you trust, add | raw — for example, the HTML an AI Node wrote: <div>{{$("AI").aiResponse | raw}}</div>. Plain-text bodies don't change.
ℹLinks go out only as http, https or mailto. A link with any other scheme (javascript:, data:, tel:…) becomes #. Images and other sources (src) take only http and https.
⚠Send, Send and wait, Reply, Forward and Send draft send the email for real on every run — Run test included. Point the first tests at an address of yours.

Send and wait for a response

Sends the email with an Approve and a Disapprove button below your message, and stops the flow there. When the recipient clicks, the flow goes on from this node with the answer under _waitResponse:

{
  "_waitResponse": {
    "approved": true,
    "decidedAt": "2026-10-01T09:12:44Z",
    "comment": null,
    "timedOut": false
  }
}

Put a Conditional after it on {{payload._waitResponse.approved}} to go one way or the other.

  • The buttons say Approve and Disapprove unless you write your own text. Turn Disapprove button off for a plain confirmation.
  • Ask why on disapprove shows the recipient a box for the reason before declining; the text arrives in _waitResponse.comment.
  • Wait (minutes) is how long the buttons work — 24 hours by default. After that they stop working and the flow goes on by itself, as rejected: approved is false and timedOut is true.
  • Approve if nobody answers makes it go on as approved instead, like an Approval Gate set to auto-approve. timedOut is still true, so a Conditional can tell it apart from someone clicking.
  • With the Disapprove button off nobody could say no, so the timeout doesn't invent a rejection: unless Approve if nobody answers is on, the request just expires and the flow stops there, as it always did.
ℹAnyone with the email can click, so send it to the person who decides. It is not an AI tool: an agent can't wait for a click, so it only runs as a single operation.

Finding emails

Search takes words, or Outlook's search terms:

from:billing@example.com subject:invoice hasAttachments:true

Empty, it returns the newest emails of the folder. A search looks in every folder unless you pick one. Up to 50 per run; each one carries a preview of the body, or the whole body as text with Include body on.

Picking a folder

Wherever a folder is asked for — the folder to search, where to move an email, where to create a folder — you pick it from your mailbox's own list, subfolders included, with the path they sit in (Inbox / Clients / Acme). Refresh reloads it after you create one in Outlook. A standard folder is saved by its Outlook name (inbox, archive…), so it works in any language and on any mailbox; one of yours, by its ID.

To take the folder from the flow instead, choose Type a name or a template under the list and write {{payload.folder}} or a folder's name.

Downloading attachments

Download attachments takes an email ID — {{payload.id}} from the trigger — and saves its files in HostWebhook. They come out in attachments, each with a _file the next node reads: attach them all to another email with {{payload.attachments}}, or go through them one by one with a Loop.

{
  "messageId": "AAMkAGI2…",
  "attachments": [
    {
      "name": "invoice-1042.pdf",
      "contentType": "application/pdf",
      "size": 48213,
      "_file": { "id": "…", "originalName": "invoice-1042.pdf", "downloadUrl": "https://…" }
    }
  ],
  "count": 1,
  "skipped": []
}

Images pasted into the body are left out unless you turn on Include inline images. Anything that isn't a file — an attached email or event, a link to a cloud file — or that goes over 25 MB per file, 50 MB per run or 20 files, is listed in skipped with the reason.

Organizing

Move email takes its destination from the same list. Outlook gives a moved email a new ID, and the node returns it: use the output's ID for anything that comes after. Delete email moves it to Deleted Items unless Delete for good is on.

Add category and Remove category pick from your mailbox's categories — several at once, with their colors. List categories returns them to the flow. A name the mailbox doesn't have can still be typed; Outlook adds it without a color.

ℹConnected before categories were added? Reading them needs one more permission, to read the mailbox's settings (read only). A credential connected earlier doesn't have it: the list says so, and Reconnect in Settings → Credentials adds it. Everything else keeps working meanwhile.

AI toolkit mode

Once the mailbox is connected, the node asks for a Mode. AI toolkit turns it into eighteen tools that an AI Node — or an MCP client, through one of your MCP servers — calls by name.

ToolArguments
send_outlook_emailto · subject · body · body_type? · cc? · bcc? · reply_to? · importance? · save_to_sent_items?
reply_to_outlook_emailmessage_id · body · reply_all?
forward_outlook_emailmessage_id · to · body?
create_outlook_draftto? · subject? · body? · body_type? · cc? · bcc? · importance?
send_outlook_draftdraft_id
search_outlook_emailssearch? · folder? · unread_only? · received_after? · max_results? · include_body?
get_outlook_emailmessage_id · body_format?
get_outlook_conversationconversation_id · max_results?
move_outlook_emailmessage_id · destination
mark_outlook_email_readmessage_id
mark_outlook_email_unreadmessage_id
flag_outlook_emailmessage_id · status?
add_outlook_categorymessage_id · categories
remove_outlook_categorymessage_id · categories
list_outlook_categories—
delete_outlook_emailmessage_id · permanent?
list_outlook_foldersparent_folder? · max_results?
create_outlook_foldername · parent_folder?

What you control

  • Deleting starts blocked. Unblock delete_outlook_email in the node's tool list if the agent should have it. Any other tool can be blocked the same way — sending, for an agent that should only read.
  • No attachments from the model. Attachments are files of the flow, and the model has none to pass: sending a file is a single-operation node. For the same reason Download attachments is not a tool, and neither is Send and wait — an agent can't wait for a click.
  • Characters per call sent to the model. 20,000 by default. Lists that don't fit are cut whole emails at a time, with a notes field saying how many were left out.

Testing a tool

⚠Only a tool call picks the tool. In AI toolkit mode, only an AI Node, an MCP client or a voice agent chooses which tool the node runs. Run Test, a flow or a webhook run the operation saved on the node: an operation in their payload that names another tool is refused.
✦To try a tool, call it from an AI Node or from an MCP client. Its arguments look like this:
jsonA tool call
{ "operation": "search_outlook_emails", "search": "invoice", "max_results": 5 }
⚠A node in toolkit mode is not part of the pipeline. Events arriving through connections made before you switched are refused — the node only runs the tool it is asked for.

The trigger

Pick an Outlook credential, then the folder to watch, from your mailbox's list — Inbox, another standard folder, or any of yours, subfolders included. It fires once for every new email in that folder, including the ones a rule moves into it.

Optionally, only when:

  • The sender contains something — its name or its address, upper or lower case.
  • The subject contains something.
  • The email has attachments.

Activating subscribes to the folder with Microsoft. Each notification carries a secret that belongs to this trigger, and HostWebhook checks it before reading the email. An email is delivered once, even when Microsoft sends the same notification twice. Deactivating deletes the subscription.

ℹNo loops. An email that a node of this same flow sent — a reply, an approval request, a copy to yourself — doesn't fire this trigger again, even if it lands in the folder it watches and matches its filters. HostWebhook marks what its nodes send with the flow that sent it. An email from another flow still fires it.
ℹMicrosoft's subscriptions expire after at most seven days. HostWebhook asks for three and renews them on its own every night. If Microsoft removes one or reports that notifications were missed, HostWebhook creates a new one and delivers the emails that arrived in between — without repeating any.

What the trigger sends downstream

A flat email, with the same field names as the Gmail trigger where they mean the same thing — a flow that read a Gmail email reads an Outlook one:

{
  "event": "newEmail",
  "service": "outlook",
  "id": "AAMkAGI2…",
  "conversationId": "AAQkAGI2…",
  "subject": "Invoice #1042 for September",
  "from": "Sam Billing <billing@example.com>",
  "fromName": "Sam Billing",
  "fromAddress": "billing@example.com",
  "to": "Ana García <ana@example.com>",
  "toAddresses": ["ana@example.com"],
  "cc": "",
  "receivedAt": "2026-09-30T15:04:05Z",
  "snippet": "Hi Ana, attached is the invoice for September…",
  "bodyText": "Hi Ana,\nAttached is the invoice for September.",
  "bodyHtml": "<html>…</html>",
  "hasAttachments": true,
  "isRead": false,
  "importance": "normal",
  "categories": [],
  "flag": "notFlagged",
  "folder": "Inbox",
  "webLink": "https://outlook.live.com/owa/?ItemID=…"
}

Reply to it or move it with the action node using {{payload.id}}; read the whole thread with {{payload.conversationId}}.

Trying it out

The trigger's Test push reads the latest emails of the folder, applies your filters, and shows them exactly as a delivery will arrive — without running the flow. To see a real one, activate the trigger and send the mailbox an email: Microsoft usually notifies within seconds.


Good to know

Busy or throttled

Microsoft limits how fast one mailbox can be called. When it answers that it is busy, the node waits the time it asks for (up to ten seconds) and tries once more before giving up with Microsoft's message.

Email IDs

An email's ID changes when it moves to another folder. An ID from before the move no longer finds it — use the one Move email returns.

Mail to outside addresses bounces with 550 5.7.708

A Microsoft 365 organization that is new, or still on a trial, can have the mail that apps send refused when it goes outside the organization. The node reports success — Microsoft accepted the email — and a moment later the mailbox gets a bounce: 550 5.7.708 Service unavailable. Access denied, traffic not accepted from this IP. Mail inside the organization still arrives, and so may mail sent by hand from Outlook. This is Microsoft protecting new organizations, not a HostWebhook setting, and nothing in the node changes it.

  • It eases as the organization builds a sending history. To lift it sooner, open a support request from the Microsoft 365 admin center and ask Microsoft to remove the sending restriction for your organization.
  • A trial organization can also send to at most 100 outside recipients a day; past that, bounces say 5.7.236.