DataLatte
MCP + Notion: Build a Self-Updating Client CRM with AI
AI Automation

MCP + Notion: Build a Self-Updating Client CRM with AI

June 13, 2026·Nataliia· 10 min read All posts
Every successful local business owner knows their regulars by name. The coffee shop owner who remembers that Sarah takes oat milk and no sugar. The groomer who knows that Max the golden retriever needs extra time because he hates the dryer. The salon stylist who knows not to suggest highlights to a client who is growing out her color.
That personal touch is what keeps people coming back. But when you have 50, 100, or 200 clients, keeping it all in your head stops working. You start forgetting. Follow-ups slip through the cracks. A client who spent $800 with you last year quietly switches to a competitor — and you only notice when you run the year-end numbers.
Here is the data that makes this painfully concrete: repeat customers spend 67% more per visit than new customers and are worth roughly five times more in lifetime revenue than a single-visit client. Yet most local businesses track their regulars in a scattered mix of booking software notes, text messages, and fading memory.
The problem is not that business owners do not want a CRM. It is that traditional CRMs are either built for enterprise sales teams (too complex) or require constant manual data entry (no one has time). The result: the CRM sits empty while the business owner goes back to their mental Rolodex.
This article shows you a better path — a self-updating client CRM built on Notion, powered by Claude AI, and connected through the Model Context Protocol (MCP). Once it is running, your AI logs every appointment, schedules follow-ups, and surfaces clients who are overdue for a visit — automatically.

Why Most Local Businesses Skip the CRM

Let us name the real friction points before we solve them.
Data entry is a second job. After a full day of cutting hair or grooming dogs, the last thing anyone wants to do is open a CRM and type in notes. Most appointment booking tools (Vagaro, Mindbody, Acuity) let you add client notes, but the interface is clunky and the data stays locked in their system.
Off-the-shelf CRMs are designed for B2B sales. HubSpot and Salesforce are built around deal pipelines and sales reps. A hair salon does not have "deals" — it has repeat service relationships. The terminology is wrong, the features are overkill, and the pricing is aggressive.
No intelligence. Even if you do maintain a spreadsheet with client notes, it does not tell you anything. It does not flag that Rachel has not booked in 10 weeks. It does not draft a re-engagement text. It just sits there, static, consuming space.
The solution we are building removes all three friction points. Data entry is handled by AI. The structure is built for service businesses, not sales teams. And the intelligence layer — Claude — turns your raw data into actionable follow-ups.

What You Are Building

Here is the architecture at a glance:
  1. A client finishes an appointment. Your booking system (or a simple form) sends appointment data to a webhook.
  2. A Python script receives that data and passes it to Claude via the API.
  3. Claude reads the appointment notes, extracts key details, and uses the Notion MCP server to update (or create) the client record in Notion.
  4. Scheduled automations run daily: Claude checks for upcoming follow-up dates, drafts reminder messages, scans for birthdays, and generates a weekly revenue summary.
What you need:
  • Notion account (free tier works fine)
  • Claude API key (Anthropic Console — light usage starts at roughly $5/month)
  • Python 3.10+
  • A way to trigger webhooks from your booking system (most platforms support this natively)

Setting Up Your Notion CRM Database

Create a new Notion database called Client CRM. Add these exact properties:
Property NameTypeNotes
Client NameTitleFull name
PhonePhonePrimary contact
EmailEmailFor follow-up messages
Last VisitDateUpdated after each appointment
ServicesMulti-selectHaircut, Color, Full Groom, Bath, etc.
Staff MemberSelectWho served them
Visit NotesTextService details, preferences, reactions
Next Follow-UpDateAuto-calculated from service type
BirthdayDateFor birthday campaigns
Lifetime ValueNumberRunning total in dollars
StatusSelectActive, Lapsed, VIP, New
Total VisitsNumberCount of appointments
The JSON structure for a fully populated client record looks like this:
{
  "Client Name": {
    "title": [{ "text": { "content": "Sarah Chen" } }]
  },
  "Phone": { "phone_number": "+1-555-842-1923" },
  "Email": { "email": "sarah.chen@email.com" },
  "Last Visit": { "date": { "start": "2026-05-28" } },
  "Services": {
    "multi_select": [
      { "name": "Highlights" },
      { "name": "Blowout" }
    ]
  },
  "Visit Notes": {
    "rich_text": [{
      "text": {
        "content": "Requested balayage with warm tones. Loves the result. Sensitive scalp — use gentle developer. Prefers appointments after 3pm."
      }
    }]
  },
  "Next Follow-Up": { "date": { "start": "2026-07-23" } },
  "Lifetime Value": { "number": 1240 },
  "Status": { "select": { "name": "VIP" } },
  "Total Visits": { "number": 14 }
}
Once the database is created, grab your Notion Integration Token from the Notion Developers portal and the database ID from the page URL. You will need both for the MCP configuration.

Installing the Notion MCP Server

The Notion MCP server lets Claude read from and write to your Notion workspace directly, without any custom API integration code. Configure it in your claude_desktop_config.json:
{
  "mcpServers": {
    "notion": {
      "command": "npx",
      "args": ["-y", "@notionhq/notion-mcp-server"],
      "env": {
        "OPENAPI_MCP_HEADERS": "{\"Authorization\": \"Bearer YOUR_NOTION_INTEGRATION_TOKEN\", \"Notion-Version\": \"2022-06-28\"}"
      }
    }
  }
}
On macOS, this file lives at ~/Library/Application Support/Claude/claude_desktop_config.json. On Windows, find it at %APPDATA%\Claude\claude_desktop_config.json.
After restarting Claude Desktop, Notion will appear as an available tool. Claude can now search, read, create, and update pages in your workspace — and because MCP is a standard protocol, you can add more servers later (Google Calendar, Slack, Supabase) without changing your Python code.
Make sure to share your Client CRM database with the integration in Notion's settings, or Claude will not be able to see it.

The Four Core Automation Workflows

Workflow 1: After-Appointment Log

This runs automatically when an appointment ends. The booking system sends a webhook, your Python script catches it, and Claude fills in the Notion record.
import anthropic
import json
from flask import Flask, request, jsonify

app = Flask(__name__)
client = anthropic.Anthropic(api_key="YOUR_ANTHROPIC_API_KEY")

NOTION_DATABASE_ID = "YOUR_DATABASE_ID"

SYSTEM_PROMPT = """You are a CRM assistant for a local service business.
When given appointment data, you:
1. Search the Notion CRM database for the client by name or phone number
2. If found, update the existing record with new visit details
3. If not found, create a new client record with all available fields
4. Always update: Last Visit date, Services, Visit Notes, Total Visits (increment by 1)
5. Calculate Next Follow-Up date based on service type:
   - Haircut: 6 weeks from today
   - Highlights or Color: 8 weeks from today
   - Full Groom (dog): 4 weeks from today
   - Bath only: 3 weeks from today
   - Fitness or personal training session: 1 week from today
6. Add today's service cost to the existing Lifetime Value
7. Set Status to VIP if Lifetime Value exceeds $500

Respond with a plain-text summary of what was updated or created."""

@app.route("/appointment-webhook", methods=["POST"])
def handle_appointment():
    data = request.json

    appointment_context = f"""
New appointment completed:
Client: {data.get('client_name')}
Phone: {data.get('phone')}
Email: {data.get('email', 'Not provided')}
Services today: {', '.join(data.get('services', []))}
Staff member: {data.get('staff_member')}
Appointment date: {data.get('appointment_date')}
Duration: {data.get('duration_minutes')} minutes
Cost today: ${data.get('cost')}
Staff notes: {data.get('notes', 'None')}

Please update the Notion CRM with this appointment information.
"""

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=1024,
        system=SYSTEM_PROMPT,
        messages=[{"role": "user", "content": appointment_context}]
    )

    return jsonify({
        "status": "updated",
        "client": data.get('client_name'),
        "details": response.content[0].text
    })

if __name__ == "__main__":
    app.run(port=5001)
Test this locally with curl -X POST http://localhost:5001/appointment-webhook -H "Content-Type: application/json" -d '{"client_name": "Jane Smith", "phone": "+15551234567", "services": ["Haircut"], "staff_member": "Maria", "appointment_date": "2026-06-13", "duration_minutes": 45, "cost": 65, "notes": "Likes extra moisture treatment"}'

Workflow 2: Follow-Up Scheduler

This runs every morning via a cron job. Claude queries Notion for all clients whose Next Follow-Up date has passed and drafts personalized re-engagement messages ready for you to send.
import anthropic
import schedule
import time
from datetime import date

client = anthropic.Anthropic(api_key="YOUR_ANTHROPIC_API_KEY")

def run_followup_check():
    today = date.today().isoformat()

    prompt = f"""
Today is {today}. Search the Notion Client CRM database and find all clients where:
- The "Next Follow-Up" date is on or before today
- Status is "Active" or "VIP"

For each client found, draft a personalized follow-up SMS message that:
- Uses their first name only
- References their last service (pull from Services field)
- Suggests booking without being pushy
- Stays under 160 characters

Format your output as a numbered list:
1. [Client Name] — [Draft SMS]

If no clients need follow-up today, say so clearly.
"""

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}]
    )

    print(f"=== Follow-Up Report: {today} ===")
    print(response.content[0].text)
    print("=" * 40)

schedule.every().day.at("08:00").do(run_followup_check)

while True:
    schedule.run_pending()
    time.sleep(60)

Workflow 3: Birthday and Anniversary Reminders

Birthdays are one of the highest-converting touchpoints for local businesses. A personalized message on a client's birthday with a small discount converts at two to three times the rate of generic promotions — and costs nothing but a text.
def run_birthday_check():
    today = date.today()
    month_day = today.strftime("%m-%d")

    prompt = f"""
Today's month and day is {month_day} (ignore the year when checking birthdays).

Search the Notion Client CRM database for any clients whose Birthday field 
matches today's month and day.

For each birthday client found, produce two things:
1. A warm SMS under 160 characters offering 15% off their next visit, 
   mentioning their name and the specific service they last had
2. An email version with a subject line and 3-4 sentence body

If no birthdays today, check for clients whose first-ever visit 
(estimate from the date pattern in notes if available) was exactly 
1 year ago this month — draft a "one year anniversary" loyalty message for those.

List each client separately with clear SMS and Email sections.
"""

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}]
    )

    print(f"=== Birthday/Anniversary Check: {today} ===")
    print(response.content[0].text)

schedule.every().day.at("09:00").do(run_birthday_check)

Workflow 4: Monthly Revenue Reporting

Every first of the month, Claude queries Notion and generates a plain-English business summary. No formulas. No pivot tables. Just a clean report that tells you what happened.
from datetime import datetime, timedelta

def generate_monthly_report():
    first_of_this_month = datetime.now().replace(day=1)
    last_month_end = first_of_this_month - timedelta(days=1)
    last_month_start = last_month_end.replace(day=1)
    last_month_label = last_month_end.strftime("%B %Y")

    prompt = f"""
Generate a monthly client revenue and retention report for {last_month_label}
using the Notion Client CRM database.

Please calculate and clearly report:

1. REVENUE SUMMARY
   - Total revenue from all visits last month (sum of Lifetime Value increments)
   - Average spend per visit
   - Highest single-visit spend

2. TOP CLIENTS
   - Top 5 clients by total spend last month

3. CLIENT ACTIVITY
   - Total unique clients served
   - New clients (first visit ever) vs returning clients
   - Clients who visited 3+ times (highly loyal segment)

4. SERVICE BREAKDOWN
   - Which services generated the most revenue

5. RETENTION RISK
   - Clients who visited last month but whose Next Follow-Up date has now passed
   - These are the people most at risk of churning — list their names

6. MONTH-OVER-MONTH TREND
   - Compare to the prior month if data is available
   - Call out any significant changes

Write this as a readable business narrative, not just a data dump.
Start with a one-sentence executive summary.
"""

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=3000,
        messages=[{"role": "user", "content": prompt}]
    )

    print(f"=== Monthly Business Report: {last_month_label} ===")
    print(response.content[0].text)

# Run on the 1st of every month at 7am
schedule.every().day.at("07:00").do(
    lambda: generate_monthly_report() if datetime.now().day == 1 else None
)

Real Example: A Pet Grooming Business with 200 Clients

Paws & Claws is a one-stylist pet grooming studio in Austin, Texas. Before implementing this system, the owner kept client notes in a shared Google Sheet — updated maybe 40% of the time, with inconsistent formatting and no structure for follow-ups.
The before state:
  • Average client visits per year: 3.1
  • Lapsed clients (no visit in 10+ weeks): estimated 35–40 at any time
  • Time spent on follow-up reminders per week: 2–3 hours of manual texting
  • Monthly revenue visibility: "roughly I think around X" level accuracy
After implementing the Notion + MCP + Claude pipeline:
  • Follow-up rate went from ad hoc to 100% automated. Every pet gets a follow-up text at exactly the right interval for their coat and service type (bath-only dogs get 3-week nudges; full-groom clients get 4-week messages). Average visits per client climbed from 3.1 to 4.7 in the first 6 months.
  • Lapsed clients recovered. In the first 30 days, Claude identified 23 clients who had not booked in over 8 weeks. The owner sent the AI-drafted re-engagement messages. Nine rebooked within a week — roughly $720 in recovered revenue with 10 minutes of effort.
  • Birthday messages converted at 31%. Fourteen clients received birthday messages in the first month. Four booked a birthday bath package the same week. That is a 28% conversion rate on a zero-cost campaign.
  • Time saved: approximately 45 minutes per day that had previously been spent on manual follow-up reminders and memory-jogging before client calls.
  • Total monthly cost: $11.40 in Claude API calls for 200 active clients with daily automations.
The owner's comment after 90 days: "I feel like I finally have a real business system, not just vibes and a spreadsheet."

System Comparison: What Are Your Options?

FeatureNotion + MCP + ClaudeHubSpot CRMVagaroMindbody
Monthly cost~$12 (API only)$20–$890$30–$90$129–$349
Setup time2–4 hours1–2 days30 minutes2–3 days
AI-written follow-up messagesYes, personalizedNoNoNo
Auto follow-up schedulingYes (smart intervals)Manual or paid add-onBasic templates onlyBasic templates only
Custom fields for your businessFully flexibleLimited in free tierFixed schemaFixed schema
Revenue reportingAI-generated narrativeComplex dashboard setupBasicModerate
Birthday campaignsFully automatedPaid tier onlyLimitedYes
Data ownership100% yours, exportableVendor-lockedVendor-lockedVendor-locked
Multi-staff supportYes (Notion collab)YesYesYes
Works offline (data in Notion)YesCloud-onlyCloud-onlyCloud-only
Learning curveMedium (setup once)HighLowMedium
The decisive differentiator is AI-generated personalization at low cost. Every other tool on this list gives you templates. This system gives you individualized messages drafted from the client's actual history — and charges you cents per message.

FAQ

Is Notion a good CRM for small businesses?
Yes, particularly for service businesses built around repeat client relationships. Notion's database structure is flexible enough to model exactly the properties your business tracks — unlike purpose-built CRMs that lock you into their schema. The free tier supports unlimited pages and databases, so you can run a full CRM for 500+ clients at zero platform cost. The trade-off is that Notion is not a CRM out of the box — you are building one using Notion's building blocks. The database structure in this guide removes that friction: it is pre-designed for local service businesses, so you are not starting from a blank page.
Does MCP work with Notion's free plan?
Yes. The Notion MCP server authenticates using an Integration Token, which is available on all Notion plans including the free tier. The MCP server can read, create, and update database entries, search for records by property, and retrieve rich text fields — all without any paid Notion subscription. The only meaningful free-tier limit is that you can add up to 10 guest collaborators; for an internal CRM, this is not a constraint.
How much does this system actually cost to run per month?
For a 200-client business running the four workflows described here — daily follow-up check, birthday check, appointment webhook processing, and monthly reporting — expect roughly 60,000 to 90,000 tokens per month total. At Claude Haiku pricing ($0.80 per million input tokens, $4 per million output tokens), that is approximately $3–$8/month. If you prefer Sonnet-class quality for client-facing messages, budget $15–$25/month. Notion is free. The Python script runs cheaply on a $5/month VPS, a spare computer, or a Raspberry Pi. Total system cost for most small service businesses: under $30/month.
Can multiple staff members use and update this CRM?
Yes, in two ways. First, multiple staff can have direct Notion access — Notion is a collaborative tool and free-tier workspaces support up to 10 members. Anyone with access can open the database and edit records manually. Second, staff who do not need full database access can submit appointment notes through a shared form (Google Forms, Tally, or a custom HTML page) that posts to the webhook endpoint. Claude processes each submission regardless of who submitted it. If you want to track who made changes, add a "Last Updated By" property to the database and pass the staff member's name through the webhook payload.
How do I migrate from spreadsheets to Notion CRM without losing my data?
The migration takes 30 to 60 minutes for most businesses. Export your existing spreadsheet as a CSV file. In your Notion Client CRM database, click the three-dot menu in the top right, select Import, then choose CSV. Notion will attempt to match your column headers to existing database properties — review the mapping carefully and correct any mismatches before confirming. After import, run one cleanup prompt in Claude: "Review the imported records in the Notion Client CRM and list any entries missing Phone number, Last Visit date, or Services data — I want to identify gaps to fill in manually." This surfaces the incomplete records without you having to scan 200 rows yourself. Plan to spend 15–20 minutes filling in gaps, and you will have a clean, structured CRM database ready for all four automations.

Free for local businesses

Want this applied to your business?

I'll review your Google presence, local SEO, and ad accounts — and send you a specific action plan within 48 hours. No pitch, no pressure.

Want hands-on help?

See how DataLatte handles AI Agents & Automation for local businesses.

Learn more
Nataliia — local marketing expert
Nataliia

Local marketing strategist with 10+ years at global agencies — OMD, Dentsu, GroupM, and BBDO. Now helping small businesses get the same data-driven edge. Based in Europe, working with clients in the US, UK, Australia, and beyond.

About Nataliia

Want this applied to your business?

Let's review your current marketing setup together — free, no obligations.

Get Your Free Marketing Audit