Beginner~8 min setupCommunication & CRMVerified April 2026
Slack logo
Close logo

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

scheduled

Use case type

reporting

Real-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.

/mo
505005K50K

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.

Close account with API key access — found in Close under Settings > API Keys. The key owner needs read access to Opportunities and Tasks across all users, not just their own.
Slack workspace admin rights or permission to install apps — needed to authorize Zapier's Slack bot and invite it to channels.
Zapier account on Starter plan or above — the free plan does not support multi-step Zaps, and this workflow uses 4 action steps.
A dedicated Slack channel for pipeline updates already created (e.g., #pipeline-daily) — the Zapier bot needs to be invited to the channel before the Zap can post.

Optional

Your Close pipeline names written down — needed when filtering opportunities by pipeline in step 5. If left blank, all pipelines are returned.

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Opportunity Nameopportunity_name
Opportunity Valuevalue
Opportunity Statusstatus
Assigned Useruser_id
Task Descriptiontext
Task Due Datedate
Task Assigned Userassigned_to
3 optional fields▸ show
Close Dateexpected_date
Lead Namelead_name
Pipeline Namepipeline_id

Step-by-Step Setup

1

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.

  1. 1Click the orange 'Create Zap' button in the top-left sidebar
  2. 2Click the untitled Zap name at the top and type 'Close Daily Pipeline → Slack #sales'
  3. 3Click the 'Trigger' block to begin trigger setup
What you should see: You should see the trigger configuration panel open on the right side of the Zap editor, prompting you to choose an app.
2

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.

  1. 1Type 'Schedule' in the app search field
  2. 2Select 'Schedule by Zapier' from the results
  3. 3Click 'Choose an event' and select 'Every Day'
  4. 4Click 'Continue'
What you should see: You should see a configuration panel asking for 'Time of Day' and 'Day of Week' preferences.
Common mistake — Schedule by Zapier runs in UTC. If your team is in US Eastern time (UTC-5), set the time to 13:00 UTC to hit 8:00 AM ET. Getting this wrong means the digest arrives in the middle of the night.
Zapier
+
click +
search apps
Slack
SL
Slack
Set the Schedule by Zapier t…
Slack
SL
module added
3

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.

  1. 1Set 'Time of Day' to your target UTC time (e.g., 13:00 for 8 AM ET)
  2. 2Set 'Day of Week' to 'Monday through Friday'
  3. 3Toggle 'Trigger on Weekends?' to OFF
  4. 4Click 'Continue'
  5. 5Click 'Test trigger' to confirm a sample fire
What you should see: The test should return a green checkmark and a sample payload showing a timestamp — this confirms the trigger is configured and Zapier can read the schedule.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.
4

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.

  1. 1Click the '+' icon below the Schedule trigger
  2. 2Search for 'Close' in the app picker
  3. 3Select 'Close' from the results
  4. 4Choose 'Search Opportunities' as the Action Event
  5. 5Click 'Sign in to Close' and paste your Close API key when prompted
What you should see: After authentication, you should see a green 'Connected' badge next to your Close account name and a form to configure the opportunity search filters.
Common mistake — Close's Zapier integration uses API keys, not OAuth. The key must belong to an admin or a user with full pipeline read access. A rep-level key will return only that rep's deals and silently miss the rest of the pipeline.
5

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.

  1. 1Set 'Status' to 'Active'
  2. 2Set 'Pipeline' to your target pipeline name if applicable
  3. 3Leave 'Close Date Before' blank for all active deals, or set to today's date for current-week deals only
  4. 4Click 'Continue'
  5. 5Click 'Test action' to confirm Close returns real deal records
What you should see: The test should return at least one sample opportunity record with fields like opportunity name, value, status, and assigned user visible in the data panel.
Common mistake — Zapier's Close 'Search Opportunities' action returns a maximum of 100 records per run. If your pipeline has more than 100 active deals, Zapier will silently truncate the results. Switch to Make or a custom API call via Code by Zapier for pipelines above that size.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Close
CL
notified
6

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.

  1. 1Click '+' below the opportunity search step
  2. 2Select 'Close' again from the app picker
  3. 3Choose 'Search Tasks' as the Action Event
  4. 4Select your already-connected Close account
  5. 5Set 'Is Overdue' to 'True' and 'Status' to 'Todo'
  6. 6Click 'Continue' and then 'Test action'
What you should see: The test returns a list of overdue task records showing task description, due date, assigned user, and the linked lead or contact name.
7

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.

  1. 1Click '+' below the Search Tasks step
  2. 2Search for 'Code by Zapier'
  3. 3Select 'Run Python' as the Action Event
  4. 4Under 'Input Data', add key 'opportunities' mapped to the full output from step 4
  5. 5Add key 'tasks' mapped to the full output from step 6
  6. 6Paste the Python code from the pro tip into the 'Code' field
  7. 7Click 'Continue' and 'Test action'
What you should see: The test returns an 'output' object with a 'message' key containing a formatted multi-line string ready to paste directly into Slack.
Common mistake — Code by Zapier's Python environment does not support third-party libraries like pandas or requests. Stick to standard library functions — json, datetime, and string formatting are all you need here.

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)}]
8

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.

  1. 1Click '+' and select 'Slack'
  2. 2Choose 'Send Channel Message' as the Action Event
  3. 3Click 'Sign in to Slack' and authorize via the OAuth window
  4. 4Select your target channel from the 'Channel' dropdown
  5. 5Map 'Message Text' to the 'message' output from the Code by Zapier step
  6. 6Set 'Bot Name' to 'Pipeline Bot' and optionally add a 📊 emoji as the bot icon
  7. 7Click 'Continue'
What you should see: You should see a preview of the message text in the configuration panel populated with real data from your Close pipeline.
Common mistake — Slack's Zapier integration posts as a bot by default, not as you. The bot needs to be invited to private channels before it can post. If your #pipeline-daily channel is private, type '/invite @Zapier' in that channel first.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
9

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.

  1. 1Click 'Test Zap' at the bottom of the editor
  2. 2Watch each step go green in sequence
  3. 3Switch to your Slack channel to confirm the message posted
  4. 4Verify the deal count, overdue task count, and formatting look correct
What you should see: A formatted pipeline summary message appears in your Slack channel within 30 seconds of clicking 'Test Zap', showing active deal count, total pipeline value, and overdue task count.
Zapier
▶ Turn on & test
executed
Slack
Close
Close
🔔 notification
received
10

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.

  1. 1Click the toggle switch in the top-right to 'On'
  2. 2Confirm the green 'On' status indicator appears
  3. 3Navigate to Task History in the left sidebar
  4. 4The next morning, check Task History to confirm a successful run
  5. 5Go to Settings > Notifications and enable error email alerts
What you should see: The Zap shows 'On' status in your dashboard. The next day's Task History entry shows all steps completed with green checkmarks and the Slack message delivered.

Scaling Beyond 100+ active deals in Close pipeline+ Records

If your volume exceeds 100+ active deals in Close pipeline records, apply these adjustments.

1

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.

2

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.

3

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

VerdictWhy Zapier for this workflow

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.

Cost

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.

Tradeoffs

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 messageUpdate 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 dataCreate 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 DMAdd 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

Was this guide helpful?
Slack + Close overviewZapier profile →