# Notion

Push submissions to a Notion database with field-level mapping.

## Notion

Send every submission to a Notion database as a new page. Map fields to properties, compose rich page bodies, and backfill past responses.

<h2 id="what-you-get">What you get</h2>

<ul>
  <li>One Notion page per submission</li>
  <li>Field-level mapping: form field → database property</li>
  <li>Optional rich page body composed from answers</li>
  <li>Backfill existing submissions on demand</li>
  <li>Auto-recovery when database properties are renamed</li>
</ul>

<h2 id="connect">Connect Notion</h2>

<h2 id="test-event">Test event</h2>

<p>
  The Finalize step and the integration detail panel both have a <strong>Send test</strong> button that creates a real page in your
  database. Text and title properties get <code>[Question Title]</code> placeholders, numbers get
  <code>0</code>, emails get <code>test@example.com</code>, dates get the current timestamp, selects use the first available option, and
  files get a tiny placeholder image. Delete the test page after verifying.
</p>

<h2 id="backfill">Backfill existing submissions</h2>

<p>
  After connecting, you can backfill past responses into the database. Pages are created one at a time (~3 per second to stay within
  Notion's rate limits), with progress logged every 10 pages.
</p>

<h2 id="property-types">Property types</h2>

<h3 id="metadata-properties">Metadata properties</h3>

<p>
  Channel reads "Public link" or "Request", and Request ID holds the id of the request a response answered, so a database that collects both
  share-link and request responses can tell them apart and join back to the request.
</p>

<h2 id="repeating-groups">Repeating groups</h2>

<p>
  If your form has a <a href="/building-forms/repeating-groups">repeating group</a>, the field picker gives you two ways to map it,
  depending on whether you want the whole group in one property or each member field broken out.
</p>

<ul>
  <li>
    <strong>The whole group → one property</strong> — pick the group itself to map every entry into a single Rich text (or Title) property.
    Each entry shows as a numbered, labeled row, like "1. Full name: Jane Appleseed, Age: 34, 2. Full name: Marcus Lee, Age: 29".
  </li>
  <li>
    <strong>Each member field → its own property</strong> — pick a member field to give it a dedicated property. The values from every entry
    join with " · " (for example "Jane Appleseed · Marcus Lee").
  </li>
</ul>

<p>
  Member fields that no longer exist in the form but appear in past submissions stay mappable, so syncing never breaks for older responses.
</p>

<h2 id="rich-page-body">Rich page body</h2>

<p>
  Beyond property mapping, you can compose a rich page body with the template editor. Type <strong>@</strong> to insert any form field value
  or metadata such as PDF Link — the editor shows them as mention chips that resolve at sync time.
</p>

<p>
  Page bodies support paragraphs, <strong>bold</strong>, <em>italic</em>, <u>underline</u>, and links. Headings, lists, and images are not
  supported — they render as plain paragraphs. Text is automatically chunked at 2,000 characters per rich-text block (Notion's limit).
</p>

<h2 id="abandoned-responses">Abandoned response events</h2>

<p>
  If a respondent starts your form but doesn't finish, formbase can still sync the partial data. On the{' '}
  <strong>Abandoned submissions</strong> step, set <strong>Send abandoned event after</strong> to 12 hours, 1 day, 3 days, or 1 week. An
  hourly sweep then creates a page with whatever the respondent filled in, using the same property mapping as a completed submission. Map
  the "Submission status" metadata field to a Status or Select property to tell them apart in Notion.
</p>

<p>
  Only drafts from a share link are swept, and you can narrow it further with <strong>Required fields</strong> — the page is created only
  when at least one of the fields you pick was filled in.
</p>

> ℹ️ **Pro feature**
> <p>
>     Abandoned response delivery requires a Pro or Business plan. The core Notion integration is available on all plans. See{' '}
>     <a href="/subscription-billing/plans-pricing">plans & pricing</a>.
>   </p>

<h2 id="schema-drift">Schema changes and auto-recovery</h2>

<p>
  If you rename a property in Notion, formbase detects the change on the next submission and updates its mapping automatically. Properties
  are matched by their stable internal ID, so renames are transparent.
</p>

<p>
  If you delete a property, formbase drops it from the mapping and keeps syncing the remaining fields. If a property's type changes to
  something incompatible (e.g., number becomes select), the value may fail to sync — re-open the integration and re-map that field.
</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<ul>
  <li>
    <strong>Database not visible</strong> — Re-authorize and share the database with formbase during the Notion consent screen.
  </li>
  <li>
    <strong>Property mismatch</strong> — Mismatched types prevent syncing. Re-open the integration to see which fields need attention.
  </li>
  <li>
    <strong>Rate limits</strong> — Notion's API has per-workspace limits. formbase retries automatically; backfills throttle to ~3 pages per
    second.
  </li>
  <li>
    <strong>Access revoked</strong> — If you remove formbase from Notion Settings → Connections, the integration stops with an error and the
    person who set it up receives an email. Reconnect to restore.
  </li>
</ul>

<h2 id="faq">FAQ</h2>

  <p>No. Create the database in Notion first, then share it with formbase during authorization.</p>

  <p>
    The next submission fails with a "not found" error and the integration stops. The database is fixed when the integration is created, so
    delete this integration and create a new one against the new database.
  </p>

  <p>Yes. Notion accounts are connected at the workspace level. Any member can use any connected account when setting up an integration.</p>

  <p>Yes. Authorize additional Notion workspaces during new integration setups. Each form picks which account to use.</p>

  <p>No. But if you remove formbase from Notion Settings → Connections, the token is revoked and you'll need to reconnect.</p>

  <p>
    Both appear as pages in the same database. The "Submission status" property reads "Completed", "Partial", or "Updated" when a respondent
    edited an earlier answer — use Notion's filtered views to separate them.
  </p>

  <p>
    Go to Form settings → Integrations → Notion and delete the integration. To also revoke formbase's access to your Notion workspace, go to
    Notion Settings → Connections and remove formbase.
  </p>

<h2 id="next-steps">Next steps</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Slack](/integrations/slack) — Post submissions to a Slack channel
  - [Airtable](/integrations/airtable) — Push submissions into an Airtable base
  - [Repeating groups](/building-forms/repeating-groups) — Let respondents add as many entries as they need
</div>
