Logic Composer
Inputs and outputs
Define the values a logic block or logic flow takes in and gives back, including required inputs and list outputs.
Inputs and outputs are the contract of a logic block or logic flow. Inputs are the values the caller passes in when it runs; outputs are the values it gives back when it finishes. Recipes, event handlers, business processes, other flows, the Run dialog, Dataverse actions and AI agents all use the same contract, so define it with care.
Add an input
Section titled “Add an input”- Open the block or flow and select the Input tab (“Values passed in when it runs”).
- Add an input.
- Enter a Name, for example
QuoteAmount. Each name must be unique in the block or flow. - Choose its Type. See Types.
- To accept several values, turn on List of values.
- Turn on Must have a value if the logic cannot run without it.
- Save the input, then save the form.
Input settings
Section titled “Input settings”| Setting | What it does | Notes |
|---|---|---|
| Name | Names the input in expressions and in every caller. | Must be unique. Choose it before others start using the block: callers bind inputs by name. |
| Type | The kind of value the input accepts. | Uses the shared Type picker. Unique Identifier is not offered; use Lookup or Row. |
| List of values | Accepts a list instead of one value. | Not available when the block or flow is exposed as a Dataverse action. |
| Must have a value | Makes the input required. | Inputs without it are marked Optional in the grid. |
Required and optional inputs
Section titled “Required and optional inputs”- A caller must bind every input that has Must have a value. The expression editor marks a call to a block with an unbound required input as a problem, and the Run dialog will not run until you fill it in.
- An optional input that the caller leaves out is empty when the logic runs; there is no default-value setting. Design for that: check it with Null / Not Null or give it a fallback with First Non-Empty. Remember that an empty number counts as 0 in arithmetic and number comparisons. See Empty values.
Outputs
Section titled “Outputs”How a block or flow defines its outputs depends on what it is.
| Logic | Outputs | Where you define them |
|---|---|---|
| Formula | One value named result, of the type you choose above the formula. Can be a list. |
The Formula tab. |
| Validation | One Yes/No value named result: Yes when the data is valid. |
Fixed. |
| Validation set | isValid, plus failedValidation or failedValidations. |
Fixed; depends on Return First Validation Error. See Validation set. |
| Decision table, Decision tree | Any number of named, typed outputs. Each can be a list. | The Output tab. |
| Logic flow | Any number of named, typed outputs (“Values it gives back when it finishes”). Each can be a list. | The Output tab. The flow’s steps set their values. See Logic flows. |
List outputs
Section titled “List outputs”Formulas, decision tables, decision trees and logic flows can return lists, for example the list of approvers for a quote or the products a customer is eligible for. Editing an output keeps its list setting.
List outputs and list inputs are not allowed on a block or flow that is exposed as a Dataverse action. They are fine for MCP tools, which return lists as typed lists. See AI and API exposure.
Removing outputs
Section titled “Removing outputs”On a decision table or tree, deleting an output also removes it from every row or outcome node that set it. The editor asks you to confirm first.
Use outputs elsewhere
Section titled “Use outputs elsewhere”- In an expression, use Run Logic Block: bind the block’s inputs by name and pick one output. To use several outputs, add one call per output, or call the block from a flow step. See Calling logic blocks.
- In a flow, call a block or another flow with a step and use its outputs in later steps. See Logic steps.
- In a recipe, validation blocks can stop the save. See Logic recipes.
Example
Section titled “Example”A Quote Discount decision table for quotes:
| Input | Type | Must have a value |
|---|---|---|
CustomerSegment |
Choice (Account, Relationship Type) | Yes |
QuoteAmount |
Currency | Yes |
IsFirstOrder |
Yes/No | No |
| Output | Type |
|---|---|
DiscountPercent |
Decimal Number |
DiscountReason |
Text |
Because IsFirstOrder is optional, the table treats an empty value as No when it compares it with is Yes.