Alert Slack when a HubSpot deal is stuck in a stage for over 14 days using Make

medium complexityCost: $10-29/mo

Prerequisites

Prerequisites
  • Make account (Free plan works for low volume)
  • HubSpot connection in Make via OAuth
  • Slack connection in Make

Why Make?

Make's visual scenario builder handles stale deal detection well because it has built-in search, aggregation, and scheduling modules — no code required. The Text Aggregator compiles all stale deals into a single message, and the built-in scheduler runs the scenario daily. The free plan includes 1,000 operations/month, which covers daily stale deal checks for most teams.

The trade-off is that Make's HubSpot search module counts each returned deal as a separate operation. If you have 50 stale deals, that's 50 operations per run. The workaround is to use the HTTP module with raw API calls instead of the HubSpot module — this reduces it to a flat 3 operations per run regardless of deal count.

How it works

  • Scheduler triggers the scenario daily at a set time (e.g., 8 AM)
  • HubSpot Search CRM Objects finds deals not modified in 14+ days, excluding closed stages
  • Text Aggregator compiles all stale deals into a single formatted string
  • Slack module posts the aggregated summary to your channel

Step 1: Schedule daily execution

Create a new scenario. Set the schedule:

  • Schedule type: Every day
  • Time: 08:00

Step 2: Search for stale deals

Add a HubSpot CRM → Search CRM Objects module:

  • Object type: Deals
  • Filter: hs_lastmodifieddate less than {{addDays(now; -14)}} AND dealstage not in closedwon, closedlost
  • Properties: dealname, amount, dealstage, hs_lastmodifieddate, hubspot_owner_id

Make handles pagination automatically — it returns all matching deals as individual bundles.

Step 3: Aggregate into a single message

Add a Text Aggregator module:

  • Source module: Search CRM Objects
  • Text: • *{{dealname}}* — {{dealstage}} — ${{formatNumber(amount; 0)}} — {{round(dateDifference(now; hs_lastmodifieddate; "d"))}}d stale
  • Row separator: newline

This compiles all stale deals into one formatted string.

Step 4: Send to Slack

Add a Slack → Create a Message module:

  • Channel: #sales-pipeline
  • Text:
⚠️ *Stale Deals Alert*
{{Text Aggregator output}}

Step 5: Handle empty results

Click the connection between the Search and Aggregator modules and enable Stop Processing After Empty Aggregation on the Text Aggregator. This prevents an empty Slack message when no stale deals are found.

Alternatively, add a Filter after the Aggregator that checks length(output) > 0.

Step 6: Activate

  1. Click Run once to test
  2. Verify the Slack message
  3. Toggle to Active

Troubleshooting

Common questions

How many Make operations does the daily stale deal check use?

With the HubSpot module: each returned deal counts as 1 operation, plus the aggregator and Slack — roughly 52 operations for 50 stale deals. With the HTTP module (raw API): 3 operations total regardless of deal count. Use the HTTP module for high-volume pipelines.

Can I include stage names in the Slack message?

The HubSpot Search module returns the stage ID (e.g., qualificationscheduled), not the label. Add an HTTP module to call the Pipelines API and use Make's map() function to look up the label. This adds 1 operation per run.

What if no stale deals are found?

Enable "Stop Processing After Empty Aggregation" on the Text Aggregator module. This prevents the Slack module from executing with an empty message. Alternatively, add a filter after the aggregator that checks output length.

Cost

  • Free plan: ~2-3 credits per run (search + aggregator + Slack). 30 runs/month = ~90 credits. Well within the 1,000 free credits.

Looking to scale your AI operations?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.