HubSpot Open Deals + Gmail Thread Lag: Weekly Sales Friction Digest to Slack via Make
Every Friday at 3 PM, this surfaces every HubSpot deal that's gone cold and every Gmail thread that hasn't moved in 5+ days — so your team walks in Monday knowing exactly what to chase.
The stack in the order it runs — data flows from the source through to where it lands.
The failure mode is always the same: a deal sits in 'Proposal Sent' for 12 days, nobody notices because the CRM stage hasn't changed, and the email thread has gone cold. The founder or sales lead finds out on a Friday standup. By then the prospect has signed with a competitor or gone quiet.
Use Make, not Zapier. This workflow iterates over a list of deals, runs a sub-search for each one, and conditionally aggregates results. Make's iterator + array aggregator pattern was built for exactly this. Zapier would require multiple Zaps with lookup steps that get expensive fast.
HubSpot's CRM API lets you filter deals by stage and `hs_lastmodifieddate`. Gmail's API — via Make's Gmail module — lets you search threads by label and `after:` date filter per sender domain. Together: deals that haven't moved + threads that haven't been replied to. That's your friction signal.
One real constraint: Gmail search via Make is rate-limited to 250 quota units per second per user. Searching 50 deal threads per run is fine — 200+ deals is where you'll hit limits and slow down. Scope to specific pipeline stages only, like 'Proposal Sent' and 'Contract Sent', not all open deals. Also, this requires Gmail OAuth connected to the sales rep's account, not a shared inbox. If your team is on Outlook, swap the Gmail module for Make's Microsoft Outlook module — identical search syntax. And skip this entirely if deals close primarily over phone or Zoom (the Gmail signal won't fire even when deals are active), or if your HubSpot data is messy — wrong stages, no contact email attached. Fix the data hygiene first or you'll get false positives every single week.
The stack (4)
How it runs
- 1
Create the Make scenario with a weekly schedule trigger
In Make, create a new scenario. Set the trigger to Scheduling → every Friday at 3:00 PM local time. Name it `sales-friction-weekly-digest`. Friday afternoon gives the team 10 minutes to scan before EOW and flag what they want to action Monday morning. Don't run this on Monday — you want the data fresh from the prior week, not stale by the time anyone reads it.
- 2
Fetch open HubSpot deals filtered by stage and last modified date
Add a HubSpot module: Search for CRM Objects → Deals. Filter: `dealstage IN ['appointmentscheduled', 'qualifiedtobuy', 'presentationscheduled', 'decisionmakerboughtin', 'contractsent']` — use your actual stage IDs from HubSpot's pipeline settings. Add a second filter: `hs_lastmodifieddate < today minus 5 days`. Return properties: `dealname`, `hubspot_owner_id`, `amount`, `closedate`, `hs_lastmodifieddate`, `associated_contact_email`. Limit to 50 results. If you have more than 50 stale deals, the pipeline itself is the problem.
- 3
Iterate over deals and search Gmail for thread activity
Add a Make Iterator to loop over the deals array. Inside the iteration, add a Gmail module: Search Emails. Query: `from:{associated_contact_email} OR to:{associated_contact_email} after:{date 7 days ago}`. This returns threads in that window. Count the results — zero means the thread has gone cold. Store `threadCount` and `lastEmailDate` from the most recent message in the thread if one exists. This per-deal Gmail search is the core signal.
- 4
Filter to deals with no recent email activity
Add a Make Filter step after the Gmail search: only continue if `threadCount = 0` OR `lastEmailDate < today minus 5 days`. This cuts deals where email is still moving. What's left is your friction list — open in CRM, no email movement. Use a Make Array Aggregator to collect these filtered deals into a single array with fields: `dealName`, `ownerName`, `amount`, `daysSinceModified`, `closeDate`.
- 5
Sort the aggregated list by amount descending
Add a Tools module → Sort Array. Sort by `amount` descending. This puts the highest-value stale deals at the top, not an alphabetical list nobody cares about. Cap the output to 10 records using a Slice operation. A Slack message listing 40 stale deals gets ignored. A list of 10 high-value ones gets action.
- 6
Build the Slack message with deal-level rows
Add a Make Tools → Set Variable module to construct the Slack Block Kit JSON. Build a section block with a header: `🔴 {N} Stale Deals Need Attention — Week of {date}`. Then a markdown text block listing each deal as: `• {dealName} — ${amount} — {daysSinceModified}d stale — Close {closeDate}`. Keep it tight. Don't include individual deal links in the main list — add a single footer link to the HubSpot view filtered to the same criteria.
- 7
Post the digest to Slack with conditional empty-state handling
Add a Slack module: Create a Message. Post to `#sales-ops`. Before this module, add a Router: if the aggregated array is empty, post a brief green message — `✅ No stale deals this week. Pipeline looks healthy.` Silent weeks make people assume the automation broke. The non-empty path posts the full digest. This two-path router is the difference between a tool people trust and one they quietly stop checking.
- 8
Log the digest run to a Google Sheets audit tab
After the Slack post, add a Google Sheets module: Add a Row. Write: run date, total stale deals found, total deal value at risk (sum of amounts), top deal name. This gives you a trend line. If stale deal count is growing week over week, that's a pipeline quality problem, not a one-off. You can chart it in Looker Studio with zero additional setup.
Want me to build this for you instead?
Product Audit and CTO Mode run out of this same thinking. If you’re reading this thinking “I want this, but in my product” — let’s talk.
See servicesMore like this
Gmail Thread Aging + Stripe Invoice Overdue: Unified AR Follow-Up Digest to Slack via Zapier
Surface overdue Stripe invoices and the exact age of your last Gmail thread with that customer — every morning at 8:30, automatically — so AR follow-up stops living in someone's head.
Intercom Ticket Volume + Razorpay Failed Payments: Daily Support-Cost-per-Revenue Alert to Slack via Zapier
Catch the support cost blowout from Razorpay failed payments before your agents are already buried.
Outlook Calendar Load + HubSpot Deal Velocity: Weekly Ops Digest to Microsoft Teams
Every Monday at 07:30, your revenue team gets one Teams card: last week's deal pipeline movement next to each rep's actual meeting load — so you stop guessing whether low close rates are a pipeline problem or a capacity problem.