AutomationFlowsEmail & Gmail › Toastmasters Email Auto-responder

Toastmasters Email Auto-responder

Toastmasters Email Auto-Responder. Uses gmailTrigger, httpRequest, gmail, googleCalendar. Event-driven trigger; 11 nodes.

Event trigger★★★★☆ complexity11 nodesGmail TriggerHTTP RequestGmailGoogle CalendarGoogle Sheets
Email & Gmail Trigger: Event Nodes: 11 Complexity: ★★★★☆ Added:

This workflow follows the Gmail → Gmail Trigger 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": "Toastmasters Email Auto-Responder",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinutes",
              "value": 2
            }
          ]
        },
        "simple": false
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000001",
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "typeVersion": 1,
      "position": [
        240,
        460
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "functionCode": "// Extract key fields from the incoming Gmail message\nconst message = items[0].json;\n\nconst from = message.payload?.headers?.find(h => h.name === 'From')?.value || '';\nconst subject = message.payload?.headers?.find(h => h.name === 'Subject')?.value || '';\nconst messageId = message.id || '';\nconst threadId = message.threadId || '';\nconst timestamp = new Date(parseInt(message.internalDate)).toISOString();\n\n// Use snippet as the body text (plain-text preview)\nconst body = message.snippet || '';\n\nreturn [\n  {\n    json: {\n      from,\n      subject,\n      body,\n      threadId,\n      messageId,\n      timestamp\n    }\n  }\n];\n"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000002",
      "name": "Extract Email",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        480,
        460
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "anthropic-beta",
              "value": "prompt-caching-2024-07-31"
            },
            {
              "name": "x-api-key",
              "value": "={{$credentials.httpHeaderAuth.value}}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"claude-haiku-4-5-20251001\",\n  \"max_tokens\": 500,\n  \"temperature\": 0.3,\n  \"system\": [{\"type\": \"text\", \"text\": \"SYSTEM_PROMPT_PLACEHOLDER\", \"cache_control\": {\"type\": \"ephemeral\"}}],\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"From: {{ $json.from }}\\nSubject: {{ $json.subject }}\\n\\n{{ $json.body }}\"\n    }\n  ]\n}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000003",
      "name": "Claude API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        720,
        460
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "functionCode": "// Parse Claude's response, splitting on ---REPLY--- and ---META--- markers\nconst content = items[0].json.content;\nconst text = Array.isArray(content)\n  ? content.map(c => c.text).join('')\n  : (typeof content === 'string' ? content : '');\n\nconst previous = items[0].json;\n\nlet replyText = text;\nlet action = 'reply_only';\nlet meta = {};\n\n// Split on markers\nconst replyMatch = text.split('---REPLY---');\nif (replyMatch.length > 1) {\n  replyText = replyMatch[1];\n}\n\nconst metaMatch = text.split('---META---');\nif (metaMatch.length > 1) {\n  const metaRaw = metaMatch[1].trim();\n  // Trim replyText to remove everything after ---META---\n  replyText = replyText.split('---META---')[0].trim();\n  try {\n    meta = JSON.parse(metaRaw);\n    action = meta.action || 'reply_only';\n  } catch (e) {\n    // If JSON parse fails, default to reply_only\n    action = 'reply_only';\n  }\n}\n\n// Carry forward the original email fields from the upstream node\nreturn [\n  {\n    json: {\n      replyText,\n      action,\n      meta,\n      from: $('Extract Email').first().json.from,\n      subject: $('Extract Email').first().json.subject,\n      body: $('Extract Email').first().json.body,\n      threadId: $('Extract Email').first().json.threadId,\n      messageId: $('Extract Email').first().json.messageId,\n      timestamp: $('Extract Email').first().json.timestamp\n    }\n  }\n];\n"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000004",
      "name": "Parse Response",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        960,
        460
      ]
    },
    {
      "parameters": {
        "rules": {
          "rules": [
            {
              "value": "rsvp",
              "output": 0
            },
            {
              "value": "escalate",
              "output": 1
            },
            {
              "value": "reply_only",
              "output": 2
            }
          ]
        },
        "fallbackOutput": 2,
        "dataType": "string",
        "value1": "={{ $json.action }}"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000005",
      "name": "Route Action",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 2,
      "position": [
        1200,
        460
      ]
    },
    {
      "parameters": {
        "sendTo": "={{ $json.from }}",
        "subject": "=Re: {{ $json.subject }}",
        "message": "={{ $json.replyText }}",
        "options": {
          "threadId": "={{ $json.threadId }}"
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000006",
      "name": "Send Reply",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1500,
        660
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "calendarId": "primary",
        "eventId": "={{ $json.meta.eventId }}",
        "additionalFields": {
          "attendees": "={{ $json.from }}"
        },
        "operation": "update"
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000007",
      "name": "Add RSVP",
      "type": "n8n-nodes-base.googleCalendar",
      "typeVersion": 1.1,
      "position": [
        1500,
        260
      ],
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "={{ $json.from }}",
        "subject": "=Re: {{ $json.subject }}",
        "message": "={{ $json.replyText }}",
        "options": {
          "threadId": "={{ $json.threadId }}"
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000008",
      "name": "RSVP Reply",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1740,
        260
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "oporto.toastmasters.club@gmail.com",
        "subject": "=[AUTO-ESCALATED] {{ $json.subject }}",
        "message": "=This email was auto-escalated by the ClubDesk bot.\n\n--- Original Message ---\nFrom: {{ $json.from }}\nSubject: {{ $json.subject }}\n\n{{ $json.body }}",
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000009",
      "name": "Forward to Officers",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1500,
        460
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "sendTo": "={{ $json.from }}",
        "subject": "=Re: {{ $json.subject }}",
        "message": "={{ $json.replyText }}",
        "options": {
          "threadId": "={{ $json.threadId }}"
        }
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000010",
      "name": "Escalate Auto-Reply",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1740,
        460
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        },
        "sheetName": {
          "__rl": true,
          "mode": "byName",
          "value": "Email Log"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Timestamp": "={{ $json.timestamp }}",
            "From": "={{ $json.from }}",
            "Subject": "={{ $json.subject }}",
            "Action": "={{ $json.action }}",
            "Reply Snippet": "={{ $json.replyText.substring(0, 200) }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Timestamp",
              "displayName": "Timestamp",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "From",
              "displayName": "From",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "Subject",
              "displayName": "Subject",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "Action",
              "displayName": "Action",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "Reply Snippet",
              "displayName": "Reply Snippet",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1b2c3d4-0001-4000-8000-000000000011",
      "name": "Log Interaction",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.2,
      "position": [
        2040,
        460
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Extract Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Email": {
      "main": [
        [
          {
            "node": "Claude API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude API": {
      "main": [
        [
          {
            "node": "Parse Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Response": {
      "main": [
        [
          {
            "node": "Route Action",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route Action": {
      "main": [
        [
          {
            "node": "Add RSVP",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Forward to Officers",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add RSVP": {
      "main": [
        [
          {
            "node": "RSVP Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSVP Reply": {
      "main": [
        [
          {
            "node": "Log Interaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Forward to Officers": {
      "main": [
        [
          {
            "node": "Escalate Auto-Reply",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Escalate Auto-Reply": {
      "main": [
        [
          {
            "node": "Log Interaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Reply": {
      "main": [
        [
          {
            "node": "Log Interaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "name": "toastmasters",
      "id": "1"
    },
    {
      "name": "email-automation",
      "id": "2"
    }
  ],
  "triggerCount": 1,
  "updatedAt": "2026-02-16T00:00:00.000Z",
  "versionId": "1"
}

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

Toastmasters Email Auto-Responder. Uses gmailTrigger, httpRequest, gmail, googleCalendar. Event-driven trigger; 11 nodes.

Source: https://github.com/rianino/ClubDesk/blob/049275ecaa7386dab213cd0d8b51babaa779f177/n8n-workflows/email-responder.json — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

AICARE Email Blast System. Uses googleDrive, httpRequest, googleSheets, gmail. Event-driven trigger; 39 nodes.

Google Drive, HTTP Request, Google Sheets +2
Email & Gmail

This workflow automatically manages every new Calendly booking from start to finish. When a prospect books a meeting, it captures all details, syncs everything to HubSpot, creates a prep task for the

HTTP Request, Calendly Trigger, ClickUp +4
Email & Gmail

An automated n8n workflow that monitors your Gmail inbox, classifies job application emails using a local AI (Ollama), and logs every application — with company, role, and status — to a Google Sheet i

Gmail, Gmail Trigger, HTTP Request +1
Email & Gmail

Automatically transform resume submissions into comprehensive candidate profiles with AI-powered parsing, GitHub analysis, and instant team notifications. Monitors Gmail for incoming resume attachment

Gmail, Gmail Trigger, @Vlm Run/N8N Nodes Vlmrun +3
Email & Gmail

EnquiryFlow. Uses gmailTrigger, httpRequest, googleSheets, gmail. Event-driven trigger; 12 nodes.

Gmail Trigger, HTTP Request, Google Sheets +1