🔨 LearnForge
No-Code & AI

n8n + Notion: How to Build a Full CRM Automation for Free

HubSpot Starter costs $20/month for one user and locks most automation behind the $890/month Professional plan. Pipedrive Essential is $12.50 per user. For teams that already live in Notion, the math for a dedicated CRM tool often doesn't hold up — especially when n8n can automate everything HubSpot does natively, using a Notion database that costs nothing. This guide covers the complete setup: the Notion database schema, 6 automation workflows, and every configuration detail that makes the system actually work in practice.

📅 August 4, 2026 ⏱️ 22 min read ✍️ LearnForge Team 🏷️ n8n · Notion · CRM
n8n and Notion CRM automation — build a full free CRM with 6 automated workflows

What this actually costs vs paid CRMs

$0
Notion free plan (unlimited pages)
$0
Self-hosted n8n (unlimited executions)
$6–12
VPS server per month (optional)
$890
HubSpot Professional/month (for full automation)

The Notion free plan supports unlimited database pages, all property types (Select, Date, Relation, Formula, Rollup), and full API access. Self-hosted n8n is completely free. The only real cost is a VPS if you don't already have one — or $20/month for n8n Cloud Starter if you prefer managed hosting.

What this guide covers

  1. The Notion CRM database schema (exact structure)
  2. Workflow 1: Lead capture from any source → Notion row
  3. Workflow 2: Automatic lead enrichment (company data)
  4. Workflow 3: Rep assignment + Slack alert
  5. Workflow 4: Follow-up reminder (3 days no contact)
  6. Workflow 5: Deal stage change → log + team notification
  7. Workflow 6: Deal Won → onboarding email + archive
  8. Connecting n8n to Notion (credential setup)
  9. FAQ

The Notion CRM database schema

Most Notion CRM guides skip the database structure entirely — they show you how to connect a webhook and create a page, but don't tell you which properties to create or why. The property types matter a lot: an n8n workflow can filter Notion database pages by a Select or Date property, but can't usefully filter by a plain Text field. Build the schema right first and the automations become straightforward to configure.

The system uses two linked databases: Contacts and Deals. One contact can have multiple deals. This is the same data model used by HubSpot and Pipedrive — it's the right separation for any pipeline where the same company may buy from you more than once, or where you're tracking multiple products sold to the same contact.

Contacts database

Create a new full-page database in Notion. Add these properties:

Property name Type Notes
NameTitleDefault — first and last name
EmailEmailUsed for deduplication and sending
CompanyTextCompany name, filled by enrichment
PhonePhoneOptional
SourceSelectWebsite Form / Referral / Cold Outreach / LinkedIn / Event
StatusSelectNew / Contacted / Qualified / Proposal / Won / Lost
Assigned ToPersonYour Notion workspace member
Last ContactDateUpdated by n8n after every interaction
Next Follow-upDaten8n checks this daily for reminders
NotesTextFree notes, appended by automations
DealsRelationLinks to Deals database (configure after creating Deals)
Total Deal ValueRollupRolls up Value from linked Deals (Sum)

Deals database

Create a second full-page database. Add these properties:

Property name Type Notes
Deal NameTitlee.g. "Acme Corp — Enterprise Plan"
ContactRelationLinks to Contacts database
ValueNumberDeal value in USD (or your currency)
StageSelectProspecting / Demo / Proposal / Negotiation / Won / Lost
Close DateDateExpected or actual close date
OwnerPersonDeal owner (may differ from contact's Assigned To)
ProbabilityNumber% — for weighted pipeline view
Lost ReasonSelectPrice / Competitor / Timing / No Budget / No Response
CreatedCreated timeAuto-filled by Notion

After creating both databases: Go to the Contacts database, open the Deals relation property, and link it to your Deals database. Then in the Contacts database add a Rollup property — select the Deals relation, the Value field, and Sum as the calculation. You now see total deal value per contact automatically. This relation is what lets the workflows link a new deal to an existing contact by the contact's Notion page ID.

Connecting n8n to Notion

Go to notion.so/my-integrations, click "New integration", give it a name (e.g. "n8n CRM"), and copy the Internal Integration Token. This token doesn't expire and gives n8n read/write access to any database you explicitly share it with.

Open each of your two databases in Notion, click the ••• menu at the top right, go to Connections, and invite your n8n integration. You must do this for every database the workflows will touch — Notion doesn't give integrations workspace-wide access by default.

In n8n, go to Credentials → New → Notion API → paste the token. One credential covers all 6 workflows. You'll also need each database's ID — it's the 32-character string in the database URL between the last slash and the question mark: notion.so/workspace/abc123...?v=...

Build n8n + Notion Workflows — Step by Step

The LearnForge AI Apps course covers n8n from first workflow to full production systems, including database automation, AI agents, and real-world integrations. Module 1 is completely free.

Start Free Module →

The 6 automations

1

Lead Capture → Notion Contact Row (any source)

Webhook trigger — works with Typeform, Webflow, WordPress, custom HTML, Calendly

The entry point of the whole system. Whenever a new lead comes in from any source, n8n creates a contact row in the Notion database automatically. The workflow doesn't care where the lead came from — you use a Webhook trigger node as the universal receiver and configure each form to POST to that URL, or use native n8n nodes for Typeform and Calendly.

The first node after the webhook is a deduplication check. The Notion node with "Query Database" action filters the Contacts database by the email property: filter: { property: "Email", email: { equals: "{{ $json.email }}" } }. If the query returns a result, the contact already exists — the IF node branches to an "Update existing" path rather than creating a duplicate. Without this check, every second form submission from the same person creates a new row, and your CRM becomes noise within a week.

The "Create new" path uses the Notion "Create Page" action with the database ID of your Contacts database. Map the form fields to the Notion properties: Name → title, Email → email property, Source → select property (the value must exactly match one of your Select options — case-sensitive). Set Status to "New" as the default. The page ID returned from this step is what downstream workflows use to link deals and update fields.

Webhook Trigger Notion Query (check duplicate) IF (exists?) Notion Create Page → or → Notion Update Page
Zero manual data entry No coding needed Setup: ~20 min
2

Automatic Lead Enrichment — Company Data Without Asking

Runs immediately after Workflow 1 creates the contact

Your lead submitted a form with their name, email, and maybe a message. You now need to know: what does their company do, how big is it, are they a good fit? Without enrichment, your rep has to research this manually before making contact — typically 5–10 minutes per lead that adds up fast. This workflow does it automatically in the 30 seconds between submission and the rep seeing the Slack notification.

The workflow can run in two modes depending on your budget. Free mode: Use an HTTP Request node to call the Clearbit Discovery API or Hunter.io's domain search endpoint — both have free tiers (100 requests/month on Clearbit, 25/month on Hunter). Pass the email domain (everything after the @) as the query parameter. The response includes company name, industry, employee count, LinkedIn URL, and approximate revenue. Paid mode: Apollo.io ($49/month) or RocketReach ($80/month) return much richer data including direct phone numbers and technology stack.

After the enrichment call, the Notion Update Page action writes the data back to the contact: Company field gets the company name, the Notes field gets appended with "Enriched: [industry], [size] employees, [HQ location]". The rep opens the Notion contact and the research is already there. For leads where enrichment fails (personal Gmail addresses, etc.), the IF node routes to an empty branch — no error, the contact just stays without company data.

Notion Page ID (from WF1) HTTP Request (Clearbit / Apollo) IF (data found?) Notion Update Page (company + notes)
Saves 5–10 min per lead Free API needed (Clearbit/Hunter) Setup: ~25 min
3

Auto-Assign Rep + Slack Alert with Full Lead Context

Fires after enrichment completes — rep gets the lead in under 60 seconds

For teams with more than one sales rep, lead assignment is either manual (a manager looks at the queue and drags leads to reps), or it doesn't happen consistently. This workflow removes that step entirely. The assignment logic lives in a Google Sheet — a simple table mapping source or industry to a rep's name and Notion user ID. When a new lead comes in, n8n reads the table, finds the matching rep, and sets the Assigned To property in Notion. The Slack notification goes directly to that rep with the lead's details and a direct link to the Notion contact page.

The Google Sheet assignment table has three columns: Source (matching your Notion Source select options), Rep Name, and Notion User ID. The Notion User ID is found in your workspace's People settings — it's a UUID that the Notion API requires for the Person property type. Round-robin assignment (ignoring source) is handled by a Code node that tracks the last assigned rep in a single Sheets cell and rotates through the list on each execution.

The Slack message is where the context matters. It should include: the lead's name, email, company (from enrichment), their form message verbatim, which source they came from, and a direct URL to the Notion page — formatted as https://notion.so/{page_id_without_hyphens}. With this, the rep goes directly from Slack notification to the contact record without searching. Response time drops from hours to minutes.

Lead data (from WF1/WF2) Google Sheets (assignment table) Notion Update (Assigned To) Slack DM to rep
Lead assigned in <60 seconds No coding needed Setup: ~20 min
4

Follow-up Reminder — 3 Days No Contact, Rep Gets Pinged

Runs daily at 9 AM, checks Next Follow-up date in Notion

This is the workflow that prevents leads from going cold silently. Without it, a rep contacts a prospect, gets busy with other deals, and doesn't follow up for 10 days. The prospect moves on. With it, if a contact's Next Follow-up date is today (or earlier) and their Status is still Contacted or Qualified, the rep gets a Slack reminder with the contact name, when they were last contacted, and a link to the Notion page.

The Schedule Trigger fires every weekday at 9 AM. The Notion "Query Database" action pulls all contacts where the Next Follow-up date property is on or before today AND the Status is not Won or Lost — using Notion's filter API: { "and": [ { "property": "Next Follow-up", "date": { "on_or_before": "{{ $now.toISO() }}" } }, { "property": "Status", "select": { "does_not_equal": "Won" } }, { "property": "Status", "select": { "does_not_equal": "Lost" } } ] }. The query can return multiple contacts — the SplitInBatches node processes each one individually and sends a separate Slack message to the assigned rep.

One important detail: after the rep takes action and updates Last Contact in Notion, they should also set the Next Follow-up date to the next planned touchpoint. This keeps the system accurate. You can add a Notion Trigger workflow that fires when Last Contact is updated and automatically sets Next Follow-up to 3 business days later — removing even that manual step.

Schedule (9 AM weekdays) Notion Query (overdue follow-ups) SplitInBatches Slack DM to assigned rep
Prevents cold leads No coding needed Setup: ~20 min
5

Deal Stage Change → Pipeline Log + Team Notification

Notion Trigger — fires when Stage property is updated

When a deal moves through your pipeline — from Demo to Proposal, from Proposal to Negotiation — two things should happen automatically: the event gets logged in a shared tracking sheet (so you have pipeline history and can review why deals progressed or stalled), and the relevant team members get notified in Slack with the deal name, value, new stage, and owner. Without automation, both steps are manual, which means neither happens consistently.

This workflow uses the Notion Trigger node set to watch the Deals database for page updates. The trigger fires on any property change, so the first step is a Code node that checks whether the Stage property actually changed — comparing the current value to the previous value stored in a Google Sheets log row. If Stage didn't change (maybe the rep updated a note), the workflow exits. If Stage changed, the new stage and timestamp get written to the log row, and the Slack node posts to the #sales channel with the deal details.

The Slack message format matters here: "Acme Corp — Enterprise Plan moved to Negotiation ($8,400 · owner: Sarah). View deal →". This gives the whole team pipeline visibility without anyone needing to check Notion. Managers get an accurate read of pipeline health from their Slack feed alone.

Notion Trigger (page updated) Code Node (stage changed?) Google Sheets (log row) Slack #sales

Note on the Notion Trigger: It requires a different credential type than the Notion node — you need a Notion Public Integration with OAuth (not Internal Integration Token). The setup takes about 5 extra minutes at developers.notion.com. The trigger polls Notion's API every minute on n8n Cloud; on self-hosted it depends on your workflow activation mode.

Full pipeline visibility in Slack Light JS for stage comparison Setup: ~30 min
6

Deal Won → Onboarding Email + Contact Archived

Triggered when Stage is set to "Won" in the Deals database

Closing a deal is the moment where the process often breaks: the sales rep marks it won, celebrates briefly, and then the handoff to the next stage — whether that's customer success, onboarding, or invoicing — happens inconsistently. Some customers get a welcome email within the hour. Others don't hear anything for two days. This workflow ensures the handoff is instant and identical every time.

The Notion Trigger detects when a deal's Stage changes to "Won". The workflow then runs a sequence of three parallel branches: (1) Send a welcome email to the contact via Gmail or SendGrid — the template pulls the contact's name and the deal name from the Notion pages linked via the Contact relation; (2) Post a #wins message to Slack with the deal name, value, owner, and a confetti emoji — these messages are genuinely good for team morale and worth the 30 seconds of configuration; (3) Update the contact's Status from "Qualified" to "Won" in the Contacts database, and move the contact to a "Customers" filtered view by updating a separate Customer boolean property.

The "Lost" branch follows the same pattern but with a different email (honest, non-salesy close: "Thank you for considering us — the door is open if anything changes"), a Slack notification to the owner only (not the whole team), and a mandatory Lost Reason field update in the Deals database. Tracking loss reasons is where most small CRMs fail — they record that a deal was lost but not why, making it impossible to improve the process.

Notion Trigger (Stage = Won) Notion Get (contact page) Gmail (welcome email) + Slack #wins + Notion Update (Status → Won)
Instant, consistent handoff No coding needed Setup: ~25 min

What the full system looks like once it's running

A lead submits a form at 11:47 PM on a Thursday. By 11:48 PM, n8n has created the Notion contact row, enriched it with company data, assigned it to a rep, and set Next Follow-up to three business days from now. Friday morning at 9 AM the rep sees it in their Slack DM. They reach out, have a call, and move the deal to Demo in Notion. The stage-change workflow logs it and notifies the sales channel. The rep forgets to follow up after the demo — the follow-up reminder workflow pings them at 9 AM Monday. They close the deal two weeks later. Workflow 6 fires: welcome email to the customer, #wins Slack post, contact status updated to Won.

None of this required a paid CRM. The rep spent zero time on data entry — every property in Notion was set by a workflow. The manager has full pipeline visibility in Slack without opening Notion. The customer got a same-day welcome email.

The total build time for all 6 workflows is 3–4 hours if you're reasonably comfortable with n8n. The biggest time investment is getting the Notion property types right and understanding how the Notion API represents them — Select properties take a { "select": { "name": "New" } } structure, Relations take an array of page IDs, Person properties take an array of user objects. Once you've configured one property correctly, the rest follow the same pattern.

Frequently Asked Questions

Can you use Notion as a CRM with n8n?

Yes — Notion's database system with its property types and filter API handles everything a small-to-mid business CRM needs: lead tracking, deal pipeline, contact history, follow-up scheduling. n8n connects Notion to your forms, email, Slack, and data enrichment APIs so records get created, updated, and acted on automatically. The setup in this guide replaces HubSpot or Pipedrive for teams with up to ~200 active deals.

How much does it cost to build a CRM with n8n and Notion?

Notion's free plan includes unlimited database pages and all property types needed for a CRM. Self-hosted n8n is free with unlimited executions — your only cost is a VPS ($6–12/month) or n8n Cloud Starter ($20/month). Total: $0–20/month, vs $890/month for HubSpot Professional (which includes comparable automation) or $12.50/user/month for Pipedrive Essential (which doesn't).

What is the best Notion database structure for a CRM?

Two linked databases: Contacts (Name, Email, Company, Source, Status, Assigned To, Last Contact, Next Follow-up) and Deals (Deal Name, Contact relation, Value, Stage, Close Date, Owner). The Relation between them and a Rollup showing total deal value per contact give you HubSpot-style association without paying for it. The exact schema is in the table above — create those properties first before building any workflows.

How does n8n connect to Notion?

Create an Internal Integration at notion.so/my-integrations, copy the token, share it with your databases (via each database's ••• menu → Connections → Invite). In n8n, create a Notion API credential with that token. This one credential covers all workflows. You also need each database's ID — the 32-character string in the database URL between the last slash and the question mark.

Which is better for CRM — n8n + Notion or HubSpot?

n8n + Notion costs $0–20/month and gives full flexibility over automation logic, data structure, and integrations. HubSpot Free has very limited automation — sequences and workflow automation require Professional at $890/month. For teams under 10 people with fewer than 500 active contacts, n8n + Notion matches HubSpot's capability. HubSpot wins for built-in email sequences, native reporting dashboards, and teams that don't want to manage their own automations.

Can n8n automatically update Notion database records?

Yes — the Notion "Update Page" action takes a page ID and the properties to change. Get the page ID from a prior Notion Query step or from a Notion Trigger. Common patterns: update Status when a deal stage changes, update Last Contact when an email is logged, set Next Follow-up date automatically. The workflows in this guide update Status, Assigned To, Last Contact, Company, and Notes — all without anyone touching the Notion UI.

Related Articles

No-Code & AI

Automate Slack Notifications with n8n — 7 Practical Examples

Deploy alerts, lead pings, error monitoring, approval buttons — exact node setups for 7 production workflows.

No-Code & AI

n8n Automation: 15 Real-World Examples That Save Hours Every Week

CRM syncs, AI email routing, invoice processing — exact node setups for 15 production workflows.

No-Code & AI

How to Build AI Agents with n8n — Step by Step (No Code)

AI Agent node setup, memory types, live tools — build a production support agent without writing code.

Ready to Build Your n8n + Notion CRM?

The LearnForge AI Apps course walks you through n8n from zero to full production systems — Notion integrations, AI agents, Slack automations, and everything in between. Start with the free module today.

Start Free Module →