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 flow
HubSpot logo
Source
HubSpot
Gmail logo
Process
Gmail
Make logo
Process
Make
Slack logo
Destination
Slack

The stack in the order it runs — data flows from the source through to where it lands.

Why this stack

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)

  1. HubSpot logo

    CRM + marketing for go-to-market.

    Pipeline data becomes an automatable input for revenue reports.

  2. Gmail logo

    Google Workspace mail with a solid API.

    Labels + the Gmail API make it easy to trigger flows off inbound mail.

  3. Make logo

    No-code automation builder. Visual scenarios that chain APIs and AI calls.

    Per-operation pricing is cheaper than Zapier at the volumes I run, and the visual editor handles branching cleanly.

  4. Slack logo

    Team chat where most ops alerts and reports land.

    The default place a small team already lives — pipe reports here instead of email nobody opens.

How it runs

  1. 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. 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. 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. 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. 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. 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. 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. 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 services

More like this