Slack + Tevyr
Drive a Slack workspace from any Tevyr macro — post timer warnings to your control-room channel, route Q&A submissions to a moderation channel, ping ops when a session goes long, all without a Zapier middleman. Connects once via OAuth; tokens auto-refresh in the background.
Slack is the messaging platform most production crews already live in during a show. Tevyr's Slack integration uses Slack's official OAuth 2.0 install flow — no copy-pasting tokens, no bot user setup. Get a workspace at slack.com.
What you can do
Wire Slack to your show's lifecycle and stop alt-tabbing between tools.
Live timer warnings to #control-room
When the timer hits 1 minute remaining, post '60s left in {session name}' to your ops channel. Producer + camera + lighting all see it at the same time.
Q&A submissions to a moderation channel
Audience submits a question → Tevyr posts it to #qa-moderation with the submitter's name. Moderators triage in Slack, no extra dashboard to watch.
Session lifecycle pings
On every session start, end, and blackout, fire a short note into Slack. The post-show recap writes itself from your channel history.
On-call paging via @mention
On critical failures or overruns, post with <!channel> or @oncall into your alert channel. Pagerduty's job, free.
Prerequisites
- Tevyr Starter plan or above — Free plan ships 0 integration connections
- A Slack workspace where you can install apps (or get an admin to install Tevyr on your behalf)
- A target channel — Tevyr can post to public channels without being invited thanks to the
chat:write.publicscope; private channels require/invite @tevyronce
One-time setup
The whole flow lives in Tevyr's Settings → Integrations modal. No copy-pasting between tabs.
1. Open the Integrations modal
- In Tevyr, click your avatar → Settings → Integrations
- Click Add new in the top-right of the modal
- Pick the Slack tile from the template grid
2. Connect your workspace
- Click Connect Slack — a Slack OAuth popup opens
- Pick the workspace you want Tevyr to install into
- Slack shows the scopes Tevyr requests:
chat:write(post messages as the Tevyr bot) andchat:write.public(post to public channels without being invited) - Click Allow
- The popup closes automatically; a green toast confirms the install and the new connection appears in your list with the workspace name as its subtitle
3. Verify with the test button
Click Test on the new connection. Tevyr calls Slack's auth.test endpoint — read-only, no message sent — and shows a green toast like "Tevyr — live · workspace verified". If the toast is red, jump to Troubleshooting below.
Recipes
Drag a flow.http_request step into any macro, pick your Slack connection, then pick the Send message action. The recipes below show the fields you fill in.
Recipe 1 — Post when a session starts
Trigger: lifecycle event on_session_start.
| Field | Value |
|---|---|
| Channel | #stage or a channel ID like C0123456 |
| Message | :movie_camera: {{ctx.session.name}} just started |
Every time a session starts, the channel gets a one-liner with the session name auto-filled.
Recipe 2 — Warn the room when the timer hits 1 minute
Trigger: lifecycle event on_timer_warning (set the threshold to 60 seconds in the trigger config).
| Field | Value |
|---|---|
| Channel | #control-room |
| Message | <!channel> 60 seconds left in {{ctx.session.name}} |
The <!channel> mention pings every active member of the channel. Use <!here> if you only want online folks.
Recipe 3 — Route a Q&A submission to a moderation channel
Trigger: lifecycle event on_question_submitted (or wire Tevyr's Q&A webhook through a flow.http_request chain).
| Field | Value |
|---|---|
| Channel | #qa-moderation |
| Message | New Q&A from {{ctx.question.submitter_name}}: {{ctx.question.text}} |
Troubleshooting
"Bot can't post to private channel"
The chat:write.public scope only covers public channels. For a private channel, invite the Tevyr bot once:
/invite @tevyr
Then re-fire. Slack returns not_in_channel until the bot is invited.
"Test passes but messages don't land"
Channel name typos. Slack is case-insensitive on channel names, but spaces and special characters silently fail. The safest input is the channel ID — find it via the channel header → About → the alphanumeric ID at the bottom (e.g., C0123456).
"Connection went red after weeks of working"
Slack OAuth tokens refresh automatically inside Tevyr, but a workspace admin can revoke an installed app at any time (Workspace settings → Apps & integrations → Manage). If your connection turns red:
- Click Disconnect on the connection
- Click Connect Slack to re-run the OAuth dance — re-grants the scopes and saves a fresh token
"I want to post to two workspaces"
Each Slack connection is one workspace. Add a second connection from the Integrations modal — pick Slack again, install into the second workspace, give it a distinct name (e.g. "Slack — Tevyr" vs "Slack — Client Workspace"). Macros pick the connection by name.
Context variables
The Channel and Message fields above support {{ctx.*}} interpolation — at fire time, Tevyr resolves them against the macro's run context (active session, timer state, event title, etc.). Common ones: {{ctx.event.title}}, {{ctx.session.title}}, {{ctx.session.speaker_name}}, {{ctx.timer.remaining_seconds}}, {{ctx.now.iso}}. See the full context-variable reference in the Macros guide — the same variables work for every integration template.
Triggered by webhook events
This integration can be fired automatically from any webhook event (timer.started, timer.warning, session.started, etc.). When creating a webhook, pick Integration mode and select your Slack connection — Tevyr will format the call for you on every matching event.
Related
- Macros — build multi-step cues that include Slack pings alongside timer, message, and display actions
- Integrations overview — other tools you can wire alongside Slack
- Discord guide — Discord webhook alternative for community/gaming use cases
- Webhooks — one-way broadcasts to Slack via Incoming Webhooks if you prefer no-OAuth