{
  "name": "Website-Formular an HubSpot und Slack",
  "nodes": [
    {
      "parameters": {
        "content": "## Website-Formular an HubSpot und Slack\n\n**Zweck:** Nimmt Kontaktanfragen deiner Website per Webhook an, legt den Kontakt in HubSpot an oder aktualisiert ihn und meldet die Anfrage im Vertriebskanal.\n\n**Zugangsdaten (Credentials):**\n- Formular-Webhook: Header Auth (Header-Name und geheimer Wert). Denselben Header schickt dein Server oder Formular-Dienst mit.\n- HubSpot: Private-App-Token (Scopes crm.objects.contacts.read und crm.objects.contacts.write)\n- Slack: OAuth2 oder Bot-Token mit chat:write\n\n**Anpassen:**\n- Formular auf POST an die Production-URL des Webhooks schicken (Feldnamen email, vorname, nachname, firma, nachricht)\n- Slack-Kanal in „Slack melden“\n- Spam-Schutz (Honeypot/Captcha) im Formular selbst\n\n**Sicherheit (vor dem Aktivieren lesen):**\n- Der Webhook verlangt Header Auth. Das passt, wenn dein Server oder ein Formular-Dienst die Daten schickt, nicht der Browser.\n- Schickt der Browser direkt, bleibt ein Header nicht geheim. Wer Authentication dann auf None stellt, öffnet den Webhook: Jeder mit der URL kann Kontakte anlegen und bei bekannter E-Mail-Adresse Vorname, Nachname und Firma eines bestehenden Kontakts ändern.\n- Für diesen Fall: firstName, lastName und companyName unter Additional Fields in „HubSpot Kontakt anlegen“ entfernen (der Node sendet sie dann nicht) und ein Captcha-Token im Workflow prüfen. Ein Captcha hält Bots ab, es belegt nicht, wem die E-Mail-Adresse gehört.\n- Auch mit Header Auth gilt: Wer das Formular mit einer fremden E-Mail-Adresse ausfüllt, ändert die Namensfelder dieses Kontakts. Soll das nicht passieren, die drei Felder entfernen.\n- „Slack melden“ maskiert &, < und > in den Eingaben. Slack-Steuersequenzen wie <!channel> oder <URL|Text> wirken dadurch nicht. Reine URLs verlinkt Slack weiterhin, Formatierung wie *fett* bleibt möglich.\n\nValidiert am 10.11.2026 gegen das n8n-Node-Schema, nicht in Produktion ausgeführt.\nQuelle: automationskompass.de/n8n-templates/",
        "height": 960,
        "width": 420,
        "color": 7
      },
      "id": "f8bd3740-87a3-4dbe-8aeb-df30fe40fedd",
      "name": "Notiz",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -520,
        120
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "kontaktformular",
        "authentication": "headerAuth",
        "options": {}
      },
      "id": "45c03801-e386-40e5-b0bd-0b1e5d85a85b",
      "name": "Formular-Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        0,
        300
      ],
      "webhookId": "3852f81b-453d-489f-ae4d-6b381e627c2e"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c8cc000d-b356-493c-af1e-d8c4b4718f75",
              "name": "email",
              "value": "={{ ($json.body.email || \"\").trim().toLowerCase() }}",
              "type": "string"
            },
            {
              "id": "bd979f99-8cc0-492f-ad2a-976fb670e67a",
              "name": "vorname",
              "value": "={{ $json.body.vorname }}",
              "type": "string"
            },
            {
              "id": "5d7b8327-d147-425f-83de-8ebabbcc0218",
              "name": "nachname",
              "value": "={{ $json.body.nachname }}",
              "type": "string"
            },
            {
              "id": "1ca3dccf-6a7e-4b61-9179-e9e36b5a012b",
              "name": "firma",
              "value": "={{ $json.body.firma }}",
              "type": "string"
            },
            {
              "id": "2fa760d8-b040-4804-94d0-7b3b40aa97c0",
              "name": "nachricht",
              "value": "={{ $json.body.nachricht }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "38664449-d14f-43b5-b8f3-002a41662ec1",
      "name": "Felder normalisieren",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "3ec3f64a-6777-4db0-afa7-0fa15e89be58",
              "leftValue": "={{ $json.email }}",
              "rightValue": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$",
              "operator": {
                "type": "string",
                "operation": "regex"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "d3280656-fcc3-4bb9-ad3b-f9078c9cdbb8",
      "name": "Gültige E-Mail?",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.3,
      "position": [
        480,
        300
      ]
    },
    {
      "parameters": {
        "authentication": "appToken",
        "resource": "contact",
        "operation": "upsert",
        "email": "={{ $json.email }}",
        "additionalFields": {
          "firstName": "={{ $json.vorname }}",
          "lastName": "={{ $json.nachname }}",
          "companyName": "={{ $json.firma }}"
        }
      },
      "id": "3b66078c-db2f-440c-9428-ae91d959a6b2",
      "name": "HubSpot Kontakt anlegen",
      "type": "n8n-nodes-base.hubspot",
      "typeVersion": 2.2,
      "position": [
        720,
        300
      ]
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "#vertrieb",
          "mode": "name"
        },
        "text": "={{ ('Neue Anfrage von ' + ($('Felder normalisieren').item.json.vorname || '') + ' ' + ($('Felder normalisieren').item.json.nachname || '') + ' (' + ($('Felder normalisieren').item.json.firma || '') + '): ' + ($('Felder normalisieren').item.json.nachricht || '')).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }}",
        "otherOptions": {}
      },
      "id": "decc4f83-f998-4c1d-b54c-6f755520481a",
      "name": "Slack melden",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.4,
      "position": [
        960,
        300
      ]
    }
  ],
  "connections": {
    "Formular-Webhook": {
      "main": [
        [
          {
            "node": "Felder normalisieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Felder normalisieren": {
      "main": [
        [
          {
            "node": "Gültige E-Mail?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gültige E-Mail?": {
      "main": [
        [
          {
            "node": "HubSpot Kontakt anlegen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HubSpot Kontakt anlegen": {
      "main": [
        [
          {
            "node": "Slack melden",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Berlin"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  }
}
