Power Automate

Outlook Categories in Power Automate: Read, Assign and Preserve Them

Read and assign Outlook email categories in Power Automate using current connector and Graph routes, with shared-mailbox and timing checks.

Collab365 Team · Published 22 April 2026 · Refreshed 14 August 2026 · 9 min read

Outlook Categories in Power Automate: Read, Assign and Preserve Them

Power Automate can assign Outlook categories to email. It can also read the exact category names on a message, but the safest method depends on what your trigger or action actually returns.

The short version is:

  • use Assigns an Outlook category for one email;
  • use Assign a category to multiple emails for a batch;
  • inspect a real flow run before assuming its email output includes categories;
  • if it does not, use the Office 365 Outlook connector's Send an HTTP request action to re-read the message's Microsoft Graph categories collection;
  • treat the category master list and the categories applied to one message as two different things.

This guide replaces an older version that described five “proven” methods, including undocumented category-search syntax and AI classification. Those claims were not adequately supported. The workflow below stays within current Microsoft connector and Graph documentation.

First, understand the two category objects

Outlook has:

  1. a master category list for the mailbox, containing names and colours; and
  2. a message's categories property, containing the category display names applied to that item.

Microsoft Graph describes a message's categories property as a collection of strings. It separately exposes the mailbox owner's master categories.

That distinction explains several confusing results:

  • finding a category in the master list does not mean it is applied to the message;
  • a flow can receive a message ID without receiving the message's category array;
  • the same display name may not be governed consistently across different user or shared mailboxes;
  • changing a category colour in Outlook is different from assigning that name to a message.

Choose the route that matches the job

Job Recommended route Why
Add one category to one email Assigns an Outlook category Dedicated connector action with message ID and category inputs
Add one category to several emails Assign a category to multiple emails Avoids building your own loop for that batch operation
Test whether an email has a category Use the categories array if the preceding action returns it; otherwise re-read the message Do not assume every mail trigger has the same output shape
List the mailbox's category definitions Graph GET /me/outlook/masterCategories or the connector's Get Outlook category names action This returns definitions/names, not categorised messages
Replace the complete category array Graph PATCH only after reading and deliberately composing the final array Sending a collection is different from adding one name
Find all messages with a category Build a tested retrieval process for your mailbox and volume The Outlook connector reference does not document the old article's category: query as a guaranteed filter

Assign a category to one email

The current Office 365 Outlook connector includes Assigns an Outlook category.

In a cloud flow:

  1. Start from an email trigger or an action that returns the target message.
  2. Add Office 365 Outlook — Assigns an Outlook category.
  3. Put the email's connector Message Id in the action's Message Id field.
  4. Enter the exact category name in Category.
  5. Save and test with a disposable message.
  6. Open that message in the target mailbox and confirm the category was applied.

Use the ID emitted by the connector action or trigger in the same flow. Do not paste a browser URL, internet message ID or conversation ID merely because each looks like an identifier.

Assign a category to several emails

The same connector has Assign a category to multiple emails. It accepts an array of message IDs and one category name.

Use it when your flow already has the target IDs. Keep batches bounded and record failures. A successful bulk step does not prove that every source message belonged to the mailbox context you intended.

Read the categories on an email

Start with the simplest honest test: run the flow, open the trigger/action outputs and search the raw body for categories.

Connector schemas change, and different mail actions do not necessarily expose identical properties. Microsoft's current Office 365 Outlook connector reference documents categories on several item types and documents category-assignment actions, but it does not establish a Categories property on every email trigger response.

If the categories array is present, use it directly. If it is missing, re-read the message.

Re-read a message with the Outlook connector

Add Office 365 Outlook — Send an HTTP request. Microsoft documents this action for Graph requests under /me or /users/{userId}, including the messages segment.

For a message in the connection owner's mailbox:

Method: GET
URI: https://graph.microsoft.com/v1.0/me/messages/{Message Id}?$select=id,subject,categories

Replace {Message Id} with the dynamic message ID from the preceding step. Do not include the braces literally.

For a message in another mailbox that the connection is allowed to access:

Method: GET
URI: https://graph.microsoft.com/v1.0/users/shared@contoso.com/messages/{Message Id}?$select=id,subject,categories

Use the actual mailbox address and message ID. The connection identity must have the required mailbox access, and Power Platform data policies can restrict connector use.

The Graph response has this shape:

{
  "id": "message-id",
  "subject": "Example message",
  "categories": [
    "Customer",
    "Urgent"
  ]
}

In a condition, use the dynamic categories value when Power Automate exposes it. If you need an expression, select the HTTP action in the expression editor and use its real internal action name, for example:

contains(body('Send_an_HTTP_request')?['categories'], 'Urgent')

Do not blindly copy that action name: Power Automate changes it when the card is renamed.

Check for one category safely

A robust test accounts for an empty array and exact names.

Recommended pattern:

  1. Re-read the message if categories were absent from the trigger.
  2. Confirm that categories is an array in the run history.
  3. Use contains() against the array and the exact display name.
  4. Put the “category found” and “category not found” paths in separate branches.
  5. Log the message ID and branch during rollout.

Category display names are strings. Avoid converting the entire array to one text value and using a loose substring search: Customer could then match Customer complaint unintentionally.

Preserve existing categories

The dedicated assignment action is the simplest choice when you want to assign one name.

If you instead use Microsoft Graph's update message operation, remember that categories is a collection. A PATCH body such as this expresses the desired collection:

{
  "categories": [
    "Customer",
    "Urgent"
  ]
}

If existing categories must survive, read the current array, add the required value only if missing, and send the composed result. Do not replace the collection with a one-item array unless replacing it is the intended business rule.

Graph message updates require Mail.ReadWrite; the connector connection and tenant policy still determine what the flow can do. Use this route for a governed requirement, not because it looks more technical.

Shared mailbox categories

Shared mailboxes add three separate questions:

  1. Which mailbox owns the message? Use that mailbox in the request path.
  2. Who owns the flow connection? That identity needs access to the shared mailbox.
  3. Where is the category defined? Confirm the exact name in the target mailbox's category list.

Test with a normal flow connection account rather than an administrator who has wider access than the production owner.

For shared-mailbox trigger problems, use our focused guide to Power Automate triggers for a shared email inbox. Category logic cannot repair a trigger that never receives the message.

Timing: a trigger sees the message at one point in its life

A flow triggered when a message arrives may run before an Outlook rule, person or another automation applies a category. In that case, the empty category array is not proof that the read method failed; it may be a timing result.

Decide which event your process actually needs:

  • classify immediately from message content;
  • wait and re-read after another known process;
  • run on a schedule and inspect the current mailbox state;
  • trigger the downstream process from the system that applies the category.

If you add a delay, make it an explicit operational compromise and test the real timing. A fixed delay is not a transactional guarantee.

Do not rely on undocumented category search syntax

The connector describes the Search Query input of Get emails (V3) as similar to Outlook search. Its connector reference does not document category:"Name" as a supported Power Automate recipe.

That does not prove the syntax can never work in a particular mailbox. It means it should not be the foundation of an authoritative cross-tenant guide without a current Microsoft support statement and a tenant test.

If you use Get emails (V3) for other filters, also read our current Get emails (V3) query guide. Keep retrieval, category reading and category assignment as independently testable steps.

Production checklist

Before relying on Outlook categories in a business flow, prove all of these:

  • the trigger/action returns the connector message ID you use later;
  • the connection runs in the correct mailbox context;
  • the target category name exists and is spelled consistently;
  • a re-read returns the expected categories array;
  • the flow handles no categories, one category and several categories;
  • existing categories remain when they should;
  • a shared mailbox test uses the production connection identity;
  • data policies and mailbox permissions allow the actions;
  • retries cannot send duplicate notifications or repeat consequential work;
  • failed items are visible to an owner.

Test the flow with messages that deliberately take both branches. “The action was green” is not evidence that the right mailbox item was classified.

Frequently asked questions

Can Power Automate assign an Outlook category to an email?

Yes. The Office 365 Outlook connector provides actions for assigning a category to one email or to multiple email IDs.

Why can I not see Categories in my email trigger?

Not every connector response is documented with the same output shape. Inspect the raw run output. If the category array is absent, re-read the message through the connector's Send an HTTP request action and select categories.

Can I use category: in Get emails (V3)?

Microsoft's current connector reference does not document that exact syntax as a supported Power Automate recipe. Treat any tenant-specific success as something to test, not as a universal guarantee.

Are Outlook categories shared across mailboxes?

Category definitions belong to a mailbox owner's master category list. Confirm the exact category name and permissions in the mailbox whose message you are processing.

Will assigning one category remove the existing categories?

Use the dedicated assignment action when adding a category. If you update the Graph categories collection directly, read and deliberately compose the complete final array when existing names must remain.

Build the flow around evidence

The dependable design is small: get the correct connector message ID, re-read the message when necessary, inspect an array, and use the dedicated assignment action for assignment. Keep mailbox context, timing and permissions visible.

If you want a second pair of eyes on the flow and its run output, join the Power Automate Builders Space. Bring a redacted trigger output and identify whether the message is in a user or shared mailbox.

How this article was checked

This rewrite was checked on 14 August 2026 against Microsoft's current Office 365 Outlook connector reference, message resource, message update operation and Outlook category resource.