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.
- 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) ormyapps.microsoft.com(work), and the credential stops working; Reconnect it from Settings → Credentials.
The action node
Twenty operations, in four groups.
| Group | Operation | What it does | Mailbox |
|---|---|---|---|
| Send | Send email | From the connected mailbox, with attachments from the flow. A copy stays in Sent Items. | sends |
| Send | Send and wait for response | With Approve / Disapprove buttons; the flow waits for the click. | sends |
| Send | Reply | To the sender or to everyone, with the original quoted below. | sends |
| Send | Forward | With its attachments, to other people. | sends |
| Send | Create draft | Saved in Drafts, not sent. | writes |
| Send | Send draft | It moves from Drafts to Sent Items. | sends |
| Find & read | Find emails | By words, sender, subject, attachments or date — newest first. | reads |
| Find & read | Get email | One email whole: sender, recipients, body, attachments list and flags. | reads |
| Find & read | Get conversation | Every email in a thread, oldest first. | reads |
| Find & read | Download attachments | Saves an email's files in HostWebhook, for the next node. | reads |
| Organize | Move email | To another folder. Its ID changes: the output has the new one. | writes |
| Organize | Mark as read / unread | Two operations, one each. | writes |
| Organize | Flag email | Flag it for follow-up, mark it complete, or clear it. | writes |
| Organize | Add / remove category | The categories it already had stay. | writes |
| Organize | List categories | The mailbox's categories and their colors. | reads |
| Organize | Delete email | To Deleted Items — or for good. | deletes |
| Folders | List folders | With their IDs and how many emails and unread each has. | reads |
| Folders | Create folder | At 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.
{{ }} 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.javascript:, data:, tel:…) becomes #. Images and other sources (src) take only http and https.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:
approvedisfalseandtimedOutistrue. - Approve if nobody answers makes it go on as approved instead, like an Approval Gate set to auto-approve.
timedOutis stilltrue, 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.
Finding emails
Search takes words, or Outlook's search terms:
from:billing@example.com subject:invoice hasAttachments:trueEmpty, 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.
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.
| Tool | Arguments |
|---|---|
| send_outlook_email | to · subject · body · body_type? · cc? · bcc? · reply_to? · importance? · save_to_sent_items? |
| reply_to_outlook_email | message_id · body · reply_all? |
| forward_outlook_email | message_id · to · body? |
| create_outlook_draft | to? · subject? · body? · body_type? · cc? · bcc? · importance? |
| send_outlook_draft | draft_id |
| search_outlook_emails | search? · folder? · unread_only? · received_after? · max_results? · include_body? |
| get_outlook_email | message_id · body_format? |
| get_outlook_conversation | conversation_id · max_results? |
| move_outlook_email | message_id · destination |
| mark_outlook_email_read | message_id |
| mark_outlook_email_unread | message_id |
| flag_outlook_email | message_id · status? |
| add_outlook_category | message_id · categories |
| remove_outlook_category | message_id · categories |
| list_outlook_categories | — |
| delete_outlook_email | message_id · permanent? |
| list_outlook_folders | parent_folder? · max_results? |
| create_outlook_folder | name · parent_folder? |
What you control
- Deleting starts blocked. Unblock
delete_outlook_emailin 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
notesfield saying how many were left out.
Testing a tool
operation in their payload that names another tool is refused.{ "operation": "search_outlook_emails", "search": "invoice", "max_results": 5 }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.
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.