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
- Webhook (POST) — public URL, path
/contact - Set — coerce fields, default missing values
- IF — reject if
emailis empty or obviously malformed - Notion → Create Database Page — writes to the
Inbounddatabase - Gmail / SMTP → Send Email — confirmation back to submitter
- 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 property | Source |
|---|---|
| Name (Title) | {{ $json.name }} |
{{ $json.email }} | |
| Topic | {{ $json.topic }} |
| Message | {{ $json.message }} |
| Source | literal "website" |
| Status | literal "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.