Create Actions with Triggers

Triggers let you create actions in your app. Here are some common uses of a trigger:

  • Send a Slack alert to the management team if the severity level is critical.
  • Invite different people to an activity based on a select dropdown.
  • Use a different attribute than conclusion to close an activity.
  • Send emails from your app.
  • Send SMS (mobile text) to any mobile phone.

Sending email and SMS is often used for escalation, and to communicate with people outside your Slack workspace.

Notice about triggers
Triggers are not supported in the app builder and require that you use the code editor.

A trigger is associated with an attribute. The trigger can fire when the attribute state changes, for example, when a user selects an option from a select dropdown menu.

Here is an example that invites different people to resolve an incident, based on the location:

attributes:
  - name: location
    type: select
    label: Office location
    options:
      - name: uk
        label: ":flag-gb: London"
        trigger:
          owner: "@tina"
          members: "@uk-sre-team"
          alert: "#incidents-uk"
      - name: us
        label: ":flag-us: Washington DC"
        trigger:
          owner: "@dave"
          members: "@us-sre-team"
          alert: "#incidents-us"

These members and alert settings will be appended to the app’s member and alert settings (not replace them).

Notice how the triggers are associated with the select options. You can also associate the trigger with an attribute. Whenever someone updates the input attribute, a message will be sent to a Slack channel and a user.

attributes:
  - name: input
    type: text
    label: Updating this field will send a message
    trigger:
      message:
        to: "#log, @fred"
        body: "Update from my app:\n${input}"

Here we use macro substitution to insert the attribute’s text value into the message.

Trigger actions

A trigger can either be associated with an attribute or an option in a select menu. It is activated when the attribute changes, or when the select menu is chosen.

These are the possible actions a trigger can perform:

  • owner: Change the owner of the activity.
  • members: Add people to the member list.
  • alert: Add people to the alert list.
  • conclude: Conclude (and close) the activity.
  • setAttribute: Set an attribute value.
  • message: Send a Slack message to anyone on the team, see Slack messages.
  • email: Email an external user, see email.
  • sms: Send SMS (mobile text) to mobile phones, see sms.

In fact, the trigger can perform all of these actions at the same time. Keep in mind that alerts are only sent when an activity is created.

The examples above illustrate the three first actions, so let’s take a look at setting an attribute value and concluding the activity.

Here is a trigger that both sets an attribute value and closes the activity:

attributes:
  name: decision
  editors: "${superusers}"
  type: select
  label: Decision
  visible: edit,conclude
  options:
    - name: yes,
      label: ":thumbsup: Yes"
    - name: no
      label: ":thumbsdown: No"
  trigger:
    conclude: true
    setAttribute:
      name: conclusion
      value: "The decision was ${decision.label}"

The setAttribute action sets an attribute to a specified value. In the example above, the conclusion will be set to “The decision was 👍 Yes” or “The decision was 👎 No”, based on the decision.

This is a convenient pattern when you want to use a different attribute to conclude an activity. In this case we use the select dropdown (decision) to conclude the activity.

Here we also set editors to restrict who can make a decision. Define superusers to authorize certain team members to make decisions.

Cascading set-attribute triggers will not work:
What if you have a chain of set-attribute triggers in a loop, so that a => b => c => a. Would an infinite loop of triggers cause the melt-down of a Google datacenter? Cascading triggers may lead to bad outcomes, which is why Conclude detects and stops them.

Button-based triggers

Button triggers are convenient for implementing single-click actions. Here’s a useful pattern that sets the conclusion and closes the activity when the user clicks the Yes or No button.

attributes:
  - name: approve
    type: button
    label: Yes
    style: primary
    visible: edit,conclude
    trigger:
      conclude: true
      setAttribute:
        name: conclusion
        value: Approved
  - name: decline
    type: button
    label: No
    style: danger
    visible: edit,conclude
    trigger:
      conclude: true
      setAttribute:
        name: conclusion
        value: Denied

Conditional triggers

You can specify a couple of conditions:

  • ifMatch: Activate a trigger if a regular expression matches the attribute value.
  • ifNotMatch: Activate a trigger if the expression does not match the value.

Conclude uses golang-style regular expressions.

If both conditions are specified, the trigger will fire if both conditions are satisfied (not just one of them).

attributes:
  - name: incident,
    type: text,
    label: Describe the incident,
    trigger:
      ifMatch: (?i)critical
      message:
        to: "@incident-management"
        body: "Urgent update about incident in ${channel}"

This code will send a Slack message to a user group if somebody creates an activity where the incident description contains the “critical”. The special code (?i) creates a case-insensitive regular expression, and will match “critical” and “CRITical”.

Connect. Collaborate. Conclude