> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rootly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom Workflows

> Build automated Slack actions in Rootly with triggers, conditions, and 10+ actions including channel creation, messaging, bookmarks, reminders, and renaming.

Custom workflows give you full control over Slack automation. Create channels, send messages, invite users, and more based on triggers and conditions you define. If you're new to workflows, see the [Workflows](/workflows/workflows) documentation first.

***

## Available Actions

| Action                                              | What It Does                              |
| --------------------------------------------------- | ----------------------------------------- |
| [Create Slack Channel](#create-slack-channel)       | Create a dedicated incident channel       |
| [Send Slack Message](#send-slack-message)           | Post a message to channels/users          |
| [Send Slack Reminder](#send-slack-reminder)         | Send recurring messages with snooze/pause |
| [Send Slack Blocks](#send-slack-blocks)             | Send rich Block Kit messages              |
| [Invite to Slack Channel](#invite-to-slack-channel) | Add users/groups to a channel             |
| [Rename Slack Channel](#rename-slack-channel)       | Change channel name dynamically           |
| [Update Channel Topic](#update-channel-topic)       | Update the channel topic                  |
| [Add Slack Bookmark](#add-slack-bookmark)           | Pin links to channel bookmark bar         |
| [Archive Slack Channel](#archive-slack-channel)     | Archive inactive channels                 |
| [Change Channel Privacy](#change-channel-privacy)   | Switch between public/private             |

***

## Create a Workflow

<Steps>
  <Step title="Open Workflows">
    Go to **Rootly → Workflows → Create Workflow**.

    <img alt="Rootly workflows page" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-1.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=c0409f09a45b4653a1a0bfbd0dc8cc89" width="847" height="175" data-path="images/integrations/slack/workflows/custom-workflows/image-1.png" />

    <img alt="Create workflow button" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-2.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=c57062238967f931002fe8141aef4cbf" width="1365" height="630" data-path="images/integrations/slack/workflows/custom-workflows/image-2.png" />
  </Step>

  <Step title="Choose Workflow Type">
    Select **Incident**, **Retrospective**, or **Pulse** depending on when you want the workflow to run.

    <img alt="Workflow type selection" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-3.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=025e075bd3bc9a582f5ea05170325658" width="1165" height="578" data-path="images/integrations/slack/workflows/custom-workflows/image-3.png" />
  </Step>

  <Step title="Configure Triggers">
    Triggers define when the workflow runs.

    <img alt="Workflow trigger configuration" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-triggers.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=5006936e835d8ecebdb55a79e15c1225" width="621" height="305" data-path="images/integrations/slack/workflows/custom-workflows/image-triggers.png" />

    | Trigger                         | When It Fires                           |
    | ------------------------------- | --------------------------------------- |
    | **Incident Created**            | New incident declared                   |
    | **Incident Updated**            | Fields like severity or status change   |
    | **Incident Status Changed**     | Status moves (e.g., Active → Mitigated) |
    | **Incident Commander Assigned** | Someone takes ownership                 |
    | **Manual Trigger**              | Run on-demand from Slack or web UI      |
  </Step>

  <Step title="Add Conditions (Optional)">
    Conditions filter when the workflow should actually execute.

    <img alt="Workflow conditions panel" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-condition.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=164d200e342a7e094efe5005a0300ec0" width="626" height="334" data-path="images/integrations/slack/workflows/custom-workflows/image-condition.png" />

    **Common conditions:**

    * **Severity** — Only for SEV-1 or SEV-2
    * **Team/Service** — Only for specific teams
    * **Incident Type** — Only for actual incidents (not tests)
    * **Environment** — Only for production
  </Step>

  <Step title="Add Actions">
    Click **Add Action** and search for **Slack**.

    <img alt="Add action button" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-4.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=0fb23314ab525a038f41f59416723322" width="677" height="221" data-path="images/integrations/slack/workflows/custom-workflows/image-4.png" />

    <img alt="Search Slack actions" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-5.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=7733ed6115ea025cc7ae4925215daae7" width="859" height="432" data-path="images/integrations/slack/workflows/custom-workflows/image-5.png" />

    Select one or more Slack actions. Each action is configured independently.
  </Step>
</Steps>

***

## Action Reference

<AccordionGroup>
  <Accordion title="Create Slack Channel" icon="hashtag">
    Creates a dedicated channel for the incident.

    <img alt="Create Slack Channel action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-6.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=2bedb13d6c555911c9ab2f2e6bdf1cbd" width="894" height="579" data-path="images/integrations/slack/workflows/custom-workflows/image-6.png" />

    <ParamField body="Workspace" type="string" required>
      Which Slack workspace to create the channel in.
    </ParamField>

    <ParamField body="Title" type="string" required>
      Channel name. Supports [Liquid variables](/liquid/incident-variables).

      Example: `incident-{{ incident.sequential_id }}-{{ incident.title }}`
    </ParamField>

    <ParamField body="Private" type="enum">
      Controls channel visibility:

      * `auto` — matches incident privacy (private incident → private channel)
      * `true` — always private
      * `false` — always public
    </ParamField>

    <Note>
      If the incident already has a Slack channel, this action will skip channel creation to avoid duplicates.
    </Note>
  </Accordion>

  <Accordion title="Send Slack Message" icon="message">
    Posts a message to channels, users, or user groups.

    <img alt="Send Slack Message action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/send-slack-message.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=6820f5395cffa9f782ca28dc45a625da" width="719" height="1340" data-path="images/integrations/slack/workflows/custom-workflows/send-slack-message.png" />

    <ParamField body="Channels" type="string">
      Target channels. Use `{{ incident.slack_channel_id }}` for the incident channel. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Slack Users" type="string">
      Individual users to message directly.
    </ParamField>

    <ParamField body="Slack User Groups" type="string">
      Groups to notify — all members receive the message.
    </ParamField>

    <ParamField body="Text" type="string" required>
      Message content. Supports [Liquid variables](/liquid/incident-variables) and [Slack markdown](https://api.slack.com/reference/surfaces/formatting).
    </ParamField>

    **Message Options:**

    | Option                     | Description                             |
    | -------------------------- | --------------------------------------- |
    | **Pin to Channel**         | Pin the message                         |
    | **Send as Ephemeral**      | Only visible to specified users         |
    | **Thread under parent**    | Reply to an existing message            |
    | **Update Parent Message**  | Replace the parent instead of threading |
    | **Broadcast Thread Reply** | Also post threaded reply as new message |

    **Action Buttons** — add interactive buttons to messages:

    | Button                   | What It Opens            |
    | ------------------------ | ------------------------ |
    | Update Summary           | Edit incident summary    |
    | Manage Incident Roles    | Assign/remove roles      |
    | Update Incident          | Edit incident fields     |
    | Leave Feedback           | Log incident feedback    |
    | Manage Action Items      | Task/follow-up checklist |
    | Add PagerDuty Responders | Page via PagerDuty       |
    | Add Opsgenie Responders  | Page via Opsgenie        |
  </Accordion>

  <Accordion title="Send Slack Reminder" icon="bell">
    Same as Send Message, but with **Snooze/Pause** buttons and support for **recurring schedules**.

    <img alt="Send Slack Reminder action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-7.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=abd695714b8aa77ab4e16282a4329fa0" width="446" height="586" data-path="images/integrations/slack/workflows/custom-workflows/image-7.png" />

    <ParamField body="Channels" type="string">
      Target channels. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Text" type="string" required>
      Reminder message content. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Repeat" type="enum">
      How often the reminder fires. Options include once, every N minutes, hourly, and daily.
    </ParamField>

    <Note>
      Use reminders for periodic nudges (e.g., "Update the incident summary every 30 minutes"). The Snooze and Pause buttons allow responders to defer or stop reminders without leaving Slack.
    </Note>
  </Accordion>

  <Accordion title="Send Slack Blocks" icon="grid-2">
    Send rich, interactive messages using [Slack Block Kit](https://api.slack.com/reference/block-kit).

    <img alt="Send Slack Blocks action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-9.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=2f56cd3c8819dbd4d36fbb87298ff5ff" width="807" height="600" data-path="images/integrations/slack/workflows/custom-workflows/image-9.png" />

    <ParamField body="Blocks" type="string" required>
      JSON payload following Block Kit format. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Notification Preview" type="string">
      Text shown in push notifications when Block Kit content can't be rendered.
    </ParamField>

    **Block Kit Examples:**

    Text section with markdown:

    ```json theme={null}
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Incident:* {{ incident.title }}\n*Severity:* {{ incident.severity }}"
      }
    }
    ```

    Button that triggers a workflow:

    ```json theme={null}
    {
      "type": "actions",
      "elements": [{
        "type": "button",
        "text": { "type": "plain_text", "text": "View Action Items" },
        "action_id": "trigger_custom_workflow",
        "value": "incident-list-out-incomplete-action-items"
      }]
    }
    ```

    **Available `action_id` values:**

    | action\_id                                | What It Does                                        |
    | ----------------------------------------- | --------------------------------------------------- |
    | `toolbar_update_incident_summary`         | Edit summary modal                                  |
    | `toolbar_update_status`                   | Change status modal                                 |
    | `toolbar_update_incident`                 | Edit incident modal                                 |
    | `manage_incident_role_assignments_dialog` | Assign roles modal                                  |
    | `manage_incident_action_items`            | Action items checklist                              |
    | `add_feedback`                            | Feedback modal                                      |
    | `pagerduty_responders`                    | PagerDuty escalation                                |
    | `opsgenie_responders`                     | Opsgenie escalation                                 |
    | `snooze_reminder`                         | Snooze recurring workflow                           |
    | `pause_reminder`                          | Pause recurring workflow                            |
    | `trigger_custom_workflow`                 | Run another workflow (set `value` to workflow slug) |
    | `open_custom_form`                        | Open a custom form (set `value` to form slug)       |

    <Warning>
      Slack's Block Kit Builder can't interpret Liquid variables. Test your templates in Rootly's [Liquid Variable Explorer](https://rootly.com/account/help/liquid-explorer).
    </Warning>
  </Accordion>

  <Accordion title="Invite to Slack Channel" icon="user-plus">
    Adds users or user groups to a channel.

    <img alt="Invite to Slack Channel action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-12.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=185227b62852e5e640131098f37f2dcc" width="804" height="527" data-path="images/integrations/slack/workflows/custom-workflows/image-12.png" />

    <ParamField body="Channel" type="string" required>
      Target channel. Use `{{ incident.slack_channel_id }}` for the incident channel. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Slack Users" type="string">
      Individual users to invite. Use `{{ incident.creator }}` for the incident creator.
    </ParamField>

    <ParamField body="Slack User Groups" type="string">
      Groups to invite — all members are added to the channel.
    </ParamField>
  </Accordion>

  <Accordion title="Rename Slack Channel" icon="pencil">
    Changes the channel name dynamically, useful for reflecting status changes.

    <img alt="Rename Slack Channel action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-11.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=cc5566e5eb36fa873182e7f72825d94e" width="804" height="456" data-path="images/integrations/slack/workflows/custom-workflows/image-11.png" />

    <ParamField body="Channel" type="string" required>
      Channel to rename. Use `{{ incident.slack_channel_id }}`. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="New Title" type="string" required>
      New channel name. Supports [Liquid variables](/liquid/incident-variables).

      Example: `resolved-{{ incident.title }}`
    </ParamField>

    **Common use case:** Rename to include status when resolved (e.g., `resolved-database-outage`).
  </Accordion>

  <Accordion title="Update Channel Topic" icon="pen-to-square">
    Sets the channel topic to display key incident info at a glance.

    <img alt="Update Slack Channel Topic action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-13.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=aaf466b242d97256101619fbda685dce" width="803" height="491" data-path="images/integrations/slack/workflows/custom-workflows/image-13.png" />

    <ParamField body="Channels" type="string" required>
      Channels to update. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Topic" type="string" required>
      New topic text. Supports [Liquid variables](/liquid/incident-variables) and Slack markdown.
    </ParamField>

    **Example topic:**

    ```
    🔴 {{ incident.severity }} | {{ incident.status }} | Commander: {{ incident.commander.name | default: "Unassigned" }}
    ```
  </Accordion>

  <Accordion title="Add Slack Bookmark" icon="bookmark">
    Pins a link to the channel's bookmark bar for quick access during an incident.

    <img alt="Add Slack Bookmark action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-14.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=1dbc570027cc83cc19cea28de68cc93a" width="671" height="615" data-path="images/integrations/slack/workflows/custom-workflows/image-14.png" />

    <ParamField body="Channel" type="string" required>
      Channel to add the bookmark to. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Title" type="string" required>
      Bookmark display text. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Link" type="string" required>
      URL to bookmark. Common values: `{{ incident.url }}`, `{{ incident.jira_issue_url }}`. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Emoji" type="string">
      Icon shown next to the bookmark.
    </ParamField>

    <ParamField body="Playbook" type="string">
      Optionally link to a Rootly playbook instead of specifying a title and link manually.
    </ParamField>
  </Accordion>

  <Accordion title="Archive Slack Channel" icon="box-archive">
    Archives the channel to keep your workspace clean after an incident is resolved.

    <img alt="Archive Slack Channel action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-10.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=678615fa0bcddbf2226327e065cb76fd" width="803" height="340" data-path="images/integrations/slack/workflows/custom-workflows/image-10.png" />

    <ParamField body="Channel" type="string" required>
      Channel to archive. Use `{{ incident.slack_channel_id }}`. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    **Common trigger:** Incident status changed to "Closed" with a 24–48 hour delay to allow post-incident cleanup.
  </Accordion>

  <Accordion title="Change Channel Privacy" icon="lock">
    Switches a channel between public and private.

    <img alt="Change Slack Channel Privacy action" src="https://mintcdn.com/rootly/U92QwrKbfI6ZhNrU/images/integrations/slack/workflows/custom-workflows/image-15.png?fit=max&auto=format&n=U92QwrKbfI6ZhNrU&q=85&s=299182af2963897d85e6a562d3a883e0" width="670" height="363" data-path="images/integrations/slack/workflows/custom-workflows/image-15.png" />

    <ParamField body="Channel" type="string" required>
      Channel to modify. Supports [Liquid variables](/liquid/incident-variables).
    </ParamField>

    <ParamField body="Privacy" type="enum" required>
      * `public` — make the channel visible to all workspace members
      * `private` — restrict access to invited members only
    </ParamField>

    <Note>
      Changing from private to public may not be allowed by your Slack workspace settings.
    </Note>
  </Accordion>
</AccordionGroup>

***

## Common Liquid Variables

| Variable                                 | Description                                   |
| ---------------------------------------- | --------------------------------------------- |
| `{{ incident.slack_channel_id }}`        | Current incident's channel ID                 |
| `{{ incident.title }}`                   | Incident title                                |
| `{{ incident.severity }}`                | Severity level                                |
| `{{ incident.status }}`                  | Current status                                |
| `{{ incident.url }}`                     | Link to incident in Rootly                    |
| `{{ incident.creator }}`                 | User who created the incident                 |
| `{{ parent_incident.slack_channel_id }}` | Parent incident's channel (for sub-incidents) |

<Tip>
  Explore all variables in the [Liquid Variable Explorer](https://rootly.com/account/help/liquid-explorer).
</Tip>
