AutomationFlowsSlack & Telegram › Contact Form to Airtable & WhatsApp

Contact Form to Airtable & WhatsApp

Original n8n title: CRM Automatisierung — Kontaktformular → Airtable + Whatsapp

CRM Automatisierung — Kontaktformular → Airtable + WhatsApp. Uses airtable, httpRequest. Webhook trigger; 6 nodes.

Webhook trigger★★★★☆ complexity6 nodesAirtableHTTP Request
Slack & Telegram Trigger: Webhook Nodes: 6 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
{
  "name": "CRM Automatisierung \u2014 Kontaktformular \u2192 Airtable + WhatsApp",
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "nodes": [
    {
      "id": "c444c68f-e5b3-4c74-8a72-687b17a9a709",
      "name": "Webhook \u2014 Kontaktformular",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -208,
        0
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "contact-form",
        "responseMode": "responseNode",
        "options": {}
      }
    },
    {
      "id": "0a51c800-a348-4f16-b533-6442a3e04959",
      "name": "Code \u2014 Extrait donn\u00e9es formulaire",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        16,
        0
      ],
      "parameters": {
        "jsCode": "// Extrait les donn\u00e9es du body du webhook\nfor (const item of $input.all()) {\n  item.json = item.json.body;\n}\nreturn $input.all();"
      }
    },
    {
      "id": "f609cb2d-d63a-4940-8afb-03cf714bf411",
      "name": "Airtable \u2014 Cr\u00e9er contact CRM",
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        208,
        0
      ],
      "parameters": {
        "operation": "create",
        "base": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_BASE_ID",
          "mode": "id"
        },
        "table": {
          "__rl": true,
          "value": "YOUR_AIRTABLE_TABLE_ID",
          "mode": "id"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "schema": [
            {
              "id": "name",
              "displayName": "name",
              "type": "string"
            },
            {
              "id": "email",
              "displayName": "email",
              "type": "string"
            },
            {
              "id": "phone",
              "displayName": "phone",
              "type": "string"
            },
            {
              "id": "company",
              "displayName": "company",
              "type": "string"
            },
            {
              "id": "message",
              "displayName": "message",
              "type": "string"
            },
            {
              "id": "service",
              "displayName": "service",
              "type": "string"
            },
            {
              "id": "timestamp",
              "displayName": "timestamp",
              "type": "dateTime"
            },
            {
              "id": "source",
              "displayName": "source",
              "type": "string"
            }
          ]
        }
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "fa2a56bd-b7b4-4200-aa93-0eb5adc80906",
      "name": "Code \u2014 Normaliser num\u00e9ro t\u00e9l\u00e9phone",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        432,
        0
      ],
      "parameters": {
        "jsCode": "// Normalise le num\u00e9ro de t\u00e9l\u00e9phone pour Evolution API\n// Supporte les formats DE (49) et CM (237)\nconst input = $json;\nlet phoneInput = input.phone || (input.fields ? input.fields.phone : '') || '';\n\nlet raw = phoneInput.toString().replace(/[^0-9]/g, '');\nif (raw.startsWith('00')) raw = raw.slice(2);\n\nlet finalNumber = '';\n\n// Allemagne (49)\nif (raw.startsWith('49')) {\n  finalNumber = raw;\n} else if (raw.startsWith('0') && (raw.length === 10 || raw.length === 11)) {\n  finalNumber = '49' + raw.slice(1);\n}\n// Cameroun (237)\nelse if (raw.startsWith('237')) {\n  finalNumber = raw;\n} else if (raw.match(/^[236][0-9]{8}$/)) {\n  finalNumber = '237' + raw;\n} else {\n  finalNumber = raw;\n}\n\nreturn { ...input, normalizedNumber: finalNumber, debug_raw: raw };"
      }
    },
    {
      "id": "8d284f4c-941a-482a-994d-e0ae8107ab50",
      "name": "WhatsApp \u2014 Envoyer confirmation client",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        656,
        0
      ],
      "parameters": {
        "method": "POST",
        "url": "=https://YOUR_EVOLUTION_API_URL/message/sendText/YOUR_INSTANCE_NAME",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $env.EVOLUTION_API_KEY }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"number\": \"{{ $json.normalizedNumber }}\",\n  \"text\": \"\ud83d\udc4b Bonjour {{ $json.fields.name }}, merci pour votre demande concernant {{ $json.fields.service }}. Nous vous r\u00e9pondrons dans les 24h.\",\n  \"delay\": 0\n}"
      }
    },
    {
      "id": "f4c792f2-f401-4795-9975-0830e2d5a80a",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        848,
        0
      ],
      "parameters": {
        "options": {}
      }
    }
  ],
  "connections": {
    "Webhook \u2014 Kontaktformular": {
      "main": [
        [
          {
            "node": "Code \u2014 Extrait donn\u00e9es formulaire",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code \u2014 Extrait donn\u00e9es formulaire": {
      "main": [
        [
          {
            "node": "Airtable \u2014 Cr\u00e9er contact CRM",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable \u2014 Cr\u00e9er contact CRM": {
      "main": [
        [
          {
            "node": "Code \u2014 Normaliser num\u00e9ro t\u00e9l\u00e9phone",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code \u2014 Normaliser num\u00e9ro t\u00e9l\u00e9phone": {
      "main": [
        [
          {
            "node": "WhatsApp \u2014 Envoyer confirmation client",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "WhatsApp \u2014 Envoyer confirmation client": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "tags": [
    "crm",
    "airtable",
    "whatsapp",
    "contact-form"
  ]
}

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

CRM Automatisierung — Kontaktformular → Airtable + WhatsApp. Uses airtable, httpRequest. Webhook trigger; 6 nodes.

Source: https://github.com/guilloulearnlife/n8n-portfolio/blob/24614da8343195909d722fe7754bfcdb6d1820bf/workflows/crm-automatisierung.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

qualiopi. Uses airtable, telegram, emailSend, httpRequest. Webhook trigger; 51 nodes.

Airtable, Telegram, Email Send +3
Slack & Telegram

How it works • Webhook triggers from content creation system in Airtable • Downloads media (images/videos) from Airtable URLs • Uploads media to Postiz cloud storage • Schedules or publishes content a

Airtable, Telegram, HTTP Request
Slack & Telegram

This workflow automatically deletes user data from different apps/services when a specific slash command is issued in Slack.

Airtable, Crypto, HTTP Request
Slack & Telegram

This guide will walk you through setting up your n8n workflow. By the end, you'll have a fully automated system for managing your contract employee placements, from generating documents to sending ren

Airtable, Google Docs, HTTP Request +2
Slack & Telegram

HR teams, IT Operations, and System Administrators managing employee onboarding at scale. It’s perfect if you use Odoo 18 to trigger account requests and need Redmine + GitLab accounts created instant

HTTP Request, Slack