Free Power Automate Tutorial β learn flows and expressions in 12 days
Triggers, expressions, loops and error handling - topic by topic, with every flow runnable right here in the page and a real run history to read.
A free, hands-on Power Automate course
Twelve short lessons on the part of Power Automate people actually get stuck on: expressions and flow logic. Every flow on this site runs in your browser and gives you back a real run history - every action, its resolved inputs, its outputs, and whether it was skipped. Nothing to install, no signup, no tenant needed.
Start with Day 1.
?['field'], item() and "why did my scheduled flow run at 2:30pm" come up constantly.The 12 days
Day 1 β What Power Automate is, and your first flow
Power Automate is the thing that does the boring half of your job while you are asleep.β¦Day 2 β Triggers - what starts a flow
Pick the wrong trigger and you will fight the flow forever. Pick the right one and half the β¦Day 3 β Variables, Compose and the data types
Two ways to hold a value, and knowing which one to reach for stops a lot of pain.β¦Day 4 β Expressions - the syntax that trips everyone up
This is the day Power Automate stops being drag-and-drop and starts being a skill.β¦Day 5 β Conditions and branching
A flow that always does the same thing is a macro. A flow that decides is an automation.β¦Day 6 β Apply to each - doing it to every row
The moment your trigger hands you a list instead of a single thing, you need this.β¦Day 7 β Filter array, Select and working without loops
The single biggest performance win in Power Automate: stop looping.β¦Day 8 β Dates, times and time zones
Power Automate runs on UTC and your users do not. Almost every date bug comes from that one β¦Day 9 β The shape of real data
Most flows do not fail on logic. They fail because the data was not the shape you assumed.β¦Day 10 β Error handling and making flows reliable
A flow that works is easy. A flow that tells you when it did not work is the professional onβ¦Day 11 β A real flow, end to end
Everything so far, doing one real job from start to finish.β¦Day 12 β Practice questions and interview answers
Everything from the first eleven days, as problems. Clear each box and try it before you looβ¦How the playground works
Power Automate is a website you drag boxes around in, and a web page cannot be that. But a flow is JSON underneath - the designer’s own "Peek code" option shows you exactly this shape - and the expression language is a real language.
So you write the flow as JSON, press Run, and read the run history. Which is precisely what the real product gives you after a run, and where you will spend most of your debugging time.
There is a second, smaller box for learning one expression at a time: type expressions, one per line, and see what each returns.
What runs for real
Expressions. The engine is written from scratch and covers the functions you use daily: concat, toUpper, toLower, trim, length, replace, substring, indexOf, split, join, startsWith, endsWith; add, sub, mul, div, mod, int, max, min, formatNumber; equals, greater, less, and, or, not, if, empty, coalesce, contains; first, last, skip, take, union, createArray, json, range; and the date family - utcNow, formatDateTime, addDays, addToTime, startOfDay, startOfMonth, convertTimeZone.
Flow structure. Initialize, Set, Increment and Append variables. Compose. Condition with real branching. Switch. Apply to each with item() and items(), including nested loops. Filter array. Select. Scope. Terminate. A mock Send email that shows you the fully resolved message instead of sending it.
It also enforces the rules that catch people: you cannot initialise the same variable twice, ['field'] fails where ?['field'] returns null, and outputs('Some action') tells you which actions actually exist when you get the name wrong.
Those need a tenant of your own and somebody to walk you through it, and that is the classroom course. The clock here is also frozen at 18 March 2026, 09:30 UTC so that the date examples give the same answer every time.
How to get the most out of it
- Type the expression, do not copy it. The typing is where the learning happens, and the error messages here are written to teach rather than to blame.
- Change the trigger body. Every flow has its test data right at the top. Blank a field, zero a number, empty a list - that is where real flows break.
- Read the Inputs, not just the Outputs. The inputs show what an action was given after every expression was worked out. That is where the bug usually is.
- Build expressions a layer at a time, in Compose actions. Writing the whole nested thing and then debugging it is how people lose an afternoon.
