

How to Send Daily Close Pipeline Updates to Slack with Zapier
A scheduled Zapier workflow queries Close each morning for pipeline metrics, overdue tasks, and upcoming activities, then posts a formatted summary to a designated Slack channel.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Sales managers at 5-30 person inside sales teams who want a zero-effort daily briefing without building a custom report in Close.
Not ideal for
Teams needing real-time deal alerts the moment a status changes — use a webhook-based Zap triggered by Close deal updates instead.
Sync type
scheduledUse case type
reportingReal-World Example
A 12-person SaaS inside sales team uses this to post a #pipeline-daily digest to Slack at 8:00 AM every weekday. Before this, the sales manager pulled a Close report manually each morning, copied numbers into Slack, and reps still missed overdue tasks because no one checked Close until mid-morning. Now the summary hits Slack before standups and overdue task count dropped 40% in the first month.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Before You Start
Make sure you have everything ready.
Optional
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Opportunity Name | opportunity_name | |
| Opportunity Value | value | |
| Opportunity Status | status | |
| Assigned User | user_id | |
| Task Description | text | |
| Task Due Date | date | |
| Task Assigned User | assigned_to | |
3 optional fields▸ show
| Close Date | expected_date |
| Lead Name | lead_name |
| Pipeline Name | pipeline_id |
Step-by-Step Setup
Zapier Dashboard > Create Zap
Create a new Zap and name it
Log into Zapier and click the orange 'Create Zap' button in the top left. Give the Zap a clear name in the title bar at the top — something like 'Close Daily Pipeline → Slack #sales'. A clear name matters when you have multiple Zaps running; generic names like 'Zap 1' get confusing fast. You'll land on the trigger setup screen automatically.
- 1Click the orange 'Create Zap' button in the top-left sidebar
- 2Click the untitled Zap name at the top and type 'Close Daily Pipeline → Slack #sales'
- 3Click the 'Trigger' block to begin trigger setup
Trigger > App > Schedule by Zapier > Every Day
Set the Schedule by Zapier trigger
Search for 'Schedule by Zapier' in the app search box and select it. This is a native Zapier app — no separate account needed. Choose 'Every Day' as the trigger event. This fires once per day at a time you specify, which is what drives the morning pipeline summary. Do not use 'Every Hour' — it will spam your Slack channel and burn through tasks quickly.
- 1Type 'Schedule' in the app search field
- 2Select 'Schedule by Zapier' from the results
- 3Click 'Choose an event' and select 'Every Day'
- 4Click 'Continue'
Trigger > Schedule by Zapier > Configure > Time of Day
Configure the schedule time and days
Set 'Time of Day' to the UTC equivalent of your team's morning standup time. Under 'Day of Week', choose weekdays only unless your team works weekends. The 'Trigger on Weekends' toggle is separate from the day-of-week field — both need to be set correctly. Click 'Continue' when done, then click 'Test trigger' to confirm it fires.
- 1Set 'Time of Day' to your target UTC time (e.g., 13:00 for 8 AM ET)
- 2Set 'Day of Week' to 'Monday through Friday'
- 3Toggle 'Trigger on Weekends?' to OFF
- 4Click 'Continue'
- 5Click 'Test trigger' to confirm a sample fire
Action > App > Close > Search Opportunities
Add a Close action to fetch pipeline data
Click the '+' button below the trigger to add your first action. Search for 'Close' and select it. Choose 'Search Opportunities' as the action event — this lets you query deals by status, pipeline, and date range. You'll need to authorize your Close account if you haven't already; have your Close API key ready from Close Settings > API. This step pulls the raw deal data that populates your Slack message.
- 1Click the '+' icon below the Schedule trigger
- 2Search for 'Close' in the app picker
- 3Select 'Close' from the results
- 4Choose 'Search Opportunities' as the Action Event
- 5Click 'Sign in to Close' and paste your Close API key when prompted
Action > Close > Search Opportunities > Configure
Configure the opportunity search filters
Set 'Status' to 'Active' to pull only open deals. Leave the date range fields blank if you want all active pipeline; set 'Close Date Before' to today if you only want deals due this week. Map 'Pipeline' to your specific pipeline name if Close has multiple pipelines configured — leaving it blank returns all pipelines, which may be too broad for a team-specific channel. Click 'Continue' when your filters are set.
- 1Set 'Status' to 'Active'
- 2Set 'Pipeline' to your target pipeline name if applicable
- 3Leave 'Close Date Before' blank for all active deals, or set to today's date for current-week deals only
- 4Click 'Continue'
- 5Click 'Test action' to confirm Close returns real deal records
Action > Close > Search Tasks > Configure
Add a second Close action to fetch overdue tasks
Click '+' again to add another action step. Select Close again, but this time choose 'Search Tasks' as the event. Filter by 'Overdue: Yes' and 'Assigned User: All' to capture every rep's overdue activity. This is a separate API call from the opportunity search — both results will be available as data in your Slack message. Set the status filter to 'Todo' to exclude completed tasks.
- 1Click '+' below the opportunity search step
- 2Select 'Close' again from the app picker
- 3Choose 'Search Tasks' as the Action Event
- 4Select your already-connected Close account
- 5Set 'Is Overdue' to 'True' and 'Status' to 'Todo'
- 6Click 'Continue' and then 'Test action'
Action > Code by Zapier > Run Python > Input Data
Add a Code by Zapier step to build the summary text
Click '+' and add a 'Code by Zapier' action with 'Run Python' selected. This step takes the raw Close data from steps 4 and 6 and formats it into a readable Slack message. Without this step, you'd be posting raw JSON to Slack or a single deal at a time. Paste in the Python code from the pro tip below. Map the input variables to the opportunity and task arrays from the previous steps. This is the most technical step but also the one that makes the message actually useful.
- 1Click '+' below the Search Tasks step
- 2Search for 'Code by Zapier'
- 3Select 'Run Python' as the Action Event
- 4Under 'Input Data', add key 'opportunities' mapped to the full output from step 4
- 5Add key 'tasks' mapped to the full output from step 6
- 6Paste the Python code from the pro tip into the 'Code' field
- 7Click 'Continue' and 'Test action'
Paste this into the Code by Zapier 'Run Python' step. Map input_data keys 'opportunities' and 'tasks' to the JSON outputs from your Close Search steps. The script counts deals, sums pipeline value, flags this-week closers, and lists overdue tasks by rep — all in one formatted Slack-ready string.
JavaScript — Code Stepimport json▸ Show code
import json from datetime import datetime, timedelta # Input data comes from Zapier's input_data dict
... expand to see full code
import json
from datetime import datetime, timedelta
# Input data comes from Zapier's input_data dict
# 'opportunities' and 'tasks' are JSON strings from Close search steps
opps_raw = input_data.get('opportunities', '[]')
tasks_raw = input_data.get('tasks', '[]')
try:
opportunities = json.loads(opps_raw) if isinstance(opps_raw, str) else opps_raw
except Exception:
opportunities = []
try:
tasks = json.loads(tasks_raw) if isinstance(tasks_raw, str) else tasks_raw
except Exception:
tasks = []
today = datetime.utcnow().date()
week_out = today + timedelta(days=7)
# Pipeline totals
total_value = sum(float(o.get('value', 0) or 0) for o in opportunities)
total_deals = len(opportunities)
# Deals closing this week
closing_soon = [
o for o in opportunities
if o.get('expected_date') and today <= datetime.strptime(o['expected_date'], '%Y-%m-%d').date() <= week_out
]
# Build overdue task lines
task_lines = []
for t in tasks:
due_str = t.get('date', '')
rep = t.get('assigned_to_name', 'Unknown')
description = t.get('text', 'No description')
lead = t.get('lead_name', '')
days_overdue = ''
if due_str:
try:
due_date = datetime.strptime(due_str, '%Y-%m-%d').date()
delta = (today - due_date).days
days_overdue = f'{delta} day{"s" if delta != 1 else ""} overdue'
except Exception:
days_overdue = 'overdue'
lead_part = f' ({lead})' if lead else ''
task_lines.append(f'• {rep} — {description}{lead_part} — {days_overdue}')
# Format the Slack message
date_label = today.strftime('%b %-d, %Y')
message_parts = [
f'📊 *Daily Pipeline Summary — {date_label}*',
'',
f'*Active Deals:* {total_deals} | *Total Value:* ${total_value:,.0f}',
f'*Closing This Week:* {len(closing_soon)} deal{"s" if len(closing_soon) != 1 else ""}',
]
if task_lines:
message_parts.append('')
message_parts.append(f'⚠️ *Overdue Tasks ({len(task_lines)}):*')
message_parts.extend(task_lines[:10]) # cap at 10 to avoid Slack message length limits
else:
message_parts.append('')
message_parts.append('✅ No overdue tasks today.')
message_parts.append('')
message_parts.append('_Powered by Close CRM_')
output = [{'message': chr(10).join(message_parts)}]Action > Slack > Send Channel Message > Configure
Add the Slack action to post the message
Click '+' and add a Slack action. Choose 'Send Channel Message' as the event. Connect your Slack workspace if not already connected — Zapier will open a Slack OAuth window. Select the target channel from the dropdown (e.g., #pipeline-daily or #sales). Map the 'Message Text' field to the 'output > message' value from the Code by Zapier step. Set the bot name to something like 'Pipeline Bot' so reps know the source.
- 1Click '+' and select 'Slack'
- 2Choose 'Send Channel Message' as the Action Event
- 3Click 'Sign in to Slack' and authorize via the OAuth window
- 4Select your target channel from the 'Channel' dropdown
- 5Map 'Message Text' to the 'message' output from the Code by Zapier step
- 6Set 'Bot Name' to 'Pipeline Bot' and optionally add a 📊 emoji as the bot icon
- 7Click 'Continue'
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}channel: {{channel}}
ts: {{ts}}
Zap Editor > Test Zap > Review Results
Test the full Zap end-to-end
Click 'Test Zap' at the bottom of the editor. Zapier runs all steps in sequence using real data from Close and attempts to post to your Slack channel. Open your Slack channel in another tab so you can see the message appear in real time. Check that deal counts, overdue task numbers, and rep names look correct. If the message is malformed, go back to the Code by Zapier step and re-test with updated input.
- 1Click 'Test Zap' at the bottom of the editor
- 2Watch each step go green in sequence
- 3Switch to your Slack channel to confirm the message posted
- 4Verify the deal count, overdue task count, and formatting look correct
Zap Editor > Toggle On > Task History
Turn on the Zap
Toggle the Zap to 'On' using the switch in the top right of the editor. Zapier will confirm activation with a green indicator. The first live run will happen at the scheduled time you set in step 3 — not immediately. Check Zapier's Task History the next morning to confirm the Zap ran successfully and delivered the message. Set up a Zapier alert under Settings > Notifications to email you if the Zap errors.
- 1Click the toggle switch in the top-right to 'On'
- 2Confirm the green 'On' status indicator appears
- 3Navigate to Task History in the left sidebar
- 4The next morning, check Task History to confirm a successful run
- 5Go to Settings > Notifications and enable error email alerts
Scaling Beyond 100+ active deals in Close pipeline+ Records
If your volume exceeds 100+ active deals in Close pipeline records, apply these adjustments.
Zapier caps Close searches at 100 records
The Close 'Search Opportunities' action in Zapier returns a maximum of 100 records silently. If you have 150 active deals, the summary will undercount by 50 with no error. For pipelines over 100 deals, switch to Make (which supports pagination on Close searches) or use a Code by Zapier step with the Close API directly to paginate through results.
Cap overdue task list length in Slack messages
Slack has a 4,000-character limit per message. If 40 overdue tasks are returned, listing all of them will truncate the message or cause an API error. The pro tip code already caps task display at 10 items. Adjust this cap in the Python script based on your typical task volume.
Use pipeline filters to split large teams into segments
If a single team has 200+ deals, create separate Zaps per pipeline or per region and post each to a different Slack channel. This keeps each Zap under the 100-record limit and makes the Slack messages more actionable for each sub-team.
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use Zapier for this if your sales team is not technical and you need something live this week. The guided Zap builder handles Close and Slack auth without any API configuration, the Schedule trigger is built in, and the Code by Zapier step handles the formatting without requiring a separate server. The one scenario where you'd skip Zapier: if your pipeline has more than 100 active deals. Zapier's Close integration doesn't paginate, so you'll silently get incomplete data. Use Make instead — its Close module supports pagination and the HTTP module lets you hit the Close API directly for full result sets.
Real cost math: this Zap uses 4 tasks per run — one for the schedule, one for Close opportunities search, one for Close tasks search, one for the Slack post (the Code step is free). At 22 weekday runs per month, that's 88 tasks/month. Zapier's Starter plan includes 750 tasks/month for $19.99/month, so this Zap alone uses about 12% of that allowance. If you run this plus other Zaps, you'll hit 750 tasks fast. Make runs the equivalent for free on its Free plan (1,000 operations/month) and charges $9/month for 10,000 operations if you scale up — roughly half the Zapier cost at volume.
Make handles this use case better structurally: its iterator module can loop through all returned deals individually and build a formatted list without needing Python, and it supports Close API pagination natively. n8n is better if you self-host and want zero per-task cost — the Code node handles the same Python logic and there's no task cap. Power Automate is a poor fit here; its Close connector is thin and the scheduled flow setup is more complex than Zapier's for the same result. Pipedream is excellent if a developer on your team wants to extend this later — the Node.js environment gives you full Close API access, but setup takes 3x longer than Zapier for a non-technical user. Zapier wins on setup speed and team accessibility, not on flexibility or cost.
Three things you'll hit after go-live: First, Close's user IDs don't resolve to names automatically in Zapier. The 'Search Opportunities' action returns a user_id field, not a display name — you'll need to either use the assigned_to_name field explicitly (it exists but isn't always documented clearly in Zapier's field picker) or add a 'Find User' step. Second, the Schedule trigger fires in UTC at the exact second configured, but Zapier's Close API calls add 10-30 seconds of latency. The Slack message arrives 30-90 seconds after the scheduled time, not instantly — this is normal. Third, if someone archives the Slack channel the Zap posts to, Zapier will error silently on the next run without an obvious error message. Check Task History if the message stops appearing — 'channel_archived' is the error to look for.
Ideas for what to build next
- →Add per-rep breakdowns to the daily message — Update the Python script to group deals and overdue tasks by assigned rep and post individual rep scorecards. Useful once the team exceeds 5 reps and totals alone stop being actionable.
- →Add a weekly Close digest with trend data — Create a second Zap on a Friday schedule that compares this week's pipeline value against last week using Close's Search Opportunities date filters. Post the delta to #sales-leadership so managers see momentum, not just snapshots.
- →Route overdue task alerts to individual reps via Slack DM — Add a second Slack action step that sends a direct message to each rep with only their own overdue tasks, using a lookup between Close's assigned_to_name and Slack user IDs. Keeps the channel summary clean while making accountability personal.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup