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

How to Send Daily Close Pipeline Updates to Slack with Make

Every morning, Make queries Close for pipeline metrics, overdue tasks, and upcoming activities, then posts a formatted digest to one or more Slack channels.

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-touch daily digest without paying for a BI tool.

Not ideal for

Teams that need real-time deal alerts — use a webhook-triggered scenario instead of a scheduled one.

Sync type

scheduled

Use case type

reporting

Real-World Example

💡

A 12-person SaaS sales team runs this every weekday at 8:00 AM. Before, managers pulled pipeline numbers manually from Close each morning and copy-pasted them into Slack — a 15-minute daily ritual that got skipped on busy days. Now #sales-pipeline receives a structured summary showing total pipeline value, deals with no activity in 7+ days, and tasks due today, before the first standup call.

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

Skip the setup

Import this workflow directly into Make

Copy the pre-built Make blueprint and paste it straight into Make. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Close API key with read access to Leads, Opportunities, and Activities — generate one at Close Settings > API Keys
Slack bot token or OAuth connection with chat:write and channels:read scopes
The Slack bot must be manually invited to each target channel before the scenario runs
Make account (free tier is sufficient for this scenario at standard daily frequency)
Close user account must have at minimum 'Member' role to read pipeline and activity data via API

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Lead Statusstatus
Opportunity Valuevalue_period
Opportunity Statusstatus
Activity Typetype
Is Overdueis_overdue
Activity Due Datedate
4 optional fields▸ show
Assigned Useruser_id
Lead Namedisplay_name
Opportunity Close Datedate_won
Activity Notenote

Step-by-Step Setup

1

make.com > Scenarios > Create a new scenario

Create a new Make scenario

Log into Make at make.com and click the blue 'Create a new scenario' button in the top right of your Scenarios dashboard. You'll land on the visual canvas with a single empty module in the center. This canvas is where you'll chain together the Close search, any data transformations, and the Slack post. Give the scenario a name immediately — click the default 'New scenario' text in the top left and type something like 'Daily Close Pipeline → Slack'.

  1. 1Click 'Create a new scenario' in the top right
  2. 2Click the pencil icon next to 'New scenario' in the top left
  3. 3Type a descriptive name like 'Daily Close Pipeline → Slack'
  4. 4Press Enter to save the name
What you should see: You should see a blank canvas with one empty circular module and your new scenario name displayed in the top left.
2

Canvas > Empty module > Schedule

Add the Schedule trigger

Click the empty circular module on the canvas to open the module picker. Search for 'Schedule' and select it — this is Make's built-in clock trigger, not an app integration. Set the interval to 'Days' and configure the time to fire at 7:55 AM in your team's timezone. The five-minute buffer before standup matters: Close's API response can take 10-20 seconds for large result sets, and Slack delivery adds another few seconds.

  1. 1Click the empty circular module on the canvas
  2. 2Type 'Schedule' in the search box
  3. 3Select 'Schedule' from the results
  4. 4Set 'Run scenario' to 'Every day'
  5. 5Set the time to 07:55 and select your team's timezone from the dropdown
  6. 6Check the 'Days of the week' boxes for Monday through Friday only
What you should see: The module now shows a clock icon and the label 'Schedule'. Hovering over it should show your configured time and timezone.
Common mistake — Make runs schedules in UTC by default until you explicitly set a timezone. If you skip the timezone dropdown, your 8 AM digest will fire at 8 AM UTC — which is midnight Pacific or 3 AM Eastern.
Make
+
click +
search apps
Slack
SL
Slack
Add the Schedule trigger
Slack
SL
module added
3

Canvas > + > Close > Search Leads > Add connection

Connect Close and search for active leads

Click the '+' to the right of the Schedule module to add the next module. Search for 'Close' and select it from the app list. Choose the action 'Search Leads'. You'll be prompted to create a Close connection — click 'Add' and paste your Close API key (found in Close under Settings > API Keys). Name this connection something identifiable like 'Close – [Your Company]'. Once connected, configure the search query to pull active leads with open opportunities.

  1. 1Click the '+' button to the right of the Schedule module
  2. 2Type 'Close' in the search box and select the Close app
  3. 3Choose 'Search Leads' as the action
  4. 4Click 'Add' next to the Connection field
  5. 5Paste your Close API key into the API Key field
  6. 6Click 'Save' to establish the connection
  7. 7In the 'Query' field, enter: status:"potential" or status:"active"
  8. 8Set 'Limit' to 200 to capture full pipeline without pagination issues
What you should see: The module should show a green dot next to your connection name and display the query field populated with your search string.
Common mistake — Close's Search Leads endpoint returns leads, not opportunities directly. You'll extract opportunity data from the nested 'opportunities' array in the next step. If you set Limit below your actual lead count, you'll silently miss records — check your total lead count in Close first.
4

Canvas > + > Flow Control > Iterator

Add an Iterator to process each lead

Add a new module after the Close search. Search for 'Flow Control' and select 'Iterator'. In the Array field, map the output array from the Close Search Leads module — it will appear as 'Array of Leads[]' in the variable picker. The Iterator will process each lead one at a time, making it possible to inspect each lead's nested opportunity data. This is required before you can aggregate the data into a single summary.

  1. 1Click '+' after the Close Search Leads module
  2. 2Search for 'Flow Control' and select it
  3. 3Choose 'Iterator'
  4. 4Click inside the 'Array' field
  5. 5From the variable picker, select the leads array output from the Close module (labeled something like '1. Close – Leads[]')
What you should see: The Iterator module appears and shows '1. Close – Leads[]' mapped in the Array field. A sample data preview will show the first lead's fields on the right panel.
5

Canvas > + > Flow Control > Numeric Aggregator

Add an Aggregator to build pipeline metrics

After the Iterator, add a 'Numeric Aggregator' module from Flow Control. This lets you sum opportunity values across all leads. Set the source module to your Iterator, the Aggregate function to 'SUM', and the Value field to the opportunity value path — something like {{item.opportunities[].value_period}}. You'll need one Numeric Aggregator for total pipeline value and a second one for opportunity count. Add the second aggregator as a parallel branch from the Iterator by right-clicking the Iterator and choosing 'Add another route'.

  1. 1Click '+' after the Iterator module
  2. 2Search for 'Flow Control' and select 'Numeric Aggregator'
  3. 3Set 'Source Module' to your Iterator
  4. 4Set 'Aggregate function' to 'SUM'
  5. 5Map the 'Value' field to the opportunity's value field from Close
  6. 6Right-click the Iterator to add a second route for opportunity count
  7. 7Add a second Numeric Aggregator set to 'COUNT' on the same opportunity field
What you should see: You should see two Numeric Aggregator modules branching from the Iterator. Each should show a sample aggregated value in the output panel when you run the scenario once with existing data.
Common mistake — Close stores opportunity values in the smallest currency unit (e.g., cents for USD). If you're summing `value_period`, divide the result by 100 in your Slack message using Make's `divide()` formula, or your totals will look like $1,250,000 when the real number is $12,500.
6

Canvas > Schedule module (right-click) > Add another route > Close > Search Activities

Search for overdue tasks in Close

Add another branch from the Schedule trigger — right-click the Schedule module and select 'Add another route'. On this new branch, add a Close module and select 'Search Activities'. Set the query to filter for tasks that are overdue: is_overdue:true type:task. Set Limit to 100. This runs in parallel with the lead search, so both queries fire at the same time and you don't wait for one to finish before starting the other.

  1. 1Right-click the Schedule module on the canvas
  2. 2Select 'Add another route'
  3. 3Click the '+' on the new empty branch
  4. 4Select the Close app
  5. 5Choose 'Search Activities'
  6. 6In the Query field, enter: is_overdue:true type:task
  7. 7Set Limit to 100
  8. 8Reuse your existing Close connection from the dropdown
What you should see: A second branch appears from the Schedule module. The Close Search Activities module should show your query string and connection name populated.
Common mistake — Close's activity search requires the `type:task` filter — without it you'll pull calls, emails, and SMS records into your overdue count and inflate the number significantly.
7

Canvas > Schedule module (right-click) > Add another route > Close > Search Activities

Search for tasks due today

Add a third route from the Schedule trigger using the same right-click method. Add another Close Search Activities module. This time, set the query to filter for tasks due today using Close's date filter syntax: type:task date:"{{formatDate(now; 'YYYY-MM-DD')}}". Make's formatDate(now; 'YYYY-MM-DD') formula inserts today's date dynamically each time the scenario runs. Set Limit to 100.

  1. 1Right-click the Schedule module and select 'Add another route'
  2. 2Add a Close Search Activities module
  3. 3In the Query field, type: type:task date:"
  4. 4Click the formula icon and insert: formatDate(now; 'YYYY-MM-DD')
  5. 5Close the quote: type:task date:"{{formatDate(now; 'YYYY-MM-DD')}}"
  6. 6Set Limit to 100
What you should see: The module's Query field should show the formula and render a preview date like type:task date:"2024-11-14" in the sample data panel.
Common mistake — Make evaluates `now` at scenario execution time in UTC. If your team is in UTC-5 or later, tasks due 'today' may pull yesterday's tasks in the morning. Add `addDays(now; 0)` with a timezone offset function or schedule the scenario to run after midnight UTC to avoid this.
8

Canvas > + > Tools > Set Multiple Variables

Add a Tools > Set Variable module to build the message

Now converge all three branches into a single message. Add a 'Tools' module and select 'Set Multiple Variables'. Map each variable from your three branches: total pipeline value (from Aggregator 1), total deal count (from Aggregator 2), overdue task count (from the overdue activities search), and today's task count. Use Make's formula bar to format the pipeline value with currency formatting. Name your variables clearly — pipeline_value, deal_count, overdue_tasks, tasks_today — because you'll reference them by name in the Slack message.

  1. 1Add a new module after your three branches converge
  2. 2Search for 'Tools' and select 'Set Multiple Variables'
  3. 3Add variable: Name = pipeline_value, Value = {{divide(3.result; 100)}} (adjust module number to match your Aggregator)
  4. 4Add variable: Name = deal_count, Value = {{4.result}}
  5. 5Add variable: Name = overdue_tasks, Value = {{length(5.array)}}
  6. 6Add variable: Name = tasks_today, Value = {{length(6.array)}}
What you should see: The Set Multiple Variables module shows four named variables with mapped values. Running the scenario once should show real numbers in the output panel.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
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

Canvas > + > Slack > Create a Message

Format the Slack message with Block Kit

Add a Slack module and select 'Create a Message'. Connect your Slack workspace using OAuth — click 'Add' next to Connection, then authenticate with a Slack account that has permission to post to your target channel. Set the Channel field to your sales channel name (e.g., #sales-pipeline). For the message text, use Slack Block Kit JSON in the 'Blocks' field for a structured, scannable format. Use the variables you defined in the previous step to populate the metrics.

  1. 1Add a Slack module after the Set Multiple Variables module
  2. 2Select 'Create a Message'
  3. 3Click 'Add' next to Connection and authenticate with Slack via OAuth
  4. 4Set Channel to #sales-pipeline (or your target channel name)
  5. 5Toggle on 'Use Blocks' if available, or paste Block Kit JSON into the Blocks field
  6. 6Set the fallback Text field to: Daily Pipeline Update – {{formatDate(now; 'MMM D, YYYY')}}
What you should see: The Slack module should show your channel name and connection displayed. A preview of the Block Kit JSON should render in the right panel if you click 'Run once'.
Common mistake — Slack requires the bot to be invited to the channel before it can post. If you get a `not_in_channel` error, open Slack, go to your channel, type `/invite @YourBotName`, and retry.
Message template
📬 New entry: {{1.name}}
Email: {{1.email}}
Details: {{1.description}}
10

Canvas > Right-click any module > Add error handler

Add an error handler for API failures

Right-click the Close Search Leads module and select 'Add error handler'. Choose 'Ignore' for non-critical paths, but for the Slack module, choose 'Rollback' so you don't get a partial message posted without all data. Alternatively, add a separate Slack module on the error path that posts to a #automation-alerts channel with the error message. This gives you visibility when Close's API is slow or returns an unexpected schema.

  1. 1Right-click the Close Search Leads module
  2. 2Select 'Add error handler'
  3. 3Choose 'Break' to pause execution and log the error
  4. 4Add a Slack module on the error handler path
  5. 5Set the channel to #automation-alerts
  6. 6Set the message to: ⚠️ Daily pipeline scenario failed. Error: {{error.message}}
What you should see: A red error handler branch appears below the Close module. Running the scenario with an invalid API key should now route to the error Slack message instead of crashing silently.
11

Canvas > Toggle (bottom left) > ON | Canvas > Run once

Activate the scenario and verify the first run

Click the toggle in the bottom left of the canvas to turn the scenario ON. The toggle turns blue. Make will run the scenario at your next scheduled time, but you can also click 'Run once' to test immediately. After a successful run, check your Slack channel for the message and verify the numbers match what you see in Close's pipeline view. Check the scenario's execution log (History tab) to confirm all modules returned 'success' status with green checkmarks.

  1. 1Click 'Run once' to trigger an immediate test run
  2. 2Wait 15-30 seconds for all Close API calls to complete
  3. 3Open your Slack channel and confirm the message posted correctly
  4. 4Click the 'History' tab in Make to review the execution log
  5. 5Confirm all modules show green status
  6. 6Click the ON/OFF toggle to activate the scheduled scenario
What you should see: Your Slack channel should show a formatted pipeline digest message. The History tab in Make should show the scenario run with all green checkmarks and no warnings.
Common mistake — Make's free plan limits you to 1,000 operations per month. This scenario uses approximately 6-10 operations per run (Schedule + 3 Close searches + Aggregators + Variables + Slack). At 5 days/week, that's roughly 130-200 operations/month — well within free tier limits. But if you add more branches or routes later, recalculate.

Paste this into a Make 'Tools > Set Multiple Variables' module's value field for the pipeline_value variable. It formats the raw Close cents value as a dollar string with commas — e.g., 1850000 becomes $18,500. Replace `3.result` with the actual output number of your Numeric Aggregator module.

JavaScript — Custom Function{{if(
▸ Show code
{{if(
  divide(3.result; 100) >= 1000000;
  concat(

... expand to see full code

{{if(
  divide(3.result; 100) >= 1000000;
  concat(
    "$";
    toString(floor(divide(3.result; 100000000)));
    ".";
    substring(toString(round(divide(3.result; 100))); -2);
    "M"
  );
  if(
    divide(3.result; 100) >= 1000;
    concat(
      "$";
      toString(floor(divide(3.result; 100000)));
      ",";
      padStart(toString(mod(floor(divide(3.result; 100)); 1000)); 3; "0")
    );
    concat(
      "$";
      toString(divide(3.result; 100))
    )
  )
)}}
Make
▶ Run once
executed
Slack
Close
Close
🔔 notification
received

Scaling Beyond 500+ active leads or 200+ daily tasks in Close+ Records

If your volume exceeds 500+ active leads or 200+ daily tasks in Close records, apply these adjustments.

1

Use Close's pagination to avoid truncated results

Close's API returns a maximum of 200 records per request. If your pipeline has more than 200 active leads, you'll silently miss records. Add a second Close Search Leads module with _skip=200 and a third at _skip=400 if needed, then combine all arrays using a Make Array Aggregator before your Iterator.

2

Increase Make's timeout buffer between API calls

With large datasets, Close can take 5-10 seconds per API call. If you're running three parallel Close searches, all three fire simultaneously and can trigger rate limiting. Add a Sleep module (Tools > Sleep, 2 seconds) between sequential Close calls in the same execution path. For parallel paths, stagger the scenario's sub-routes using Routers with conditional delays.

3

Switch from a full count to sampled metrics at scale

If you have 1,000+ leads, iterating every single one daily is expensive in Make operations. Instead, use Close's built-in reporting API endpoints (like report/activity/) which return pre-aggregated counts. This turns a 1,000-operation run into a 5-operation run and avoids pagination entirely.

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 Make for this workflow

Use Make for this if your team wants visual control over multi-branch scheduled workflows without writing code. This scenario runs three parallel Close API calls, aggregates the results, and formats a Slack message — Make's canvas makes that fan-out/fan-in pattern easy to see and debug. Make also handles the schedule trigger natively, so you don't need a separate cron service. The one scenario where you'd skip Make: if your team already lives in n8n and has JavaScript experience — n8n lets you do the aggregation and formatting in a single Code node, which is faster to build and easier to modify than Make's multi-module chain.

Cost

The math here is simple. Each daily run uses roughly 8 operations in Make (Schedule + 3 Close searches + 2 Aggregators + Variables + Slack). At 22 workdays per month, that's 176 operations. Make's free plan includes 1,000 operations per month, so this scenario costs nothing at single-channel, single-team scale. The Core plan at $9/month gives you 10,000 operations and is where you'd land if you extend this to 5+ channels or add per-rep breakdowns. Zapier's equivalent — a multi-step Zap with scheduled trigger — would cost at minimum $19.99/month (Starter plan) and hit task limits faster because Zapier counts each lead record as a separate task.

Tradeoffs

Zapier's Schedule trigger is marginally simpler to configure for non-technical users — no timezone math, it asks for local time directly. n8n's Code node makes the aggregation and formatting step dramatically cleaner: one function instead of four Make modules. Power Automate has a native Close connector in preview, which means less API key management, but it's slow to update and the connector lags behind Close's actual API capabilities. Pipedream's Close integration has better support for Close's newer API endpoints and handles pagination automatically in the source step. Make wins here specifically because the visual multi-branch layout makes the parallel API calls easy to reason about and the error handler routing is clear — those are real advantages when you're troubleshooting why your digest shows wrong numbers at 8 AM.

Three things you'll run into after the scenario is live. First, Close's value_period field returns cents, not dollars — your pipeline total will look wildly wrong until you add the divide-by-100 fix. Second, Make's now variable runs in UTC, and day-of-week filters and date-based task queries will drift if your team is in a UTC-offset timezone. Set your schedule time in UTC and test on a Friday afternoon to confirm the scenario correctly skips the weekend. Third, Close's API rate limit is 40 requests per 10 seconds across all API keys for your account. If someone on your team is running a manual Close export or another integration fires at the same time as this scenario, you'll get 429 errors and a missing digest — the fix is to add a Sleep module and schedule this scenario during off-peak hours, not during the same window as other Close integrations.

Ideas for what to build next

  • Add per-rep breakdowns to the digestExtend the scenario with a Close List Users call and a Router that groups opportunity values by user_id. Post a second Slack message block that ranks reps by open pipeline value — gives managers the team view and individual accountability in one message.
  • Add a weekly summary variantClone this scenario and change the Schedule trigger to weekly (Monday 8 AM). Add a Close Search Opportunities module filtered by deals won in the past 7 days to include a 'Closed Last Week' metric alongside the active pipeline numbers.
  • Route alerts for stale deals to individual repsAfter the Iterator, add a filter that catches deals with no activity in 7+ days, then look up the assigned rep's Slack user ID using Slack's 'Search for Users' module and send them a direct message — not just a channel post — so they get a personal nudge, not just a broadcast.

Related guides

Was this guide helpful?
Slack + Close overviewMake profile →