Real-time alerts: New leads, qualifications, bookings, cancellations, and outcomes all post to Slack
Per-event routing: Send each event type to a different channel (or several channels)
Smart debouncing: A "New lead" message waits a few minutes — if the prospect qualifies or books, the earlier message is replaced so your channel stays clean
Rich previews: Each message includes prospect details, the event name, custom form fields, and a one-click "Open in SalesCal" button
Go to Settings > Integrations
Find Slack and click Add to Slack
A Slack popup opens. Pick the workspace you want to connect, review the requested permissions, and click Allow
You're redirected back to SalesCal and the integration card now shows the workspace name and your name as the connector
SalesCal requests these Slack scopes:
Scope | Purpose |
| Post messages in channels the bot is in |
| Post in public channels without joining first |
| List your public channels in the channel picker |
| List private channels the bot has been added to |
| Show your workspace name and icon on the connection card |
| Resolve Slack users for future @mentions |
| Match SalesCal team members to Slack users by email |
SalesCal does not read your message history. The bot only posts messages it generates from SalesCal events.
Once connected, the Event routing card lists every event you can pipe into Slack. For each event you choose:
On / off — enable or disable the event
Channels — one or many channels to post to. Public channels show with #; private channels show with a lock icon. The bot must be a member of any private channel you select
Test button — when an event is enabled and at least one channel is selected, this sends a sample message to the first selected channel so you can confirm it lands
The 8 supported events:
Event | When it fires |
New lead | A prospect entered their name + email or phone on the booking form |
Qualified | The prospect submitted the form and passed your qualification rules |
Disqualified | The prospect submitted the form and was disqualified |
Call booked | A prospect picked a time and confirmed |
Call rescheduled | An existing booking moved to a new time |
Call cancelled | A booking was cancelled |
No-show | The meeting outcome was set to "No-show" |
Call completed | The meeting outcome was set to "Completed" |
Changes don't take effect until you click Save changes.
The New lead event has a delay slider (default 5 minutes, range 1–30 minutes). When a lead fills in the form, the New-lead message waits this long before posting.
If the prospect qualifies, books, gets disqualified, or completes any other terminal event during the wait, the queued New-lead message is dropped — only the later, higher-signal event is sent. This stops your channel from filling with duplicate noise for the same prospect.
The same debounce applies between "Qualified" and "Booked": if a prospect qualifies and books within 60 seconds, only the booking notification posts.
Each message uses Slack's Block Kit format and includes:
Header with an emoji and the event title (e.g. ":sparkles: Qualified lead")
Prospect details: name (a clickable link that opens the lead in your dashboard), email/phone, the event they're booking, lead score and grade (where applicable), disqualification reason (when disqualified)
Booking details (booked / rescheduled / cancelled / no-show / completed): scheduled time in the host's timezone, assigned host name and email
Custom form fields (up to 10, truncated at 200 characters per value)
Attribution context: UTM source if present, detected city and country if available
Action button: "Open in SalesCal" links straight to the lead in your dashboard
Each SalesCal team can connect one Slack workspace. Everyone on the team sees the same Slack settings and the same channel options. Individual users do not have their own Slack connections.
The Slack bot needs to be a member of any private channel before SalesCal can post to it. In Slack, open the channel, type /invite @SalesCal, then refresh the channel picker in SalesCal.
Public channels work without an invite, but only if Slack hasn't restricted public posting at the workspace level. Try inviting the bot to the channel explicitly with /invite @SalesCal.
The picker fetches up to ~500 channels for performance. Very large workspaces may have channels that don't appear — invite the bot to the specific channel you need and it will show up.
Confirm the event is toggled on, at least one channel is selected, and the bot is in that channel. If you're impersonating another user from the admin panel, test messages are suppressed to avoid sending fake data to real channels.
This is rare but can happen if Slack's API briefly rate-limits us. Check the message timestamps; if you genuinely see duplicates outside of debounce, contact support.
Go to Settings > Integrations > Slack
Click Disconnect in the top right of the connected card
Confirm the prompt: "Disconnect Slack? Your channel settings will be lost."
On disconnect, SalesCal revokes the bot token in Slack and removes your channel routing settings. The Slack messages already posted stay where they are.
The bot token is stored encrypted at rest in SalesCal's database
Messages include prospect data (name, email, phone, custom form answers) — make sure your Slack channels match the level of sensitivity that data deserves
SalesCal does not subscribe to any Slack events; the integration is outbound only
Start with one channel. Pipe every event to a single #salescal-alerts channel for a week, see what's noisy, then split by event type.
Use private channels for outcome events. "No-show" and "Completed" often include host context that's not for the whole company.
Keep the New-lead delay at 5 minutes. Lower and you get duplicate noise; higher and the signal isn't real-time anymore.
Test after big workspace changes. If you rename channels or remove the bot, re-run the Test button on a couple of events to confirm routing still works.
Managing Leads — what each lead state means
Qualification Rules — controls when "Qualified" vs "Disqualified" fires
Managing Meetings — outcomes that trigger No-show / Completed