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

# Notion

> Add LinkedIn contacts who reply to a Notion database with the Notion API, and update their stage when they book.

> [!NOTE]
>
> **Pro plan.** Notion works through a connection and HTTP steps, which are part of Pro and Agency (and the free trial). Anything you already have keeps working on every plan. See [Plans and billing](/help/account/billing.md).

When a contact replies, a **Webhook / HTTP** step creates a page in your Notion pipeline database. When they book a meeting, another step updates the page's stage.

> [!NOTE]
>
> **How it connects:** Notion's API with an internal integration token. See Notion's [create a page](https://developers.notion.com/reference/post-page) docs and its [2025-09-03 upgrade guide](https://developers.notion.com/guides/get-started/upgrade-guide-2025-09-03). Requests and answers follow Notion's docs.

## Before you start

* **An internal integration:** in Notion, open **Settings > Connections > Develop or manage integrations**, create one and copy its secret.
* **Share the database with it:** on the database, open the **...** menu, **Connections**, and add your integration.
* **The database id:** the long id in the database's link.

## 1. Connect Notion

In Kerux, open **Integrations > Connections**, click **Connect** on **Custom API** (under **Developers**): **How it signs in:** **Bearer token**, paste the secret; **Base URL:** `https://api.notion.com`. Click **Save**.

## 2. Create the page when someone replies

A contact who replies leaves the campaign (the **When the contact replies** box). In that box, add **Send to another campaign** and pick a short "Replied: to Notion" campaign. Its **Webhook / HTTP** step, named `notion`:

```json theme={null}
{
  "method": "POST",
  "url": "/v1/pages",
  "headers": { "Notion-Version": "2022-06-28" },
  "bodyType": "json",
  "body": {
    "parent": { "type": "database_id", "database_id": "YOUR_DATABASE_ID" },
    "properties": {
      "Name": { "title": [{ "text": { "content": "{{contact.full_name}}" } }] }
    }
  }
}
```

`Name` is your database's title property. Other properties use Notion's property shapes (rich text, select, URL), as its docs show. With `Notion-Version` 2025-09-03 or later, Notion uses data sources: the parent becomes `{ "type": "data_source_id", "data_source_id": "..." }` (Notion's upgrade guide). Send the version that matches the parent you use.

Notion answers with the page, including its `id` and `url`: `{{steps.notion.response.body.id}}`.

## 3. Update the stage when a meeting is booked

Save the page id on the contact with an **Update contact** step (a custom field such as **Notion page id**). A small campaign started by the **Meeting booked** Kerux event then runs:

```json theme={null}
{
  "method": "PATCH",
  "url": "/v1/pages/{{contact.custom.notion_page_id}}",
  "headers": { "Notion-Version": "2022-06-28" },
  "bodyType": "json",
  "body": { "properties": { "Stage": { "select": { "name": "Meeting" } } } }
}
```

## Test with one contact

In the follow-up campaign's **Builder**, click **Test** to open **Test on one contact** and open the page from the `url` in Notion's answer.

## Common errors

> [accordion] 404 object\_not\_found
>
> The database isn't shared with your integration. Add it under the database's **Connections**.

> [accordion] 400 validation\_error
>
> A property name or shape doesn't match the database (names are case sensitive). Notion's message names the property.

Related: [Webhook steps](/help/integrations/webhook-steps.md), [Airtable](/help/integration-guides/airtable.md), [Kerux events](/help/campaigns/kerux-triggers.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.