Documentationbreadcrumb arrow Grafana Cloudbreadcrumb arrow Platformbreadcrumb arrow Workflowsbreadcrumb arrow Step and trigger types reference
Public preview Grafana Cloud
Last reviewed: October 13, 2026

Step and trigger types reference

Note

Grafana Workflows is currently in public preview. Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.

This reference lists the step types and trigger types you can use in Grafana Workflows, with their inputs, outputs, and configuration.

Step types

Steps are the individual actions in a workflow. They execute in order from first to last. Each step has a type, an ID, and a set of inputs. Every step produces outputs that later steps can reference through the workflow context using CEL expressions, for example, ${steps['my-step'].outputs.responseBody}. Step IDs that contain a hyphen need bracket notation, as in this example, because CEL reads a hyphen after a dot as subtraction.

For details on connecting steps with the workflow context, refer to Use CEL expressions.

General

General steps make HTTP calls and run code.

HTTP call (http.call)

Send an HTTP request to a public URL and return the response status code, body, and headers. Supports bearer token and basic authentication using secrets.

The step only calls public addresses. Requests to private or internal network addresses are blocked. Each request times out after 30 seconds and follows up to 5 redirects. The request body can be up to 1 MiB. A response body longer than 1 MiB is truncated to 1 MiB.

A 4xx or 5xx response doesn’t fail the step. To act on an error response, check responseCode in a later step, for example, in a filter step.

Inputs:

NameTypeRequiredDescription
methodstringYesHTTP method: GET, POST, PUT, PATCH, DELETE, HEAD, or OPTIONS.
urlstringYesThe request URL.
bodystringNoThe request body.
headersarray (string)NoRequest headers as a JSON array of "Key: Value" strings, for example, ["Accept: application/json"].
authMethodstringNoAuthentication method: bearer or basic.
authSecretsecretStringNoSecret for bearer token authentication. Refer to Manage secrets.
authUsernamesecretStringNoUsername for basic authentication. Refer to Manage secrets.
authPasswordsecretStringNoPassword for basic authentication. Refer to Manage secrets.

Outputs:

NameTypeDescription
responseCodeintThe HTTP response status code.
responseBodystringThe response body.
responseHeadersarray (string)The response headers.

Execute code (code.execute)

Run sandboxed code inside a workflow. Your code reads the workflow context from the context variable and the named arguments from the args variable. Code runs in an isolated sandbox with no network access and a temporary filesystem.

Currently supported languages: Python.

Inputs:

NameTypeRequiredDescription
languagestringYesProgramming language to execute. Currently supported: python.
codestringYesSource code to execute in the sandbox. Read the workflow context with context.get("<VARIABLE>") and the named arguments with args.get("<NAME>").
argsobjectNoNamed arguments as a JSON object, available in your code as the args variable (a dict in Python, empty when not set). Use ${...} expressions to pass workflow data and wrap each one in quotes to receive a string, for example, {"id": "${inputs.data.incidentID}"}.

Outputs:

NameTypeDescription
stdoutstringStandard output captured from execution.
stderrstringStandard error output captured from execution.
successboolWhether execution completed without error.
errorstringError message if execution failed.

Injected variables:

Two variables are automatically available inside the sandbox:

VariableTypeDescription
contextdictThe full workflow context, including trigger inputs, previous step outputs, and resolved resources. Mirrors the data available to CEL expressions. Secrets are never included.
argsdictThe evaluated JSON object from the step’s args parameter. Empty dict ({}) when args isn’t set.

The context variable has the following structure:

JSON
{
  "inputs": { },
  "steps": {
    "step-id": {
      "outputs": { }
    }
  },
  "resources": {
    "incident": { },
    "alertgroup": { }
  }
}
  • context["inputs"] contains the trigger event data or manual test input.
  • context["steps"] contains outputs from all previously executed steps, keyed by step ID.
  • context["resources"] contains loaded resource data (incidents, alert groups).

Example: process data from a previous step

This example shows a workflow where a code step reads the response from an earlier HTTP call, processes it, and outputs structured JSON for a downstream filter step:

YAML
steps:
  - id: fetch-status
    type: http.call
    name: "Get service status"
    inputs:
      method: "GET"
      url: "https://api.example.com/status"

  - id: analyze
    type: code.execute
    name: "Analyze status response"
    inputs:
      language: python
      code: |
        import json

        response = context["steps"]["fetch-status"]["outputs"]["responseBody"]
        data = json.loads(response)

        unhealthy = [s for s in data.get("services", []) if s["status"] != "healthy"]
        threshold = args.get("threshold", 1)

        print(json.dumps({
            "unhealthy_count": len(unhealthy),
            "unhealthy_services": [s["name"] for s in unhealthy],
            "should_alert": len(unhealthy) >= threshold,
        }))
      args: '{"threshold": 1}'

  - id: check-alert
    type: filter
    name: "Alert if threshold exceeded"
    inputs:
      condition: "json_parse(steps['analyze'].outputs.stdout).should_alert == true"

Example: scheduled check

YAML
steps:
  - id: run-check
    type: code.execute
    inputs:
      language: python
      code: |
        has_inputs = len(context.get("inputs", {})) > 0
        print(f"Scheduled run, has trigger inputs: {has_inputs}")

Later steps reference code output using CEL expressions, for example, ${steps['analyze'].outputs.stdout}.

Flow control

Flow control steps transform data, stop runs, branch, and pause.

Transform (transform)

Evaluate a template string with embedded CEL expressions to generate dynamic content. Use ${expression} syntax to embed expressions that reference workflow inputs and previous step outputs.

Inputs:

NameTypeRequiredDescription
templatestringYesA template string with embedded ${expression} placeholders.

Outputs:

NameTypeDescription
resultstringThe rendered template string.

Filter (filter)

Gate workflow execution on a CEL condition. If the condition evaluates to false, the workflow stops and no further steps execute.

Inputs:

NameTypeRequiredDescription
conditionstringYesA CEL expression that evaluates to a boolean.
failOnExitboolNoWhen true, the workflow fails instead of exiting silently when the condition is false.

Outputs:

NameTypeDescription
matchedbooltrue if the condition matched, false otherwise.

Switch (switch)

Conditionally execute different sets of steps based on CEL expressions. Each branch has a condition and its own list of steps. The first branch whose condition evaluates to true runs. Include a default branch with no condition as a fallback.

Branches:

A switch step uses a branches array instead of inputs. Each branch has a condition (a CEL expression) and a steps list. Omit the condition to mark a branch as the default fallback.

YAML
- id: route-by-severity
  type: switch
  branches:
    - condition: "resources.incident.event.severity.matches('(?i)^critical$')"
      steps:
        - id: page-oncall
          type: irm.page-team
          inputs:
            teamIdentifier: "platform"
            identifierType: "name"
    - steps:
        - id: post-update
          type: slack.message.post
          inputs:
            channelID: "C0123456789"
            messageText: "Non-critical incident received"

Outputs:

NameTypeDescription
matchedCasestringThe matched condition string, default for the default branch, or empty when no match.
matchedBranchIndexintThe zero-based index of the matched branch. Returns -1 when no branch matched.
errorstringAn error message if evaluation failed. Empty on success.

Wait (wait)

Pause workflow execution for a specified number of seconds.

Inputs:

NameTypeRequiredDescription
secondsintYesThe number of seconds to wait, from 0 to 604800 (7 days).

Outputs:

NameTypeDescription
waitedSecondsintThe number of seconds the step waited.

Incident

Incident steps operate on incidents in Grafana IRM. You can pass incident IDs directly or reference them from incident resources loaded into the workflow context. For details on loading incident data, refer to Load incident data.

Create incident (incident.create)

Create a new IRM incident with a title, severity, and optional labels.

Inputs:

NameTypeRequiredDescription
titlestringYesTitle of the incident.
statusstringNoIncident status: active or resolved.
severitystringYesSeverity of the incident: pending, critical, major, or minor.
labelsarray (object)NoLabels to attach to the incident. Each label has a key and label field.

Outputs:

NameTypeDescription
successbooltrue if the incident was created successfully.
incidentIDstringThe identifier of the created incident.
incidentURLstringThe full URL of the incident overview page, for use in links.
errorstringAn error message if the operation failed.

Add participant to incident (incident.add-participant)

Add a user to an IRM incident with a specific role.

Inputs:

NameTypeRequiredDescription
incidentIDstringYesThe incident ID.
userIDstringYesEmail address of the participant.
rolestringNoThe participant role. Built-in roles are commander, investigator, and observer. Custom roles configured for your stack are also accepted. Defaults to observer.

Outputs:

NameTypeDescription
successbooltrue if the participant was added successfully.
didChangebooltrue if the participant was newly added.
incidentIDstringThe incident ID.
errorstringAn error message if the operation failed.

Set incident field (incident.set-field)

Update a field on an IRM incident, including title, status, severity, or role assignments.

Inputs:

NameTypeRequiredDescription
incidentIDstringYesThe incident ID.
fieldstringYesThe field to update. One of title, status, severity, role.
valuestringYesThe new value for the field.
userIDstringNoRequired when field is role. Email address of the participant.

Outputs:

NameTypeDescription
successbooltrue if the field was updated successfully.
incidentIDstringThe incident ID.
errorstringAn error message if the operation failed.

Create incident Slack channel (incident.slack-channel.create)

Create a Slack channel for an IRM incident.

Inputs:

NameTypeRequiredDescription
incidentIDstringYesThe incident ID.
channelNamestringYesDesired Slack channel name. Workflows adjusts the name to follow Slack channel naming rules.
postUpdatesboolNoSet to true to post incident activity updates to the created channel.
inviteUsersboolNoSet to true to invite users with active incident roles to the created channel.

Outputs:

NameTypeDescription
successbooltrue if the channel was created successfully.
channelIDstringThe created Slack channel ID.
channelNamestringThe created Slack channel name returned by IRM.
errorstringAn error message if the operation failed.

Add note to incident (incident.add-note)

Post a note to an IRM incident’s timeline. Use this for routine progress notes. Use incident.add-key-update for significant milestones.

Inputs:

NameTypeRequiredDescription
incidentIDstringYesThe incident ID to update, for example, INC-123.
messagestringYesNote content to post. Supports Markdown formatting.

Outputs:

NameTypeDescription
successbooltrue if the note was posted successfully.
activityItemIDstringThe identifier of the created activity item.
incidentIDstringThe incident ID.
errorstringAn error message if the operation failed.

Add key update to incident (incident.add-key-update)

Post a key update (a significant milestone) to an IRM incident. Key updates appear as headline entries on the incident timeline and stakeholder-facing views.

Inputs:

NameTypeRequiredDescription
incidentIDstringYesThe incident ID to update, for example, INC-123.
messagestringYesUpdate content to post.
titlestringNoShort summary of the update.
scopestringNoAudience or visibility of the key update: internal, public, or private. Defaults to internal.

Outputs:

NameTypeDescription
successbooltrue if the key update was posted successfully.
keyUpdateIDstringThe identifier of the created key update.
incidentIDstringThe incident ID.
errorstringAn error message if the operation failed.

Slack

Slack steps manage channels and send messages in your connected Slack workspace.

Create Slack channel (slack.channel.create)

Create a new public or private Slack channel.

Inputs:

NameTypeRequiredDescription
channelNamestringYesThe name for the new channel.
isPrivateboolNoSet to true to create a private channel.

Outputs:

NameTypeDescription
channelIDstringThe Slack channel ID.
channelNamestringThe final channel name assigned by Slack.

Post message to Slack channel (slack.message.post)

Post a message to a Slack channel. Supports plain text, Block Kit blocks for rich formatting, attachments, and threaded replies.

Inputs:

NameTypeRequiredDescription
channelIDstringYesThe Slack channel ID to post to.
messageTextstringNoPlain text message content. Required unless you set blocks or attachments.
blocksstringNoA JSON string of Slack Block Kit blocks for rich formatting.
threadTsstringNoThe timestamp of a parent message to reply in a thread.
replyBroadcastboolNoSet to true to also post the reply to the channel. Requires threadTs.
attachmentsstringNoA JSON array string of Slack message attachments.

Outputs:

NameTypeDescription
messageIDstringThe posted message ID.

Archive Slack channel (slack.channel.archive)

Archive a Slack channel.

Inputs:

NameTypeRequiredDescription
channelIDstringYesThe Slack channel ID to archive.

Outputs:

NameTypeDescription
successbooltrue if the channel was archived successfully.

Add bookmark to Slack channel (slack.channel.add-bookmark)

Add a bookmark link to a Slack channel.

Inputs:

NameTypeRequiredDescription
channelIDstringYesThe Slack channel ID.
bookmarkTitlestringYesThe title for the bookmark.
bookmarkUrlstringYesThe URL for the bookmark.
bookmarkEmojistringNoAn emoji to display with the bookmark.

Outputs:

NameTypeDescription
bookmarkIDstringThe ID of the created bookmark.

Add users to Slack channel (slack.channel.add-users)

Invite users to an existing Slack channel. You can identify each user by their Slack user ID or their email address, and you can mix both in one list. Workflows looks up each email address in Slack. If an email address doesn’t match a Slack user, the step fails and the error lists the unmatched addresses. If you set users with an expression and a step output already contains a list, wrap it in json_stringify(). For example, ${json_stringify(steps.oncall.outputs.users.map(u, u.email))} uses the email addresses from a step with the ID oncall, such as Get on-call users from a schedule.

Inputs:

NameTypeRequiredDescription
channelIDstringYesThe Slack channel ID.
usersarray (string)YesA list of Slack user IDs or email addresses to invite.

Outputs:

NameTypeDescription
successbooltrue if the users were added successfully.

Send Slack direct message (slack.direct-message.send)

Send a direct message to up to 8 Slack users. If you select more than one user, everyone receives the same message in a single group direct message. You can identify each user by their Slack user ID or their email address, and you can mix both in one list. Workflows looks up each email address in Slack. If an email address doesn’t match a Slack user, the step fails and the error lists the unmatched addresses. If you set users with an expression and a step output already contains a list, wrap it in json_stringify(). For example, ${json_stringify(steps.oncall.outputs.users.map(u, u.email))} uses the email addresses from a step with the ID oncall, such as Get on-call users from a schedule.

Inputs:

NameTypeRequiredDescription
usersarray (string)YesA list of up to 8 Slack user IDs or email addresses to message.
messagestringYesPlain text message content.

Outputs:

NameTypeDescription
channelIDstringThe Slack conversation ID of the direct message.
messageIDstringThe sent message ID.

IRM

IRM steps page users and teams, invite users to incidents and alert groups, and look up who’s on call.

Page user via IRM (irm.page-user)

Create an IRM escalation to page a user by email address.

Inputs:

NameTypeRequiredDescription
userIDstringYesEmail address of the user to page (for example, alice@example.com).
importantboolNoSet to true to mark the escalation as important. Defaults to false.
messagestringNoA message to attach to the escalation.

Outputs:

NameTypeDescription
oncallUserIDstringThe resolved IRM user ID used in the escalation.
escalationIDstringThe created escalation ID.
statestringThe escalation state returned by IRM, for example, triggered.
alertGroupURLstringA permalink to the related IRM alert group, if returned. Otherwise empty.
errorstringAn error message if the operation failed. Empty on success.

Page team via IRM (irm.page-team)

Create an IRM escalation to page an entire team. You can also associate the escalation with an incident, which invites the team to join it, and add a message.

Inputs:

NameTypeRequiredDescription
teamIdentifierstringYesThe team identifier value, interpreted according to identifierType.
identifierTypestringNoIdentifier mode: id (default, IRM team ID) or name (exact team name match).
incidentIDstringNoAn incident ID to associate with the escalation. The team is invited to join the incident.
importantboolNoSet to true to mark the escalation as important. Defaults to false.
messagestringNoA message to attach to the escalation.

Outputs:

NameTypeDescription
escalationIDstringThe created escalation ID.
statestringThe escalation state returned by IRM, for example, triggered.
alertGroupURLstringA permalink to the related IRM alert group, if returned. Otherwise empty.
errorstringAn error message if the operation failed. Empty on success.

Invite user to incident (irm.invite-user-to-incident)

Create an IRM escalation to invite a user to an incident.

Inputs:

NameTypeRequiredDescription
userIDstringYesEmail address of the user to invite (for example, alice@example.com).
incidentIDstringYesID of the incident to associate with the escalation.
importantboolNoSet to true to mark the escalation as important. Defaults to false.
messagestringNoA message to attach to the escalation.

Outputs:

NameTypeDescription
oncallUserIDstringThe resolved IRM user ID used in the escalation.
escalationIDstringThe created escalation ID.
statestringThe escalation state returned by IRM, for example, triggered.
alertGroupURLstringA permalink to the related alert group, if returned. Otherwise empty.
errorstringAn error message if the operation failed. Empty on success.

Invite user to alert group (irm.invite-user-to-alert-group)

Create an IRM escalation to invite a user to an alert group.

Inputs:

NameTypeRequiredDescription
userIDstringYesEmail address of the user to invite (for example, alice@example.com).
alertGroupIDstringYesID of the alert group to associate with the escalation.
importantboolNoSet to true to mark the escalation as important. Defaults to false.

Outputs:

NameTypeDescription
oncallUserIDstringThe resolved IRM user ID used in the escalation.
escalationIDstringThe created escalation ID.
statestringThe escalation state returned by IRM, for example, triggered.
alertGroupURLstringA permalink to the related alert group, if returned. Otherwise empty.
errorstringAn error message if the operation failed. Empty on success.

Get on-call users from a schedule (irm.schedule-current-oncall)

Look up the users currently on call for an IRM schedule. Use the result in later paging or notification steps.

Inputs:

NameTypeRequiredDescription
scheduleIdentifierstringYesThe schedule identifier value, interpreted according to identifierType.
identifierTypestringNoIdentifier mode: id (default, IRM schedule ID) or name (exact name match).

Outputs:

NameTypeDescription
scheduleIDstringThe resolved IRM schedule ID used for the lookup.
countintThe number of on-call users returned. 0 when no one is on-call.
usersarrayThe list of on-call user objects, including id, email, username, slack, and more.
shiftsarrayThe list of current shift entries, including shift_start, shift_end, and users.
errorstringAn error message if the operation failed. Empty on success.

Get on-call users for a team (irm.team-current-oncall)

Look up the users currently on call for a team, using the team’s direct paging integration. Use this step when you want to notify whoever is on-call for a team without specifying a schedule.

Inputs:

NameTypeRequiredDescription
teamIdentifierstringYesThe team identifier value, interpreted according to identifierType.
identifierTypestringNoIdentifier mode: id (default, IRM team ID) or name (exact name match).
routestringNoAn optional route ID for the team’s direct paging integration. If omitted, the default route is used.

Outputs:

NameTypeDescription
teamIDstringThe resolved IRM team ID used for the lookup.
countintThe number of on-call users returned. 0 when no one is on-call.
usersarrayThe list of on-call user objects, including id, email, username, slack, and more.
shiftsarrayThe list of current shift entries, including shift_start, shift_end, and users.
errorstringAn error message if the operation failed. Empty on success.

Microsoft Teams

Steps that post messages to or create resources in Microsoft Teams.

Prerequisites:

Before using any Microsoft Teams step, install the Microsoft Teams app through Grafana IRM integrations and set up at least one hook for it. This connects your Grafana Cloud stack to your Microsoft Teams tenant. After the connection exists, you can turn off or remove the hook.

The msteams.meeting.create step needs the Calendars.ReadWrite application permission on the app registration used by your Microsoft Teams integration, with admin consent granted. New installs of the Microsoft Teams app request this permission and grant consent automatically, so you only need to add it if you installed the app before Workflows supported msteams.meeting.create. In that case, add the permission in the app registration’s API permissions page and grant admin consent for it. No additional Teams-specific admin setup is required.

Create Teams meeting (msteams.meeting.create)

Create a Microsoft Teams online meeting on behalf of an organizer. The meeting is added to the organizer’s Outlook calendar. Requires the Calendars.ReadWrite Microsoft Entra ID application permission. Refer to the Prerequisites above.

The calendar event shows the organizer as free, so it doesn’t block their time or conflict with other meetings.

To compute startDateTime or endDateTime relative to another timestamp, use the CEL timestamp() and duration() functions, for example, ${timestamp(inputs.time) + duration('1h')}. Refer to Use CEL expressions.

Inputs:

NameTypeRequiredDescription
organizerEmailstringYesEmail address of the meeting organizer, matched against either their mail or userPrincipalName attribute in Microsoft Entra. The meeting is created on their behalf.
subjectstringYesMeeting subject.
startDateTimestringYesMeeting start time, RFC 3339 format, for example, 2026-06-11T10:00:00Z. Any timezone offset is accepted and converted to UTC before the meeting is created.
endDateTimestringNoMeeting end time, RFC 3339 format, converted to UTC the same way as startDateTime. Must be after startDateTime. Defaults to one hour after startDateTime if not set.

Outputs:

NameTypeDescription
meetingIDstringCalendar event ID for the created meeting.
joinURLstringJoin link to share with meeting participants.

Post message to Teams channel (msteams.message.post)

Post a text message or Adaptive Card to a Microsoft Teams channel. At least one of messageText or adaptiveCard is required. To reply in a thread, pass conversationID and threadActivityID from a previous msteams.message.post step.

Inputs:

NameTypeRequiredDescription
teamIDstringYesMicrosoft Teams team ID. Use the team picker or a CEL expression.
channelIDstringYesMicrosoft Teams channel ID. The channel picker lists the channels in the selected team. Use the channel picker or a CEL expression.
messageTextstringNoPlain text message body. Required unless adaptiveCard is provided. When both are set, text is sent with the Adaptive Card.
adaptiveCardstringNoJSON string of an Adaptive Card object (the card body). Required unless messageText is provided.
conversationIDstringNoConversation ID from a prior msteams.message.post step, for example, ${steps['<STEP_ID>'].outputs.conversationID}. Required with threadActivityID.
threadActivityIDstringNoActivity ID of the parent message to reply to, for example, ${steps['<STEP_ID>'].outputs.activityID}. Required with conversationID.

Outputs:

NameTypeDescription
conversationIDstringConversation ID for this message. Pass as conversationID on a later msteams.message.post step to reply in the same thread.
activityIDstringActivity ID of the posted message. Pass as threadActivityID on a later msteams.message.post step to reply to this message.

Grafana Assistant

Steps that send a prompt to the Grafana Assistant and return structured output.

Ask Assistant (assistant.prompt)

Send a prompt to the assistant and receive structured JSON output conforming to a provided schema. If the assistant’s response doesn’t parse as JSON or doesn’t validate against outputSchema, the step sends a follow-up prompt asking the assistant to correct its response. If the chat request itself fails, the step sends the same prompt again. Both kinds of retry count toward maxRetries.

When the retries run out, the step fails and the run stops. The run error includes the last error and the beginning of the assistant’s last response.

Prerequisites:

Grafana Assistant must be in use on your stack. The person whose permissions the run uses needs the grafana-assistant-app.chats:access permission. For details, refer to Manage access.

Inputs:

NameTypeRequiredDescription
promptstringYesThe prompt to send to the assistant. Supports a CEL expression.
outputSchemastringNoJSON Schema (draft-07 through 2020-12) describing the expected output structure. Defaults to any JSON object.
maxRetriesintNoMaximum number of retries. Defaults to 3, maximum 10.

Outputs:

NameTypeDescription
resultobjectThe validated JSON object from the assistant.
rawTextstringThe raw text response before parsing, for debugging.
attemptsintNumber of attempts taken. 1 means success on the first try.
validationErrorsstringEmpty on success. Outputs aren’t saved for a failed step.

Trigger types

Triggers define when a workflow starts. You configure triggers in the startWhen section of a workflow definition. For details on configuring triggers, refer to Configure triggers.

Event trigger

An event trigger starts a workflow when an incoming event matches a regular expression pattern. Events are named according to the pattern {app}.{resource-type}.{event-type}, for example, grafana_irm_app.incident.updated.

You define event triggers using matching rules. Each rule contains a regular expression that’s tested against the event name. If any rule matches, the workflow starts.

Configuration:

FieldTypeRequiredDescription
eventNameRegexstringYesA regular expression tested against the event name. The workflow starts if the pattern matches.

Example:

YAML
startWhen:
  matchingRules:
    - eventNameRegex: "grafana_irm_app\\.incident\\.updated"
    - eventNameRegex: "grafana_irm_app\\.alertgroup\\.updated"

Available event sources

The following table lists the event sources that can trigger workflows:

AppResourceEventExample event nameDescription
grafana_irm_appincidentupdatedgrafana_irm_app.incident.updatedFires any time an incident is created or updated.
grafana_irm_appalertgroupupdatedgrafana_irm_app.alertgroup.updatedFires any time an alert group is created or updated.
grafana_irm_appscheduleupdatedgrafana_irm_app.schedule.updatedFires when the current on-call users change.

Schedule trigger

A schedule trigger starts a workflow at recurring times using a cron expression. Schedules use the standard five-field Unix cron format. They run in UTC unless the expression starts with CRON_TZ=<ZONE>. For details, refer to Run a schedule in a specific timezone.

Configuration:

FieldTypeRequiredDescription
(schedule)stringYesA five-field Unix cron expression, for example, 0 9 * * 1-5. Runs in UTC unless prefixed with CRON_TZ=<ZONE>.

Example:

YAML
startWhen:
  schedules:
    - "0 9 * * 1-5"
    - "0 0 1 * *"

A workflow can have multiple schedules. Each schedule triggers the workflow independently.

Cron field reference:

FieldRangeSpecial characters
Minute0-59*, ,, -, /
Hour0-23*, ,, -, /
Day of month1-31*, ,, -, /
Month1-12*, ,, -, /
Day of week0-6 (0 is Sunday)*, ,, -, /

Manual trigger

A manual trigger starts a workflow from the editor on demand. You can trigger any workflow manually, whether or not it has event or schedule triggers.

To trigger a workflow manually in the editor, click Run and provide event data in CloudEvents format in the Trigger Workflow dialog box. For details, refer to Configure triggers.

Manual-only workflows have an empty startWhen section:

YAML
startWhen:
  matchingRules: []
  schedules: []

Combine triggers

A workflow can have both event and schedule triggers. The workflow starts when any matching rule matches an incoming event or when any schedule fires.

YAML
startWhen:
  matchingRules:
    - eventNameRegex: "grafana_irm_app\\.incident\\.updated"
  schedules:
    - "0 9 * * 1-5"