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

# Slack Channel Triggers

> Start Duvo agents automatically from Slack channel activity — every message, keyword matches, or an emoji reaction — without anyone mentioning the Duvo app.

Slack channel triggers let your agents start automatically from activity in a Slack channel — without anyone needing to mention the Duvo app. Use them to monitor channels continuously, process every message that matches a pattern, or react to a specific emoji on a message.

<Note>
  This page covers **automated channel triggers**. For on-demand workflows started by a team member mentioning the Duvo app, see [Slack Mention Workflows](/user-guide/examples/slack-mention-workflows).
</Note>

## Key Capabilities

* **Channel message trigger** — Start a Run automatically from every new message in a channel, or from messages containing specific keywords or patterns
* **Reaction trigger** — Start a Run when someone adds a specific emoji reaction to a message (for example, `white_check_mark` to approve, or `ticket` to create a ticket)
* **Scheduled channel digest** — Run a scheduled agent that reads recent channel messages and produces a summary, alert, or report on a time-based cadence
* **Bot and third-party app message support** — Capture structured messages from Jira, GitHub, PagerDuty, and other Slack integrations, not just messages from humans
* **No mention required** — Team members do not need to tag the Duvo app; the trigger fires silently in the background

***

## How Channel Message Triggers Work

The **Channel Message trigger** is a push-based trigger: the Duvo app listens to the channel and starts a Run for every new message (or every message matching your keyword filter). It fires within seconds of the message being posted.

If multiple agents have a matching Channel Message trigger on the same channel, they all start simultaneously — there is no selection menu. Use keyword filters to prevent unintended overlaps.

**Reaction triggers** work the same way: the Duvo app listens for emoji reactions in enabled channels and starts a Run when the configured reaction is added.

**Scheduled digests** use a time-based schedule rather than a real-time trigger. The agent runs at a set time, reads the recent message history of the channel, and produces output.

***

## Choosing the Connection for a Trigger

When you create or edit a Slack (or Microsoft Teams) channel trigger, you choose **which connection** backs it using the connection picker on the trigger. If your organization has Connections sharing enabled, the picker groups connections into two sections:

* **Team** — connections a teammate has shared with your team
* **Personal** — connections you set up under your own profile

A **channel trigger can run on a team-shared connection**, so the Duvo app can listen to a channel through a connection a teammate installed — every agent owner does not need to install the app themselves.

<Note>
  **@mention triggers always run as the mentioning user.** A Slack or Microsoft Teams @mention trigger uses the mentioning person's own personal connection, so it cannot use a team-shared connection. Only **channel** triggers can be backed by a shared connection.
</Note>

<Warning>
  If an org admin turns Connections sharing off, shared connections revert to their creator, and any channel triggers other users had pinned to those shared connections are automatically disabled. The creator's own triggers keep working.
</Warning>

***

## When to Use Channel Triggers

* **#alerts or #incidents** — Every alert that lands in the channel is automatically triaged, deduplicated, or escalated without anyone reading and forwarding each message
* **#support-inbox** — Every inbound support message is read, categorized, and a ticket is created — no manual scanning required
* **Weekly digest** — On Friday at 5pm, summarize everything posted in #operations that week and send the digest to stakeholders
* **Approval shortcut** — Team members react with the `white_check_mark` emoji on a pending item in #approvals to trigger the approval workflow, without opening a separate tool
* **Monitoring** — Watch #deploys or #ci-alerts for failure patterns and post a summary to the engineering team each morning

***

## How to Set It Up

<Tabs>
  <Tab title="Channel message trigger">
    Fires on every matching message.

    <Steps>
      <Step title="Open Setup" icon="settings">
        Open your agent and go to **Setup**.
      </Step>

      <Step title="Find the Slack Workspace connection" icon="message-square">
        Find the **Slack Workspace** connection in the Connections section.
      </Step>

      <Step title="Enable the Channel Message trigger" icon="message-square">
        Enable the **Channel Message** trigger.
      </Step>

      <Step title="Select the channel" icon="hash">
        Select the channel you want to monitor.
      </Step>

      <Step title="Choose the connection (optional)" icon="plug">
        Choose which connection backs the trigger. If Connections sharing is enabled, pick a **Team** (shared) connection or one of your **Personal** connections. Channel triggers can run on a team-shared connection.
      </Step>

      <Step title="Add keywords (optional)" icon="funnel">
        Optionally enter keywords or patterns. The trigger fires only when a message contains one of these terms. Leave empty to fire on every message in the channel.
      </Step>

      <Step title="Save" icon="check">
        Save.
      </Step>
    </Steps>

    <Note>
      **Prerequisites**: The [Slack Workspace connection](/user-guide/connections/available-connections/slack-workspace) must be installed by a team admin, and the Duvo app must be invited to the target channel (`/invite @Duvo`).
    </Note>
  </Tab>

  <Tab title="Reaction trigger">
    Fires when a specific emoji is added.

    <Steps>
      <Step title="Open Setup" icon="settings">
        Open your agent and go to **Setup**.
      </Step>

      <Step title="Enable the Slack Reaction trigger" icon="smile">
        Enable the **Slack Reaction** trigger.
      </Step>

      <Step title="Select the channel" icon="hash">
        Select the channel to monitor.
      </Step>

      <Step title="Choose the connection (optional)" icon="plug">
        Choose which connection backs the trigger. If Connections sharing is enabled, pick a **Team** (shared) connection or one of your **Personal** connections. Channel triggers can run on a team-shared connection.
      </Step>

      <Step title="Enter the emoji name" icon="smile">
        Enter the emoji name (for example, `white_check_mark` or `ticket`).
      </Step>

      <Step title="Save" icon="check">
        Save.
      </Step>
    </Steps>

    When a team member adds the configured reaction to any message in the channel, Duvo starts a Run and passes the original message content as context.
  </Tab>

  <Tab title="Scheduled channel digest">
    Fires at a set time. Channel digests use a scheduled agent rather than a real-time trigger.

    <Steps>
      <Step title="Open Setup" icon="settings">
        Open your agent and go to **Setup**.
      </Step>

      <Step title="Set a schedule" icon="clock">
        Set a **schedule** — for example, every Friday at 5pm, or every weekday at 8am.
      </Step>

      <Step title="Write your AOP" icon="pen-line">
        Write your AOP to read recent message history from the target channel and produce the desired output.
      </Step>

      <Step title="Add the Slack connection" icon="message-square">
        Add the **Slack** connection so the agent can read channel history and post replies.
      </Step>
    </Steps>
  </Tab>
</Tabs>

***

## Worked Example 1 — #support-inbox Triage

**Outcome**: Every message posted in #support-inbox is automatically read, categorized, and routed. A ticket is created in your issue tracker and the poster receives an acknowledgment — without a human scanning the channel.

**Connections used**:

* Slack Workspace — triggers from channel messages
* Slack — reads the message thread and posts replies (required for actions beyond the trigger thread)
* Linear — creates tickets for engineering issues
* Human-in-the-Loop — escalates ambiguous or urgent requests

### Trigger setup

<Steps>
  <Step title="Enable the Channel Message trigger" icon="message-square">
    Enable the **Channel Message** trigger on the agent.
  </Step>

  <Step title="Select the channel" icon="hash">
    Select **#support-inbox** as the channel.
  </Step>

  <Step title="Leave the keyword filter empty" icon="funnel">
    Leave keyword filter empty so every message starts a Run.
  </Step>
</Steps>

### AOP

```
You will receive a message from the #support-inbox Slack channel.

1. Read the message and any files or images attached to it.

2. Classify the request:
   - Bug report: something is broken or behaving incorrectly
   - Feature request: the user wants something new or changed
   - Question: the user needs information or help
   - Urgent: anything flagged as blocking, critical, or production-down

3. For bug reports and urgent issues:
   - Create a Linear issue titled "[Bug] [one-sentence summary]" in the [your team] team.
   - Set priority to Urgent for urgent issues, Medium for standard bugs.
   - Post a reply in the #support-inbox thread: "Logged as a bug — ticket created: [Linear issue link]."

4. For feature requests:
   - Create a Linear issue titled "[Feature Request] [one-sentence summary]" with priority Low.
   - Post a reply: "Thanks — logged as a feature request: [Linear issue link]."

5. For questions:
   - Search [your knowledge base or Notion] for an answer.
   - If a clear answer is found, post it in the thread.
   - If no answer is found, post: "Good question — escalating to the team." and send a
     Human-in-the-Loop request to [on-call Slack handle] with the question and context.

6. For urgent issues, also post in #engineering: "Urgent support issue: [summary]. Ticket: [link]."
```

### Expected results

* Every message in #support-inbox triggers a Run within seconds.
* Bug reports and feature requests get a Linear ticket and a thread acknowledgment automatically.
* Questions are answered from the knowledge base or escalated to the on-call engineer.
* The channel stays organized — every message gets a response, nothing is missed.

***

## Worked Example 2 — Reaction-Based Approval in #approvals

**Outcome**: Finance and operations team members post pending approvals in #approvals. A reviewer adds a `white_check_mark` reaction to approve, or an `x` to reject. The agent detects the reaction, records the decision, and notifies the requester.

**Connections used**:

* Slack Workspace — reaction trigger
* Slack — post DM to the requester and reply in the channel
* Google Sheets — log the approval decision

### Trigger setup

<Steps>
  <Step title="Enable the Slack Reaction trigger" icon="smile">
    Enable the **Slack Reaction** trigger on the agent.
  </Step>

  <Step title="Select the channel" icon="hash">
    Select **#approvals** as the channel.
  </Step>

  <Step title="Set the emoji" icon="smile">
    Set the emoji to `white_check_mark` for approvals. Create a second agent with `x` for rejections, or handle both reactions in one AOP.
  </Step>
</Steps>

### AOP

```
You will receive a Slack message that had a reaction added to it, along with the reaction emoji
and the name of the person who added it.

1. Read the original message to understand what is being approved or rejected.

2. Determine the decision:
   - If the reaction is white_check_mark: approved
   - If the reaction is x: rejected

3. Extract the requester's Slack username from the original message.

4. Log the decision in the "Approvals" Google Sheet with:
   - Date and time
   - Requester name
   - Approver name
   - Decision (Approved / Rejected)
   - Summary of what was approved

5. Send a Slack DM to the requester:
   - If approved: "Your request has been approved by [Approver Name]. Reference: [row number in sheet]."
   - If rejected: "Your request was not approved by [Approver Name]. Reply here with questions."

6. Post a reply in the #approvals thread confirming the decision is recorded.
```

### Expected results

* A reviewer adds the `white_check_mark` reaction on any message in #approvals.
* The requester receives a DM within seconds confirming the decision.
* The decision is logged in Google Sheets with a timestamp and approver name.
* The original message thread gets a confirmation reply.

***

## Worked Example 3 — Weekly #operations Digest

**Outcome**: Every Friday at 5pm, Duvo reads the past week of messages in #operations, identifies key decisions, open items, and blockers, and posts a structured summary to #operations-digest.

**Connections used**:

* Slack — read channel history and post the digest
* Human-in-the-Loop (optional) — flag items needing follow-up

### Trigger setup

<Steps>
  <Step title="Set a schedule" icon="clock">
    Set a **schedule** of every Friday at 5pm.
  </Step>

  <Step title="No Slack trigger needed" icon="calendar">
    No Slack trigger needed — the agent runs on the time schedule and reads the channel.
  </Step>
</Steps>

### AOP

```
Read all messages posted in the #operations Slack channel from the past 7 days.

From those messages, extract and organize:
1. Decisions made — items that were agreed, approved, or confirmed
2. Open items — questions or tasks raised but not yet resolved
3. Blockers — anything described as blocking, stuck, or waiting on someone
4. Upcoming deadlines — any dates, deliverables, or commitments mentioned

Format a digest with these four sections. Keep each item to one sentence.
Include the name of the person who raised or resolved each item.

Post the digest to the #operations-digest channel with the header:
"Operations digest — week of [Monday's date]"

If there are more than 3 open items or blockers, also post a Human-in-the-Loop request
to the #operations channel: "Weekly digest ready. [N] open items need follow-up."
```

### Expected results

* Every Friday at 5pm, #operations-digest receives a structured summary.
* Open items and blockers are surfaced even if they were buried in a busy week of messages.
* The team has a single record of decisions and follow-ups without anyone manually reviewing the channel.

***

## Tips

<Tip>
  **Use keyword filters to avoid overlapping triggers**: If you have two agents with channel message triggers on the same channel, add distinct keyword filters to each (for example, "invoice" and "contract") so they do not both fire on every message.
</Tip>

<Tip>
  **Write the AOP to handle bot messages**: Slack channels often receive structured messages from Jira, GitHub, PagerDuty, and similar tools. The Duvo app captures these messages including their fields and values. Explicitly instruct your AOP: "If the message is from a bot or app, read its structured content (title, fields, links) as well as any plain text."
</Tip>

<Tip>
  **Set a cooldown for high-volume channels**: In a channel with dozens of messages per hour, a channel message trigger will start a Run for each one. Confirm your AOP handles this volume, or use a keyword filter to narrow the trigger.
</Tip>

<Tip>
  **Combine with scheduled digests**: Use a channel message trigger for time-sensitive items (like incidents) and a scheduled digest for summary reporting on the same channel.
</Tip>

***

## Troubleshooting

<AccordionGroup>
  <Accordion title="The trigger is not firing" icon="zap-off">
    * Confirm the Duvo app has been invited to the channel: `/invite @Duvo` in the channel.
    * Verify the Slack Workspace connection is active on the [Connections page](https://app.duvo.ai/integrations).
    * Check that the agent has a published build — draft-only agents cannot be triggered.
    * If a keyword filter is set, confirm the test message contains the exact keyword (case-insensitive match).
  </Accordion>

  <Accordion title="Every message starts a Run but most should not" icon="funnel">
    * Add a keyword filter to the trigger so only relevant messages start a Run.
    * Alternatively, keep the trigger broad and add a filter step to the AOP: "If the message does not match \[criteria], stop processing."
  </Accordion>

  <Accordion title="The AOP cannot read the channel history for a digest" icon="history">
    * The Slack connection (not Slack Workspace) is required for reading channel history. Confirm it is enabled under **Connections** and authorized.
    * Confirm the agent has permission to read the target channel. Re-authorize the Slack connection if needed.
  </Accordion>

  <Accordion title="Reaction trigger fires for the wrong emoji" icon="smile">
    * Emoji names in Slack are case-sensitive and use underscores, not spaces. Use `white_check_mark` not `white check mark`. Find the exact name by hovering over the emoji in Slack and checking the tooltip.
  </Accordion>
</AccordionGroup>

***

## Related

<CardGroup cols={2}>
  <Card title="Event-Driven Triggers" icon="bolt" href="/user-guide/assignment-features/event-driven-triggers">
    Overview of all trigger types and the trigger matrix.
  </Card>

  <Card title="Slack Mention Workflows" icon="at-sign" href="/user-guide/examples/slack-mention-workflows">
    On-demand workflows started by mentioning the Duvo app.
  </Card>

  <Card title="Slack Workspace Connection" icon="message-square" href="/user-guide/connections/available-connections/slack-workspace">
    Install the Duvo app and configure team-level settings.
  </Card>

  <Card title="Slack Connection" icon="message-square" href="/user-guide/connections/available-connections/slack">
    Read channel history and post messages from agents.
  </Card>

  <Card title="Scheduling Agents" icon="calendar" href="/user-guide/assignment-features/scheduling-assignments">
    Set up time-based digests.
  </Card>

  <Card title="Human-in-the-Loop" icon="user-check" href="/user-guide/assignment-features/human-in-the-loop">
    Escalate items needing human attention from channel digests.
  </Card>
</CardGroup>
