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

# Slack Workflow Builder

> Connect a custom Slack app to Ravenna so your team can create tickets from Slack Workflow Builder using a no-code Open Form step.

Connect a custom Slack app to Ravenna so your team can open Ravenna request forms, and create tickets, directly from Slack Workflow Builder. The Workflow app adds an **Open Form** step that you can drop into any Slack workflow, so people submit requests without leaving Slack.

The Workflow app is separate from the main Ravenna Slack app. The main app is installed and owned by Ravenna. The Workflow app is a custom app that you create and own in your own Slack workspace, then register with Ravenna using its App ID and Signing Secret. Each connected Slack workspace can have one Workflow app.

<Note>
  Slack does not let third-party apps distribute workflow steps automatically, so you create the app yourself from a manifest Ravenna provides. This gives you a Workflow app that is already configured to talk to Ravenna. You only need to set the name and icon.
</Note>

## Prerequisites

<Warning>
  You must be a **Slack workspace admin** to create and install a custom Slack app. If you don't have admin permissions, ask your Slack administrator to complete these steps.
</Warning>

Before you start, connect your Slack workspace to Ravenna if you haven't already.

<Callout icon="link" color="#6B7280">
  Follow the [Slack setup guide](/integrations/slack/setup) to connect your workspace first.
</Callout>

## Create the Slack app from a manifest

<Steps>
  <Step title="Create a new app">
    1. Go to the [Slack apps page](https://api.slack.com/apps) and click **Create New App**.
    2. In the **Create an app** dialog, select **From a manifest**.

    <Frame>
      <img src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/1-new-slack-app.jpg?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=bbfe1b0c7f2b141b96f337dae8f04ff4" alt="Create an app dialog with the From a manifest option selected" width="3840" height="2410" data-path="images/integrations/slack/1-new-slack-app.jpg" />
    </Frame>
  </Step>

  <Step title="Select your workspace">
    Choose the Slack workspace where you want to install the Workflow app.

    <Frame>
      <img src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/2-select-workspace.jpg?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=2d0a96cdb9abc17601cfd449651684bd" alt="Slack workspace picker for the new app" width="1214" height="888" data-path="images/integrations/slack/2-select-workspace.jpg" />
    </Frame>
  </Step>

  <Step title="Paste the manifest">
    Copy the manifest below and paste it into the JSON editor.

    <Frame>
      <video autoPlay muted loop playsInline src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/3-paste-json.mp4?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=c3c84583cbbc3e687fa71dea0e8f62dd" data-path="images/integrations/slack/3-paste-json.mp4" />
    </Frame>

    <Accordion title="View the manifest JSON" icon="code">
      ```json theme={"system"}
      {
        "display_information": {
          "name": "Ravenna Workflows",
          "description": "Workflow app for Ravenna",
          "background_color": "#000000"
        },
        "features": {
          "bot_user": {
            "display_name": "Ravenna Workflows",
            "always_online": false
          }
        },
        "functions": {
          "ravenna_open_form": {
            "title": "Open Form",
            "description": "Opens a Ravenna form as a Slack modal so the person can submit a request. Setup guide: https://docs.ravenna.ai/integrations/slack/workflow-builder",
            "input_parameters": {
              "formId": {
                "type": "string",
                "title": "Form ID",
                "description": "The ID of the Ravenna form to open.",
                "hint": "Find the ID in the request type URL in Ravenna. Required.",
                "is_required": true
              },
              "channelId": {
                "type": "slack#/types/channel_id",
                "title": "Slack channel",
                "description": "The Slack channel where the workflow runs. Used to route the ticket to the matching Ravenna channel.",
                "hint": "Select 'Channel where the workflow was used' to route the ticket to the matching Ravenna channel.",
                "is_required": false
              },
              "queueId": {
                "type": "string",
                "title": "Ravenna channel",
                "description": "Fallback Ravenna channel to route the ticket to when the workflow runs outside a connected Slack channel.",
                "hint": "Fallback used when the workflow runs outside a connected Slack channel, such as from a direct message.",
                "is_required": false
              },
              "interactivity": {
                "type": "slack#/types/interactivity",
                "title": "Interactivity",
                "description": "Interactivity context required to open a modal.",
                "hint": "Leave this set to the provided interactivity context.",
                "is_required": true
              }
            },
            "output_parameters": {}
          }
        },
        "oauth_config": {
          "redirect_urls": ["https://core.api.ravennahq.com/api/oauth/slack"],
          "scopes": {
            "bot": ["chat:write", "files:read", "users:read", "users:read.email"]
          }
        },
        "settings": {
          "event_subscriptions": {
            "request_url": "https://core.api.ravennahq.com/api/slack/events",
            "bot_events": ["function_executed"]
          },
          "interactivity": {
            "is_enabled": true,
            "request_url": "https://core.api.ravennahq.com/api/slack/interactions"
          },
          "org_deploy_enabled": true,
          "socket_mode_enabled": false,
          "token_rotation_enabled": false,
          "function_runtime": "remote"
        }
      }
      ```
    </Accordion>
  </Step>

  <Step title="Review and create">
    Review the configuration and click **Create**. Your Workflow app is now configured and ready to use.
  </Step>

  <Step title="Set the name and icon">
    On the app's **Basic Information** page, set a display name and icon that match your team's branding. The step name shown in Workflow Builder comes from the manifest, so renaming the app does not change it.

    <Frame>
      <img src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/5-change-icon-name.jpg?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=6454e6260a202bbb36e18655f8845d7e" alt="Update app name, icon and color." width="3840" height="2382" data-path="images/integrations/slack/5-change-icon-name.jpg" />
    </Frame>
  </Step>

  <Step title="Install the app to your workspace">
    In the left sidebar, go to **Install App** and click **Install to Workspace**. Review the requested permissions and click **Allow**.
  </Step>
</Steps>

## Connect the Workflow app to Ravenna

After you create the app, register it with Ravenna so Ravenna can verify and process requests from it.

<Steps>
  <Step title="Copy the credentials">
    On the Slack app's **Basic Information** page, copy the **App ID** and the **Signing Secret**.

    <Frame>
      <img src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/6-copy-details.jpg?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=e18ce49681a2e1d29242e7b03c31f264" alt="Slack Basic Information page showing the App ID and Signing Secret" width="3840" height="2236" data-path="images/integrations/slack/6-copy-details.jpg" />
    </Frame>
  </Step>

  <Step title="Copy the bot token (for file uploads)">
    If your forms include file uploads, also copy the **Bot User OAuth Token** (starts with `xoxb-`) from the app's **OAuth & Permissions** page. Ravenna uses it to download files that people attach in the form. You can skip this if your forms have no file fields.
  </Step>

  <Step title="Open Ravenna integration settings">
    In Ravenna, go to **Settings > Integrations** and find the **Workflow App** tile for the workspace you want to connect. Click **Connect**.

    <Frame>
      <img src="https://mintcdn.com/ravenna/sZ-ZSHAK3TDsEoFK/images/integrations/slack/7-connect-app.jpg?fit=max&auto=format&n=sZ-ZSHAK3TDsEoFK&q=85&s=e5503ff6ed1c9a5a5c294ec1732ecd9e" alt="Ravenna Integrations page with the Workflow App tile and Connect dialog" width="1725" height="970" data-path="images/integrations/slack/7-connect-app.jpg" />
    </Frame>
  </Step>

  <Step title="Enter the credentials">
    Paste the **App ID**, **Signing Secret**, and (if needed) the **Bot User OAuth Token**, then save.
  </Step>
</Steps>

<Note>
  File uploads in forms only work when you provide the Bot User OAuth Token. Without it, the ticket is still created but attached files are dropped, because only the Workflow app's own token can download files uploaded through its modal.
</Note>

<Warning>
  1. The App ID and Signing Secret must both come from the same Slack app you created from the manifest. If they don't match, Ravenna cannot verify requests and the workflow step does nothing.
  2. If you have more than one Slack workspace connected to Ravenna, connect the credentials to the **Workflow App** tile for the same workspace where you installed the app.
</Warning>

## Build a workflow that creates tickets

<Tip>
  New to Slack Workflow Builder? See [Slack's Workflow Builder guide](https://slack.com/help/articles/360035692513-Guide-to-Slack-Workflow-Builder) to get started.
</Tip>

<Steps>
  <Step title="Open Workflow Builder">
    In Slack, click **Tools** in the sidebar and select **Workflows**. You can also press <kbd>⌘</kbd>+<kbd>K</kbd> / <kbd>Ctrl</kbd>+<kbd>K</kbd> and search for "Workflows".
  </Step>

  <Step title="Create a workflow and choose a trigger">
    Click **New Workflow**, then choose the **From a link in Slack** trigger. This creates a link and button that people click to start the workflow.
  </Step>

  <Step title="Add the Ravenna step">
    Click **Add Steps**, search for the name of the custom app you installed, and add the **Open Form** step.
  </Step>

  <Step title="Configure the step">
    The Open Form step has the following inputs:

    * **Form ID** (required): The Ravenna form to open.

          <Accordion title="How to find the Form ID" icon="hashtag">
            In Ravenna, go to **Forms** and open the form you want to use. The Form ID is the last part of the page URL:

            ```text theme={"system"}
            https://app.ravenna.ai/<workspace>/forms/<FORM_ID>
            ```

            Copy the `<FORM_ID>` value and paste it into the step.
          </Accordion>

    * **Slack channel**: Click the channel dropdown and select **Channel where the workflow was used**. This passes the Slack channel to Ravenna so it can route the ticket to the matching Ravenna channel.

    * **Ravenna channel**: A fallback Ravenna channel to use when the workflow runs outside a connected Slack channel, such as from a direct message.

          <Accordion title="How to find the Ravenna channel ID" icon="hashtag">
            In the Ravenna sidebar, hover over the channel you want to use and open its actions menu (the **...** icon). Click **Copy** to copy the channel ID to your clipboard, then paste it into the step.
          </Accordion>
  </Step>

  <Step title="Finish and publish">
    Click **Finish Up** to save, then publish the workflow. Your team can now run it to open the form and create a ticket.
  </Step>
</Steps>

## Make the workflow discoverable

Help your team find and use the workflow with either of these options.

<AccordionGroup>
  <Accordion title="Feature the workflow in a channel">
    Feature the workflow so it appears in a channel's Workflows tab. See [Slack's guide to featuring a workflow](https://slack.com/help/articles/32393999092883-Manage-the-Workflows-tab-in-channels-and-DMs#feature-a-workflow).
  </Accordion>

  <Accordion title="Add the workflow to a Canvas">
    Add the workflow to a Slack Canvas for a more visual, organized entry point. See [Slack's guide to sharing a Canvas](https://slack.com/help/articles/360056199714-Share-a-Canvas-in-a-channel-or-DM).
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="The step runs but no form opens">
    **Cause**: Ravenna cannot verify the request, or the app was not built from the Ravenna manifest.

    **Solution**:

    * Confirm the **App ID** and **Signing Secret** in Ravenna match the Slack app you created from the manifest.
    * Confirm you created the app from the manifest above, which includes the `ravenna_open_form` function.
    * Confirm the **Form ID** in the step points to a valid Ravenna form.
  </Accordion>

  <Accordion title="The ticket lands in the wrong channel">
    **Cause**: Ravenna could not resolve the destination from the Slack channel.

    **Solution**:

    * Set the **Slack channel** input to **Channel where the workflow was used** so Ravenna receives the channel at run time.
    * Set a **Ravenna channel** as a fallback for workflows that run outside a connected Slack channel.
  </Accordion>
</AccordionGroup>

<Callout icon="link" color="#6B7280">
  Learn more about [creating tickets in Slack](/integrations/slack/creating-tickets) and using [Slack triggers and actions in Ravenna workflows](/integrations/slack/workflows).
</Callout>
