AI for CRM data: what goes wrong, and how to check it
AI for your role · Facts checked 22 October 2026
Connect Claude to HubSpot, Salesforce or Attio through their official MCP servers, or upload a CSV export. Either way, the answer can be wrong while every record is real: duplicates, stale stages, owner changes, mixed currencies, created-versus-closed cohorts and page limits. Ask Claude for its filters, then reconcile one total against the CRM's own report.
Connector or export: two ways in, with different ways to go wrong
There are two ways to get Claude to answer questions about HubSpot, Salesforce or Attio, and both work the same way in ChatGPT. Connect the CRM's MCP server, so the assistant queries live records as you. Or export a report to CSV and upload it, so the assistant analyses a file in code.
Neither is safer by default. They fail differently.
| Connector (MCP server) | Export (CSV upload) | |
|---|---|---|
| Data | Live, with your permissions | A snapshot, with whatever filters the report had |
| Calculations | Depends on the tool; HubSpot's query tool can't join objects or convert currency | Run in code (Claude's code execution, ChatGPT's data analysis), which you can read |
| Typical failure | A search returns one page of results and the model totals it as if it were everything | The export's filters are invisible, so the model analyses a subset as the whole |
| Size limits | 200 results per page on HubSpot searches | ChatGPT spreadsheets around 50 MB depending on rows; Claude's sandbox works with files up to 30 MB |
| Best for | "Which deals in stage X slipped this week?" | Cohort analysis, win rates by segment, anything with a lot of rows |
Sources: HubSpot developer docs; OpenAI file uploads FAQ; Claude help centre, checked 21–22 October 2026.
Our default is Claude, with questions about specific records going through the connector and questions that aggregate thousands of rows going through an export or, better, a warehouse table your team has already modelled. Either way, the CRM itself carries traps that neither route fixes.
Five traps that make a CRM answer wrong while looking right
Every one of these produces a clean, confident number. None of them is a hallucination in the usual sense: the records are real. The answer is still wrong.
1. Duplicates. Two account records for one company, or one contact entered by marketing and again by sales. A count of "customers" or "accounts touched" goes up; a win rate goes down. Ask the model to group by email domain or company domain before counting, then check a sample by hand: similar names are often different companies.
2. Stale stages. An opportunity sits in "Negotiation" because nobody updated it, not because anyone is negotiating. Pipeline and pipeline coverage look healthy. Ask for days since last stage change and last activity alongside every stage total.
3. Owner changes. When accounts move between reps, most CRMs show the current owner on historical deals. A "bookings by rep" answer credits this year's owner with last year's wins. That matters for quota attainment and territory reviews. Ask which owner field was used and whether it is current or at close.
4. Currency. Multi-currency pipelines need converting before they're summed, and at which rate is a decision. HubSpot's documentation says its query_crm_data tool "does not support joins, column aliases, subqueries, association traversal, or currency conversion". A model that sums the amount field across currencies will produce a number that looks like dollars and isn't.
5. Closed-date versus created-date cohorts. "Win rate for Q2" can mean deals created in Q2 that eventually won, or deals that closed in Q2. The two answers differ, sometimes a lot, and a model will pick one without saying. The same choice drives sales cycle length and win rate.
A sixth, specific to connectors: the page limit. HubSpot's search tool returns at most 200 results per page and its get tool takes 100 IDs per request (HubSpot docs). If the model doesn't page through, every total is quietly capped.
Trace a CRM answer back to its records
Connect Count next to your HubSpot, Salesforce or Attio connector. It labels every claim in the answer and shows the reasoning chain down to the query and records, so a missed page or a mixed currency is visible.
Connect your CRM to Claude in four steps
All three major CRMs run official MCP servers, and Claude adds each one as a connector. The steps are short. The decisions inside them, mostly about permissions, are what matter.
- Install the connector. On Pro or Max you add it yourself in Customize > Connectors. On Team or Enterprise, an owner adds it in Organization settings > Connectors and each person then signs in with their own account, so Claude sees only what that person can see (custom connectors help article).
- HubSpot: install HubSpot's connector from Customize > Connectors in Claude and sign in with OAuth (HubSpot). It reads contacts, companies, deals, tickets and activities, and can create and update records and log notes. Revenue objects such as invoices and subscriptions are read-only and in beta. With Sensitive Data enabled, activity and conversation data are blocked (HubSpot MCP docs).
- Attio: search for Attio in Claude's connectors and install it. OAuth, no API keys; tools include
search-records,list-recordsandrun-basic-report. Reads are "auto-approved"; writes "request user confirmation" (Attio MCP docs). - Salesforce: Salesforce runs hosted MCP servers, but its developer documentation wouldn't load for us, so this is reported rather than confirmed. According to LibreChat's setup guide, reads, mutations and deletes are separate servers, authentication is per user through an External Client App, and field-level security and sharing rules apply. If that holds, connect the reads server only. Check Salesforce's own docs before you rely on it.
- Decide what it may write. Salesforce: the reads server (reported). HubSpot's connector writes, and "all actions respect your existing HubSpot user permissions", so connect as a user with the access you want Claude to have. Attio: leave the write confirmations on.
- Create a project for CRM questions (Claude Projects). Upload your definitions of opportunity, stage, pipeline and booked, and paste instructions like these:
Use only the definitions in this project. Before any total, state the
object, filters, date field, amount field and currency handling, and
how many result pages you read. Return record IDs with every list.
Don't create, update or merge records unless I ask in that message.
- Test it against a report you trust. Ask for a total you already know, such as last quarter's closed-won amount, and reconcile it before asking anything new.
If your company runs ChatGPT instead, custom MCP servers are added as plugins from chatgpt.com/plugins (OpenAI developer docs), and Attio says it's listed in ChatGPT Apps. The traps and checks on this page don't change. The wider team setup, with Stripe and the warehouse, is in AI for RevOps.
Prompts that make the traps visible
These are illustrative, and written for a Claude project with your CRM connected. Each forces the model to state a choice you'd otherwise never see.
State the filters before the number
Question: what is our open pipeline for [quarter]?
Before answering, tell me: which object, which stages count as open,
which date field defines the quarter, which amount field, and how you
handle currencies. Then answer. If a search returns a full page of
results, fetch the next page before totalling, and tell me how many
pages you read.
Audit data quality without touching it
For opportunities with close date in [period], return record IDs for:
(a) no activity in [30] days, (b) stage unchanged for more than [n] days,
(c) amount missing or zero, (d) account sharing a domain with another
account. Don't edit or merge anything.
Cohort a win rate both ways
From the attached export, calculate win rate for [period] twice, in code:
once for deals created in the period, once for deals closed in it. Show
both, the counts behind each, and the code. Don't say which is right.
The second answer is the useful one. When the two numbers differ, your team needs to choose, once, and write it down. More patterns in prompts for data analysis.
It acts as you: permissions, writes and injected instructions
A CRM connector inherits your access. If you can edit every deal, so can the assistant. Anthropic's own guidance on custom connectors says Claude acts with your permissions, that a shared API key gives every user the same access, and that during Research "tools can run without approval", so any connector that writes should be switched off first (Claude help centre).
CRM data also contains text written by people outside your company: email bodies, form submissions, notes pasted from calls. Instructions hidden in that text can steer an agent. That's not hypothetical for MCP generally: in a published case, a support ticket containing hidden instructions led a coding agent with broad database access to read a table of integration tokens and post it into the ticket (General Analysis, July 2025).
Three settings we'd use:
- Read-only first. Salesforce's reported read-only server, read-only roles in HubSpot, or a user without edit rights.
- Keep confirmations on. Attio asks before writes; leave it that way. Avoid "Allow always" for any tool that changes records.
- One connector at a time for writes. Don't let an agent that reads inbound email also update deals unsupervised.
A two-minute check against the CRM's own report
The fastest check on a CRM answer is the CRM. It already knows how to count its own records.
- Rebuild one total as a saved report with the filters the model stated. Same number? Good. Off by a round number? Probably a page limit.
- Open three records the answer names. Are they in the stage and period it says?
- Ask about currency and dates. "Which currency is this total in, and which date field defines the period?"
- Ask what was excluded. "Which records matched the question but aren't in your answer?"
- Check one owner. For any per-rep figure, open one deal and compare the owner at close with the owner now.
If you'd rather see every step at once, connect Count alongside your CRM connector and ask it to audit the answer. It labels each claim as a citation, an assumption, model knowledge or a hallucination, and draws the reasoning chain from the prompt through each query to the records the claim rests on. The wider RevOps setup is in AI for RevOps, and the general method in how to check AI answers.
Questions people ask
Can I connect HubSpot to Claude?
Yes. HubSpot publishes an official connector for Claude, installed from Customize > Connectors in Claude with OAuth. It can read and write most CRM objects within your HubSpot permissions. Its query tool doesn't do joins or currency conversion, and searches return at most 200 results per page, so ask Claude how many pages it read.
Is AI good for cleaning CRM data?
It's good at finding candidates: missing fields, stale stages, likely duplicates. Don't let it merge or edit records unsupervised, because similar names are often different companies. Ask for record IDs, check a sample, then fix in the CRM.
Should I give AI a CRM export or a live connection?
Live connections suit questions about specific records; exports suit heavy aggregation, because the model analyses them in code you can read. The export's filters are invisible to the model, so tell it what the export includes.
Does Salesforce have an MCP server?
Salesforce runs hosted MCP servers. We couldn't load its developer documentation, but a third-party setup guide describes separate read, write and delete servers with per-user OAuth, and says Salesforce's field-level security and sharing rules apply. Confirm on Salesforce's own docs before connecting.
Sources
- HubSpot: Integrate with the remote HubSpot MCP server
- HubSpot: Connector for Claude (checked 22 October 2026)
- Anthropic: What are projects?
- Attio: MCP overview
- Salesforce: Hosted MCP servers reference (could not be loaded)
- LibreChat: Salesforce hosted MCP setup (third-party)
- Anthropic: Getting started with custom connectors using remote MCP
- Anthropic: Create and edit files with Claude
- OpenAI: File uploads FAQ
- OpenAI: Connect ChatGPT to a custom MCP server
- General Analysis: Supabase MCP can leak your entire SQL database (July 2025)
