Skip to main content
Every step in Components, by group. A later step reads a step’s output as {{ ctx.steps['Step name'].field }}: see Data and expressions.

Workflow steps: the Components panel, a Condition and a Slack step added to New starter setup, and their output in a test run (1:27).

The Components panel with a Search components box and collapsed groups: Flow Control, Approval, Blocks, Cache, Client, Communication, Compliance, Data, Database, Distribution, Forms and Microsoft.
Branching steps have one dot per branch along the bottom: drag from the branch you want. End every path with Finish Workflow.

Flow Control

Condition

Add a Condition per branch, each with an expression and a Label. Triggr tries them top to bottom and follows the first that’s true, otherwise the Default Branch.
The Is Finance? Condition step: Condition 1 with Condition ctx.params.department === 'Finance' and Label Finance, an Add Condition button, Default Branch Everyone else and Condition Language Javascript.
With Condition Language Javascript, write ctx. paths without braces: ctx.params.department === 'Finance'. The default, Triggr Lang, drops ctx. and needs double quotes: params.department == "Finance". In a run, condition_label shows the branch taken, or Default when no condition matched:
The Is Finance? step in a run: Status success, Type condition, and Output with next_steps for_loop-1, condition_label Finance and matched_condition ctx.params.department === 'Finance'.

For Loop

Expression is JavaScript that returns a list, such as ctx.params.licences. The body reads the current item as ctx.<Variable Name>: {{ ctx.licence }}, or {{ ctx.user.mail }} for a list of objects.
The For each licence step: Expression ctx.params.licences, Variable Name licence, and Subflow Configuration notes about the Body and On Completion handles and the End For Loop node.
Body (left dot) runs the steps to repeat, ending with End For Loop; On Completion (right dot) runs after the last item.
The canvas: both branches of Is Finance? lead to For each licence, whose left branch runs Licence note then End For Loop, and whose right branch runs Run child then Finish Workflow.
Items run one at a time, and an empty list goes straight to On Completion. In the body, ctx.steps['Name'] holds a step’s latest pass: until the step runs again, it still holds the previous pass’s output. To keep every pass, see Collect results in a loop. Here Licence note returns 'Assign ' + ctx.licence + ' to ' + ctx.details.upn; its second pass:
The second Licence note step in a run: Status success, Type code, and Output with line Assign Teams to sam.taylor@acme.com.

Delay and Wait Until

Delay waits a fixed Duration.
The Delay step with Duration 10 and Time Unit Minutes.
Wait Until takes YYYY-MM-DDTHH:MM:SS and a time zone. A YYYY-MM-DD value from a webhook or Manual Trigger works as shown: {{ ctx.params.startDate }}T09:00:00 Europe/London. A form’s Date field sends a timestamp instead, so use the day from a Code step (recipe): {{ ctx.steps['Prepare details'].startDay }}T09:00:00 Europe/London.
The Wait Until step with Date and Time set to a template of ctx.params.startDate followed by T09:00:00 Europe, and the format hint.

Trigger Workflow

Trigger Workflow (Triggr) starts another workflow, which reads Parameters as ctx.params. The client isn’t inherited: pass {{ ctx.client.id }} and add Set Client By ID there.
The Run child Trigger Workflow step: Workflow Docs sample – expressions child, Await Completion ticked, and Parameters JSON with name, notes and licences filled from templates with the json filter.
  • Without Await Completion: this run carries on at once. Output: triggeredWorkflowExecutionId, workflowName.
  • With it: this step waits for the other workflow, however long. Output: status (completed or failed), finishNodeOutput.outcome and finishNodeOutput.comment, so return values in that workflow’s Finish Workflow Comment.
The Run child step's Output in a run: status completed, completedAt, workflowName, finishNodeOutput with the child's comment and outcome success, and triggeredWorkflowExecutionId.
A failed child doesn’t fail this run: check ctx.steps['Run child'].status === 'completed' with a Condition before reading finishNodeOutput.

Finish Workflow

Set Outcome to Success to complete the run, or Fail to mark it Failed. Comment goes back to an awaiting workflow or a webhook caller with ?await=true.
The Finish Workflow step with Outcome Success and a Comment built from templates for the full name, start date, licence list, branch label and the child workflow's comment.
The Finish Workflow step in a run: Status success and Output with comment Sam Taylor starts 02/11/2026 with E3, Teams. Branch: Finance. Child: Hello Sam Taylor: E3 first. Notes: Dell 5440 laptop, and outcome success.

Approval

See Approvals and manual steps.

Client

Microsoft, PSA and On Prem steps act on the run’s client, ctx.client. Set one first when the trigger doesn’t. To change a client variable, use Set Client Variable in the Triggr group. Find the ID with Search For Client (Triggr), then pass {{ ctx.steps['Find client'].clients[0].id }}:
The Find client Search For Client step: Property Variable, Variable Name haloId, Value ctx.params.haloClientId as a template, Match Type Exact.
The Set Client By ID step with Client ID set to the first client id from the Find client step.

Communication

Send Email sends from app@triggr-app.com, or from your own address with a sending profile. To takes comma-separated addresses, each emailed separately. Body accepts HTML. Output: status, recipients, from.
The Send Email step: Sending Profile not selected, To it@example.com, Subject New request from the client name, a Body using the summary and the ticketing step's status, and an Attachments field with Pick from library.
Attachments: up to 10 files, 25 MB in total (22 MB without a sending profile).

Data and Database

The Execute SQL step: Database not selected and a SQL Query selecting name and backup_status from backups where client equals the client name template in single quotes.
data lists the rows with every value as text; value is the number from a single-row count, sum, avg, min, max or total column. Templates go into the SQL as plain text, so quote text values.

Network

The Send to ticketing tool HTTP Request step: Method POST, URL https://api.example.com/v1/tickets, header X-Source triggr, Body Type JSON, a JSON body using the json filter, and unticked Allow Non-2xx Status and Allow Insecure TLS.
A JSON reply arrives parsed in body. A status outside 200–299 fails the step unless Allow Non-2xx Status is ticked; then branch on status. Requests time out after 30 seconds.

On Prem

These run on a client’s network through the desktop agent, using scripts from On-Prem > Scripts.
The Execute PowerShell (Timeout) step: Script not selected, Parameters JSON with UserPrincipalName set from the email field with the json filter, Timeout (seconds) 300 and an empty Client ID.
Parameters must be valid JSON. Execute PowerShell waits for the agent indefinitely, so prefer Execute PowerShell (Timeout) (30 to 86,400 seconds); timing out stops the wait, not the script.

Microsoft

Each step acts on the run’s client’s Microsoft 365 tenant. Connection Type Automatic uses the org variable defaultMicrosoftConnection; or choose CIPP, Microsoft Graph (GDAP) or Microsoft Graph (SAM). User Identifier takes a UPN or object ID.

PSA

These use your default PSA, the org variable defaultPSA (halo, connectwise or autotask), set with Setup Wizard on Settings > Org Variables.

Triggr

Utilities

Other groups

Integrations

Below the Integrations divider, every integration has a group of its actions. Set the integration up before you use one; see the integration guides. An action outputs statusCode, headers and body (the other system’s reply).

FAQ

The other system refused the call. Tick Allow Non-2xx Status and branch on status, or use Generic Integration Action for a connected tool so Triggr signs the request.
No default PSA is set. Run Setup Wizard on Settings > Org Variables and choose your PSA.
A step is waiting: an approval, a manual step, a delay, an awaited workflow or an agent. See Stop a stuck run.
For other messages, see Common errors.