Skip to main content
Lifetime license included with every purchase
n8n workflowsNotion automationdatabase syncproductivity

How to Automate Notion Workflows with n8n (Databases, Pages, and Syncs)

Automate Notion database entries, page creation, and cross-tool syncs with n8n. Build reliable Notion workflows without manual copy-paste or glue scripts.

Nn8n Marketplace Team·May 16, 2026·9 min read

Notion Is Your Team's Source of Truth. n8n Keeps It Accurate Without the Manual Work.

Notion is where teams track projects, log decisions, manage content pipelines, and maintain wikis. The problem is that keeping Notion up to date requires someone to copy data in from other systems — manually, repeatedly, error-prone.

n8n closes that gap. Instead of someone copy-pasting form responses into a Notion database or manually updating a project status when a GitHub PR merges, you wire the trigger once and the data flows automatically.

This post covers the most practical Notion automation patterns: auto-creating pages, querying and updating database rows, and syncing Notion with external tools. Every pattern is buildable with n8n's native Notion node — no code required for most of it.

What You Can Automate

Notion automation with n8n handles the full lifecycle of database management:

  • Auto-create a Notion page for every new form submission (Typeform, Tally, Google Forms)
  • Log new sales deals into a Notion CRM database when they are created in HubSpot or Pipedrive
  • Update a Notion task's status to "Done" when the linked GitHub issue closes
  • Create meeting notes pages with a template structure after each calendar event
  • Append weekly analytics data (signups, revenue, churn) to a Notion dashboard database
  • Sync new Notion database rows to Airtable, Google Sheets, or your internal database
  • Auto-assign a Notion page to the right owner based on a category or tag field
  • Archive Notion pages older than 90 days by moving them to an archive database

The Notion Automation Pipeline

Every Notion workflow in n8n follows this structure:

Trigger → Fetch / Enrich → Map Fields → Notion Write → Confirm / Notify

The trigger fires when something happens externally. Fetch and enrich gathers any additional context (user name, deal value, related record IDs). Map fields translates external field names into Notion property names. The Notion write creates, updates, or queries the target database. Confirm or notify closes the loop — sending a Slack message, updating a related record, or triggering a downstream workflow.

Step-by-Step Breakdown

1. Collect

Pick your trigger based on where the data originates.

Form submissions: Use a Webhook node and point Typeform, Tally, or any other form tool at the URL. The submission body arrives as JSON — name, email, answers — ready to map into Notion.

External CRM or issue tracker events: Use a Webhook node for tools that support outgoing webhooks (GitHub, Linear, Intercom). For polling-based tools (Salesforce, most BI dashboards), use a Schedule Trigger + HTTP Request to fetch new records since the last run timestamp.

Recurring data: Use a Schedule Trigger to run daily or weekly. Combine with HTTP Request nodes that call analytics APIs — Mixpanel, PostHog, Stripe — and aggregate the numbers before writing to Notion.

2. Process / Segment

Raw data from external sources rarely maps cleanly to Notion. Two nodes do most of the work:

IF node — filter out records that don't need to go to Notion. Only create a page if the deal stage is Qualified. Only log the metric if the value changed since yesterday. Skip duplicates by querying Notion first and branching based on whether a record already exists.

Code node — handle field transformations that can't be done with expressions alone: join a first name and last name, convert a Unix timestamp to ISO 8601, build a relation array from a list of IDs.

Check for duplicates before writing

Before creating a Notion database row, run a 'Get Many' query filtered on a unique field (email, deal ID, GitHub issue number). If the result count is greater than zero, branch to an 'Update' instead of a 'Create'. This prevents duplicate rows accumulating in your database over time.

3. Route

Not every event belongs in the same Notion database. Use a Switch node to branch:

  • Bug reports → Bug Tracker database
  • Feature requests → Roadmap database
  • Sales leads → CRM database

Map the routing condition to a field in the incoming payload — for example, a type field on a webhook body or a label on a GitHub issue. The Switch node sends each item to the correct Notion node with the right database ID already set.

4. Act

The Notion node's Create Page and Create Database Item actions are the main write operations. Key things to get right:

  • Database ID: copy it from the Notion URL. It's the 32-character hex string after the last / and before any ?.
  • Property mapping: match the property name exactly as it appears in Notion (case-sensitive). Use the right type — title, rich_text, select, date, checkbox, relation.
  • Relation properties: pass an array of page IDs, not names. If you need to look up the related page ID first, add a Notion 'Get Many' query before the write step.
Use expressions for dynamic field values

Every Notion property field accepts n8n expressions. To set the Title property from an incoming webhook field named subject, use ={{ $json.subject }}. For dates, use ={{ new Date($json.created_at).toISOString() }} to ensure ISO 8601 format that Notion expects.

5. Follow Up

After writing to Notion, close the loop:

  • Send a Slack notification with a link to the new Notion page (={{ $json.url }} from the Notion node output).
  • Update the source record — set a notion_synced: true field in your CRM or mark the GitHub issue with a label so you know the sync ran.
  • Trigger a downstream workflow via HTTP Request to a second n8n webhook if additional processing is needed asynchronously.

Implementation Patterns

Pattern 1: Form-to-Notion CRM

New contact form submissions create a qualified leads database row in Notion, then ping the sales channel in Slack.

Webhook (form POST)
  → IF: email domain not in [gmail, yahoo, hotmail]
  → Notion: Create Database Item (Leads DB)
      Title    = {{ $json.name }}
      Email    = {{ $json.email }}
      Company  = {{ $json.company }}
      Source   = "Website Form"
      Status   = "New"
  → Slack: Post to #sales
      "New lead: {{ $json.name }} from {{ $json.company }}"

Filter out personal email domains up front so the sales team only sees business contacts. The Notion row becomes the canonical record — everything downstream references the Notion page URL.

Pattern 2: GitHub Issues → Notion Bug Tracker

When a GitHub issue is opened with the label bug, n8n creates a matching row in a Notion bug tracker database and updates it automatically when the issue closes.

Webhook (GitHub issue event)
  → IF: action == "opened" AND labels includes "bug"
  → Notion: Create Database Item (Bugs DB)
      Title    = {{ $json.issue.title }}
      GitHub # = {{ $json.issue.number }}
      Priority = {{ $json.issue.labels[1].name }}  (e.g. "P1")
      Status   = "Open"
      URL      = {{ $json.issue.html_url }}

  [Second workflow]
  Webhook (GitHub issue closed event)
  → Notion: Get Many (Bugs DB, filter: "GitHub #" == issue.number)
  → Notion: Update Page (set Status = "Closed")

The second workflow handles the close event separately. Both use the GitHub issue number as the link key so there's no ambiguity about which Notion row to update.

Pattern 3: Weekly Metrics Dashboard

A scheduled workflow fetches key metrics from multiple APIs every Monday morning and appends a new row to a Notion metrics database.

Schedule Trigger (Monday 8:00 AM)
  → HTTP Request: Stripe → fetch MRR, new customers
  → HTTP Request: PostHog → fetch WAU, activation rate
  → Code: merge both responses into a single metrics object
  → Notion: Create Database Item (Weekly Metrics DB)
      Week     = {{ new Date().toISOString().slice(0,10) }}
      MRR      = {{ $json.mrr }}
      New Cust = {{ $json.new_customers }}
      WAU      = {{ $json.wau }}
      Activated = {{ $json.activation_rate }}

The result is a Notion database you can chart natively with Notion's built-in chart view, or export to any BI tool. No spreadsheet formulas to maintain, no manual copy-paste on Monday mornings.

Use a Code node to merge multi-source data

When pulling from two or more APIs in the same workflow, each HTTP Request node returns its own item in the n8n data stream. Use a Code node with return [{ json: { ...items[0].json, ...items[1].json } }] to merge them into a single object before writing to Notion.

n8n Nodes You'll Use Most

NodePurpose
NotionCreate/update pages and database rows, query with filters
WebhookReceive events from forms, GitHub, Linear, Typeform
Schedule TriggerRun recurring syncs (daily, weekly)
HTTP RequestFetch data from APIs not covered by native n8n nodes
IFFilter records — skip duplicates, gate on field values
SwitchRoute to different Notion databases based on record type
CodeMerge multi-source data, transform field formats
SlackNotify team after a Notion write completes

Getting Started

  1. Create a Notion integration at notion.so/my-integrations. Give it read and write access. Copy the integration token.
  2. Share your target databases with the integration. In each Notion database, click Share → Invite → select your integration. Without this step, the Notion node returns a 404.
  3. Add the credential in n8n: Settings → Credentials → New → Notion API → paste the integration token.
  4. Get the database ID: open the Notion database in a browser. The URL format is https://notion.so/<workspace>/<database-id>?v=<view-id>. Copy the 32-character hex string.
  5. Build the trigger: start with a Webhook node for event-driven syncs, or a Schedule Trigger for recurring jobs.
  6. Map one property at a time: add a Notion node, select your database, and map a single field first. Run a test to confirm the row appears in Notion before adding more fields.
  7. Add the duplicate check: before going live, add the 'Get Many' → IF → branch pattern so the workflow updates existing rows instead of creating duplicates.

For a ready-to-deploy starting point, the Data Entry Hub template handles multi-source data collection and routing, and the Smart Todo List template shows how to sync task status across tools in real time.


If you're pairing Notion with AI-generated content — summaries, meeting notes, auto-classification — see How to Build AI-Powered Automations with n8n for the LLM integration patterns that plug directly into these Notion workflows.

For managing the broader project pipeline that feeds Notion, How to Automate Project Management with n8n covers GitHub, Jira, and Asana integrations that pair well with the Notion patterns above.

Browse Notion-ready n8n templates
FAQ

Common questions

Can n8n create Notion pages and database entries automatically?
Yes. n8n's Notion node supports creating pages, updating database rows, querying filters, and appending blocks — all without any manual input. You can trigger page creation from a form submission, a webhook, a schedule, or any other event in your stack. Fields map directly: text, select, date, relation, and checkbox properties all work.
How do I sync another tool with a Notion database using n8n?
Use a trigger node for the source system (e.g., a Webhook for Typeform, a Schedule + HTTP Request for a CRM API), then map the fields to Notion's 'Create Database Item' action. To keep records in sync bidirectionally, run two workflows: one that watches the source and writes to Notion, and one that polls Notion for recent changes and pushes them back. A timestamp filter on both sides prevents infinite loops.
What is the best way to query a Notion database in n8n?
Use the Notion node's 'Get Many' operation with a filter object. You can filter by any property type — text contains, select equals, date is after — and sort by any column. The node returns the full page object for each matching row, so downstream nodes can read properties using expressions like `={{ $json.properties.Status.select.name }}`.
Stop reading. Start running.

Get the workflow templates this guide is built on

Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.