Platform
Chatbot Builder Bulk Messaging Team Inbox Mini CRM API & Webhooks AI Integration WhatsApp Flows
Industries
E-commerce & D2C Real Estate Education Healthcare Finance & BFSI Logistics Hospitality Retail
Integrations
Learn
Learning Hub Help & Docs Connect Guides Automation Codex Blog Message Templates
Pricing Start Free Trial →
HomeConnect › Connect Notion to WhatsApp
Notion Integration Guide · Forms / Productivity

Connect Notion to WhatsApp

Create a Notion database entry for every WhatsApp lead, query existing records before sending a personalised message, and keep your Notion workspace in sync with WhatsApp conversations automatically.

Published 23 June 2026  ·  7 min read  ·  Forms / Productivity

Before following this guide, read the External API Request step foundation guide. It covers every field so this guide can focus on Notion-specific values.

You must share the database with your integration: token alone is not enough

A valid Notion token does not automatically grant access to your databases. You must explicitly open each database in Notion, click Share, search for your integration name, and click Invite. Without this step, every API call to that database returns 403, even with a perfectly valid token.

Notion-Version header is required on every request

Every Notion API call must include Notion-Version: 2025-09-03. Omitting it causes requests to fail or behave unexpectedly. This is the latest stable version as of June 2026.

Step 1: Create an integration and get the token

1
Go to notion.so/my-integrations and click New integration.
2
Choose Internal as the type. Give it a name like "WA.Expert". Click Submit.
3
On the next page, click Show next to the token and copy it. It starts with secret_. Store it securely.

Step 2: Share your database with the integration

1
Open the Notion database where WhatsApp leads should be added.
2
Click Share (top right of the page).
3
Search for your integration name ("WA.Expert") and click Invite. The integration now has access to this database.
4
Copy the Database ID from the URL. It is the 32-character string in the URL after your workspace name. Example: notion.so/myworkspace/abc123def456...
Official docs

Notion API: developers.notion.com

Step 3: Create a database entry from WhatsApp

Notion creates pages. A database entry is a page whose parent is the database. The request body must match the property types in your database schema.

External API Request Step · WA.Expert
Select Method
POST
Request URL
https://api.notion.com/v1/pages
Select Auth Type
No Auth (Bearer in header below)
Header Parameters
AuthorizationBearer YOUR_INTEGRATION_TOKEN
Notion-Version2025-09-03
Content-Typeapplication/json
Select Body Type
JSON
Body
{{"parent":{{"database_id":"YOUR_DATABASE_ID"}},"properties":{{"Name":{{"title":[{{"text":{{"content":"{{{{customer_name}}}}"}}}}]}},"Email":{{"email":"{{{{customer_email}}}}"}},"Phone":{{"phone_number":"{{{{customer_phone}}}}"}},"Source":{{"select":{{"name":"WhatsApp"}}}},"Status":{{"select":{{"name":"New"}}}}}}}}}
Choose Response Type
JSON
POST /v1/pages — full body and response
Body:
{{
  "parent": {{"database_id": "YOUR_DATABASE_ID"}},
  "properties": {{
    "Name":   {{"title":        [{{"text": {{"content": "Priya Sharma"}}}}]}},
    "Email":  {{"email":        "priya@example.com"}},
    "Phone":  {{"phone_number": "+919820000001"}},
    "Source": {{"select":       {{"name": "WhatsApp"}}}},
    "Status": {{"select":       {{"name": "New"}}}}
  }}
}}

Response (HTTP 200):
{{
  "object": "page",
  "id":     "page-uuid-here",
  "url":    "https://www.notion.so/page-uuid-here",
  "properties": {{ ... }}
}}

Map: id -> page_id, url -> notion_page_url

Property type reference

Each Notion property type uses a different JSON structure. The property name must match your database column name exactly.

Notion property typeJSON structure in propertiesExample value
Title (page name)name: {title: [{text: {content: VALUE}}]}"Name": {{"title": [{{"text": {{"content": "Priya"}}}}]}}
Rich textname: {rich_text: [{text: {content: VALUE}}]}"Notes": {{"rich_text": [{{"text": {{"content": "Enquired about demo"}}}}]}}
Emailname: {email: VALUE}"Email": {{"email": "priya@example.com"}}
Phone numbername: {phone_number: VALUE}"Phone": {{"phone_number": "+919820000001"}}
Select (single)name: {select: {name: OPTION}}"Status": {{"select": {{"name": "New"}}}}
Multi-selectname: {multi_select: [{name: OPT1}, {name: OPT2}]}"Tags": {{"multi_select": [{{"name": "WhatsApp"}}, {{"name": "India"}}]}}
Numbername: {number: VALUE}"Score": {{"number": 8}}
Datename: {date: {start: ISO_DATE}}"Date": {{"date": {{"start": "2026-06-23"}}}}
Checkboxname: {checkbox: BOOL}"Opted In": {{"checkbox": true}}
URLname: {url: VALUE}"Website": {{"url": "https://example.com"}}

Property names in the JSON body must match your Notion database column names exactly, including capitalisation and spacing.

Title is always required and always has this complex structure

Every Notion database page must have a title property (the database's Name column or whatever you renamed it). The title uses a nested array structure: {{title: [{{text: {{content: 'Your Value'}}}}]}}. This is more verbose than other property types but is mandatory.

Step 4: Query the database for existing records

Before creating a duplicate, query the database to check if the contact already exists.

External API Request Step · WA.Expert
Select Method
POST
Request URL
https://api.notion.com/v1/databases/{{{{DATABASE_ID}}}}/query
Select Auth Type
No Auth (Bearer in header below)
Header Parameters
AuthorizationBearer YOUR_INTEGRATION_TOKEN
Notion-Version2025-09-03
Content-Typeapplication/json
Select Body Type
JSON
Body
{{"filter":{{"property":"Email","email":{{"equals":"{{{{customer_email}}}}"}}}},"page_size":1}}
Choose Response Type
JSON
POST /v1/databases/{id}/query — body and response
Body:
{{
  "filter": {{
    "property": "Email",
    "email": {{"equals": "priya@example.com"}}
  }},
  "page_size": 1
}}

Response:
{{
  "results": [
    {{
      "id":  "page-uuid-here",
      "url": "https://www.notion.so/...",
      "properties": {{
        "Name":   {{"title": [{{"plain_text": "Priya Sharma"}}]}},
        "Status": {{"select": {{"name": "Contacted"}}}}
      }}
    }}
  ],
  "has_more": false
}}

results is empty -> contact not found -> create new entry
results has items -> map results[0].id, results[0].properties.*

Worked example: log WhatsApp lead to Notion

Automation flow — WhatsApp opt-in to Notion database
Trigger: Customer messages 'DEMO' on WhatsApp.

Bot collects:
  {{customer_name}}  = Priya Sharma
  {{customer_email}} = priya@example.com
  {{customer_phone}} = +919820000001

Step 1 — Check if already exists (POST /query):
POST https://api.notion.com/v1/databases/DB_ID/query
Body: {{filter: {{property:"Email", email: {{equals:"priya@example.com"}}}}}}

Response: results = [] (not found)

Conditions: if results not empty -> send existing-contact reply
            if results empty     -> run Step 2

Step 2 — Create entry (POST /pages):
POST https://api.notion.com/v1/pages
Body: {{parent: {{database_id: 'DB_ID'}},
        properties: {{
          Name:   {{title: [{{text: {{content: "Priya Sharma"}}}}]}},
          Email:  {{email: "priya@example.com"}},
          Phone:  {{phone_number: "+919820000001"}},
          Source: {{select: {{name: "WhatsApp"}}}},
          Status: {{select: {{name: "New"}}}}
        }}}}

Response: {{id: 'page-uuid', url: 'https://notion.so/...'}}

Bot replies:
'Thanks Priya! We have added you to our demo waitlist.
Our team will reach you on this number within 24 hours.'

Troubleshooting

SymptomLikely causeFix
403 on every requestDatabase not shared with the integrationOpen the Notion database, click Share, search for your integration name, and click Invite. Token alone is not enough.
400 on page creationWrong property type structureCheck the property type reference table. Title needs {title: [{text: {content: VALUE}}]}. Email needs {email: VALUE}. Match the structure exactly.
Property not savedColumn name mismatchThe property name in the JSON body must match the Notion column name exactly, including capitalisation and spaces. Check the column names in your database.
Notion-Version errorMissing version headerAdd Notion-Version: 2025-09-03 to every request. Without this header, requests can fail or return unexpected results.
results empty on queryEmail not in database or filter wrongTest the filter with a known email first. Check that the property name 'Email' matches your column name exactly in the filter body.
429 Too Many RequestsExceeding 3 requests/second rate limitNotion's rate limit is 3 requests per second. Add a brief pause between chained API calls (query then create) in your automation flow.

Common questions

How do I get a Notion API token?
+
notion.so/my-integrations > New integration > Internal > Submit. Copy the token starting with secret_ from the integration page.
Why 403 with a valid token?
+
The database must be explicitly shared with the integration via the Share menu. Token alone is not enough. Open the database, click Share, find your integration, click Invite.
Is the Notion-Version header required?
+
Yes, on every request. Use Notion-Version: 2025-09-03. Without it requests can fail.
Why are properties so verbose?
+
Notion uses a typed property system. Title: {title: [{text: {content: value}}]}. Email: {email: value}. Select: {select: {name: option}}. See the type reference table.
How do I find my database ID?
+
It is in the URL when viewing the database: the 32-character string after your workspace name. Use it with or without hyphens.
Does this incur extra WA.Expert charges?
+
One automation action per External API Request call. Included on Complete plan. Starter: from Rs. 49 per 1,000 actions. Notion API is free within 3 req/s.

Connect Airtable to WhatsApp

Airtable REST API: PAT auth, create and search records by field.

Read guide →

Connect Google Sheets to WhatsApp

Log WhatsApp data to Google Sheets via Apps Script webhook.

Read guide →

External API Request Step

Master every field in WA.Expert's HTTP action step.

Read foundation guide →

Connect Notion to WhatsApp today

Free trial, no credit card. If you get stuck, we answer live on WhatsApp.

Start Free Trial → Book a Demo
1