Connecting Slack

We handle the hard parts. Connecting Slack should feel like signing into any modern app, not like wrestling with complicated integrations. Here's how it works.

The setup wizard

When you create a new account, the wizard walks you through three steps:

Step 1: Authorize

Click Connect to Slack. You'll be redirected to Slack's OAuth page where you authorize Ruby Relay to access your workspace. This uses Slack's official OAuth 2.0 flow. We never see or store your Slack password.

Setup wizard step 1: Connect your Slack workspace with the Add Ruby Relay to Slack button

Slack's OAuth screen

After clicking Connect to Slack, you'll see Slack's permissions screen. Review the permissions and click Allow to authorize the connection.

Slack OAuth permissions screen showing the scopes Ruby Relay requests when connecting to your workspace

Step 2: Choose a channel

After authorization, you'll see a list of your Slack channels. Pick the one where you want visitor conversations to land. We recommend creating a dedicated channel (like #website-chat or #support-live) so conversations don't get lost in the noise of your general channels.

Setup wizard step 2: Pick your Slack channels from a list with Connect buttons

Step 3: Done

That's it. The wizard confirms the connection, and the whole process takes about 30 seconds. When you're ready to send a test message and watch it land in Slack, open your widget's live preview and switch it to Live mode.

Setup wizard step 3: Success screen confirming your Slack workspace is connected

Additional workspaces

To connect another Slack workspace, go to the Workspaces page and open the workspace selection dropdown in the top-right corner. Select a new workspace from there to kick off the same OAuth flow, then pick which channels to connect. See Managing Channels for working with multiple workspaces.

Workspaces page with the workspace selection dropdown open in the top-right, showing connected workspaces and the option to connect another

What permissions and why

When you authorize Ruby Relay, Slack shows its consent screen with every scope at once, which can look like a lot. Here's the honest version of what we actually do with that access:

  • We only act on the channels you connect. Relayed visitor messages and your replies flow through the channel(s) you pick, and nothing else.
  • We never read your DMs or any channel you haven't connected as a relay channel.
  • We never see your Slack password. The connection uses Slack's official OAuth 2.0, and you can disconnect anytime from the dashboard or your Slack settings.
  • We never sell, mine, or train on your conversations.

Here's exactly what each scope does, and why we request it:

ScopeWhy we need it
app_mentions:readAllow users to interact with Ruby Relay by @mentioning it
channels:historyReceive real-time messages from public channels to relay back to visitors
channels:joinAdd Ruby Relay to public channels when users configure a new relay channel
channels:readList available public channels for channel selection, retrieve channel metadata
chat:writePost relayed visitor messages and system notifications into Slack
commandsRegister the /rubyrelay slash command so your team can pull up a cheat sheet inside any channel
files:readRead images shared by team members in Slack threads so they can be displayed in the visitor's chat widget
files:writeUpload images sent by visitors and screenshots captured via !!screenshot into Slack threads
groups:historyReceive real-time messages from private channels (same as public)
groups:readList available private channels for selection, retrieve metadata
reactions:readDetect the ✅ a teammate adds to a thread to resolve a conversation in Ongoing Conversations mode
reactions:writeAdd the ✅ when a conversation is resolved by command and the ⏰ when one auto-closes, so resolved and timed-out threads read at a glance
team:readRetrieve workspace name and icon for the Ruby Relay dashboard
users:readLook up display names of Slack users who reply in relay threads

Channel selection tips

  • Create a dedicated channel. Something like #website-chat keeps live conversations separate from your team's regular chatter.
  • Set channel notifications to "All new messages." You don't want to miss a visitor because Slack decided it wasn't important enough for a notification.
  • Pin a welcome note explaining that this channel is for live visitor chat, so teammates aren't confused when messages start showing up.
  • Consider multiple channels if you have different products or sites. See Managing Channels for routing strategies.

How Slack threads work

Every new visitor session creates a new thread in your connected channel. Here's how the flow looks:

  1. Visitor opens the widget and sends a message.
  2. Ruby Relay posts the message to your channel as a new thread, with context like the page URL and visitor session info.
  3. Your team replies in the thread.
  4. The reply appears in the visitor's chat widget in real time.
  5. If the visitor sends follow-up messages, they're added to the same thread. One conversation, one thread.

Sessions time out after 90 minutes of inactivity. If the visitor comes back after that, a new thread starts. This prevents zombie threads that go on forever.

On the Growth and Scale plans you can switch on Ongoing Conversations, which keeps a thread open until you resolve it (or it sits idle for 14 days) instead of timing out at 90 minutes, so a returning visitor stays in the same thread.

Text replies and images are relayed to the visitor in real time. When a team member shares an image in the thread, it appears inline in the visitor's chat widget. Visitors can also send images back (via paste, drag-and-drop, or file picker), and those appear in the Slack thread. Other attachment types (PDFs, zip files, etc.) are not currently relayed.

Thread commands

Thread commands let you control how Ruby Relay handles individual messages. Include a command anywhere in your thread reply and Ruby Relay will act on it before processing the message.

CommandWhat it does
!!ignorePrevents the message from being relayed to the visitor. Use this for internal coordination, side conversations, or notes your team needs to see but the visitor shouldn't.
!!closeEnds the visitor session immediately instead of waiting for the 90-minute inactivity timeout. The visitor's next message will start a fresh thread.
!!resolveA synonym for !!close, the natural word to reach for when you're resolving a conversation rather than ending a session.
!!screenshotRequests a screenshot of the visitor's screen. The visitor sees a permission prompt and can allow or decline. See below for full details.

Commands can appear anywhere in the message, not just at the start. A reply like "checking with engineering !!ignore" works the same as "!!ignore checking with engineering". The entire message is suppressed either way. A !!close message is also not relayed to the visitor.

With Ongoing Conversations enabled, !!close (or !!resolve) marks the conversation resolved instead of just ending the session, and you can also resolve a thread by reacting to it with ✅.

The !!screenshot command

Sometimes text isn't enough to diagnose a problem. The !!screenshot command lets you request a screenshot of the visitor's current page, so you can see exactly what they're seeing.

How it works

  1. Type !!screenshot in the Slack thread. The message won't be relayed to the visitor.
  2. The visitor sees a prompt in the chat widget asking for permission to capture their screen.
  3. If the visitor clicks Allow, the widget captures a screenshot of the page and uploads it. The image appears both inline in the widget and in your Slack thread.
  4. If the visitor clicks Decline, you'll see "User declined the screenshot request." in the thread.
  5. If the capture fails for any reason, you'll see "Screenshot capture failed on the user's device." instead.
Chat widget showing the screenshot permission prompt with Allow and Decline buttons

What gets captured (and what doesn't)

Screenshots are captured in-browser using an HTML rendering approach. This means the visitor never has to install anything or grant browser permissions, but it comes with some trade-offs:

  • Captured: HTML, CSS, and inline images render accurately, which covers the vast majority of web content.
  • Not captured: cross-origin iframes (embedded maps, third-party widgets), canvas elements (WebGL, some charting libraries), and playing video or audio.
  • Pages taller than 4,096 pixels are clipped at that height.

The visitor always has to explicitly allow the capture. Only the browser page content is included, not browser chrome, other tabs, or anything else on their screen.

The /rubyrelay slash command

Ruby Relay registers a Slack slash command the moment you connect your workspace. Type /rubyrelay in any channel and Slack fires back an ephemeral message (only you see it) with a cheat sheet of everything you can do in a relay thread.

It covers:

  • The thread commands (!!screenshot, !!close, !!resolve, !!ignore) with one-line descriptions so you don't have to remember which is which.
  • A direct link back to this help center for the full docs.

Because the response is ephemeral, nothing posts to the channel and your team doesn't see you looking up the docs. It's a quiet "how did that command work again?" button you can hit from anywhere, including channels Ruby Relay isn't relaying from. Great for onboarding new teammates: they don't have to go hunting for a link, the slash command is right there.

Troubleshooting

Messages aren't showing up in Slack
Check that the Ruby Relay bot is still in the connected channel. If someone removed it, re-add it or reconnect the channel from the dashboard.
Replies from Slack aren't reaching visitors
Make sure you're replying in the thread, not as a standalone channel message. Only threaded replies get relayed back to the widget.
OAuth keeps failing
You need to be a Slack workspace admin (or have "Install Apps" permission) to authorize the integration. Check with your workspace owner if you're stuck.

Still stuck? See the full Troubleshooting guide or email us at support@rubyrelay.com.