What it does
Expressions in cloud flows are Workflow Definition Language functions — concat(), first(), formatDateTime(), json() and the rest — written in the fx editor and evaluated at run time. Data operations are the built-in actions that reshape data without loops: Compose, Parse JSON, Select, Filter array, Join, Create HTML table and Create CSV table.
Key facts
- Select reshapes an array into a new array of objects with the fields you name. Filter array cuts an array down to items matching a condition. Join turns an array into a delimited string. All three do in one action what an Apply to each would take hundreds of iterations to do.
- Parse JSON takes a JSON string and a schema and produces typed dynamic content downstream. The schema is generated from a sample payload, not inferred at run time.
- Compose stores a single evaluated value and can be referenced repeatedly by later actions. Variables are mutable and needed when a value has to change across iterations.
- A single expression is capped at 8,192 characters in the flow definition. Expression evaluation output is capped at 131,072 characters, which is the limit
concat(),base64()andstring()run into. - A flow definition allows 250 variables.
- Every action costs a Power Platform request, including a Compose or an Initialize variable. Expressions inside an action are free — one action with five nested functions is still one request.
- Skipped actions don't count against request limits. Failed ones do.
When to use / skip
Reach for Select and Filter array before you reach for a loop — it's the single biggest performance difference in most flows, and it turns thousands of requests into one. Use Compose for anything you evaluate once and read several times, and keep variables for genuine accumulators and counters. Skip the temptation to write one enormous nested expression to avoid an extra action; you save one request and lose the ability to debug it, and the character cap will find you eventually.
Configuration decisions
- Whether a value needs a variable or a Compose, which is really the question of whether it changes during the run.
- Whether Parse JSON is worth the schema maintenance, or whether direct expression paths against the payload are more tolerant of API changes.
- Where transformation happens — an OData
$filteron the source action is cheaper than a Filter array, which is cheaper than a loop. - How much expression logic belongs in the flow at all versus in a child flow, a Dataverse plugin or the source system.
Gotchas
- Parse JSON schemas generated from a sample mark every field as required and pin types. The first null value the API returns fails validation. Loosen the schema or expect a 3am failure.
- Referencing a Compose output whose action was skipped gives you a null that propagates silently rather than an error.
- Variables are not safe inside a concurrent Apply to each. With parallelism on, iterations race and the value you read is not reliably the one you set.
- Empty arrays and single-item arrays behave differently downstream — the designer will wrap a single-item reference in an Apply to each for you without asking, which quietly changes the flow's shape.
- The
fxeditor has autocomplete but no type checking. A wrong property name fails at run time, not at save.
Consultant notes
- Data operations are where you demonstrate value on a rescue engagement. Replacing a nested Apply to each with a Select and a Filter array often takes a flow from minutes to seconds and cuts request consumption dramatically.
- Teach makers
first(),coalesce()andempty()early. Most null-reference failures in the field come from not knowing those three exist. - Warn clients that expression-heavy flows carry a real maintenance cost — they need someone who reads WDL, and that person is rarely the process owner.
- If the client is close to their request limits, count the built-in actions too. Compose and Initialize variable are not free, and a flow with 30 of them running hourly adds up.
Worth revisiting if the expression editor gains type checking, or if request limit enforcement tightens.