This workflow follows the Execute Workflow Trigger → Gmail recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "hitl_email_approval",
"nodes": [
{
"id": "Start",
"name": "Start",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"typeVersion": 1,
"position": [
-640,
160
],
"parameters": {}
},
{
"id": "Create Draft",
"name": "Create Draft",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
-420,
160
],
"parameters": {
"resource": "draft",
"operation": "create",
"toList": "={{ $json.to }}",
"subject": "={{ $json.subject }}",
"message": "={{ $json.body }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "Notify Approvals Channel",
"name": "Notify Approvals Channel",
"type": "n8n-nodes-base.slack",
"typeVersion": 2,
"position": [
-200,
160
],
"parameters": {
"resource": "message",
"operation": "post",
"channel": "={{ $env.SLACK_APPROVAL_CHANNEL }}",
"text": "Email draft created. Approve via wait-resume webhook."
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
}
},
{
"id": "Wait For Decision",
"name": "Wait For Decision",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
20,
160
],
"parameters": {
"resume": "webhook"
}
},
{
"id": "Approved?",
"name": "Approved?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
240,
160
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.approved }}",
"operation": "isTrue"
}
]
}
}
},
{
"id": "Send",
"name": "Send",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
460,
100
],
"parameters": {
"resource": "message",
"operation": "send",
"toList": "={{ $('Start').item.json.to }}",
"subject": "={{ $('Start').item.json.subject }}",
"message": "={{ $('Start').item.json.body }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "Mark Rejected",
"name": "Mark Rejected",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
460,
240
],
"parameters": {
"keepOnlySet": true,
"values": {
"string": [
{
"name": "status",
"value": "rejected"
}
]
}
}
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "Create Draft",
"type": "main",
"index": 0
}
]
]
},
"Create Draft": {
"main": [
[
{
"node": "Notify Approvals Channel",
"type": "main",
"index": 0
}
]
]
},
"Notify Approvals Channel": {
"main": [
[
{
"node": "Wait For Decision",
"type": "main",
"index": 0
}
]
]
},
"Wait For Decision": {
"main": [
[
{
"node": "Approved?",
"type": "main",
"index": 0
}
]
]
},
"Approved?": {
"main": [
[
{
"node": "Send",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Rejected",
"type": "main",
"index": 0
}
]
]
}
},
"active": false
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
gmailOAuth2slackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
hitl_email_approval. Uses executeWorkflowTrigger, gmail, slack. Event-driven trigger; 7 nodes.
Source: https://github.com/ogu83/n8n-ai-agent-lab/blob/main/ep4-production/workflows/hitl_email_approval.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
This workflow scans an RSS blog feed on a schedule, logs newly found posts to Google Sheets, uses OpenAI to generate role-based LinkedIn drafts, and emails approval links via Gmail; approved drafts ar
📊 Description Automate the entire IT asset recovery and employee offboarding process with this AI-powered n8n workflow. 📋💻 This automation monitors Google Sheets for resigned or terminated employees,
This n8n template automates finding real estate agents in any city using Google Maps. It deep-scrapes listings via ScrapeOps Proxy, deduplicates results against Google Sheets, saves fresh leads, and s
Gmail-Governance. Uses executeWorkflowTrigger, gmail, postgres. Event-driven trigger; 10 nodes.