AutomationFlowsAI & RAG › Hitl Email Approval

Hitl Email Approval

hitl_email_approval. Uses executeWorkflowTrigger, gmail, slack. Event-driven trigger; 7 nodes.

Event trigger★★★★☆ complexity7 nodesExecute Workflow TriggerGmailSlack
AI & RAG Trigger: Event Nodes: 7 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.

Tool Think, Tool Calculator, Agent Tool +18
AI & RAG

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

Execute Workflow Trigger, Gmail, RSS Feed Read +4
AI & RAG

📊 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,

Google Sheets Trigger, Google Sheets, Gmail +1
AI & RAG

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

Google Sheets, Form Trigger, @Scrapeops/N8N Nodes Scrapeops +2
AI & RAG

Gmail-Governance. Uses executeWorkflowTrigger, gmail, postgres. Event-driven trigger; 10 nodes.

Execute Workflow Trigger, Gmail, Postgres