Databases and spreadsheets
In developmentSend form submissions to Notion
Notion is where a lot of teams already track leads, applications and bug reports, so a form that writes straight into a database saves a daily copy-paste ritual. The native Notion adapter with a visual property mapper is in active development. Until it ships you can wire the same result today through a webhook destination and a small function, and the route below is honest about which part is which.
The native Notion destination is still being built. The steps below use a webhook, which works today and needs no change to your form once the adapter ships.
What lands in Notion
- A new page in your chosen Notion database per submission
- Form fields mapped onto database properties
- Title, select, date, email, URL and number property types
- Spam quarantined before it ever reaches your workspace
Setup
Create a Notion integration
In Notion's integration settings, create an internal integration and copy its secret. Share your target database with that integration so it has write access.
Add a webhook destination today
While the native adapter is being built, point a WebForms webhook destination at a small function that calls Notion's pages endpoint. Sample below.
Switch to the native adapter when it lands
When the Notion destination ships you connect it with OAuth, pick the database and map properties in the dashboard. No form changes needed.
Notion example
Swap in your own endpoint and these run as-is.
The form never changes - only the destination configuration does.
<form action="https://send.webforms.to/wft_your_key" method="POST"> <input name="name" required /> <input name="email" type="email" required /> <textarea name="message"></textarea> <input type="text" name="_gotcha" style="display:none" tabindex="-1" /> <button type="submit">Send</button> </form>
Receives the WebForms webhook and creates a Notion page. Verify the signature first - see the webhook guide.
export async function POST(req: Request) {
const body = await req.json();
await fetch("https://api.notion.com/v1/pages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NOTION_SECRET}`,
"Notion-Version": "2022-06-28",
"Content-Type": "application/json",
},
body: JSON.stringify({
parent: { database_id: process.env.NOTION_DB_ID },
properties: {
Name: { title: [{ text: { content: body.data.name } }] },
Email: { email: body.data.email },
Message: {
rich_text: [{ text: { content: body.data.message ?? "" } }],
},
},
}),
});
return new Response("ok");
}Worth knowing
- The native Notion destination is in development. Everything on this page describes the webhook route, which works today.
- Notion's API rejects a title property that isn't an array of rich-text objects - the most common cause of a silent 400.
- Property names in the API are case-sensitive and must match your database exactly.
Notion form FAQ
Yes, today via a webhook destination and a small function that calls Notion's API. A native Notion adapter with visual property mapping is in development.
Not yet. It is in progress. We would rather say so here than have you sign up expecting a one-click connect that does not exist.
No. Destinations are configured server-side, so switching from the webhook route to the native adapter is a dashboard change with no edit to your markup.
No. Filtering happens before delivery, so quarantined submissions never fan out to any destination.
Other destinations
Send your next form submission to Notion
Free for 300 submissions a month. Endpoint in under a minute, no card required.
Start free