DenchClaw + Slack: CRM Notifications in Your Team Chat
Connect DenchClaw to Slack for deal stage alerts, daily pipeline summaries, and CRM queries from Slack messages — no HubSpot subscription needed.
DenchClaw + Slack: CRM Notifications in Your Team Chat
Sales teams live in Slack. The problem is that your CRM data is somewhere else — HubSpot, Salesforce, a spreadsheet — and you're copy-pasting deal updates into channels manually. DenchClaw can post directly to Slack, respond to queries from Slack messages, and notify your team when deals move through the pipeline.
Here's how to connect Slack as a DenchClaw channel and set up useful notifications.
Setting Up Slack as a DenchClaw Channel#
DenchClaw supports Slack as a first-class communication channel. Once set up, you can query and update your CRM from any Slack message.
Step 1: Create a Slack App#
- Go to api.slack.com/apps
- Click "Create New App" → "From scratch"
- Name it "DenchClaw" and select your workspace
- Under "OAuth & Permissions", add these Bot Token Scopes:
chat:write— post messageschannels:read— list channelsapp_mentions:read— detect @mentionsim:read— receive DMscommands— slash commands (optional)
- Install the app to your workspace
- Copy the "Bot User OAuth Token" (starts with
xoxb-)
Step 2: Configure DenchClaw with the Slack token#
npx denchclaw channel add slack --token xoxb-your-token-here --channel #crm-updatesOr tell DenchClaw interactively:
"Add Slack as a channel. My bot token is xoxb-... and I want notifications in #crm-updates"
Step 3: Test the connection#
"Send a test message to Slack"
DenchClaw posts a test message to your configured channel. If you see it in Slack, you're connected.
Step 4: Invite the bot to your channel#
In Slack, go to #crm-updates and type:
/invite @DenchClaw
The bot needs to be a member of any channel it posts to.
Deal Stage Change Notifications#
The most immediately useful setup: automatic Slack notifications when deals move through your pipeline.
"Notify #crm-updates in Slack whenever a deal changes stage"
DenchClaw creates a trigger that fires on any deal_stage field update in DuckDB. The notification looks like:
🟢 Deal Update — Acme Corp
Sarah Chen moved from Discovery → Proposal
Deal value: $24,000/year
Owner: Mark
View in DenchClaw → [link]
You can customize which stage transitions trigger notifications:
"Only notify Slack when deals reach Proposal, Contract, or Closed Won stages"
Or notify different channels for different stages:
"Post to #sales-wins when a deal closes. Post to #crm-updates for all other stage changes."
Setting up webhook-based Slack alerts#
For more control, you can set up Slack Incoming Webhooks:
- In your Slack App settings, go to "Incoming Webhooks" and activate it
- Click "Add New Webhook to Workspace" and choose your channel
- Copy the webhook URL
Then configure DenchClaw:
npx denchclaw webhook add \
--name slack-deals \
--url https://hooks.slack.com/services/T00/B00/xxxx \
--trigger deal_stage_changeA sample webhook payload DenchClaw sends:
{
"text": "Deal Update: Acme Corp",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Acme Corp* moved to *Proposal* stage\n>Contact: Sarah Chen\n>Value: $24,000\n>Owner: Mark"
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {"type": "plain_text", "text": "View in DenchClaw"},
"url": "http://localhost:3000/contacts/123"
}
]
}
]
}Daily Pipeline Summaries to Slack#
Set up a daily digest that posts your pipeline status to Slack each morning:
"Every weekday at 8am, post a pipeline summary to #crm-updates"
DenchClaw runs this DuckDB query each morning:
SELECT
deal_stage,
COUNT(*) AS deals,
SUM(deal_value::DECIMAL) AS total_value
FROM v_contacts
WHERE status = 'Active'
AND deal_stage IS NOT NULL
GROUP BY deal_stage
ORDER BY
CASE deal_stage
WHEN 'Lead' THEN 1
WHEN 'Discovery' THEN 2
WHEN 'Proposal' THEN 3
WHEN 'Contract' THEN 4
WHEN 'Closed Won' THEN 5
ELSE 6
END;And formats the result as a Slack message:
📊 Pipeline Summary — Thursday, March 26
Lead 12 deals —
Discovery 8 deals $142,000
Proposal 5 deals $89,500
Contract 2 deals $47,000
──────────────────────────────
Active Total 27 deals $278,500
↑ 3 new deals this week
↓ 1 deal moved to Closed Lost
You can also request on-demand summaries from Slack:
@DenchClaw show me today's pipeline
Using Action Fields to Post Deal Updates to Channels#
DenchClaw's Action fields can trigger Slack posts from individual contact records.
Setup example:
"Add an Action field to deal records called 'Post Update to Slack'
that shares the current deal status to #crm-updates"
When triggered (from the web UI or by saying "Post update for Acme Corp to Slack"), DenchClaw composes and sends a contextual update:
🔔 Deal Update: Acme Corp
Status: Proposal stage
Contact: Sarah Chen, VP of Engineering
Last interaction: 3 days ago (email re: pricing)
Next step: Follow up on budget approval
— Posted by Mark via DenchClaw
This replaces the habit of manually writing Slack updates like "hey just sent proposal to Acme, fingers crossed" — DenchClaw does it with actual data.
Querying CRM From Slack Messages#
Once DenchClaw is in your Slack workspace, you can query it directly from any channel:
@DenchClaw who are our top 5 deals by value?
@DenchClaw how many leads did we add this week?
@DenchClaw what's the status of Acme Corp?
@DenchClaw show me all deals in contract stage
DenchClaw translates these into DuckDB queries and posts the results back in Slack. Your whole team can query the CRM without needing to log into a separate tool.
Example Slack → DuckDB queries#
When someone asks "@DenchClaw show me this week's closed deals":
SELECT
c.name AS contact,
c.company,
c.deal_value,
c.close_date
FROM v_contacts c
WHERE c.deal_stage = 'Closed Won'
AND c.close_date >= DATE_TRUNC('week', CURRENT_DATE)
ORDER BY c.close_date DESC;When someone asks "@DenchClaw which deals haven't moved in 2 weeks":
SELECT
c.name,
c.company,
c.deal_stage,
MAX(i.date) AS last_activity,
DATEDIFF('day', MAX(i.date), NOW()) AS days_inactive
FROM v_contacts c
LEFT JOIN v_interactions i ON i.contact_id = c.id
WHERE c.status = 'Active'
GROUP BY c.name, c.company, c.deal_stage
HAVING days_inactive >= 14 OR last_activity IS NULL
ORDER BY days_inactive DESC NULLS LAST;Restricting Which Channels Can Query DenchClaw#
By default, DenchClaw responds to @mentions in any channel it's in. You can restrict this:
"Only respond to CRM queries from #sales, #crm-updates, and DMs with me"
You can also set permission levels:
"Anyone in #sales can query DenchClaw, but only I can create or update records"
This prevents situations where someone accidentally tells DenchClaw to delete a contact from a shared channel.
Frequently Asked Questions#
Can multiple team members use DenchClaw from Slack?
Yes. Anyone in channels where DenchClaw is present can query it with @mentions. Updates and creates can be restricted to specific users or left open to all — you control the permission level.
Does DenchClaw read all Slack messages?
No. DenchClaw only processes messages that @mention it or that match configured triggers (like deal stage changes). It doesn't index your Slack history.
Can I use Slack slash commands instead of @mentions?
Yes. If you enable the "Commands" scope in your Slack App and configure a slash command (e.g., /crm), you can use /crm show pipeline instead of @DenchClaw show pipeline. Setup is in your Slack App settings under "Slash Commands."
What happens if Slack's rate limit is hit?
Slack allows roughly 1 message per second per channel. If DenchClaw is batching a lot of notifications (e.g., a bulk import that triggers 50 stage-change notifications), it queues them and sends with a short delay to stay within rate limits.
Can I get Slack notifications for specific contacts, not all deals?
Yes. You can configure: "Notify me on Slack for any activity on Acme Corp or Globex." DenchClaw will post to your DM (or a channel) specifically when those accounts have updates, regardless of global notification settings.
Ready to try DenchClaw? Install in one command: npx denchclaw. Full setup guide →
