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.
What this actually costs vs paid CRMs
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
- The Notion CRM database schema (exact structure)
- Workflow 1: Lead capture from any source → Notion row
- Workflow 2: Automatic lead enrichment (company data)
- Workflow 3: Rep assignment + Slack alert
- Workflow 4: Follow-up reminder (3 days no contact)
- Workflow 5: Deal stage change → log + team notification
- Workflow 6: Deal Won → onboarding email + archive
- Connecting n8n to Notion (credential setup)
- 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 |
|---|---|---|
| Name | Title | Default — first and last name |
| Used for deduplication and sending | ||
| Company | Text | Company name, filled by enrichment |
| Phone | Phone | Optional |
| Source | Select | Website Form / Referral / Cold Outreach / LinkedIn / Event |
| Status | Select | New / Contacted / Qualified / Proposal / Won / Lost |
| Assigned To | Person | Your Notion workspace member |
| Last Contact | Date | Updated by n8n after every interaction |
| Next Follow-up | Date | n8n checks this daily for reminders |
| Notes | Text | Free notes, appended by automations |
| Deals | Relation | Links to Deals database (configure after creating Deals) |
| Total Deal Value | Rollup | Rolls up Value from linked Deals (Sum) |
Deals database
Create a second full-page database. Add these properties:
| Property name | Type | Notes |
|---|---|---|
| Deal Name | Title | e.g. "Acme Corp — Enterprise Plan" |
| Contact | Relation | Links to Contacts database |
| Value | Number | Deal value in USD (or your currency) |
| Stage | Select | Prospecting / Demo / Proposal / Negotiation / Won / Lost |
| Close Date | Date | Expected or actual close date |
| Owner | Person | Deal owner (may differ from contact's Assigned To) |
| Probability | Number | % — for weighted pipeline view |
| Lost Reason | Select | Price / Competitor / Timing / No Budget / No Response |
| Created | Created time | Auto-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
Lead Capture → Notion Contact Row (any source)
Webhook trigger — works with Typeform, Webflow, WordPress, custom HTML, CalendlyThe 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.
Automatic Lead Enrichment — Company Data Without Asking
Runs immediately after Workflow 1 creates the contactYour 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.
Auto-Assign Rep + Slack Alert with Full Lead Context
Fires after enrichment completes — rep gets the lead in under 60 secondsFor 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.
Follow-up Reminder — 3 Days No Contact, Rep Gets Pinged
Runs daily at 9 AM, checks Next Follow-up date in NotionThis 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.
Deal Stage Change → Pipeline Log + Team Notification
Notion Trigger — fires when Stage property is updatedWhen 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.
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.
Deal Won → Onboarding Email + Contact Archived
Triggered when Stage is set to "Won" in the Deals databaseClosing 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.
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
Automate Slack Notifications with n8n — 7 Practical Examples
Deploy alerts, lead pings, error monitoring, approval buttons — exact node setups for 7 production workflows.
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.
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 →