Slack integration
Send inbox events to a channel. Approve from Slack directly. One-way notify or two-way interactive.
The Slack integration mirrors your inbox into a channel and lets approved deciders act directly from Slack without opening the web app.
What it does
- Notify: every inbox item posts a card to a configured channel.
- Interact: the card has Approve / Deny / Reply buttons. Clicking them resolves the inbox item.
- Threaded comments: replying in the thread posts a comment back to the inbox item.
- DM mode: route items personal to a specific user as a Slack DM instead of a channel post.
Set up
- Settings → Integrations → Slack → Connect.
- Authorize the Viewport Slack app on your workspace.
- Pick a default channel (or leave blank for DM-only).
- (Optional) Pick a fallback channel for unrouted items.
You're done. Test it:
vpd test push --channel slackYou should see a card in the channel within a few seconds.
Card shape
┌─────────────────────────────────────────────┐
│ 🟧 Plan review · ~/code/api · Acme Engineering │
│ Claude Code · 8 minutes ago │
├─────────────────────────────────────────────┤
│ Refactor auth middleware to bearer tokens. │
│ 12 steps, 9 files. Touches /auth and tests. │
├─────────────────────────────────────────────┤
│ ✓ Approve ✗ Deny ↩ Reply │
└─────────────────────────────────────────────┘The orange bar on the left is the inbox-kind tint (orange for plan review, red for approval gate, indigo for context candidate). The channel post is the summary; the full plan is one click away on the web app.
Routing rules
Per-workflow YAML can route different gates to different channels:
approvals:
plan_review:
notify:
slack:
channel: "#engineering-reviews"
approval_gate:
notify:
slack:
channel: "#engineering-oncall"
mention: "@channel"
context_candidate:
notify:
slack:
dm_actor: true # DM the user who created the source sessionThe channel name resolves dynamically. Mentions are opt-in to prevent noise.
Who can approve from Slack
By default, only users with the right role + share access can resolve from Slack. Slack identity is mapped to Viewport identity through the Slack user's primary email. If a Slack user with no matching Viewport account clicks Approve, they get a Slack-ephemeral error: "You're not a member of this Viewport organization."
To pre-authorize via Slack, link Slack accounts in Settings → Integrations → Slack → Linked accounts.
Audit
Every Slack-driven decision writes the standard audit event with source: slack and the Slack user/channel as metadata. The Slack message ID is included for traceability.
DM mode
If you route an item to a specific user via audience: user:alice@acme.com, Slack DMs Alice instead of posting to a channel. Useful for personal gates ("review your own plan").
Limitations
- One Slack workspace per Viewport org. Multi-Slack support is planned.
- Slack-side rate limits apply. A single workflow that fires hundreds of inbox items in a minute may be batched by Slack itself.
- No Slack-side editing of plans. The Slack card shows the summary; full edits happen on the web app.
Where to go next
- Webhook delivery. Slack alternative for custom integrations.
- Approval policies. What routes when.
- Audit log. Slack actions in the log.