Off-the-shelf CRMs are built for the average business. This guide walks you through building a free, custom CRM that syncs with your Notion database using Claude Code and Vercel. First deploy in under 10 minutes.
Your team is working around the CRM right now. The status labels do not match your sales stages. The pipeline view has six stages nobody uses. The report your manager wants every Friday requires three manual exports. So someone built a spreadsheet on the side. Then a second one. Now there are three versions of the same data and none of them match.
You renew the software subscription anyway.
The problem is not your team. It is the tool. Off-the-shelf CRMs are designed to work for the largest number of businesses at once. Your business is not average. The fields are wrong. The views are wrong. The workflow is someone else's idea of how sales work.
The fix is a CRM built from your actual data, shaped to your actual workflow, deployed for free. That is what this guide covers: five steps from a GitHub template to a working, Notion-synced CRM your team will use.
What You Need Before You Start
Four tools. All free to start.
| Tool | What it does | Where to get it |
|---|---|---|
| Claude Code | AI coding agent that rebuilds the template around your data | claude.ai/code |
| CRM template | A working React or Next.js CRM you fork and customise | GitHub — search "react crm boilerplate" |
| Notion | Your existing database; the CRM reads and writes to it | notion.so |
| Vercel | Hosts the finished app for free, permanent URL | vercel.com |
You will also need a Notion API key and a Notion Integration. Step Four walks you through both.
If you track contacts in a spreadsheet rather than Notion, the same process works. Claude Code handles CSV-backed apps just as well — paste your column headers instead of your Notion field names when prompted.
Step One: Find a Free CRM Template on GitHub
Do not build from scratch. Start from something that already works.
Go to GitHub and search react crm boilerplate or nextjs crm template. Sort by Stars to find repos people actually use. Anything with 500+ stars and a commit from the last six months is a safe starting point. Look for four things:
- A contacts or leads table with sortable columns
- A detail view — clicking a contact opens a full page
- A status or pipeline column
- A README with actual setup steps
Clone or download the repo to your local machine. This is your raw material. Claude Code will reshape it around your data in the next step. You are not keeping the design — you are starting from working code instead of a blank file.
The mistake that makes it fail: an abandoned repo. If the last commit is two years old, skip it. You will be working inside this codebase. Find one with recent activity.
Your first real run: cloned the repo locally? Good. Open Claude Code in that folder.
Step Two: Give Claude Code Your Data
This is where the CRM stops being generic and starts being yours.
Open Claude Code in the folder where you cloned the template. Write one prompt that describes your data structure:
Copy this.
Copy: Rebuild This CRM Around My Data I have a Notion database that tracks my [leads / clients / contacts]. The main fields are: [list your column names — e.g. Name, Company, Status, Last Contact, Deal Size]. Here is the template code in this folder. Rebuild the contacts table and the detail page so the columns match my database exactly. Keep the existing design language.
Replace the brackets with your actual field names. That is the whole prompt.
Claude Code reads the template and rewrites the data layer to match your columns. The visual structure stays. The column names, status labels, and detail fields change to match how you actually work. Every label your team will read every day now comes from your business, not from whoever wrote the template.
Tip — be specific about outcomes, not implementation. "Rebuild the contacts table to match my fields" is better than "change the data model to use Notion." Tell Claude Code what the result should look like. It knows how to get there.
Completion beat: after Claude Code finishes, open the contacts table in your browser. Check every column header. If one is wrong — say the Status column is named Stage in your Notion database — say: "The Status column is named Stage in my Notion database, fix it." Done in one message.
Step Three: Chat In What Your Team Actually Needs
The main contacts view is right. Now add the rest.
Every feature is one message. Send them one at a time, not all at once:
- "Add a pipeline board view. Columns: New Lead, Contacted, Proposal Sent, Closed Won, Closed Lost."
- "Add a notes section on the contact detail page."
- "Add a tag system so I can filter contacts by service type."
- "Add an activity log. Every time I update a status, log it with a timestamp and who made the change."
- "Add a search bar that filters by name, company, and tag."
- "Add a view that shows only contacts with no activity in the last 30 days."
Because Claude Code works inside the same codebase throughout the session, it follows the patterns it already set up. Every new page matches the design of the existing pages. It is one coherent product, not a patchwork of components stuck together.
There is no paywall when you want to add a column. No ticket to file. No waiting for a product team to decide if your request makes the roadmap. You describe what the feature does, Claude Code builds it, you move on.
Keep a running list of what feels wrong after a few days of real use. Bring each item to Claude Code one at a time. The CRM gets better every week.
Step Four: Connect Notion API for Two-Way Sync
Without this step, the app reads from Notion but cannot write back. Edits made in the CRM disappear the next time Notion refreshes.
Get your Notion API key — four steps:
- Go to
notion.so/my-integrationsand click "New integration" - Name it (e.g. "My CRM App") and select your workspace
- Copy the Internal Integration Secret — this is your API key
- Open the Notion database, click the three-dot menu, go to Connections, and add your integration
Find your database ID: Open the Notion database in a browser. The URL looks like notion.so/yourworkspace/AbcDef1234567890?v=.... The long string before the ? is your database ID.
Wire it into the app with one prompt:
Copy this.
Copy: Add Notion Sync
Add Notion API support so the app can read and write to my database.
Database ID: [YOUR_DATABASE_ID]
Store the API key in a .env file as NOTION_API_KEY.
Every contact edit in the app should write back to Notion.
Claude Code adds the API calls, sets up the environment variable, and wires two-way sync. An edit in the CRM shows up in Notion within seconds. An edit in Notion shows up in the CRM on the next page refresh. Nothing falls through whether someone updates the record from the app or directly from Notion.
Done. Your data stays in sync.
Step Five: Deploy to Vercel
One push. Permanent URL. Your whole team is inside it from any device.
- Push your code to a GitHub repository (private is fine)
- Go to
vercel.com, log in, and click "Add New Project" - Import your GitHub repository
- Add your environment variable:
NOTION_API_KEY= your key - Click Deploy
Vercel gives you a permanent URL on the free tier with no credit card required.
| Vercel free tier | What it means in practice |
|---|---|
| 100 GB bandwidth/month | More than enough for a team CRM with hundreds of contacts |
| Unlimited deployments | Every push to GitHub redeploys automatically |
| Custom domain | Point crm.yourdomain.com at the app if you want branded access |
Share the URL with your team. No installations. No shared passwords. SSL is automatic. Done.
What Happens After Launch
The CRM is not finished when it deploys. That is the point.
You will spot something wrong after two days of real use. A missing field. A filter that should exist. A view you need every morning. Keep the list, bring each item to Claude Code, and ship the change. Because the whole thing is yours — code, data, hosting — you own the rate of improvement. The tool gets better as fast as you use it.
That is a different relationship with software than renting one that changes on someone else's schedule.
Honest: What This Does Not Cover
This setup works well for teams of 2–15 people tracking contacts, clients, or deals in Notion. It is not a drop-in replacement for a CRM with automatic email activity tracking, call recording, or scoring built in.
If your team needs Gmail threads logged automatically inside the CRM, that is an additional integration step. Start with this guide first. Add the email layer once the basics are running and adopted.
You are also the maintainer. When Notion updates their API, you update the integration — it happens rarely, and Claude Code handles the change in one message. But own that going in. You are trading the convenience of a managed SaaS product for complete control over what the tool does and costs nothing to extend.
If You Do One Thing This Week
Pick a template today. Paste it into Claude Code with your column names.
Ten minutes. Either you have a working custom CRM, or you spent ten minutes and learned it is not for you. Both outcomes are useful.