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

# Delivering Omni content to Slack

> With Slack deliveries, you can automatically schedule sending dashboards and individual tiles to your team as channel or direct messages.

export const contentCopy_0 = "Select the content to be delivered."

export const destination_0 = "Slack"

<Tip>
  Looking to ask data questions interactively in Slack? See [Omni Slack Agent](/integrations/omni-slack-agent).
</Tip>

## Requirements

To connect Slack to Omni, you'll need [**Organization Admin** permissions](/administration/users/permissions).

## Common questions

<AccordionGroup>
  <Accordion title="What permissions does Omni need?">
    When you connect your Slack workspace to Omni, Omni will request a few permissions. These permissions are required to successfully deliver content:

    | Permission                                                                                                         | How does Omni use it?                                                                | Why is it requested?                                                                                                                                                                                                                                                      |
    | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Upload, edit, and delete files ([`files:write` scope](https://docs.slack.dev/reference/scopes/files.write/))       | Allows Omni to send report attachments to Slack channels and DMs                     | Slack bundles upload, edit, and delete permissions into a single scope, meaning there isn't a way to only request upload permissions                                                                                                                                      |
    | Join public channels in your workspace ([`channels:join`](https://docs.slack.dev/reference/scopes/channels.join/)) | Allows Omni's Slackbot to automatically join public channels specified in deliveries | Without this permission, a Slack admin would need to manually invite the Omni Slackbot to every channel before setting up a delivery.<br /><br />**Note**: This is only applicable to public channels. For private channels, someone must invite the Omni Slackbot first. |
  </Accordion>

  <Accordion title="Who can be the recipient of a Slack delivery?">
    Omni's Slack integration supports sending deliveries to channels (public and private) and individual users via a direct message (DM).

    Slackbot cannot receive Omni Slack deliveries.
  </Accordion>

  <Accordion title="Can I create dynamic content in Slack deliveries?">
    Yes! See the [Dynamic content deliveries with Mustache guide](/share/deliveries/dynamic-content) for more information.
  </Accordion>
</AccordionGroup>

## Setup

<Steps>
  <Step title="Connect your Slack workspace" titleSize="h3" id="slack-workspace">
    Before Omni can send deliveries to Slack, you'll need to connect your Slack workspace. This is done on the **Integrations** page:

    1. In Omni, click **Settings > Integrations**.
    2. Click **Connect to Slack** and complete the Slack authorization flow.

    You'll be redirected back to Omni once the connection is established. For more details, refer to the [Omni Slack Agent setup guide](/integrations/omni-slack-agent#setting-up-the-omni-slack-agent).
  </Step>

  <Step title="Configure delivery settings" titleSize="h3" id="delivery-settings">
    1. Navigate to a **published** dashboard.
    2. Click **File > Deliveries & Alerts**. The delivery options will display on the left side of the page.
    3. Fill in the following:

       * **Delivery** - Select **Schedule** or **Alert**.
       * **Send** - {contentCopy_0}
       * **Destination** - Select **{destination_0}**.
       * **Name** - Enter a name for the delivery.

    **If creating an alert**, use the **Alert** tab to define the conditions that must be met to trigger the delivery. For example, you have a chart that tracks the **Total sales** for your ecommerce company. Using an alert, you can trigger a delivery when the total of your sales has changed.
  </Step>

  <Step title="Configure the delivery schedule" titleSize="h3" id="delivery-schedule">
    In this step, you'll define the cadence for the delivery:

    * For **schedules**, this determines when Omni will deliver the specified content to the destination
    * For **alerts**, this tells Omni when to check if the current query results meet the conditions required to send the delivery

    Schedules can be defined using the visual options or with cron:

    <AccordionGroup>
      <Accordion title="Visual schedule builder" icon="calendar" description="Easy point-and-click schedule builder">
        Use the UI options (**Daily**, **Weekly**, etc.) to select a time period.

        By default, schedules are set to send in the local timezone of the delivery creator's computer. Use the **Times are in** drop down to change the timezone.
      </Accordion>

      <Accordion title="Custom cron schedule (Advanced)" icon="asterisk" description="Code-based granular timing control">
        A cron expression is a string that describes the individual details of a schedule:

        | Order | Unit         | Allowed values  | Allowed special characters |
        | ----- | ------------ | --------------- | -------------------------- |
        | 1     | minute       | 0-59            | \* , - /                   |
        | 2     | hour         | 0-23            | \* , - /                   |
        | 3     | day of month | 1-31            | \* , - / L W ?             |
        | 4     | month        | 1-12 or JAN-DEC | \* , - /                   |
        | 5     | day of week  | 1-7 or SUN-SAT  | \* , - / L W ?             |
        | 6     | year         | any             | \* , - /                   |

        Using cron, you can create schedules like the following:

        ```markdown title="At 9:00 AM every day" theme={null}
        0 9 ? * * *
        ```

        ```markdown title="At 6:30AM on the last day of the month" theme={null}
        30 6 L * ? *
        ```

        ```markdown title="At 8:45 AM every day, Monday through Friday" theme={null}
        45 8 ? * MON-FRI *
        ```

        Omni uses Amazon Web Services' (AWS) syntax for cron expressions. Refer to the [AWS documentation](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-scheduled-rule-pattern.html) for more information. By default, the most frequent you can configure a schedule is hourly.

        <Tip>
          If your organization has [AI enabled](/ai/settings/features), you can use the AI cron generator to create cron expressions from natural language. Click the sparkle icon next to the cron input field and describe your desired schedule, such as "every weekday at 9am" or "first Monday of each month at noon."
        </Tip>
      </Accordion>
    </AccordionGroup>

    <Tip>
      Schedule send timezone may be different than query run timezone. For example, if your **Database timezone** is `UTC` with no other timezone conversion settings and you set your schedule to send at `12:00 PM PST`, the query will execute at `8:00 PM UTC`.

      Refer to your [connection timezone settings](/connect-data/timezones) for more information.
    </Tip>
  </Step>

  <Step title="Select format and filter options" titleSize="h3" id="format-filter-options">
    <Tip>
      You can use filters to customize content for different recipients! For example, set a filter to `A` in a scheduled delivery to recipient A, and in another scheduled delivery to recipient B, set a filter to `B`.
    </Tip>

    In the **Dashboard** or **Chart** tab, you can:

    * **Select the format of the content**, such as PNG, PDF, XLSX, or CSV.
    * **Lightly customize the contents and layout**, such as expanding tables to include up to 1,000 rows, hiding filter values, or arranging tiles in a single column.
    * **Select the page(s) to include in the dashboard delivery**. This is applicable only to [advanced layouts](/visualize-present/dashboards/advanced-layout) with multiple pages.

      **Note**: PNGs can only include one page. You'll need to create multiple deliveries to output a PNG for each page.
    * **Set filter or control values for the delivery**. Some formats will have additional customization options. PDF formats, for example, will allow you to specify the orientation and page size for the PDF.

      For dashboard deliveries, the default filters and controls will automatically be applied upon creation. Subsequent default filter value updates will not change the filter values set for existing deliveries.
  </Step>

  <Step title="Select a channel and add a message" titleSize="h3" id="channel-message">
    The last step is to configure the Slack settings for the delivery:

    1. **Select a channel or direct message**. Public and private channels are supported.

       **To deliver content to a private channel**, you'll also need to add the Omni app (`@omni`) to the private channel.

       If you don't see the private channel in the **Channel** dropdown, click the **Add channel** link. Use the modal to enter the ID of the channel.
    2. **Add a message**. Messages can include [Mustache references](/share/deliveries/dynamic-content) for dynamic, personalized content and be formatted using [Slack markup](https://api.slack.com/reference/surfaces/formatting#basic-formatting).
  </Step>

  <Step title="Test the delivery" titleSize="h3" id="test-delivery">
    If you want to test the delivery before saving, click the **Test Now** button in the bottom left corner of the page. This will send the dashboard/chart to the destination using the current settings. For example, using **Test Now** would send the delivery to all **Recipients**.

    <Note>
      The **Test Now** button will be unavailable for alerts if the **Condition type** is `Results have changed` or `Results have stayed the same`. A workaround is to use the **Send Now** option to manually trigger the delivery, which is available once the delivery has been saved.

      Save the alert and then click the <Icon icon="ellipsis-vertical" type="solid" /> icon to display the **Send Now** option. This will initiate a check on the alert condition - if the condition isn't met, the delivery will show as successful but not send anything.
    </Note>
  </Step>

  <Step title="Save the delivery" titleSize="h3" id="save-delivery">
    When finished, click **Save** to create the delivery.
  </Step>
</Steps>

## Viewing all Slack deliveries

<Note>
  Viewing Slack deliveries requires [**Organization Admin** permissions](/administration/users/permissions).
</Note>

Looking to see all of your Slack deliveries in one place?

1. In Omni, click **Settings > Deliveries**.
2. Click the **Slack tab**.
3. Click the link under **Connected to Omni**. You'll be redirected to a filtered view of the **All Deliveries** tab, which will display all the deliveries currently sent to Slack.
