Help center Configure Rotation App Slack Workflows

Extend Rotation App with custom automation and integrations.

Who can configure Slack Workflows integration?
  • Slack workspace admins or users with app installation permissions.
  • Access to Rotation App’s Home tab.

Slack Workflows integration extends Rotation App’s native capabilities by allowing you to integrate rotation data with external tools and create custom automation scenarios using Slack’s Workflow Builder.

Important
Rotation App already handles automatic rotation scheduling and announcements natively. You don’t need workflows for basic rotation functionality.

When should I use workflows?

Workflows are designed for advanced use cases that go beyond Rotation App’s built-in features:

  • External tool integration: Update on-call users in PagerDuty, Linear, Incident.io, or other systems
  • Event-driven assignments: Assign users based on specific events (like incident reports or task completion) rather than schedules
  • Custom notifications: Send personalized reminders to upcoming assignees before their shift
  • Dynamic queue management: To trigger queue changes based on team events, or periodically shuffle rotation queues to avoid repetitive patterns like the same person always getting the same weekday
  • Complex conditional logic: Chain multiple actions together based on rotation data

Why do I need to create a separate Slack app?

Slack doesn’t allow third-party apps like Rotation App to publish workflow steps directly. As a workaround, you need to create an internal Slack app in your workspace using the manifest we provide below. This app will contain the workflow steps that connect to Rotation App’s backend.

Don’t worry - you don’t need to build anything! We handle all the step execution. You just need to register the app.

Prerequisites

Before you start, make sure you have:

  • Admin access to your Slack workspace (or permission to install apps)
  • Access to Rotation App’s Home tab
  • At least one rotation already created in Rotation App

Step-by-step setup

1. Create a new Slack app

  1. Go to api.slack.com/apps
  2. Click “Create New App”
  3. Select “From an app manifest”
  4. Choose your workspace
  5. Replace the default manifest with this content:
Slack App Manifest
{
  "display_information": {
    "name": "Rotation App - Workflows"
  },
  "features": {
    "bot_user": {
      "display_name": "Rotation App - Workflows",
      "always_online": false
    }
  },
  "oauth_config": {
    "redirect_urls": [
      "https://api.rotation.app/slack-workflows/oauth_redirect"
    ],
    "scopes": {
      "bot": ["workflow.steps:execute"]
    }
  },
  "settings": {
    "event_subscriptions": {
      "request_url": "https://api.rotation.app/slack-workflows/events",
      "bot_events": ["function_executed", "workflow_step_execute"]
    },
    "org_deploy_enabled": true,
    "socket_mode_enabled": false,
    "token_rotation_enabled": false,
    "hermes_app_type": "remote",
    "function_runtime": "remote"
  },
  "functions": {
    "get_on_call_user_ids": {
      "title": "Get Assigned User(s)",
      "description": "Get the current assigned user(s) for a specific rotation",
      "input_parameters": {
        "team_id": {
          "type": "slack#/types/team_id",
          "title": "Workspace",
          "description": "The workspace that owns the rotation",
          "is_required": true,
          "name": "team_id"
        },
        "rotation_name": {
          "type": "string",
          "title": "Rotation Name",
          "description": "The name of the rotation",
          "is_required": true,
          "name": "rotation_name"
        }
      },
      "output_parameters": {
        "on_call_user_ids_0": {
          "type": "slack#/types/user_id",
          "title": "Assigned User 1",
          "description": "The currently assigned user. In a group rotation, this is the first user in the group.",
          "name": "on_call_user_ids_0"
        },
        "on_call_user_ids_1": {
          "type": "slack#/types/user_id",
          "title": "Assigned User 2",
          "description": "In a group rotation, this is the second user in the group.",
          "name": "on_call_user_ids_1"
        },
        "on_call_user_ids_2": {
          "type": "slack#/types/user_id",
          "title": "Assigned User 3",
          "description": "In a group rotation, this is the third user in the group.",
          "name": "on_call_user_ids_2"
        },
        "on_call_user_ids_3": {
          "type": "slack#/types/user_id",
          "title": "Assigned User 4",
          "description": "In a group rotation, this is the fourth user in the group.",
          "name": "on_call_user_ids_3"
        },
        "on_call_user_ids_4": {
          "type": "slack#/types/user_id",
          "title": "Assigned User 5",
          "description": "In a group rotation, this is the fifth user in the group.",
          "name": "on_call_user_ids_4"
        }
      }
    },
    "get_next_user_ids": {
      "title": "Get Next Assignee(s)",
      "description": "Get the user(s) next to be assigned in a specific rotation",
      "input_parameters": {
        "team_id": {
          "type": "slack#/types/team_id",
          "title": "Workspace",
          "description": "The workspace that owns the rotation",
          "is_required": true,
          "name": "team_id"
        },
        "rotation_name": {
          "type": "string",
          "title": "Rotation Name",
          "description": "The name of the rotation",
          "is_required": true,
          "name": "rotation_name"
        }
      },
      "output_parameters": {
        "next_user_ids_0": {
          "type": "slack#/types/user_id",
          "title": "Next Assignee 1",
          "description": "The next assignee. In a group rotation, this is the first user in the group.",
          "name": "next_user_ids_0"
        },
        "next_user_ids_1": {
          "type": "slack#/types/user_id",
          "title": "Next Assignee 2",
          "description": "In a group rotation, this is the second user in the group.",
          "name": "next_user_ids_1"
        },
        "next_user_ids_2": {
          "type": "slack#/types/user_id",
          "title": "Next Assignee 3",
          "description": "In a group rotation, this is the third user in the group.",
          "name": "next_user_ids_2"
        },
        "next_user_ids_3": {
          "type": "slack#/types/user_id",
          "title": "Next Assignee 4",
          "description": "In a group rotation, this is the fourth user in the group.",
          "name": "next_user_ids_3"
        },
        "next_user_ids_4": {
          "type": "slack#/types/user_id",
          "title": "Next Assignee 5",
          "description": "In a group rotation, this is the fifth user in the group.",
          "name": "next_user_ids_4"
        }
      }
    },
    "assign_user": {
      "title": "Assign a User",
      "description": "Assigns the provided user to the current shift.\nIf the user is not part of the rotation's users, they will be set as a one-time substitution.",
      "input_parameters": {
        "team_id": {
          "type": "slack#/types/team_id",
          "title": "Workspace",
          "description": "The workspace that owns the rotation",
          "is_required": true,
          "name": "team_id"
        },
        "rotation_name": {
          "type": "string",
          "title": "Rotation Name",
          "description": "The name of the rotation",
          "is_required": true,
          "name": "rotation_name"
        },
        "user_id": {
          "type": "slack#/types/user_id",
          "title": "User to assign",
          "description": "The user to assign",
          "is_required": true,
          "name": "user_id"
        }
      },
      "output_parameters": {}
    },
    "assign_next_user": {
      "title": "Assign Next User(s)",
      "description": "Assigns the next user(s) to a specific rotation",
      "input_parameters": {
        "team_id": {
          "type": "slack#/types/team_id",
          "title": "Workspace",
          "description": "The workspace that owns the rotation",
          "is_required": true,
          "name": "team_id"
        },
        "rotation_name": {
          "type": "string",
          "title": "Rotation Name",
          "description": "The name of the rotation",
          "is_required": true,
          "name": "rotation_name"
        }
      },
      "output_parameters": {}
    },
    "shuffle_queue": {
      "title": "Shuffle Rotation Queue",
      "description": "Shuffles the queue of users for a specific rotation",
      "input_parameters": {
        "team_id": {
          "type": "slack#/types/team_id",
          "title": "Workspace",
          "description": "The workspace that owns the rotation",
          "is_required": true,
          "name": "team_id"
        },
        "rotation_name": {
          "type": "string",
          "title": "Rotation Name",
          "description": "The name of the rotation",
          "is_required": true,
          "name": "rotation_name"
        },
        "include_currently_on_call": {
          "type": "boolean",
          "title": "Include currently assigned user(s)?",
          "description": "Whether to include the currently assigned user(s) in the shuffle",
          "is_required": false,
          "name": "include_currently_on_call"
        }
      },
      "output_parameters": {}
    }
  }
}
  1. Click “Next” and then “Create”

2. Install the app to your organization

  1. In your new app’s dashboard, go to “Settings”“Install App”
  2. Click “Install to Organization”
  3. Review the permissions and click “Allow”

3. Get the Signing Secret

  1. In your app dashboard, go to “Settings”“Basic Information”
  2. Under “App Credentials”, copy the “Signing Secret” (you’ll need this for the next step)

4. Configure the Signing Secret in Rotation App

  1. Go to Rotation App’s Home tab: Learn where to find Rotation App’s Home tab.
  2. Open the Configure Workflows dialog: Look for a “Configure Workflows” button in the top-left corner.
  3. Enter the Signing Secret: Paste the signing secret you copied from your Slack app.
  4. Save the configuration: Click save to store the signing secret which Rotation App will use to verify incoming requests.

Next steps

Once you’ve completed the setup:

  1. Create your first workflow: Go to your Slack workspace and use Workflow Builder to create workflows with Rotation App steps.
  2. Test the integration: Create a simple workflow to verify everything is working correctly.

The workflow steps will appear in Slack’s Workflow Builder under your “Rotation App - Workflows” app, and you can use them just like any other Slack workflow step.


Need help? We’re here to help! Reach out anytime at contact@rotation.app if you need assistance configuring the workflows integration or if you’d like guidance with your specific use case. We’d love to hear from you!