🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

HubSpot + Slack: close stale deals, stay in sync

Lisa Granqvist Partner Workflow Automation Expert

Nothing wrecks a forecast like a pipeline full of “maybe” deals that quietly went cold three weeks ago. They sit there, your team assumes someone is working them, and reporting turns into a guessing game.

This HubSpot Slack automation hits Sales Ops first, but a sales manager and a founder feel it just as fast. You get a cleaner pipeline, deals closed out consistently after 21 days of inactivity, and a Slack update your team actually sees.

Below, you’ll see exactly how the workflow flags stale deals, marks them Closed Lost, emails the contact for feedback via Gmail, and posts the outcome in Slack.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: HubSpot + Slack: close stale deals, stay in sync

The Challenge: Stale deals that distort your pipeline

Stale deals are sneaky because they don’t “fail” loudly. They just stop moving. A rep gets busy, a prospect ghosts, the next follow-up never happens, and 21 days later the deal is still inflating your pipeline like it has a chance. Then leadership asks why the quarter missed, and everyone starts digging through old notes, half-written tasks, and last-contact dates that should have been acted on weeks ago. It’s not just messy. It makes your CRM feel untrustworthy, so the team stops using it properly.

The friction compounds. Here’s where it breaks down in real life.

  • Deals stay “Open” because nobody wants to be the one to close them out, so your forecasts keep lying to you.
  • Reps waste about an hour a week each combing through old deals to figure out what to do next.
  • Follow-up is inconsistent, which means you lose feedback that could fix your messaging or qualification.
  • When someone finally updates the CRM, the team doesn’t notice, so the same deal gets discussed again in standups.

The Fix: Auto-close cold deals and notify the team

This workflow runs on a schedule and scans your HubSpot deals for the ones that haven’t been updated in 21+ days. When it finds them, it standardizes the deal fields (so your filtering is reliable), then automatically updates each stale deal to Closed Lost. Next, it pulls the deal’s associated contact, fetches that contact’s details, and extracts the email address. With that in hand, the workflow sends a personalized Gmail message that thanks the contact and asks for quick feedback on what stopped the process. Finally, it posts a Slack notification so your team has visibility, without needing another meeting or spreadsheet.

The workflow starts with a scheduled run, then HubSpot provides the deal list. After the 21-day filter and status update, it maps deals to contacts, sends the Gmail feedback request, and ends with a Slack alert to keep everyone aligned.

What Changes: Before vs. After

Real-World Impact

Say you manage a pipeline with about 60 active deals, and each week you spend maybe 5 minutes per deal checking last activity, next steps, and whether it’s truly alive. That’s roughly 5 hours of CRM cleanup. With this workflow, the “cold deal” decision happens automatically on a schedule, the deal is closed, the contact gets a feedback email, and Slack gets the update. You still review important deals, but the dead ones stop stealing attention.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • HubSpot for deal and contact data access
  • Slack to notify your team automatically
  • Gmail to send the feedback request email
  • HubSpot private app token (get it from HubSpot Settings → Integrations → Private Apps)

Skill level: Intermediate. You’ll connect accounts, confirm HubSpot permissions, and adjust email/Slack message content.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

A scheduled run kicks things off. You decide the interval (daily is common). The workflow starts without anyone clicking anything, which means the cleanup habit is finally consistent.

HubSpot deals are pulled and normalized. The workflow retrieves your deals, then maps key fields into a consistent structure so the stale-deal filter behaves the same way every time.

Stale deals are filtered and closed. Anything untouched for 21+ days is marked Closed Lost in HubSpot. That alone makes your pipeline more honest, frankly.

Contacts are found, emailed, and reported in Slack. The workflow fetches the deal-to-contact association, grabs contact details, extracts the email, sends the Gmail feedback request, then posts a Slack message about what was closed.

You can easily modify the 21-day threshold to 14 days (or 30) based on your sales cycle. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Scheduled Trigger

Set the schedule that kicks off the workflow and pulls your HubSpot deal data.

  1. Add and open Scheduled Automation Start.
  2. Configure the schedule rule under rule to match how often you want stale deals checked.
  3. Connect Scheduled Automation Start to Retrieve HubSpot Deals.

Step 2: Connect HubSpot Deals Retrieval

Pull all relevant deal properties from HubSpot to identify stale opportunities.

  1. Open Retrieve HubSpot Deals and set Resource to deal and Operation to getAll.
  2. Enable Return All as true.
  3. Under filters → properties, confirm the properties list includes dealname, hs_lastmodifieddate, notes_last_updated, and notes_last_contacted.
  4. Credential Required: Connect your hubspotAppToken credentials in Retrieve HubSpot Deals.

Step 3: Set Up Deal Processing and Staleness Filtering

Normalize the deal fields and filter only those inactive for 21 days.

  1. Open Map Deal Attributes and keep the JavaScript that maps dealId, dealname, lastmodifieddate, notes_last_updated, and notes_last_contacted.
  2. In Filter Stale Deals 21d, set the condition to compare ={{ $json.lastmodifieddate.toNumber() }} with ={{ Date.now() - 21 * 24 * 60 * 60 * 1000 }} using the lt operator.
  3. Confirm the execution order: Retrieve HubSpot DealsMap Deal AttributesFilter Stale Deals 21d.

If deals are not filtering as expected, verify that hs_lastmodifieddate is populated and in a timestamp format compatible with toNumber().

Step 4: Update Deals and Pull Associated Contacts

Mark stale deals as Closed Lost and gather their associated contacts for outreach.

  1. Open Mark Deals Closed Lost and set Deal ID to ={{ $json.dealId }}.
  2. Set Update Fields → stage to closedlost.
  3. Credential Required: Connect your hubspotAppToken credentials in Mark Deals Closed Lost.
  4. In Pull Deal Associations, set URL to =https://api.hubapi.com/crm/v3/objects/deals/{{ $json.dealId }}?associations=contacts.
  5. Enable Send Headers and set Authorization to Bearer [CONFIGURE_YOUR_TOKEN] using a valid HubSpot access token.
  6. Confirm the chain: Filter Stale Deals 21dMark Deals Closed LostPull Deal AssociationsParse Contact Identifiers.

⚠️ Common Pitfall: The HubSpot token in Pull Deal Associations is a header value, not an n8n credential. Replace [CONFIGURE_YOUR_TOKEN] before running the workflow.

Step 5: Fetch Contact Details and Derive Emails

Extract associated contact IDs, fetch their profiles, and prepare email addresses.

  1. Open Parse Contact Identifiers and keep the JavaScript that extracts contactId, dealId, and dealName.
  2. In Fetch Contact Details, set Contact ID to ={{ $json.contactId }} and confirm the properties list includes email, firstname, lastname, and hs_full_name_or_email.
  3. Credential Required: Connect your hubspotAppToken credentials in Fetch Contact Details.
  4. Open Derive Contact Email and keep the JavaScript that outputs email from item.json.properties.email.value.

Step 6: Configure Email and Slack Notifications

Send the feedback email via Gmail and post a Slack alert after each email is dispatched.

  1. Open Dispatch Gmail Feedback and set Send To to =[YOUR_EMAIL] (replace with your recipient or derived email field).
  2. Set Subject to =Thank You — We'd Value Your Feedback.
  3. Set Message to the provided HTML template and keep the personalization token {{ $('Fetch Contact Details').item.json.properties.firstname.value }}.
  4. Credential Required: Connect your gmailOAuth2 credentials in Dispatch Gmail Feedback.
  5. Open Post Slack Alert and set Text to =Deals which are moved to Closed Lost: {{ $('Parse Contact Identifiers').item.json.dealId }}.
  6. Select the Slack channel using Channel (e.g., [YOUR_ID]).
  7. Credential Required: Connect your slackOAuth2Api credentials in Post Slack Alert.

If you want to email the associated contact, replace Send To with the email from Derive Contact Email, for example ={{ $json.email }}.

Step 7: Test and Activate Your Workflow

Run a manual test to verify the full chain before activating the schedule.

  1. Click Execute Workflow to run Scheduled Automation Start manually.
  2. Confirm that stale deals pass through Filter Stale Deals 21d and are updated by Mark Deals Closed Lost.
  3. Verify that Dispatch Gmail Feedback sends the email and Post Slack Alert posts the deal ID message.
  4. When satisfied, toggle the workflow to Active to run on the schedule.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • HubSpot credentials can expire or need specific permissions. If things break, check the HubSpot Private App scopes and the n8n credential test first.
  • If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.

Common Questions

How quickly can I implement this HubSpot Slack automation?

Usually about an hour once your HubSpot and Gmail permissions are ready.

Can non-technical teams implement this stale deal automation?

Yes. No coding is required, but someone needs to be comfortable connecting accounts and testing with a few sample deals.

Is n8n free to use for this HubSpot Slack automation workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gmail and HubSpot usage limits (usually $0 for typical volumes).

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

How do I adapt this HubSpot Slack automation solution to my specific challenges?

Start with the “Filter Stale Deals 21d” logic and change the age threshold to match your cycle. You can also swap the “Dispatch Gmail Feedback” email copy to match your brand voice, or change the Slack destination in “Post Slack Alert” to notify a specific rep channel instead of a general one. If your process uses a different loss stage than “Closed Lost,” update the “Mark Deals Closed Lost” action to set the right stage and reason.

Why is my HubSpot connection failing in this workflow?

Most of the time it’s an expired token or missing scopes on your HubSpot private app. Regenerate the token, update the n8n HubSpot credential, and confirm you allowed read/write access for deals and read access for contacts. If it fails only on some deals, check association access and confirm the deals actually have linked contacts.

What’s the capacity of this HubSpot Slack automation solution?

On a typical n8n Cloud plan, this can handle hundreds of stale deals per run for most small teams. If you self-host, capacity is mostly about your server and HubSpot API limits. Practically, if you’re pulling thousands of deals daily, you’ll want pagination checks and a slightly slower pace to avoid rate limits.

Is this HubSpot Slack automation better than using Zapier or Make?

Often, yes, because this workflow needs multi-step logic: filtering by “last updated,” updating the deal, pulling associations, fetching contact details, then sending Gmail and Slack. n8n handles that kind of branching and data shaping cleanly, and you can self-host for unlimited executions. Zapier or Make can still do it, but it tends to sprawl into more steps, which gets expensive and harder to debug. If you only need a simple Slack ping when a deal changes stage, those tools may be quicker. Talk to an automation expert if you’re not sure which fits.

Once this is running, “pipeline hygiene” stops being a weekly fire drill. The workflow handles the boring cleanup and the follow-up nudge, and your team stays in sync in Slack.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal