AutomationFlowsData & Sheets › Slack Slash Command Email Checker

Slack Slash Command Email Checker

Original n8n title: Webhook Respondtowebhook (airtable)

Webhook Respondtowebhook. Uses respondToWebhook, executeWorkflow, airtable, crypto. Webhook trigger; 16 nodes.

Webhook trigger★★★★☆ complexity16 nodesAirtableCryptoHTTP Request
Data & Sheets Trigger: Webhook Nodes: 16 Complexity: ★★★★☆ Added:

This workflow follows the Airtable → HTTP Request 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
{
  "nodes": [
    {
      "name": "Receive Slash Command",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        100
      ],
      "parameters": {
        "path": "3c0d3820-5896-41c5-83bf-1cd5e956c32c",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 1
    },
    {
      "name": "Reject",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        680,
        200
      ],
      "parameters": {
        "options": {
          "responseCode": 403
        },
        "respondWith": "noData"
      },
      "typeVersion": 1
    },
    {
      "name": "Set",
      "type": "n8n-nodes-base.set",
      "position": [
        680,
        0
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "operation",
              "value": "={{$json[\"body\"][\"text\"].split(\" \")[0].toLowerCase()}}"
            },
            {
              "name": "email",
              "value": "={{$json[\"body\"][\"text\"].split(\" \")[1].toLowerCase()}}"
            }
          ]
        },
        "options": {},
        "keepOnlySet": true
      },
      "typeVersion": 1
    },
    {
      "name": "Read Command",
      "type": "n8n-nodes-base.switch",
      "position": [
        900,
        0
      ],
      "parameters": {
        "rules": {
          "rules": [
            {
              "value2": "delete"
            }
          ]
        },
        "value1": "={{$json[\"operation\"]}}",
        "dataType": "string",
        "fallbackOutput": 3
      },
      "typeVersion": 1
    },
    {
      "name": "Wrong Command Error",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1120,
        100
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "{\n  \"text\": \"Sorry, I didn't understand your command. You can request data deletion like so: `/gdpr delete <email>`.\"\n}"
      },
      "typeVersion": 1
    },
    {
      "name": "Acknowledge",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1340,
        0
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "{\n  \"text\": \"On it!\"\n}"
      },
      "typeVersion": 1
    },
    {
      "name": "Empty Email?",
      "type": "n8n-nodes-base.if",
      "position": [
        1120,
        -100
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"email\"]}}",
              "operation": "isEmpty"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Missing Email Error",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1340,
        -200
      ],
      "parameters": {
        "options": {},
        "respondWith": "json",
        "responseBody": "{\n  \"text\": \"It looks like the user email address is missing. You can request data deletion like so: `/gdpr delete <email>`.\"\n}"
      },
      "typeVersion": 1
    },
    {
      "name": "Valid Token?",
      "type": "n8n-nodes-base.if",
      "position": [
        460,
        100
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json[\"body\"][\"token\"]}}",
              "value2": "foo"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Paddle Data Deletion",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        1560,
        0
      ],
      "parameters": {
        "workflowId": "1231"
      },
      "typeVersion": 1
    },
    {
      "name": "Customer.io Data Deletion",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        1780,
        0
      ],
      "parameters": {
        "workflowId": "1237"
      },
      "typeVersion": 1
    },
    {
      "name": "Zendesk Data Deletion",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        2000,
        0
      ],
      "parameters": {
        "workflowId": "1240"
      },
      "typeVersion": 1
    },
    {
      "name": "Airtable",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1780,
        200
      ],
      "parameters": {
        "table": "Log",
        "options": {},
        "operation": "append",
        "application": "app3wAXUUwalhapFV"
      },
      "credentials": {
        "airtableApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Prepare Log Entry",
      "type": "n8n-nodes-base.function",
      "position": [
        1340,
        200
      ],
      "parameters": {
        "functionCode": "let deletion_nodes = [\n  'Paddle Data Deletion',\n  'Customer.io Data Deletion',\n  'Zendesk Data Deletion'\n]\n\nconst deletion_results = deletion_nodes.map(node_name => $items(node_name)[0].json);\nconst deletion_success = deletion_results.filter(json => json.success == true).length == deletion_nodes.length;\n\nreturn [{\n  json: {\n    Result: deletion_success ? 'Done' : 'Error',\n    Notes: deletion_results.map(json => json.service + ': ' + json.message).join('\\n'),\n    Processed: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 1
    },
    {
      "name": "Crypto",
      "type": "n8n-nodes-base.crypto",
      "position": [
        1560,
        200
      ],
      "parameters": {
        "type": "SHA256",
        "value": "={{$node[\"Set\"].json[\"email\"]}}",
        "dataPropertyName": "Email Hash"
      },
      "typeVersion": 1
    },
    {
      "name": "Respond to Slack",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2000,
        200
      ],
      "parameters": {
        "url": "={{$node[\"Receive Slash Command\"].json[\"body\"][\"response_url\"]}}",
        "options": {},
        "requestMethod": "POST",
        "responseFormat": "string",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "text",
              "value": "=GDPR data deletion process finished.\nStatus: {{$node[\"Prepare Log Entry\"].json[\"Result\"] == \"Done\" ? \":white_check_mark: OK\" : \":x: Error\"}}\nLog: <https://airtable.com/app3wAXUUwalhapFV/tbljkxW55l2Gq7Fzq/viwOJdJM1taITEaPr/{{$node[\"Airtable\"].json[\"id\"]}}?blocks=hide|View in Airtable>"
            },
            {
              "name": "delete_original",
              "value": "true"
            }
          ]
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Set": {
      "main": [
        [
          {
            "node": "Read Command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crypto": {
      "main": [
        [
          {
            "node": "Airtable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable": {
      "main": [
        [
          {
            "node": "Respond to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Acknowledge": {
      "main": [
        [
          {
            "node": "Paddle Data Deletion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Empty Email?": {
      "main": [
        [
          {
            "node": "Missing Email Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Acknowledge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Command": {
      "main": [
        [
          {
            "node": "Empty Email?",
            "type": "main",
            "index": 0
          }
        ],
        null,
        null,
        [
          {
            "node": "Wrong Command Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Valid Token?": {
      "main": [
        [
          {
            "node": "Set",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Reject",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Log Entry": {
      "main": [
        [
          {
            "node": "Crypto",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Paddle Data Deletion": {
      "main": [
        [
          {
            "node": "Customer.io Data Deletion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Slash Command": {
      "main": [
        [
          {
            "node": "Valid Token?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Zendesk Data Deletion": {
      "main": [
        [
          {
            "node": "Prepare Log Entry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Customer.io Data Deletion": {
      "main": [
        [
          {
            "node": "Zendesk Data Deletion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

How this works

This workflow enables teams to automate secure email verification via Slack slash commands, instantly confirming user emails without manual checks and integrating seamlessly with Airtable for data storage. It's designed for community managers or HR professionals handling onboarding who need quick, reliable validation to prevent spam or errors. The key step involves receiving the slash command, checking for a provided email, and using the crypto node to generate a unique verification token before storing it in Airtable and sending a response back to Slack.

Use this when building interactive Slack bots for user registration in small to medium teams, especially where email confirmations must be tamper-proof. Avoid it for high-volume systems needing real-time database syncing beyond Airtable, or if your setup lacks webhook access. Common variations include swapping Airtable for Google Sheets or adding HTTP requests to trigger follow-up emails upon verification.

About this workflow

Webhook Respondtowebhook. Uses respondToWebhook, executeWorkflow, airtable, crypto. Webhook trigger; 16 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

Amazon keywords. Uses airtable, httpRequest, splitOut, stickyNote. Webhook trigger; 12 nodes.

Airtable, HTTP Request
Data & Sheets

Code. Uses httpRequest, extractFromFile, splitInBatches, noOp. Webhook trigger; 51 nodes.

HTTP Request, Chain Llm, OpenAI Chat +1
Data & Sheets

OpenAI Assistant for Hubspot Chat. Uses httpRequest, airtable, stickyNote, openAi. Webhook trigger; 34 nodes.

HTTP Request, Airtable, OpenAI
Data & Sheets

OpenAI Assistant for Hubspot Chat. Uses httpRequest, airtable, stickyNote, openAi. Webhook trigger; 34 nodes.

HTTP Request, Airtable, OpenAI
Data & Sheets

Webhook Code. Uses itemLists, respondToWebhook, stickyNote, googleCalendar. Webhook trigger; 92 nodes.

Item Lists, Google Calendar, Airtable