> For the complete documentation index, see [llms.txt](https://kb.craftformswp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kb.craftformswp.com/documentation/form-building/general-settings/integrations/notion.md).

# Notion

CraftForms can add every form submission as a new page in a Notion database. A job application becomes a row in your hiring board with the CV attached, a quote request becomes a card in your sales pipeline, a booking lands in your bookings table with its dates. Each form answer goes into the Notion property you choose: text, dates, select options, numbers, checkboxes, email, phone, links and files.

It uses your own Notion integration: you create it in Notion, paste its secret into CraftForms once, and share the databases you want to fill with it.

![The Notion action with a database chosen and form fields mapped to Notion properties](https://97821998-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FM2yV1foUgoGHBC66VBDw%2Fuploads%2FE84H8Lprrm1q4Qo5LZph%2Fnotion--notion-action-mapping.jpg?alt=media)

### What you need

* **CraftForms PRO**, version 2.3 or later. In the free version the Notion card shows **PRO** and can't be connected.
* A Notion workspace where you can create integrations (workspace owners can; members may need an owner to do it).
* A Notion database with the columns (properties) you want to fill.
* An administrator or shop manager account to set up the connection.

### Step 1: Create a Notion integration

1. In Notion, go to **Settings → Connections → Develop or manage integrations**, then **New integration**.
2. Give it a name (e.g. "Website forms"), pick the workspace, and keep the type **Internal**.
3. Save it and copy the **Internal integration secret** (it starts with `ntn_`). Treat it like a password.

### Step 2: Share your database with the integration

Notion integrations see nothing until you share a page or database with them.

1. Open the database in Notion.
2. Click **•••** at the top right, then **Connections**, and add your integration.

Repeat this for every database you want CraftForms to fill. Only shared databases appear in CraftForms.

### Step 3: Connect Notion to CraftForms

1. Go to **CraftForms → Settings** and open the **Integrations** tab.
2. On the **Notion** card, click **Connect**.
3. **Name**: e.g. "Team Notion".
4. **Internal integration secret**: paste the secret.
5. Click **Save & test**. CraftForms checks it and shows **Connected to "Your workspace name".** The connection appears in the table as **Verified**.

![The Connect Notion dialog with Name and Internal integration secret](https://97821998-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FM2yV1foUgoGHBC66VBDw%2Fuploads%2FisU3EHFdMmreKGqxfjcw%2Fnotion--connect-notion.jpg?alt=media)

The secret is encrypted in your database and never shown again in full. Form editors can pick the connection but can't see the secret.

### Step 4: Add the Notion action to a form

1. Open your form (**CraftForms → Forms → Edit**).
2. In the right sidebar, open **Submit Actions** and click **Add Action**.
3. Type *notion* in the search box (or look under **Data & Spreadsheets**) and choose **Notion**.
4. Choose the **Connection** and the **Database**. The **Field mapping** then loads that database's properties.
5. Map your fields (below), click **Save**, and save the form.

| Setting                                                    | What it does                                                                                                                                                                                         |
| ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Connection**                                             | The Notion integration to use.                                                                                                                                                                       |
| **Database**                                               | The database to add pages to. Only databases shared with your integration are listed; click the reload icon after sharing a new one.                                                                 |
| **Field mapping**                                          | Which form answer goes into which Notion property. The database's title property (e.g. **Name** or **Task name**) is marked **Required**.                                                            |
| **Page content**                                           | Optional text inside the new page, e.g. `{{all_fields.text}}` for every answer. A blank line starts a new paragraph.                                                                                 |
| **Run after the visitor's response is sent (recommended)** | On by default, so the visitor doesn't wait for Notion.                                                                                                                                               |
| **Required (abort on failure)**                            | Off by default. When on, a failed page stops the remaining actions and shows the error to the visitor.                                                                                               |
| **Context prefix**                                         | Later actions can use the new page: `{{notion.url}}` is its link and `{{notion.id}}` its ID.                                                                                                         |
| **Run only if**                                            | Add the page only when a choice field has a certain value. See [Run only if](/documentation/form-building/create-form/form-settings-post-context/submit-actions/run-only-if-conditional-actions.md). |

#### Field mapping

Each row sends one value to one Notion property. On the right is the property; on the left, where the value comes from:

* **Form field**: one of your form's fields.
* **Static**: the same text every time, e.g. "Not started" for a **Status** property, so every new page starts in the right column of your board.
* **Merge tag**: text with tags, e.g. `{{email.first_name}} {{email.last_name}}` for a title.

Use **＋ Map another field** to add a property. Only mapped properties are sent, and an empty answer is skipped.

#### How answers are written

CraftForms reads each property's type from Notion when it sends, and writes the value to fit:

| Notion property               | What it gets                                                                                                                                         |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Title**, **Text**           | The answer as text. Long text is split into Notion's 2,000-character pieces.                                                                         |
| **Number**                    | A number. `12,5` is read as 12.5. Text that isn't a number is skipped.                                                                               |
| **Checkbox**                  | Ticked by any answer except an empty one or "No", "false", "off" or "0". A consent checkbox or a Yes/No question both work.                          |
| **Select**                    | The option with that name. Notion creates it if it doesn't exist yet.                                                                                |
| **Status**                    | The status with that name. It must already exist in Notion (e.g. *Not started*, *In progress*, *Done*), or Notion refuses the page.                  |
| **Multi-select**              | One option per chosen checkbox (or per comma-separated value).                                                                                       |
| **Date**                      | A date, or a date range: a booking's check-in → check-out, or a date range field, fills the start and end. A time is kept, in your site's time zone. |
| **Email**, **Phone**, **URL** | The answer as it is.                                                                                                                                 |
| **Files & media**             | The uploaded files, sent to Notion itself (up to 20 MB each). Your upload links stay private: Notion gets a copy, not a link to your site.           |

**People**, **Relation** and read-only properties (formula, rollup, created time…) aren't offered: a form can't fill them.

### In a flow

With **Flows** (PRO), Notion is also a flow step. A useful pattern: **Notion** first, then **Telegram** or **Send Email** with `{{notion.url}}` in the message, so whoever handles the request opens the Notion page in one tap.

### Check what was sent

Each page shows up in **Settings → Integrations → Activity** with the properties that were written. When a value couldn't be written, the row says which: *Page added. Not written (no such property or nothing to send): …*.

| Message                                                                                           | What to do                                                                                               |
| ------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| *Notion can't see this database. Open it in Notion → ••• → Connections and add your integration.* | The database isn't shared with the integration (or was un-shared). Do step 2 again.                      |
| *Notion refused the integration secret. Paste it again under Settings → Integrations.*            | The secret was regenerated or the integration deleted. Edit the connection and paste the current secret. |
| *Notion returned HTTP 400: Invalid status option…*                                                | A **Status** value doesn't match a status in Notion. Use the exact name, e.g. *Not started*.             |
| *Choose a Notion database in the action.*                                                         | No database is selected in the action.                                                                   |

### Good to know

* **Renamed a column in Notion?** The mapping uses property names. Open the action, click the reload icon next to **Field mapping**, and map the renamed property again.
* **New column not in the list?** Click the reload icon next to **Field mapping**. Notion's columns are remembered for about 10 minutes.
* **Several databases.** Add one Notion action per database, each with its own mapping, or use **Run only if** to send different requests to different boards.
* **Privacy.** Answers and uploaded files are copied into Notion. Mention it in your privacy notice, and remember that deleting a submission in WordPress doesn't delete its Notion page.

### FAQ

**Is the Notion integration free?** No, it's part of CraftForms PRO. Telegram and the email-marketing integrations are free.

**Do I need Zapier or Make?** No. CraftForms talks to Notion's API directly with your own integration.

**Can uploaded files go to Notion?** Yes. Map a file upload field to a **Files & media** property. Each file up to 20 MB is uploaded to Notion.

**Can CraftForms update an existing Notion page?** No. Every submission adds a new page.
