Gmail + HubSpot: faster replies with Slack approval
Your inbox is full, and the “quick reply” you meant to send turns into a 20-minute scavenger hunt. You search HubSpot for context, reread the thread, second-guess the tone, then still miss a key detail.
Support leads feel it when ticket replies slip. Sales reps feel it when warm leads go cold. And ops-minded founders end up proofreading everything. This Gmail Slack approval automation creates a ready-to-send draft with HubSpot context, then makes approval a one-click Slack moment.
You’ll see how the workflow turns inbound Gmail into a consistent, customer-ready reply, without auto-sending anything before a human signs off.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail + HubSpot: faster replies with Slack approval
flowchart LR
subgraph sg0["Monitor New Gmail Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Engine", pos: "b", h: 48 }
n1@{ icon: "mdi:message-outline", form: "rounded", label: "Send Email Reply", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Monitor New Gmail", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Screen Permitted Sender", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Compose Draft Reply", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/hubspot.svg' width='40' height='40' /></div><br/>Lookup Contact Email"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Define Record Types"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Contact Links"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Assemble Batch Read"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Execute Batch Read"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Clean CRM Context"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack Approval Wait"]
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approval Decision", pos: "b", h: 48 }
n12 --> n1
n6 --> n7
n9 --> n10
n5 --> n6
n4 --> n11
n3 --> n5
n0 -.-> n4
n8 --> n9
n7 --> n8
n2 --> n3
n10 --> n4
n11 --> n12
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2 trigger
class n4 ai
class n0 aiModel
class n3,n12 decision
class n7,n9 api
class n6,n8,n10 code
classDef customIcon fill:none,stroke:none
class n5,n6,n7,n8,n9,n10,n11 customIcon
The Problem: Replying Fast Without Sounding Sloppy
Most teams don’t struggle with writing emails. They struggle with writing the right email fast. The moment a customer asks “Where are we on this?” you’re juggling Gmail, HubSpot, and internal notes, trying to figure out which deal is relevant, whether there’s an open ticket, and what was promised last time. Meanwhile, the thread sits. Someone replies late, or worse, replies confidently with missing context. The mental load is the real tax, because every message becomes a mini investigation.
It adds up fast. Here’s where it breaks down in real life.
- HubSpot context is easy to miss when you’re switching tabs under pressure.
- Two people can answer the same question with totally different tone and next steps.
- Internal senders and teammate forwards accidentally trigger “helpful” drafts you never wanted.
- Even small details (open ticket status, active deal stage) get lost, which creates extra back-and-forth.
The Solution: Draft Replies Using HubSpot Context, Then Approve in Slack
This workflow watches for new inbound emails in Gmail and turns each message into a clean, on-brand draft reply. First, it screens the sender so you don’t generate drafts for internal domains (no awkward “auto replies” to coworkers). Then it looks the sender up in HubSpot and pulls only the context that helps you respond well: contact details plus associated deals, companies, and tickets. That CRM data gets cleaned so the AI sees readable fields instead of IDs and messy JSON. Finally, Google Gemini generates a concise reply (kept to roughly 150 words, with a single CTA and an optional clarifying question), posts it to Slack for approval, and only sends the Gmail reply if someone approves.
The workflow starts with a new Gmail message. HubSpot enriches the thread with the most relevant CRM signals, and Gemini writes the draft in your chosen tone. Slack becomes the checkpoint, so speed doesn’t come at the cost of control.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your team handles about 20 inbound emails a day that require HubSpot context. Manually, it’s common to spend maybe 6 minutes reading the thread, 6 minutes checking HubSpot (contact + deal + ticket), and another 5 minutes drafting, so around 15 minutes each. That’s about 5 hours daily. With this workflow, the only “human time” is reviewing the Slack draft and approving it, usually a minute or two per message, so you’re closer to 30–40 minutes of attention instead of half a day.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail for monitoring inbound and sending replies
- HubSpot to enrich replies with CRM context
- Google AI Studio API key (Gemini) (get it from Google AI Studio)
Skill level: Intermediate. You’ll connect accounts, paste an API key, and adjust a few filters and prompts safely.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
New inbound email lands in Gmail. The workflow triggers on fresh messages and keeps your reply in the original thread, so the conversation stays clean for the customer.
Sender screening happens immediately. Internal domains (and any “not allowed” senders you define) get excluded, which prevents noise and avoids accidental draft generation for teammate chatter.
HubSpot context is fetched and cleaned. n8n looks up the contact by email, retrieves linked records (deals, companies, tickets) with batch requests, then normalizes that info into readable fields the AI can use.
Gemini drafts, Slack approves, Gmail sends. The AI agent writes a short reply under your constraints, posts it to Slack, and waits. If the approver clicks yes, n8n sends the reply from Gmail; if not, nothing is sent.
You can easily modify the sender filter to match your customer domains, or change the draft tone to sound more formal (or more friendly) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Gmail Trigger
Start the workflow by listening for new inbound emails and filtering out disallowed senders.
- Add and open Monitor New Gmail to watch for new incoming messages.
- Set Poll Times to
everyMinutein Monitor New Gmail to check for new emails frequently. - Open Screen Permitted Sender and set the condition to exclude specific domains: Left Value =
{{$json.From}}, Operator =notContains, Right Value =n8n.io. - Confirm the execution flow: Monitor New Gmail → Screen Permitted Sender.
- Credential Required: Connect your Gmail credentials in Monitor New Gmail.
Step 2: Connect HubSpot CRM
Find the contact in HubSpot using the sender’s email address and prepare association lookups for deals, companies, and tickets.
- Open Lookup Contact Email and set Operation to
searchwith Authentication =oAuth2. - In Lookup Contact Email, set the email filter value to
{{ String($json.From || '').match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i)?.[0] || '' }}and keep the configured properties list for contact context. - Open Define Record Types and keep the JavaScript that outputs
["deals","companies","tickets"]when no records are supplied. - Open Retrieve Contact Links and set URL to
https://api.hubapi.com/crm/v4/objects/contacts/{{ $('Lookup Contact Email').item.json.id }}/associations/{{ $json.record }}. - Credential Required: Connect your HubSpot OAuth2 credentials in Lookup Contact Email.
- Credential Required: Connect your HubSpot OAuth2 credentials in Retrieve Contact Links (already configured in the workflow).
Step 3: Set Up CRM Batch Reads and Cleaning
Collect associated record IDs, read details in batches, and format the CRM context for the AI model.
- Open Assemble Batch Read and keep the code that builds batch read requests for
deals,companies, andtickets. - Open Execute Batch Read and set URL to
{{$json.url}}, Body to{{$json.body}}, and Raw Content Type to{{$json.headers['content-type']}}. - Open Clean CRM Context and keep the JavaScript that emits a single item with
deals,companies,tickets, and asummary. - Confirm the execution flow: Define Record Types → Retrieve Contact Links → Assemble Batch Read → Execute Batch Read → Clean CRM Context.
- Credential Required: Connect your HubSpot OAuth2 credentials in Execute Batch Read (this node uses
hubspotOAuth2Apibut has no credential configured yet).
Step 4: Set Up AI Drafting and Slack Approval
Use Gemini to draft the email reply and route it through Slack for human approval.
- Open Gemini Chat Engine and connect your Google Gemini credentials.
- Open Compose Draft Reply and keep the prompt text exactly as provided, including sender and CRM context references like
{{$('Monitor New Gmail').first().json.From}}and{{ JSON.stringify($json.deals || []) }}. - Verify that Gemini Chat Engine is connected as the language model for Compose Draft Reply (AI credentials should be added to Gemini Chat Engine, not the agent node).
- Open Slack Approval Wait and set Message to
{{$('Monitor New Gmail').first().json.From}} sent you the following message: ... {{ $json.output }}so the draft appears for approval. - Set Channel in Slack Approval Wait to your target Slack channel ID (replace
[YOUR_ID]). - Credential Required: Connect your Slack OAuth2 credentials in Slack Approval Wait (already configured in the workflow).
Step 5: Configure Email Reply Output
Only send an email reply when the Slack approval is true.
- Open Approval Decision and confirm the condition is Left Value =
{{$json.data.approved}}with the boolean true operation. - Open Send Email Reply and set Operation to
reply, Message to{{$('Compose Draft Reply').item.json.output}}, and Message ID to{{$('Monitor New Gmail').first().json.threadId}}. - Ensure Email Type is set to
textin Send Email Reply and Append Attribution is disabled. - Credential Required: Connect your Gmail credentials in Send Email Reply.
Step 6: Test and Activate Your Workflow
Validate the end-to-end path from a new email to a Slack-approved reply, then activate the workflow.
- Click Execute Workflow and send a test email to the monitored inbox to trigger Monitor New Gmail.
- Confirm that Screen Permitted Sender passes the message and Lookup Contact Email finds or gracefully handles the sender.
- Verify that Compose Draft Reply outputs a clean email body and Slack Approval Wait posts it in Slack with approval buttons.
- Approve in Slack and confirm Approval Decision routes to Send Email Reply.
- When satisfied, toggle the workflow to Active to run continuously.
Common Gotchas
- HubSpot credentials can expire or need specific permissions. If things break, check your HubSpot connected app/OAuth status and the contact read scopes 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.
Frequently Asked Questions
About 45 minutes if your Gmail, HubSpot, Slack, and Gemini access are ready.
No. You’ll connect accounts and edit a couple of filters and prompt fields.
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 Google Gemini (Google AI Studio) API usage, which is typically a small per-request cost depending on your model and volume.
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.
Yes, but be selective. You can bypass the Slack approval for trusted senders by adding a branch around the “Slack Approval Wait” and “Approval Decision” logic, then sending straight to “Send Email Reply” only when the sender matches a safe allowlist (or a Gmail label you control). Common customizations include stricter domain rules in the permitted sender filter, different prompts for support vs. sales, and limiting HubSpot details to only open tickets for support threads.
Usually it’s expired OAuth access or missing permissions for reading contacts and associations. Reconnect HubSpot in n8n, then re-check the nodes that do the search and HTTP requests because those are the first to show auth errors. If it fails only sometimes, you may also be hitting rate limits during busy periods, so batching and retry settings matter.
A typical small team can run hundreds of emails a day with this, assuming your Slack approval isn’t the bottleneck.
It depends on how strict you are about context quality and approvals. Zapier and Make can absolutely post drafts to Slack, but n8n makes the “messy middle” easier: batch reads from HubSpot, cleaning/normalizing fields, and branching logic around senders and record types without ballooning costs. Also, self-hosting is a big deal if you expect volume and don’t want per-task pricing. If you only need a simple “new email → draft text → Slack message” flow, those tools are fine. If you want the full HubSpot enrichment plus guardrails, n8n is the more comfortable fit. Talk to an automation expert if you want help choosing.
Once this is live, your team stops rewriting the same “catch-up” emails from scratch. The workflow handles the repetitive context-gathering and drafting so you can focus on the actual decision: approve, tweak, send.
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.