Skip to content
notionsolutions

A practical library for building,
organizing and working in Notion.

Workflow guides

Connect a Form to a Notion Database: Tally, Typeform, Google Forms, CF7 and the API

Send every form response to a Notion database as a new row. Compare Tally, Typeform, Google Forms through Zapier, Make or FormtoNotion, Contact Form 7 and the Notion API by the property types they fill and their free limits, then set up the database, map the fields and fix sync failures.

Published
Three steel chutes feeding blank white cards into one frosted-glass tray with etched rows, a blue-edged card settling into the next empty row
Every route ends the same way: one response, one new row in the database you set up first.

To connect a form to Notion, point a form tool at a Notion database whose properties already match your questions, and each response arrives as a new row. Tally and Typeform connect directly, Google Forms and Jotform go through Zapier or Make, Contact Form 7 uses a free WordPress add-on, and a form on your own site can write rows through the Notion API. If every response must link to an existing client or project, I'd use Notion's own form instead, because no connector mapping list below includes Relation.

For a free standalone form, I'd start with Tally. For a Google Form that's already collecting answers, use Zapier's two-step template, and for a contact form on a WordPress site, use the Contact Form 7 add-on. Whatever you pick, keep it to one hop between the form and Notion where you can. Every service in the middle is another login and another monthly quota, and its access token can expire.

Set up the database before the form

Every connector on this page writes into a database that already exists, and most of the problems in the troubleshooting table further down start here. Five checks come first:

  1. One property per question, with the matching type. An email answer needs an Email property, a choice question needs a Select or Multi-select, and an upload needs Files & media. Tally maps one form field to one property, so two questions can't share a column. If a choice question tracks progress, Tally can also map it to a Status property; the difference is covered in Notion Status vs Select.
  2. Give the database a title. Tally's database dropdown doesn't display databases without titles.
  3. Decide what fills the Title property. The first property of every Notion database is the Title. A name question is the usual choice. Notion's API reference notes that an empty title displays as an untitled page, which makes a list of new responses hard to scan.
  4. Create the select options before you map. Typeform only matches a choice to a Select option when both are spelled the same, including spaces and capital letters.
  5. Add the tool's connection to the database page. In Notion, open ••• at the top right of the page, then More, and choose Add connections in the Connections group, as described in Notion's guide to adding connections. Tools that sign in through OAuth ask you to Select pages and then Allow access instead. Connections are workspace-specific, so check the workspace name before you approve.

The form tool handles collection. You still decide which property each answer lands in and which answers you'll tidy by hand, and that decision is cheaper to make in the database than after the responses pile up.

Pick the route for the form you already use

Each row below uses the cost or limit that the tool's own pages state, plus the gap you're most likely to hit.

Ways to send form responses to a Notion database
RouteHow it connectsCost or limit statedNeeds careBest for
Notion formBuilt into the databaseAll members on all plans; conditional logic on Business and EnterpriseCreated and edited in the desktop and web apps onlyIntake that has to link to clients or teammates
TallyNative integrationFree, unlimited submissionsNo Person or Relation; submission times arrive in UTCA free standalone form
TypeformNative, from the Connect panelFree plan: 10 responses a monthTable databases only; no Date or Relation in its mapping list; not for EU Data Center accountsConversational forms on an existing Typeform account
Google FormsZapier, Make or the FormtoNotion add-onZapier Free: 100 tasks a month; FormtoNotion: $5 a month (vendor's figure)Zapier mainly creates new pages; updating existing ones takes extra stepsForms that already live in Google
JotformZapier's Notion integrationZapier's plan limits applyOne more account in the chainJotform's template library
forms.appConnection listed in Notion's galleryNot stated in the listingThird-party connection that Notion doesn't maintainExisting forms.app users
Contact Form 7Free WordPress add-on with an internal tokenFreeNine supported column types; no Status, Checkbox, Person or RelationA contact form on a WordPress site
Your own siteNotion API, one POST per responseYour own code and hostingYou write the mapping and keep the token on the serverA developer-built form
Diagram of three lanes, native connector, automation tool through Zapier or Make, and plugin or code, all ending in one Notion table with Name, Email, Service and Message columns
Every route ends in the same database; the routes differ in how many services sit between the form and the row.

When two routes fit, take the one with fewer accounts between the form and the database. A direct connector fails in one place you can inspect, while a chain through Zapier or Make adds a second account to check and a second quota that can pause the flow.

Field coverage and free limits, side by side

The connectors differ most in which Notion property types they can fill, and that matters more than price once your database grows past a name and an email. The table below lines up four published mapping lists across 14 common property types: Tally's Notion integration guide, Typeform's Notion setup article, the Contact Form 7 add-on's plugin page and Notion's page property reference for the API. It shows documented support, not how reliably a sync runs. "Not listed" means the vendor's list leaves that type out.

Documented field coverage by connector (4 published mapping lists)
Notion propertyTallyTypeformContact Form 7 add-onNotion API
TitleShort answer, Long answer, Submission ID or Respondent IDShort Text, Long Text or Phone NumberListedtitle
TextShort answer, Long answer, TimeShort Text, Long Text, Email, Website, Phone Number, Yes/No, Legal, number-type questions, Hidden FieldListedrich_text
NumberNumber, Payment, Rating, Linear scaleShort Text, Number, Opinion Scale, Rating, Hidden FieldListednumber
SelectMultiple choice, Dropdown, MatrixMultiple Choice, Picture Choice, Dropdown, Yes/No, Legal, Hidden FieldListedselect
Multi-selectCheckboxes, Ranking, Multi-select, Matrix with multiple selectionThe same questions as SelectListedmulti_select
StatusMultiple choice or DropdownNot listedNot listedstatus
DateDateNot listedListeddate, with an optional time zone
EmailEmailEmailListedemail
PhonePhonePhone Number, Number, Opinion Scale, RatingListedphone_number
URLLink, Submission PDF, Submission previewWebsiteListedurl
CheckboxOne checkbox option per propertyYes/No, Legal, Hidden FieldNot listedcheckbox
Files & mediaFile upload, SignatureFile UploadNot listed; uploaded file URLs are sent when file fields are mappedfiles, by external URL or file upload
Person / PeopleNot supported nativelyEmail question or Variable to Person; Hidden Field to PeopleNot listedpeople, by user ID
RelationNot supported nativelyNot listedNot listedrelation, by page ID

Composite result: the three no-code connectors document 9 to 12 of the 14 types, with a median of 11 (Contact Form 7 add-on 9, Typeform 11, Tally 12). The API covers all 14 because you write each property yourself. Relation is missing from all three connector lists, and Person appears only in Typeform's. Notion's own form isn't in the table because its help describes question types by example rather than as a list, but it names relation and people questions directly.

Free allowances decide the other half of the choice. These are the figures each source states for its free tier or base price:

Free allowance and first paid step by route
RouteFree allowance statedWhat it means per responseFirst paid step stated
Tally to NotionIntegration free for all Tally users, unlimited submissionsNo submission cap from TallyNone needed for the integration
Typeform to NotionFree plan: 10 responses a month10 new rows a monthA paid Typeform plan, also needed for File Upload and Signature questions
Google Forms or Jotform via ZapierFree: $0 a month, 100 tasks, two-step ZapsAbout 100 responses a month when each response uses one taskProfessional from $19.99 a month, with a 14-day trial and no card required
Google Forms via FormtoNotionNone statedUnlimited responses, per the vendor$5 a month
Contact Form 7 add-onAdd-on is freeNo cap stated by the pluginNone stated

On free tiers, the strictest link in the chain sets the ceiling. A Typeform chain stops at 10 rows a month long before anything else matters. A Google Forms chain on Zapier's Free plan reaches about 100 responses a month, since triggers don't count toward the task limit and a two-step Zap spends one task on the Notion action; Zapier adds that some actions use more than one task. With pay-per-task billing off, Zaps pause at that limit until the next usage period starts. Zapier's Free and Professional plans are for one user.

Notion's own form: no connector at all

Notion's form is the baseline the other routes are measured against. According to Notion's forms help, all members on all Notion plans can create and use forms, each question is connected to a property in the database, and a form shared with anyone on the web can collect answers from people outside your workspace, including people who don't use Notion. You create and customize forms in the desktop and web apps only, and conditional logic needs a Business or Enterprise plan.

Its edge for client work is linking. Questions tied to multi-select, relation and people properties can cap how many selections a respondent makes, so a response can arrive already attached to a client or project. Sharing is the other boundary to check: on a form shared with anyone in your workspace, guests can only fill it in if they have access to the connected database, which the guest vs member guide explains. Setup, sharing options and the follow-up workflow are covered in Notion forms for client intake, so this page stays with the outside tools.

Connect Tally to a Notion database

Tally is the simplest free route here: its integration is native, needs no Zapier account and is free for all Tally users with unlimited submissions. Tally describes itself as an official Notion technology partner.

  1. Publish the form, open the Integrations tab and press Connect next to Notion.
  2. Click Log in to Notion, switch workspace at the top right if needed, press Select pages, tick the pages that hold your database and press Allow access.
  3. Name the connection (the name is for Tally's own use), pick the Notion account and choose the database from the dropdown. Press refresh if it's missing.
  4. Map each Tally field to a property, adding rows with + Add property. The Title property takes a Short answer, Long answer, Submission ID or Respondent ID.
  5. If you want the answers in the page body too, type @ in the page content block to insert them, or use @All answers to add every non-empty input, hidden and calculated field.
  6. Switch on Export existing responses if earlier submissions should sync, and keep the browser tab open while they copy.
  7. Click Connect with Notion.

Map the fields

Short answers, long answers and times land in Text properties. Date, Email, Link and Phone fields go to Date, Email, URL and Phone. Multiple choice and dropdown questions go to Select or Status, and number-type fields such as rating or linear scale go to Number. Signatures and file uploads land in Files & media.

Checkbox questions give you a choice. Map the whole question to one Multi-select and the picks show as tags, or map each option to its own Checkbox property. I'd use Multi-select for anything you'll filter by later, since one column stays readable as the options grow, and keep separate checkboxes for a short fixed list.

Tally's native integration doesn't support Person or Relation properties yet, and its help points to a workaround through Make for both. I'd leave those columns unmapped instead of adding a second service, and fill them when you triage each response, the same way you'd link any record in a client and project database built with relations.

Form questions on the left joined to matching Notion property types on the right, with Person and Relation shown as empty slots marked fill during triage
Map one question to one property of the matching type; Person and Relation wait for triage.

Fix UTC submission times

Tally sends submission times to integrations in UTC. To show local time, add a Formula property with dateAdd(prop("Date"), X, "hours"), using the name of your Date property and your offset from UTC as X. For US Eastern standard time, which is UTC-5, that's:

dateAdd(prop("Date"), -5, "hours")

A fixed number doesn't follow daylight saving time, so during those months the Eastern result runs an hour early. Change X to -4 for that stretch or accept the hour. If the formula misbehaves on empty or text dates, the fixes are in Notion formula date errors.

When submissions stop syncing, open the event log with the clock icon next to the connection. Tally also emails you the first time a sync starts failing, with the reason and a link to fix it. One form can feed several databases: set up the integration once per database.

Connect Typeform to Notion

Typeform's native integration fills a Notion database from each response, with three conditions to check before you build. It maps only to a Table database, so Board, List, Calendar, Gallery, Timeline and multiple-source databases aren't supported. Your Notion account needs admin access to install the Typeform bot. And the integration isn't available on Typeform accounts that host their data in the EU Data Center.

If you'd rather see responses on a board or calendar, keep the Table as Typeform's target and add those layouts as extra views, because a view changes the presentation, not the records.

Plan limits come next. Typeform's Free plan allows 10 responses a month and keeps File Upload and Signature questions for paid plans. Its list of paid-only integrations doesn't include Notion, and the full list of available integrations sits in the Connect panel of any typeform, so confirm Notion there before you build on Free.

  1. In the form's Connect panel, find Notion and click Connect.
  2. Click Authenticate to connect your Typeform account, then Accept.
  3. Click Authenticate for Notion, press Select pages, tick the pages the Typeform bot may use and click Allow access.
  4. Select the database from the dropdown.
  5. Map questions to properties with +Add another, then click Save mapping.

The integration then shows as live in the Connect panel, where a toggle switches it off and the three-dot menu edits or deletes it. Four catches are worth knowing before the first response:

If step 4 says the databases couldn't be loaded, open the database page in Notion, click Add connections, search for Typeform and click Confirm.

Send Google Forms responses to Notion

Google Forms reaches Notion through one of three routes, and the choice comes down to volume and how many accounts you want to maintain.

Zapier

Zapier's Google Forms and Notion page offers templates such as "Send new Google Forms responses to Notion databases", and you choose which question maps to which Notion field. Its FAQ says the integration primarily creates new pages, and that updating existing pages takes additional steps. If respondents can edit their answers, decide up front whether an edit should become a new row.

The Free plan costs $0 and includes 100 tasks a month with two-step Zaps, which covers a form with one Notion action per response. Professional starts at $19.99 a month and adds multi-step Zaps and webhooks. A new Zapier account starts with a 14-day Professional trial, no credit card required.

Make

Make's Notion app page labels the app verified, and its Google Forms and Notion page offers a template called "Create Notion database items from new Google Form responses". Its Notion actions include Create a Data Source Item. Make invites new users to sign up for a free account.

FormtoNotion

FormtoNotion is a Google Forms add-on. The vendor says it sends unlimited responses to a Notion table for $5 a month, with no sign-up beyond Google Forms and Notion. Those figures are the vendor's own.

I'd start with Zapier's two-step template, because it needs no code and the free plan covers a low-volume form. Move to Make or FormtoNotion only when the 100-task ceiling becomes the actual problem.

Jotform, forms.app and other builders

Jotform's Notion forms page tells you to connect the form through Zapier's Notion integration to send submissions into your databases, so the Zapier limits above apply. Jotform's own selling point there is a library of over 20,000 form templates.

forms.app takes a direct route. Its listing in Notion's connections gallery sends forms.app responses to a Notion database and can read, insert and update content shared with the connection. The same gallery says that connections not designated Made by Notion aren't supported or maintained by Notion.

For any other builder, check two places in order: a native Notion connection in the builder's own integration list, then a Zapier or Make template. When a partner connection breaks, Notion's connections help says it doesn't troubleshoot partner connections and sends you to that partner's support team.

Connect Contact Form 7 on WordPress

For a WordPress contact form, the free Add-On for Contact Form 7 to Notion on WordPress.org sends each submission to a database using an internal integration token, and it requires Contact Form 7 version 5.5.3 or later.

  1. In Notion, create the database and every column first. The token comes from an internal connection, and Notion opens its connection tools from the developer section in the sidebar once Developer Mode is on. Add that connection to the database page with ••• → More → Add connections.
  2. Copy the token: in Settings → Connections, open ••• next to the connection and choose Retrieve an internal API token.
  3. In WordPress, install and activate the add-on, go to Contact → Integration → Notion, paste the Notion Internal integration token and click Save Settings.
  4. Open your form. The plugin asks for at least an email field, and reminds you to include a consent field.
  5. On the form's Notion tab, check Add form submissions to your database, choose the database, map each field and click Save settings.

The mapping dropdown only shows columns compatible with the linked field, and the supported types are Title, Text, Number, URL, E-mail, Phone, Select, Multiple Select and Date. A column you just created can take a minute to appear, because the add-on caches Notion columns for 60 seconds. When file fields are mapped, the add-on sends the uploaded file URLs to Notion.

If requests fail with a 401 error, update the add-on first. Version 1.6.3 fixed Notion API requests that failed with 401 because the Authorization header lacked the required "Bearer" scheme.

Write rows from your own site with the Notion API

If your site already has a form and a server, it can create each row itself. Notion's create-a-page reference takes a POST to https://api.notion.com/v1/pages with three headers: Authorization: Bearer plus your connection's token, Content-Type: application/json, and Notion-Version, where the reference lists 2026-03-11 as the latest version. The body names the database's data source as the parent and sets each property in the shape the property reference gives:

{
  "parent": { "data_source_id": "YOUR_DATA_SOURCE_ID" },
  "properties": {
    "Name": { "title": [{ "type": "text", "text": { "content": "Jordan Lee" } }] },
    "Email": { "email": "jordan@example.com" },
    "Phone": { "phone_number": "+1 415 555 0123" },
    "Service": { "select": { "name": "Website audit" } },
    "Message": { "rich_text": [{ "type": "text", "text": { "content": "Looking for a quote on a site refresh." } }] },
    "Requested date": { "date": { "start": "2026-12-01" } }
  }
}

Property names in the request have to match your column names, and a date can carry a time and offset or a named time zone when the time of day matters. I'd keep the token in a server-side environment variable and never in browser JavaScript, because whoever holds it can write to every page the connection has been added to.

Two request options are worth setting deliberately. Set template to default to start each row from the database's default template; Notion only allows that when the data source has a default template configured in the app, which Notion database template defaults walks through. Setting the notifications mode to silent skips mention and Person-property notifications, but database automations the new page triggers still run, including Send notification to actions.

If the request returns 404 object_not_found or 403 restricted_resource, check first that the connection is added to the database page, then retry.

After the row lands

A connector's job ends when the row exists. Who owns the new response and what happens next is a database decision, and Notion's automations can carry part of it. According to Notion's database automations help, automations are available on paid plans, and Free plan users can create Slack notification automations but no other kinds. The Page added trigger fires when a new page is added to the database, and automations won't act on any pages whose access is restricted. Rows created through the API count too: the create-a-page reference says database automations a page write triggers still run, even with notifications set to silent.

Two more rules shape the follow-up. An automation can't trigger another automation, though a button action can trigger one. And an automation that hits an error is paused until you switch it back on from ••• → Automations, where the ••• next to it has an Active toggle. Defining the trigger, action and exception before you build is covered in Notion automations: define the trigger, action and exception.

None of the connector mapping lists above includes Relation, so linking each response to a client is a triage step. I'd add one view filtered to responses with an empty client relation, so nothing waits unassigned, and link each row to its client from there. If the responses are leads, the simple client workflow for freelancers shows where they go after triage.

When responses don't arrive

Form-to-Notion problems by symptom
SymptomLikely causeFix
Database missing from Tally's dropdownUntitled database, or its page isn't shared with TallyGive the database a title, check Settings & members → My connections → … → Access selected pages, then refresh the dropdown
Typeform says databases couldn't be loadedTypeform connection not added to the database pageOn the page, Add connections → Typeform → Confirm
Typeform stopped sending, 401 in the Webhook panelNotion token expired or was deletedDelete the integration on the form and set it up again
Typeform choice answers don't appearOption text differs between form and Select propertyMatch spelling, spaces and case on both sides
Contact Form 7 requests fail with 401Add-on older than the "Bearer" header fixUpdate to version 1.6.3 or later
Contact Form 7 column missing from the mapping listColumn type isn't supported or compatible, or the 60-second cacheCheck the nine supported types and wait a minute
Zapier rows stop mid-monthFree plan task limit reachedWait for the next usage period, or move to a paid plan with more tasks
API returns 404 or 403Connection not added to the database pageAdd connections on the page, then retry
Responses from before setup are missingTally copies older responses only through its export toggle, and Typeform doesn't backfillTally: switch on Export existing responses. Typeform: export to Google Sheets or CSV and move the rows with Zapier's bulk transfer
Person or Relation column stays emptyTally and the Contact Form 7 add-on don't support either, and Typeform's list has no RelationFill it during triage, or use Notion's own form for linked intake
Typeform won't map to a Board or Calendar databaseTypeform maps to Table databases onlyTarget a Table database and add other layouts as views
Submission times are hours offTally sends times in UTCAdd the dateAdd formula with your offset
Automation didn't fire on a new rowFree plan, restricted page, or the automation paused after an errorCheck the plan, the page's access, and the Active toggle
Third-party connection broken in NotionNotion doesn't troubleshoot partner connectionsContact the form tool's support team

The route I'd pick, and the first step

Pick the route with the fewest hops that can fill the property types your database needs. For most freelancers, that means Tally for a standalone form, Notion's own form when responses must link to clients, the Contact Form 7 add-on on WordPress, and Zapier's two-step template for Google Forms you'd rather not move. Typeform makes sense when you already pay for it, since 10 responses a month on Free is only enough for a trial run.

Before you touch any form tool, open the target database. Give it a title, add one property per question with the right type, and add the form tool's connection to that page. Then send one test response and check every column, including the Title.

Route the responses