> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Notion as a destination

> Send your data from Nekt to Notion.

Notion is a workspace app that combines documents, wikis and databases. With this destination you can create and update **pages in a Notion database** directly from your Nekt tables — each row becomes a page, with its columns written into the database properties.

## 1. Add your Notion access

Before configuring the destination, create the integration Notion uses to authenticate:

1. Go to [notion.so/profile/integrations](https://www.notion.so/profile/integrations) and click **New integration**. Give it a name (e.g. "Nekt"), select the workspace, and make sure it has the **Insert content** and **Update content** capabilities.

2. Copy the **Internal Integration Token** (it starts with `ntn_`).

3. Open the Notion database that will receive the data, click the **`...`** menu at the top right, choose **Connections** and add your integration. **Without this step Notion cannot see the database** and every request fails with "Could not find database".

4. Copy the database URL from your browser — you can paste the whole URL into Nekt.

Then, in Nekt:

1. In the [Destinations](https://app.nekt.ai/destinations) tab, click on the "Add destination" button located on the top right of your screen. Then, select the Notion option from the list of connectors.

2. Click **Next** and you'll be prompted to add your access:

   * **Integration Token**: The internal integration token you copied above.
   * **Database ID or URL**: The Notion database that receives the records. Paste the database ID or the full database URL — the ID is extracted automatically.
   * **Match property**: Optional. The Notion property used to find an existing page to update (e.g. `Email` or an "External ID" property). Leave it empty to always create new pages.
   * **Create when no match**: When a match property is set and no page matches, create a new page. Turn it off to only update pages that already exist.
   * **Replace content on update**: When updating a page and the mapping writes to `page_content`, replace the page body. Off by default, so updates never delete content.
   * **Requests per second**: Maximum request pace. Notion allows an average of 3 requests per second per integration.
   * **Dry run**: Validation mode — performs the lookups and logs what would be created or updated, without writing anything to Notion.
   * **Enable partial success**: Whether the connector should continue trying to sync records after one fails.

3. Click **Next**.

## 2. Select your data to send

1. The next step is letting us know which data you want to send. Select the layer and then the desired table.

   > Tip: The table can be found more easily by typing its name.

2. Click **Next**.

## 3. Map your data fields

Configure how the columns from your source table should be mapped to the Notion database properties. Use the **property name exactly as it appears in Notion** (matching is case-insensitive). The connector reads the database schema from Notion, so each value is automatically converted to the format the property type expects — you never need to write Notion's typed JSON.

<AccordionGroup>
  <Accordion title="Notion property types">
    Below is what each Notion property type accepts as input. See the [Notion page property values reference](https://developers.notion.com/reference/page-property-values) for the full specification.

    | Notion type    | Accepted input                                                                    |
    | :------------- | :-------------------------------------------------------------------------------- |
    | `title`        | Any value, written as text. Every Notion database has exactly one title property. |
    | `rich_text`    | Any value, written as text.                                                       |
    | `number`       | A number or a numeric string.                                                     |
    | `select`       | Text — the option name. Notion creates the option if it does not exist yet.       |
    | `status`       | Text — the status name. Must already exist in Notion.                             |
    | `multi_select` | A list, or comma-separated text — "vip, brasil" becomes two options.              |
    | `date`         | An ISO 8601 date or date-time (e.g. "2026-07-24" or "2026-07-24T10:00:00Z").      |
    | `checkbox`     | A boolean, or `true`/`false`/`yes`/`no`/`1`/`0`/`sim`/`não`.                      |
    | `url`          | Text — the URL.                                                                   |
    | `email`        | Text — the email address.                                                         |
    | `phone_number` | Text — the phone number.                                                          |
    | `people`       | A Notion user ID, or a comma-separated list of IDs.                               |
    | `relation`     | A Notion page ID, or a comma-separated list of IDs.                               |
    | `files`        | An external URL, or a comma-separated list of URLs.                               |
  </Accordion>

  <Accordion title="Reserved mapping names">
    Two destination names address the page itself instead of a database property:

    | Name           | Description                                                                                 |
    | :------------- | :------------------------------------------------------------------------------------------ |
    | `page_id`      | The Notion page ID to update. When mapped, the record always **updates** that page.         |
    | `page_content` | Text written as the body of the page, as paragraph blocks. Blank lines separate paragraphs. |
  </Accordion>
</AccordionGroup>

Properties that Notion computes itself — formulas, rollups, unique IDs, created/last edited time and created/last edited by — cannot be written and are skipped with a warning. Empty values are never sent, so a blank column never overwrites data already in Notion.

### Creating vs. updating pages

* With no **Match property** and no `page_id` mapped, every record **creates** a new page.
* When `page_id` is mapped, the record **updates** that specific page.
* When a **Match property** is set, the connector looks the page up by that property: a match is updated, and a record with no match creates a new page (or is skipped when "Create when no match" is off). The match property must also be present in the mapping, so the connector knows which value to look up.

### Transforms

Each mapping rule can apply ordered value transforms before sending: `uppercase`, `lowercase`, `trim`, `round_int`, `to_string`, `yesno_to_bool`, `null_if:<x>` (drop a placeholder such as a dash) and `only_if:<x>` (keep the value only when it equals a given value).

## 4. Configure your Notion data destination

1. Describe your destination for easy identification within your organization. You can inform things like what data it brings, to which team it belongs, etc.

2. To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers), consider how frequently you need to have the data updated on the destination (every day, once a week, only at specific times, etc.).

3. Click **Done**.

### Check your new destination!

1. Once completed, you'll receive confirmation that your new destination is set up!

2. You can view your new destination on the [Destinations](https://app.nekt.ai/destinations) page. Now, for you to be able to see it on Notion, you have to wait for the pipeline to run. You can monitor it on the [Destinations](https://app.nekt.ai/destinations) page to see its execution and completion. If needed, manually trigger the pipeline by clicking on the refresh icon. Once executed, your data should be seen on Notion.

> If you encounter any issues, reach out to us via Slack, and we'll gladly assist you!
