Skip to main content

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 let your assignments 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. This page covers automated channel triggers. For on-demand workflows started by a team member mentioning the Duvo app, see Slack Mention Workflows.

Key Capabilities

  • Channel message trigger — Start a Job automatically from every new message in a channel, or from messages containing specific keywords or patterns
  • Reaction trigger — Start a Job 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 assignment 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 Job for every new message (or every message matching your keyword filter). It fires within seconds of the message being posted. If multiple assignments 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 Job when the configured reaction is added. Scheduled digests use a time-based schedule rather than a real-time trigger. The assignment runs at a set time, reads the recent message history of the channel, and produces output.

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

Channel message trigger (fires on every matching message)

  1. Open your assignment and go to Setup.
  2. Find the Slack Workspace connection in the Connections section.
  3. Enable the Channel Message trigger.
  4. Select the channel you want to monitor.
  5. 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.
  6. Save.
Prerequisites: The Slack Workspace connection must be installed by a team admin, and the Duvo app must be invited to the target channel (/invite @Duvo).

Reaction trigger (fires when a specific emoji is added)

  1. Open your assignment and go to Setup.
  2. Enable the Slack Reaction trigger.
  3. Select the channel to monitor.
  4. Enter the emoji name (for example, white_check_mark or ticket).
  5. Save.
When a team member adds the configured reaction to any message in the channel, Duvo starts a Job and passes the original message content as context.

Scheduled channel digest (fires at a set time)

Channel digests use a scheduled assignment rather than a real-time trigger.
  1. Open your assignment and go to Setup.
  2. Set a schedule — for example, every Friday at 5pm, or every weekday at 8am.
  3. Write your SOP to read recent message history from the target channel and produce the desired output.
  4. Add the Slack connection so the assignment can read channel history and post replies.

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

  1. Enable the Channel Message trigger on the assignment.
  2. Select #support-inbox as the channel.
  3. Leave keyword filter empty so every message starts a Job.

SOP

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 Job 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 assignment 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

  1. Enable the Slack Reaction trigger on the assignment.
  2. Select #approvals as the channel.
  3. Set the emoji to white_check_mark for approvals. Create a second assignment with x for rejections, or handle both reactions in one SOP.

SOP

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

  1. Set a schedule of every Friday at 5pm.
  2. No Slack trigger needed — the assignment runs on the time schedule and reads the channel.

SOP

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

Use keyword filters to avoid overlapping triggers: If you have two assignments 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. Write the SOP 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 SOP: “If the message is from a bot or app, read its structured content (title, fields, links) as well as any plain text.” Set a cooldown for high-volume channels: In a channel with dozens of messages per hour, a channel message trigger will start a Job for each one. Confirm your SOP handles this volume, or use a keyword filter to narrow the trigger. 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.

Troubleshooting

The trigger is not firing

  • 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.
  • Check that the assignment has a published build — draft-only assignments cannot be triggered.
  • If a keyword filter is set, confirm the test message contains the exact keyword (case-insensitive match).

Every message starts a Job but most should not

  • Add a keyword filter to the trigger so only relevant messages start a Job.
  • Alternatively, keep the trigger broad and add a filter step to the SOP: “If the message does not match [criteria], stop processing.”

The SOP cannot read the channel history for a digest

  • The Slack connection (not Slack Workspace) is required for reading channel history. Confirm it is enabled under Connections and authorized.
  • Confirm the assignment has permission to read the target channel. Re-authorize the Slack connection if needed.

Reaction trigger fires for the wrong emoji

  • 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.