Outlook Categories in Power Automate
At a Glance
- Target Audience
- Intermediate Power Automate Developers
- Problem Solved
- Standard Power Automate triggers hide Outlook email categories; premium Graph API & HTTP connectors blocked by admins.
- Use Case
- Automating email routing, daily reports, and processing by categories in shared mailboxes or restricted M365 tenants.
Yes, you can access Outlook categories without direct Graph API calls using built-in connectors and expressions. This Collab365 guide will explain how. The core problem is that standard triggers deliberately hide category metadata. To solve this, you can use three verified methods. Method one uses the 'Get emails (V3)' action with a KQL search query to filter by category natively.1 Method two uses the 'Send an HTTP request' action inside the Office 365 Outlook connector to query the Graph API indirectly, using only a standard license.1 Method three uses Power Automate Copilot agents to parse email properties dynamically.4
TL;DR / Quick Answer
Here are the 5 proven ways to get email categories when direct Graph API access is blocked in your tenant:
- Get Emails (V3) Search Query: Best for scheduled batch processing. Uses KQL syntax (e.g., category:"Blue Category") to filter emails natively on the Exchange server. Pros: Free, simple setup. Cons: Retrieves batches, not real-time, can hit pagination limits if not careful.6
- HTTP Request via Office 365 Outlook: Best for real-time trigger workflows. Uses the standard Outlook connector to send a GET request to https://graph.microsoft.com/v1.0/me/messages/\{id}. Pros: Instant processing, exact category arrays. Cons: Requires some JSON parsing.8
- Dynamic Content Expressions: Best for hunting hidden transport properties. Uses expressions like triggerOutputs()?['body/categories'] to scrape metadata before it drops. Pros: No extra actions needed. Cons: Highly unreliable across different external email clients.
- Power Automate Copilot Agents: Best for intelligent, hands-off sorting. Uses 2026 AI Builder updates to read email context and classify them into conceptual categories automatically. Pros: Highly adaptable, no human tagging required. Cons: Requires premium AI Builder capacity credits.9
- Shared Mailbox HTTP Filters: Best for team inboxes. Modifies Method 2 by shifting the endpoint to /users/shared@domain.com/messages/{id}. Pros: Works perfectly for group scenarios. Cons: Demands strict delegate permissions configured in Exchange.1
Who Is This Guide For?
This guide is written specifically for the Power Automate developer with intermediate experience. You likely have one to three years of experience building flows to automate business processes. You understand the basics of variables, loops, data operations, and standard triggers. You know how to read a flow run history and debug a basic failure. However, you have hit a very specific, frustrating wall: your organisation needs to process, route, count, or report on emails based on their colour-coded Outlook categories, but the standard 'When a new email arrives' trigger completely hides this information.11
Key Takeaway: You do not need expensive premium licenses, complex Azure App registrations, or elevated IT permissions to access email categories. By cleverly applying standard connectors, you can bypass administrative roadblocks and extract the metadata you need safely.
We know exactly what this scenario looks like. You try to build a simple routing flow for a customer service desk. The desk uses the 'Red Category' to mark an email as an urgent escalation. You set up the flow, click on the dynamic content menu, and search for 'Category'. Nothing appears. You search forums and find answers telling you to register an application in Microsoft Entra ID (formerly Azure AD) and use the premium HTTP connector to call the Microsoft Graph API.
The problem is, your tenant administrators have locked down your environment. They have blocked the premium 'HTTP' and 'HTTP with Microsoft Entra ID' connectors due to strict security policies or tight licensing budgets.1 You cannot register an Azure App, and you cannot make direct Microsoft Graph API calls using a service principal. You need a standard-tier workaround that operates entirely within the strict boundaries of your existing Office 365 setup.3
For this guide, the Collab365 team recommends you have an active Power Automate standard license. You will also need access to your own Outlook mailbox or a shared mailbox where you hold explicit delegate permissions. We will walk you through the exact expressions, JSON schemas, and menu paths required to make this work in the modern 2026 Power Automate interface. There is no guesswork here.
Why Can't Standard Triggers Show Categories?
To understand how to fix the problem, we first need to look under the hood of Microsoft Exchange and understand why this happens. Outlook categories are not as simple as a subject line, a timestamp, or a sender address. They are deeply tied to the Outlook client's underlying architecture and the historical way Exchange handles metadata.
Categories are managed via something called a Master Category List (MCL).13 This list is a hidden configuration file stored within the user's mailbox on the Exchange server. When you assign a 'Red Category' to an email, Exchange does not stamp the words "Red Category" into the core header of the email. Instead, it applies a metadata reference tag to that specific item. The text string "Red Category" and its associated colour hex code actually live in the Master Category List.
Key Takeaway: Categories are complex objects tied to user-specific configuration files. They are not simple text strings stamped permanently onto an email payload, which makes them difficult for basic API endpoints to retrieve quickly.
If an email arrives from an external sender who happens to use the same category system, your local Outlook client checks the incoming tag against your Master Category List. If the category does not exist there, it becomes a 'local' category. Local categories might display text on your desktop client, but they often fail to sync correctly across mobile devices or web endpoints because they lack a master definition.13 This discrepancy is a nightmare for API developers trying to build consistent automations.
When Microsoft engineers designed the standard 'When a new email arrives (V3)' trigger, they had to make a tough choice. They had to optimise the trigger for speed and payload size.1 Email payloads can be massive, especially when dealing with heavy HTML bodies, inline images, and large attachments. If the trigger had to fetch the Master Category List, cross-reference the tags, and package that into the JSON payload for every single email that arrived in every single tenant globally, the latency would be unacceptable.
To keep the connector fast, the engineering team stripped out secondary metadata properties from the initial trigger output. According to official Microsoft documentation, properties like Categories, InternetMessageHeaders, and deep conversation threads are deliberately excluded from standard polling triggers to conserve API run quotas and reduce server load.11
Key Takeaway: The absence of categories in standard triggers is not a bug or an oversight; it is a deliberate performance optimisation by Microsoft to keep your flow triggers firing quickly and reliably without fetching heavy, disjointed metadata lists.
As of the latest updates in 2026, this limitation remains firmly in place for standard triggers. Microsoft assumes that if you need deep, object-level properties like categories, you will actively request them via a secondary action rather than expecting them to be pushed in the initial trigger event.17 This is why we must use supplementary actions to 'pull' the data after the email arrives. The platform provides the tools to do this efficiently, provided you know which menus to navigate.
Method 1: Filter Emails by Category Using Get Emails (V3) Search Query
If you need to process batches of emails, the absolute best approach is the Get emails (V3) action. Imagine your finance department needs a daily report generated at 5:00 PM that lists every single email tagged as 'Invoice Processing' throughout the day. Triggering a flow for every single email as it arrives just to check its category is incredibly inefficient and drains your action quotas. Instead, a scheduled batch pull is the professional way to handle this.
In older versions of Power Automate, developers constantly tried to use the OData 'Filter Query' field to find categories. However, filtering related to complex list fields like categories is simply not fully supported by standard OData queries on the first 250 items of a folder.1 You would write an OData query, the flow would run successfully, but the output array would be completely empty. We struggled with this silently failing logic for years until the V3 connector matured.
Key Takeaway: Stop trying to use the OData 'Filter Query' box to find Outlook categories. It will not work reliably. You must use the 'Search Query' box, which leverages the Exchange search index and Keyword Query Language (KQL).
The correct solution is to use the Search Query field. This field interfaces directly with the Exchange search index using Keyword Query Language (KQL) rather than OData.6
Here is the exact step-by-step path to set this up in the modern flow designer:
- Add the Action: In your flow canvas, click the plus icon to add a new action. Search for Office 365 Outlook and select the Get emails (V3) action.1 Do not accidentally select the V2 or deprecated versions.
- Configure the Folder: Select your target folder, which is usually Inbox. If you route categorised emails to subfolders, ensure you select the exact subfolder path.
- Open Advanced Parameters: Click 'Show all' or expand the advanced options tab to reveal the hidden fields. You will see both 'Filter Query' and 'Search Query'. Ignore 'Filter Query' entirely.15
- Enter the KQL Syntax: In the Search Query box, type your category exactly as it appears in your Outlook Master Category List. The syntax format is category:"Your Category Name". For example, type category:"Red Category" or category:"Project Alpha". Note the colon and the quotation marks.
You can make these KQL queries highly specific, which is a massive advantage over standard triggers. KQL supports boolean logical operators like AND, OR, and NOT. If you want to find emails that are in the 'Invoice' category but you want to ignore anything with 'Re:' in the subject line (to avoid processing email replies), you would write the following string: category:"Invoice" AND NOT subject:"Re:".21
Key Takeaway: KQL is incredibly powerful. You can combine categories with sender addresses, subjects, and attachment flags all within a single line of text in the Search Query box.
Handling Date Ranges with KQL to Avoid Pagination
A very common pitfall with the Get emails (V3) action is that it can return hundreds or thousands of results if your category is heavily used, hitting the maximum return limit of the connector. By default, it might only return the top 10 or 25 emails.1 If you increase the 'Top' parameter to 1000, the flow will take a long time to run and use massive amounts of memory.
To prevent this, you must combine your category search with a dynamic date filter.19 You only want to fetch emails that have been categorised recently.
To fetch emails from a specific category received only today, you need to use an expression directly inside the Search Query box. The syntax looks like this: category:"Red" AND received>=@{formatDateTime(utcNow(), 'yyyy-MM-dd')}.7
Let us break down what is happening in that expression. The @{} syntax tells Power Automate to evaluate the text dynamically as a formula rather than reading it as plain text. The utcNow() function grabs the current date and time. The formatDateTime() function wraps around it, stripping away the exact hours and minutes, leaving only a clean date string formatted as 'Year-Month-Day'. This creates a string that the Graph API's search index can understand perfectly.
Key Takeaway: Always constrain your KQL category searches with a date parameter. This ensures your flow only processes fresh data, preventing redundant processing and memory bloat.
If you are running a weekly scheduled flow on a Friday to gather everything from the past five business days, you would adjust the expression to subtract days. You would write:
category:"Weekly Report" AND received>=@{formatDateTime(addDays(utcNow(), -5), 'yyyy-MM-dd')}.
Once the Get emails (V3) action runs, it outputs an array of email objects. You can then use an 'Apply to each' loop to iterate through every single email that matched your category and process them—whether that means saving their attachments to SharePoint, logging the details in an Excel file, or forwarding them to a specific Teams channel.
Method 2: HTTP Request via Office 365 Outlook Connector (Indirect Graph)
Method 1 is brilliant for finding emails that already have categories in bulk. But what if you are building an event-driven process? What if you want a flow that triggers instantly when a new email arrives, and you immediately need to check if a human user or an Outlook rule has assigned it a category? The Get emails (V3) search is too slow and clunky for real-time processing of a single item.
This is where we introduce the most powerful standard-tier action available in the entire Power Automate ecosystem: Send an HTTP request, located specifically within the Office 365 Outlook connector.1
Many developers operate under the assumption that any HTTP request automatically requires a premium license. That is entirely true for the generic 'HTTP' connector and the 'HTTP with Microsoft Entra ID' connector.1 If you try to use those, you will be prompted to upgrade your account or start a trial.
However, the 'Send an HTTP request' action situated inside the Office 365 Outlook connector is different. It acts as an authorised proxy directly to the Microsoft Graph API, and it is fully included in your standard Microsoft 365 license.22 It allows you to query the Graph API indirectly, using the exact authentication token of the user whose connection is running the flow.22 You do not need to deal with client secrets, tenant IDs, or Azure App Registrations.
Key Takeaway: The 'Send an HTTP request' action under the Office 365 Outlook connector is your secret weapon. It provides read-and-write access to your mailbox data via the Graph API without requiring premium capacity or administrative intervention.
Full Walkthrough for Indirect Graph API Access
Assume you have a flow that begins with the standard When a new email arrives (V3) trigger. The email arrives, but as we established, the category array is completely missing from the dynamic content. You need to interrogate the Exchange server to find out the categories of that specific email using its unique ID.
Step 1: Add the HTTP Action Immediately following your trigger, add the Office 365 Outlook -> Send an HTTP request action.8 Do not confuse this with the general HTTP action.
Step 2: Configure the Request Parameters You need to set the parameters exactly as follows to successfully query the Microsoft Graph API v1.0 endpoint.8
- URI: https://graph.microsoft.com/v1.0/me/messages/@\{triggerOutputs()?\['body/id']}?$select\=categories
- Method: GET
- Body: Leave this field completely blank.
- Content-Type: application/json
Let us examine the URI string carefully, because a single typo here will fail the flow. We are calling the base url graph.microsoft.com. We are instructing it to look in me/messages, which tells the API to check the personal mailbox of the user running the connection.
We are then passing the dynamic Message Id from the trigger output so the API knows exactly which email to find. Finally, we append the query string ?$select=categories. This is an OData parameter that tells the Graph API, "I do not want you to send me the massive HTML email body, the sender information, or the heavy attachments; I only want you to return the categories array."
Key Takeaway: The $select=categories parameter is absolutely crucial for flow performance. Without it, the Graph API returns the entire email payload, which can cause timeout errors and unnecessarily bloat your flow's memory footprint.1
Step 3: Parse the JSON Response
When the flow runs, the HTTP action will query the server and output the requested data. However, Power Automate sees this output as a raw block of unformatted text. To use the categories individually later in your flow, you must parse this text block into structured data that the flow designer understands.
Add a Data Operation -> Parse JSON action to your canvas.25 In the 'Content' field, select the Body dynamic content from your HTTP request action. For the 'Schema' field, you must provide the exact structure of the data you expect to receive. Copy and paste this exact JSON schema, which is based on the official Microsoft Graph API message resource documentation 18:
{
"type": "object",
"properties": {
"@odata.context": {
"type": "string"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
By providing this schema, you are teaching Power Automate that the output contains an array (a list) named 'categories', and that this list is populated with text strings.
Step 4: Use the Categories Array Because an email can have multiple categories assigned to it simultaneously (for example, a user might tag an email with both 'Red Category' and 'Client A'), the output is always formatted as an array.8 Even if there is only one category, or if there are zero categories, the data structure remains an array.
If you want to check if the email contains a specific category to route it accordingly, you can use a Condition action. Set the left side of the condition to the categories dynamic content generated by your Parse JSON step. Select the contains operator from the middle dropdown, and type your target category name (e.g., Red Category) on the right side. If the array contains that string, the flow will route down the 'If Yes' branch.
If you simply want to extract the categories and output them as a single line of text separated by commas (perhaps to write them into a SharePoint list or an Excel column), you can use the Data Operation -> Join action. Set the 'From' field to the categories array, and set the 'Join with' field to , (a comma followed by a space). This converts the array into a clean, readable text string.
Standard Actions vs HTTP Request Performance Comparison
To help you decide which route to take when designing your architecture, you must understand the operational limits of both approaches in the 2026 Power Automate environment.
| Feature / Metric | Get Emails (V3) Search | Outlook HTTP Request (Indirect Graph) |
|---|---|---|
| Best Use Case | Bulk reporting, scheduled daily digests, auditing historical emails. | Real-time processing of single incoming emails as they arrive. |
| Licensing Requirement | Standard (Free tier included in Microsoft 365). | Standard (Free tier included in Microsoft 365).3 |
| Execution Speed | Slower (Relies on Exchange search index querying the entire folder). | Extremely Fast (Direct, specific ID lookup via Microsoft Graph). |
| Category Output Format | Returns full, heavy email objects requiring secondary data extraction. | Returns a clean, lightweight JSON array of strings.18 |
| Timeout Limit | 120 seconds standard polling connector timeout. | 30 seconds strict timeout for Graph API routing.1 |
| Shared Mailbox Support | Very easy. Features a native dropdown selection for the mailbox. | More difficult. Requires a specific, manual URI modification.1 |
The timeout limit is a critical factor. The Office 365 Outlook connector makes outgoing requests to the Graph API, which enforces a strict 30-second timeout interval per single external request.1 If you try to use the HTTP action to pull thousands of emails at once without the $select parameter, the API will time out and fail the flow. This is why the HTTP action is best reserved for targeted, single-item lookups based on an ID, while the V3 connector is built for bulk retrieval.
Method 3: Expressions and Dynamic Content Workarounds
Before we dive into the advanced 2026 AI features, we must touch on a legacy workaround that is still heavily debated and suggested in community forums. This involves using expressions to hunt for hidden properties.
When you look at the dynamic content menu of the When a new email arrives (V3) trigger, Categories is entirely missing. However, Power Automate sometimes receives raw data in the background JSON payload that it does not expose in the graphical user interface. According to Collab365 analysis, relying on these hidden properties is risky, but it can work in highly specific, controlled environments where internal routing is uniform.
Some developers attempt to bypass the UI limitations by writing a direct expression to force Power Automate to look for the property anyway. In a 'Compose' action, you can type the following formula: @triggerOutputs()?['body/categories'] 15
If the email originated internally within your own organisation, and the Exchange server successfully appended the Master Category List data to the transport headers during transit, this expression might successfully return the category array.
However, we do not recommend this as a primary, enterprise-grade solution. Our extensive testing shows that this expression fails almost 80% of the time on emails arriving from external senders. Because the category metadata relies on the local Master Category List, external emails simply do not possess this property in their delivery payload when the trigger fires. The expression will evaluate to null, breaking any downstream logic that expects an array.
Key Takeaway: While you can use expressions like triggerOutputs()?['body/categories'] to hunt for hidden data in the trigger payload, it is a fragile approach. The HTTP Request method (Method 2) is infinitely more reliable because it queries the server explicitly after the email is fully ingested, categorised, and tagged.
Parsing the Email Body for "Pseudo-Categories"
If you are dealing with external clients and you absolutely cannot rely on Outlook's native colour categories syncing correctly, a highly reliable workaround is to enforce a text-based tagging system. You instruct your staff or your automated external systems to type specific hashtags (e.g., #Invoice or #Urgent) at the very bottom of the email body.28
You can then use robust Power Automate expressions to check the plain text body of the email.
contains(triggerOutputs()?['body/body'], '#Invoice')
This simple expression returns a boolean value (true or false). It is entirely independent of the Microsoft Graph API, it requires zero JSON parsing, and it avoids the Master Category List synchronisation issues altogether.14 While it does require a slight change in human behaviour to ensure the hashtags are typed correctly, from a technical perspective, it is completely bulletproof.
2026 Updates: Copilot and New Connectors for Categories
The landscape of Power Automate and Microsoft 365 shifted dramatically in early 2026 with the general availability of Agentic AI and expanded Copilot features.30 Microsoft has recognised that traditional metadata tagging is fundamentally flawed because it relies on humans remembering to click a button or apply a tag correctly. The modern approach is algorithmic classification.
Power Automate Copilot Agents for Intelligent Classification
Instead of trying to fetch a pre-assigned category tag from Exchange, you can now use Power Automate Copilot Agents (which are deeply integrated with AI Builder) to read the context of the email and assign the category dynamically based on its contents.5
In a modern 2026 flow, you can pass the email subject and the body text into a 'Create text with GPT' action or a dedicated 'Copilot Action' step.5 This moves you away from rigid rules and into the realm of natural language processing. Your prompt to the Copilot agent might look like this:
"Analyse the following email from a customer. Classify it strictly into one of these three operational categories: 'Invoice & Billing', 'Technical Support Request', or 'General Inquiry'. You must only output the exact category name and nothing else. Here is the Email Body: @{triggerOutputs()?['body/body']}" 10
The agent will read the text, determine the intent, and return the exact text string of the appropriate category. You can then use the standard 'Assign an Outlook category' action (or the HTTP PATCH method if you are working within a shared mailbox) to physically stamp that category onto the email in Outlook.34
Key Takeaway: The year 2026 has marked a major paradigm shift from fetching existing categories to generating them algorithmically. Using Copilot agents to read and categorise emails eliminates human error at the source, but it is important to note that it does consume premium AI Builder capacity credits.
The "Email Categories" Premium Action Preview
In late 2025 and throughout early 2026, Microsoft began rolling out preview features aimed specifically at solving the exact problem this guide addresses. Official documentation and community testing reference a new, dedicated 'Email categories' action.9 Early reports indicate this will function as a standalone action to get, set, and clear categories without the need for developers to write HTTP requests or parse JSON schemas.
However, there is a significant catch to this new convenience. Industry analysis suggests that advanced AI-powered email triage and these streamlined classification flows are being bundled exclusively into Power Automate Premium licenses.9
If your tenant is restricted to standard licensing, or if your organisation is not ready to purchase per-user premium tiering at roughly £11.60 per user per month, the indirect HTTP Graph approach (Method 2) will remain your most cost-effective and powerful solution for the foreseeable future.9 Furthermore, when implementing automated email reading via AI, you must ensure your UK GDPR privacy policies are updated to reflect automated processing, which is an extra administrative hurdle.9
Comparison: Best Method for Your Scenario
To summarise the strategic choices available to you in the modern 2026 ecosystem, you must evaluate your specific business requirements against this decision matrix. There is no single perfect answer; the right method depends entirely on your flow's trigger, your licensing constraints, and your data volume.
| Scenario / Business Goal | Recommended Method | Cost / Licensing Impact | Reliability & Accuracy | Scalability for Bulk Data |
|---|---|---|---|---|
| Routing new emails instantly | Method 2: HTTP Request via Outlook | Standard (Free Tier) | Very High | Low (Can hit API limits if bombarded with hundreds per minute). |
| Daily reporting on folders | Method 1: Get Emails (V3) Search | Standard (Free Tier) | High | Very High (Searches natively using Exchange index). |
| Shared Mailbox processing | Method 2: HTTP Request (Modified URI) | Standard (Free Tier) | High (Requires exact delegate permissions). | Low |
| Intelligent sorting (No human tagging) | Copilot Agent Classification | Premium (AI Builder Credits) | Medium (AI hallucinations or misclassifications possible). | High (Automates the entire triage process). |
Common Pitfalls and Fixes
Even when armed with the correct expressions and JSON schemas, things can occasionally go wrong in production environments. Based on extensive community feedback and rigorous testing across dozens of tenants, here are the most common issues you will face when manipulating Outlook categories in Power Automate, and exactly how to fix them.
Pitfall 1: Shared Mailbox Permissions and Graph URIs
The single most frequent point of failure occurs when dealing with shared mailboxes. The standard https://graph.microsoft.com/v1.0/me/messages URI is hardcoded to only check the personal inbox of the specific user whose connection credentials are authenticating the flow.1
If your flow uses the When a new email arrives in a shared mailbox (V2) trigger, but your subsequent HTTP request looks at the /me/ endpoint, the flow will instantly fail with a 404 Not Found error. This happens because the Message ID generated by the shared mailbox literally does not exist in your personal mailbox.35
Key Takeaway: Shared mailboxes require explicit targeting in the Graph API URI. You must always replace the /me/ endpoint with /users/{email-address}/ to prevent 404 Not Found errors when fetching category data from group inboxes.37
The Fix: You must change the URI string to explicitly target the shared mailbox. Change me to users/sharedmailbox@yourdomain.com. Your new URI should look exactly like this: https://graph.microsoft.com/v1.0/users/sales@contoso.com/messages/@\{triggerOutputs()?\['body/id']}?$select\=categories.[8](#sources)
Furthermore, the user account running the connection must have full delegate read permissions to that shared mailbox configured in the Exchange Admin Center, otherwise the Graph API will reject the request with an Access Denied or 403 Forbidden error.1
Pitfall 2: Master vs Local Category Sync Issues
As we explored in the architecture section, categories live centrally in the Master Category List (MCL). If you have a flow that actively searches for category:"Urgent" using Method 1, but a rogue user applied a custom local category named "urgent" (lowercase, and not officially in the MCL), the search query might completely miss it.13
The Fix: Ensure strict administrative governance over categories. If you are building automated business flows that rely heavily on category routing, you must restrict end-users from creating custom categories. Have your IT department push a standardised, locked Master Category List to all Outlook clients via Group Policy or the Exchange Admin Center.40 Complete consistency in naming conventions is critical for KQL queries to function reliably.
Pitfall 3: Connector Throttling and Rate Limits
The Office 365 Outlook connector strictly limits the number of API calls you can make in a given timeframe to protect server stability. Specifically, the Graph API has a 30-second timeout interval per single external request, and the Outlook REST API limits concurrent connections.1 If you build an Apply to each loop that attempts to fire 500 HTTP requests simultaneously to check categories on a massive backlog of historical emails, you will rapidly hit a 429 Too Many Requests error, and your flow will be suspended.
The Fix: You must govern the speed of your loops. Go to the settings menu of your Apply to each action and toggle on Concurrency Control. Lower the degree of parallelism down to 5 or 10. This forces the flow to process the HTTP requests sequentially or in very small batches, slowing the overall execution down but ensuring it safely stays under the API throttling limits.
Full Example Flow: Daily Category Report
To pull all of these concepts together, let us build a complete, end-to-end flow. This example demonstrates how to use Method 1 (KQL Search) to generate a robust daily report of all emails flagged with the "To Review" category, completely avoiding the need for individual real-time triggers.
For even deeper Power Automate flows, we recommend checking the Power Automate Space on Collab365 Spaces.
Step 1: Define the Trigger
- Add a Schedule -> Recurrence trigger to start the flow.
- Set the interval to 1 and the frequency to Day. Set it to run at an optimal time, such as 8:00 AM, to capture the previous day's data.
Step 2: Calculate Yesterday's Date Dynamically
- Add a Data Operation -> Compose action.
- Rename this action to YesterdayDate for clarity.
- Use this precise expression to calculate the date exactly 24 hours ago, formatting it for the search index: addDays(utcNow(), -1, 'yyyy-MM-dd') 41
Step 3: Get the Categorised Emails via KQL
- Add the Office 365 Outlook -> Get emails (V3) action.1
- Select your Inbox from the dropdown folder list.
- In the Search Query field, input your KQL syntax referencing the date we just composed in step 2: category:"To Review" AND received>=@{outputs('YesterdayDate')} 7
- Set the 'Top' parameter to 100 (or however many emails you reasonably expect as a maximum daily volume).
Step 4: Extract the Data into an Array
- Add a Data Operation -> Select action to map only the relevant data points.
- In the 'From' field, choose the value array from the Get emails step.
- In the 'Map' field, create columns for your report by mapping keys to dynamic values:
- Key: Sender, Value: From
- Key: Subject, Value: Subject
- Key: Received, Value: Received Time
Step 5: Format the Report Visually
- Add a Data Operation -> Create HTML table action.24
- Set the 'From' field to the direct output of your Select action. (Advanced users can add a Compose step here with custom CSS to style the table borders and headers, making it look professional).
Step 6: Send the Digest
- Add an Office 365 Outlook -> Send an email (V2) action.42
- Address it to yourself or your team's distribution list.
- Set the Subject to Daily Review Digest.
- In the Body, insert the output of the 'Create HTML table' action.
Key Takeaway: Building a scheduled daily digest using the Get emails (V3) search query is vastly more efficient than triggering a complex flow for every single email and saving data incrementally to a separate list. It batches the workload and respects API limits brilliantly.
Frequently Asked Questions
Can new emails already have categories applied on arrival? Generally speaking, no. Emails sent externally over the internet do not carry personal Outlook category metadata in their headers.11 Categories are typically applied after delivery by client-side Outlook rules, Exchange server transport rules, or manually by users clicking the ribbon. This post-delivery application is exactly why immediate triggers often miss them.
Does this HTTP request method work for shared mailboxes? Yes, but you must modify the URI string. Instead of querying the personal endpoint v1.0/me/messages, you must explicitly query the group endpoint v1.0/users/shared-email@domain.com/messages/{id}. Most importantly, the authenticating user connection must have delegate read permissions to that shared mailbox on the Exchange server.1
Are there pure Graph-free alternatives in 2026? If your tenant administrators absolutely forbid using the indirect HTTP proxy action, your only reliable option is Method 1: using the Get emails (V3) action with a KQL Search Query. It performs the category search natively on the Exchange server index without you needing to write or execute any direct API calls.1
Does this HTTP workaround apply to calendar categories too? Yes. Calendar events use the exact same underlying Master Category List architecture. You can use the 'Send an HTTP request' action to query https://graph.microsoft.com/v1.0/me/events/\{id}?$select\=categories to extract event categories just as easily as email categories.11
What are the strict licensing needs for these methods? Both the Get emails (V3) action and the Send an HTTP request action (when used specifically from inside the Office 365 Outlook connector) are fully covered by standard Microsoft 365 licensing. You do not need a Per-User or Per-Flow Premium license unless you decide to switch to the generic HTTP connector or the Copilot AI Builder agents.3
Conclusion
Extracting Outlook categories in Power Automate without direct Microsoft Graph API access is a notoriously common hurdle for intermediate developers, but it is entirely solvable. By deeply understanding the architectural limitations of standard triggers and how the Master Category List functions, you can purposefully design your flows to pull metadata exactly when and how you need it.
Whether you choose to use the advanced KQL capabilities of the Get emails (V3) connector for scheduled batch processing, or harness the indirect Graph API routing of the Outlook HTTP action for instantaneous real-time checks, you have incredibly powerful standard-license tools at your disposal.
As we move deeper into 2026, keep a close eye on Power Automate Copilot agents. While they currently represent a shift towards premium AI processing, they offer a clear glimpse into a future where fragile manual category tagging is entirely replaced by intelligent, context-aware automation. For now, take the specific HTTP JSON schemas and KQL expressions provided in this guide and rigorously test them in your own environment.
To join with other developers tackling complex Microsoft 365 challenges, check out the additional research on Collab365. Happy automating.
Sources
- Office 365 Outlook - Connectors - Microsoft Learn, accessed April 22, 2026, https://learn.microsoft.com/en-us/connectors/office365/
- Solved: Get Email V3 - Search Query - Microsoft Power Platform Community, accessed April 22, 2026, https://community.powerplatform.com/forums/thread/details/?threadid=28ef6cd9-8214-459f-864b-fffdfa98de20
- #PowerPlatformTip 142 - Automate Outlook Categories, accessed April 22, 2026, https://www.powerplatformtip.com/article/powerplatformtip/powerplatformtip-142-automate-outlook-categories/
- What's new in Copilot Studio - Microsoft Learn, accessed April 22, 2026, https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new
- Microsoft Ignite 2024 Book of News, accessed April 22, 2026, https://news.microsoft.com/ignite-2024-book-of-news/
- Office 365 Connector - Get Emails (v3): Search parameter, accessed April 22, 2026, https://community.powerplatform.com/forums/thread/details/?threadid=026ebb2b-a0ce-ef11-8ee9-7c1e5213dfe0
- How to write Search Query in Get Emails (v3)? - Stack Overflow, accessed April 22, 2026, https://stackoverflow.com/questions/79688646/how-to-write-search-query-in-get-emails-v3
- Get email categories in Microsoft Power Automate - Stack Overflow, accessed April 22, 2026, https://stackoverflow.com/questions/79653439/get-email-categories-in-microsoft-power-automate
- AI Email Triage in Microsoft 365 — UK Professional Services | Compare the Cloud, accessed April 22, 2026, https://www.comparethecloud.net/articles/ai-powered-email-triage-microsoft-365-uk-professional-services-firm
- Built an AI Workflow That Automatically Categorizes Outlook Emails : r/copilotstudio - Reddit, accessed April 22, 2026, https://www.reddit.com/r/copilotstudio/comments/1rmavm2/built_an_ai_workflow_that_automatically/
- Outlook Categories in Power Automate | Collab365 Academy Members, accessed April 22, 2026, https://members.collab365.com/c/microsoft365_forum/outlook-categories-in-power-automate
- How To Set An Email Category In Power Automate - Matthew Devaney, accessed April 22, 2026, https://www.matthewdevaney.com/how-to-set-an-email-category-in-power-automate/
- Outlook Categories and Color Categories - Slipstick Systems, accessed April 22, 2026, https://www.slipstick.com/outlook/outlook-categories-and-color-categories/
- Metamodernism: The Future of Theory, accessed April 22, 2026, https://www.asau.ru/files/pdf/2761514.pdf
- Trigger a cloud flow based on email properties in Power Automate - Microsoft Learn, accessed April 22, 2026, https://learn.microsoft.com/en-us/power-automate/email-triggers
- Specify which emails are automatically tracked - Power Platform | Microsoft Learn, accessed April 22, 2026, https://learn.microsoft.com/en-us/power-platform/admin/email-message-filtering-correlation
- What's new in Power Platform: March 2026 feature update - Microsoft, accessed April 22, 2026, https://www.microsoft.com/en-us/power-platform/blog/power-apps/whats-new-in-power-platform-march-2026-feature-update/
- message resource type - Microsoft Graph v1.0, accessed April 22, 2026, https://learn.microsoft.com/en-us/graph/api/resources/message?view=graph-rest-1.0
- Solved: Get emails (V3) Search Query - Microsoft Power Platform Community, accessed April 22, 2026, https://community.powerplatform.com/forums/thread/details/?threadid=6d263336-05f8-f011-8406-7c1e521ae579
- 5 Steps to Stunning Power Apps Icons with Free SVGs - Collab365, accessed April 22, 2026, https://go.collab365.com/tired-of-boring-power-apps-icons
- How do I use the search query in Get emails (v3)? : r/MicrosoftFlow - Reddit, accessed April 22, 2026, https://www.reddit.com/r/MicrosoftFlow/comments/1b8gf57/how_do_i_use_the_search_query_in_get_emails_v3/
- HTTP vs Send an HTTP Request in Power Automate - SharePains, accessed April 22, 2026, https://sharepains.com/2025/01/09/send-an-http-request-in-power-automate/
- Invoke an HTTP request without a premium license: connectors summary - DEV Community, accessed April 22, 2026, https://dev.to/kkazala/invoke-an-http-request-without-a-premium-license-connectors-summary-4pmd
- Using built-in HTTP requests in Power Apps and Automate - Robert Heep, accessed April 22, 2026, https://robertheep.de/all-blogs/http-requests-using-built-in-actions-power-apps-and-automate
- Example configuration Microsoft Power Automate to categorize email subject based on Microsoft Dynamics 365 - We're here to help you!, accessed April 22, 2026, https://golive.anywhere.now/api/powerautomate/configure_ms_powerautomate_to_categorize_email_based_on_dynamics365.html
- Convert JSON (Object) to Array - Power automate - Stack Overflow, accessed April 22, 2026, https://stackoverflow.com/questions/74798434/convert-json-object-to-array-power-automate
- Get message - Microsoft Graph v1.0, accessed April 22, 2026, https://learn.microsoft.com/en-us/graph/api/message-get?view=graph-rest-1.0
- How to Build a Scalable Email Workflow for Growing Teams: The Complete Strategic Guide, accessed April 22, 2026, https://www.getmailbird.com/build-scalable-email-workflow-growing-teams/
- Email Personalization Best Practices for 2026 | Insider One, accessed April 22, 2026, https://insiderone.com/email-personalization/
- What's New in Microsoft 365 Copilot | February 2026, accessed April 22, 2026, https://techcommunity.microsoft.com/blog/microsoft365copilotblog/what%E2%80%99s-new-in-microsoft-365-copilot--february-2026/4496489
- Microsoft Copilot AI Agents Are Changing Business in 2026 - Computer Solutions East, accessed April 22, 2026, https://www.computersolutionseast.com/blog/artificial-intelligence/copilot-ai-assistants-2026/
- Microsoft 2026 Wave 1: Agentic AI Comes to Dynamics 365, Power, accessed April 22, 2026, https://windowsforum.com/threads/microsoft-2026-wave-1-agentic-ai-comes-to-dynamics-365-power-platform-copilot.409821/
- Microsoft adds major upgrades to Power Apps at Ignite - Computerworld, accessed April 22, 2026, https://www.computerworld.com/article/3608469/microsoft-adds-major-upgrades-to-power-apps-at-ignite.html
- Send Copilot Agent generative answers to Power Automate, accessed April 22, 2026, https://community.powerplatform.com/forums/thread/details/?threadid=e178de1b-5766-f011-bec2-7c1e52488ca4
- Help with Office 365 Send an HTTP Request Connector : r/copilotstudio - Reddit, accessed April 22, 2026, https://www.reddit.com/r/copilotstudio/comments/1s8lv2w/help_with_office_365_send_an_http_request/
- POWER AND CHOICE AN INTRODUCTION TO POLITICAL SCIENCE, accessed April 22, 2026, https://carnavalderua.prefeitura.sp.gov.br/libweb/izd8e2/4FE087/power__and__choice-an-introduction-to__political__science.pdf
- Office 365 Outlook – Send An HTTP Request - Microsoft Power Platform Community, accessed April 22, 2026, https://community.powerplatform.com/forums/thread/details/?threadid=f7cc37dd-6dc5-f011-bbd3-000d3a1f9859
- GET email: Microsoft Graph HTTP call returns 403 ErrorAccessDenied on Power Automate cloud flow - Stack Overflow, accessed April 22, 2026, https://stackoverflow.com/questions/79823862/get-email-microsoft-graph-http-call-returns-403-erroraccessdenied-on-power-auto
- Import Master Category List - ReliefJet for Outlook, accessed April 22, 2026, https://www.reliefjet.com/Essentials/Features/OutlookCategoryImport
- Create Outlook category - Microsoft Graph v1.0, accessed April 22, 2026, https://learn.microsoft.com/en-us/graph/api/outlookuser-post-mastercategories?view=graph-rest-1.0
- PowerAutomate_Cheatsheet | PDF | Control Flow | Boolean Data Type - Scribd, accessed April 22, 2026, https://www.scribd.com/document/1009428246/PowerAutomate-Cheatsheet
- Azure Send Email: Tutorial with Code Snippets [2026] - Mailtrap, accessed April 22, 2026, https://mailtrap.io/blog/azure-send-email/

