Add, update, and fetch contacts from a Notion database by email
Go to WorkflowDescription
š Overview
Store, update, and retrieve contacts in a Notion database by sending a JSON payload to an n8n workflow. Email is used as the unique identifier ā no Notion page IDs required.
⨠What this workflow does
The workflow has three actions, controlled by a single action field in the payload:
Create** ā checks if a contact with that email already exists. Blocks the request if it does. Creates a new row in Notion if it does not.
Update** ā finds the contact by email automatically and updates their details. No Notion page ID needed.
Get** ā searches Notion by email and returns the contact's details.
š§ Requirements
An n8n instance (cloud or self-hosted)
A Notion account with an API integration token
A Notion database with these columns:
| Column | Notion type |
|--------|-------------|
| Name | Title |
| Email | Email |
| Phone | Phone number |
| Status | Select ā suggested options: Lead, Contacted, Qualified, Customer, Closed |
| Notes | Text |
āļø Setup
Create a Notion integration ā go to notion.so/my-integrations, create a new integration, and copy the token.
Add credentials in n8n ā go to Credentials ā New ā Notion API ā paste your token ā save.
Connect your database ā in Notion, open your database ā click ... top right ā Connections ā select your integration.
Select your database in n8n ā open each Notion node in the workflow and pick your database from the dropdown.
Test ā use the Manual Trigger with the sample payloads below to confirm each branch works.
Go live ā replace the Manual Trigger with a Webhook node. Send POST requests to the generated URL from any app or form.
š Sample payloads
Use these in the Manual Trigger to test each action:
Create a contact:
{
"action": "create",
"name": "Jane Doe",
"email": "[email protected]",
"phone": "+49 123 456 789",
"status": "Lead",
"notes": "Met at Berlin conference"
}
Update a contact:
{
"action": "update",
"email": "[email protected]",
"name": "Jane Doe",
"phone": "+49 123 456 789",
"status": "Customer",
"notes": "Signed contract on March 24"
}
Fetch a contact:
{
"action": "get",
"email": "[email protected]"
}
š„ Connect a frontend
This workflow works as a backend API. Any frontend can send POST requests to the Webhook URL and display the response ā no direct Notion API connection needed in the frontend.
What n8n handles so your frontend does not have to:
Checks for duplicate emails before creating a contact
Finds the correct Notion row by email before updating ā no page ID management
Returns structured JSON responses for success and error states
To wire up a frontend: replace the Manual Trigger with a Webhook node, point your form or dashboard at the Webhook URL, and read the JSON response to show feedback to the user. Works with React, Vue, plain HTML, or no-code tools like Webflow or Bubble.
š” Notes
status values are case-sensitive ā send Lead not lead.
Every contact must have a unique email address. The create action blocks duplicates.
The update action returns an error if the email is not found ā run create first.
The get action returns one contact per email lookup.