send.webforms.toRead the docs →

Databases and spreadsheets

In development

Send 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.

Get an endpointRead the docs

What will land in Notion

The native adapter is still in progress. The webhook route below delivers the same data today.

Setup

  1. 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.

  2. 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.

  3. 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.

contact.html
<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.

notion-webhook.ts
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

Notion form FAQ

Yes. Teams that already track leads, applications or bug reports in Notion can make the form the intake end of that pipeline, so nothing is copy-pasted in each morning. The webhook route below does this today; the native adapter will do it without the function.

Sending from your stack

The destination is set in the dashboard, so the form itself is the same plain POST everywhere. These guides have the markup for the common setups.

Send your next form submission to Notion

Free for 300 submissions a month. Endpoint in under a minute, no card required.

Start free