ZZentralit
n8nbeginnerWorkflowUpdated 16 Jan 2025

Public form → Notion database

A public n8n webhook receives form submissions, validates them, files an entry into Notion and sends a confirmation email.

#n8n#notion#webhook#forms

What this does

A visitor submits a form on your site. n8n receives it on a public webhook, validates the payload, creates a new page in a Notion database, then sends a confirmation email back to the submitter. Total latency is a couple of seconds; there’s no backend code to maintain.

Nodes

  1. Webhook (POST) — public URL, path /contact
  2. Set — coerce fields, default missing values
  3. IF — reject if email is empty or obviously malformed
  4. Notion → Create Database Page — writes to the Inbound database
  5. Gmail / SMTP → Send Email — confirmation back to submitter
  6. Respond to Webhook — 200 OK with {ok: true}

Wire-up

Webhook ──► Set ──► IF ──► Notion ──► Email ──► Respond
                      │
                      └─► Respond (400)

Webhook payload contract

{
  "name": "Alex Support",
  "email": "alex@example.com",
  "topic": "Onboarding question",
  "message": "We'd like to pilot zentralit for our helpdesk."
}

Notion field mapping

Notion propertySource
Name (Title){{ $json.name }}
Email{{ $json.email }}
Topic{{ $json.topic }}
Message{{ $json.message }}
Sourceliteral "website"
Statusliteral "New"

Validation (the IF node)

{{ $json.email.match(/^[^@\s]+@[^@\s]+\.[^@\s]+$/) !== null }}

If that expression is false, short-circuit to the 400 response — you never create a Notion row for garbage input, which keeps the database clean.

Confirmation email template

Subject: We received your message 👋

Hi {{ $json.name.split(' ')[0] }},

Thanks — we've got your note about "{{ $json.topic }}" and will reply
within one business day.

— the zentralit team

Why n8n for this and not a serverless function?

  • You (or the next person) can open the workflow in a browser and see exactly what happens. No hidden state, no deploy pipeline.
  • Swapping Notion for Airtable or HubSpot is a one-node change.
  • n8n’s retry + execution-log UI gives you free observability.

Importable JSON

Save the workflow export alongside this page at public/flows-assets/n8n-form-to-notion.json. Then import it via Workflows → Import from file in n8n and re-bind the credentials.

Hardening checklist before going public

  • Rate-limit the webhook (n8n cloud: enable Webhook rate limit).
  • Add a simple honeypot field (website) — reject if filled.
  • For stronger protection, put Cloudflare Turnstile in front and verify the token in a Function node before the IF.