Learn

Everything you need to understand Microsoft 365 automation before building your first flow.

Foundations

What is Power Automate?

Power Automate is Microsoft's workflow engine. You describe a trigger (something that happens) and a series of actions (what should follow), and the platform runs that sequence in the cloud without anyone opening an app. It connects to Outlook, Teams, SharePoint, Planner, Excel and hundreds of other services through connectors.

Power Automate overview

Instant, automated and scheduled flows

An instant flow runs when you press a button. An automated flow runs when an event happens — an email arrives, a list item is created. A scheduled flow runs on a recurrence, such as every weekday at 08:00. Most business automations are automated or scheduled; instant flows are best for one-off human-initiated work.

Types of cloud flows

What a standard licence covers

Every flow documented here is built with standard connectors included in Microsoft 365 — Outlook, Teams, SharePoint, Planner, OneDrive, Excel and Approvals. No premium connectors, no Dataverse, no per-flow add-ons. If a flow needs something premium, it is stated explicitly on its page.

Licensing overview

Connectors & services

SharePoint as the data layer

SharePoint lists behave like simple tables: columns with types, per-item permissions, and a REST surface Power Automate reads and writes natively. Using a list instead of a spreadsheet gives you concurrency, versioning and filter queries — which is why every module here stores state in SharePoint.

SharePoint connector reference

Outlook: mail and calendar

The Office 365 Outlook connector both reads and writes. Triggers like 'When a new email arrives' or 'When an upcoming event is starting soon' start flows; actions like 'Send an email V2' and 'Update event V4' change state. Calendar triggers are the backbone of meeting automation.

Office 365 Outlook connector

Teams as the notification surface

Posting to a Teams channel puts automation output where people already work. Adaptive Cards let a flow post structured, interactive messages — a task summary with an approve button, for example — instead of plain text nobody reads.

Microsoft Teams connector

Planner for task ownership

Planner holds tasks with an owner, a bucket and a due date. Flows create tasks from extracted meeting actions and read open tasks back when building agendas or reports, so nothing depends on someone maintaining a personal list.

Planner connector

Building flows

Triggers, actions and the run history

A flow is one trigger plus ordered actions. Every execution is recorded in the run history with the inputs and outputs of each step, which is the first place to look when something misbehaves. Read the failing action's raw outputs before changing anything.

Troubleshoot flow failures

Conditions, switches and branching

A Condition splits a flow in two based on a boolean test. A Switch handles several discrete values, such as routing an approval by department. Keep conditions shallow — deeply nested branches are hard to read and harder to debug.

Add a condition

Apply to each and concurrency

Apply to each iterates over an array. By default iterations run sequentially; enabling concurrency speeds things up but breaks order-dependent logic such as appending to a string variable. When building HTML rows in order, leave concurrency off.

Loops in Power Automate

Variables and Compose

Initialize variable must sit at the top level of a flow, never inside a loop or condition. Use variables when a value changes across steps; use Compose when you just need to shape or store a value once — Compose is cheaper and easier to inspect in the run history.

Use variables

Error handling with Configure run after

Every action can be configured to run after a previous action succeeds, fails, is skipped or times out. Pair a Scope with a follow-up action set to 'has failed' to build a catch block that notifies you rather than letting the flow die silently.

Handle errors and exceptions

Expressions & data

Expressions you will actually use

formatDateTime() for readable dates, addDays() for deadlines, coalesce() for safe defaults, length() for counts, concat() and replace() for strings, and json() to parse a payload. Expressions live in the dynamic content panel's Expression tab and are written without curly braces.

Expression function reference

OData filter queries

Filtering server-side with a Filter Query on Get items is dramatically faster than pulling every row and filtering with a condition. Use internal column names, quote strings, and remember ne, eq, ge and le rather than SQL operators.

OData filter syntax

Building HTML output

Emails and calendar bodies accept HTML. Build rows inside a loop with Append to string variable, then wrap the result in a table in a single Compose. Inline styles only — external stylesheets are stripped by Outlook.

Create HTML tables

Key concepts

Idempotency

A flow that can run twice without doing damage is idempotent. Before creating an item, check whether one already exists for that key; before sending a reminder, check whether one was already sent today. Scheduled flows retry, and duplicates are the most common bug in production automation.

Schema drift

Someone renames a SharePoint column and six flows break at once. Schema monitoring flows compare the live list structure against an expected definition on a schedule and alert before a business flow fails.

Connections and ownership

A flow runs as the connection owner. If it is built on a personal account and that person leaves, the flow stops. Production automations should own their connections through a shared service account and live in a shared environment or solution.

Manage connections

FAQ

Does any of this cost extra?

No. Everything documented here runs on connectors included with a standard Microsoft 365 subscription. You need permission to create flows in your tenant and access to the SharePoint site holding the lists.

Can I just use the Copilot prompt?

The Copilot prompt on each flow page scaffolds the structure quickly, but it rarely produces a production-ready flow. Treat it as a starting skeleton, then work through the step-by-step build to fix connectors, expressions and error handling.

My flow fails — where do I start?

Open the run history, find the first red action, and read its raw inputs and outputs. Most failures are a missing column, a filter query using a display name instead of an internal name, or a null value reaching an expression that expected a string.