Your Keap CRM semantic layer for AI agents.
We copy your Keap account nightly, shape it into datasets, and write your business rules and definitions beside the data. Your agent reads all of it over MCP, so what comes back is accurate.
Claude Desktop · connected to acme-co
You
Build me a sales dashboard for this year.
working
Sales dashboard
2026 year to date
New leads
1,284
Opportunities won
312
Sales
$486K
New leads by month
Opportunities by stage
| Contacted | 918 | |
|---|---|---|
| Qualified | 604 | |
| Proposal sent | 371 | |
| Won | 312 |
working
Where new leads are stalling
last 90 days
Leads are not being lost at the proposal. They are being lost before anyone speaks to them — and the drop is concentrated in one source.
- Paid search converts at less than half the rate of referral
- Contacted → Qualified is 66% overall, but 41% for paid search and 88% for referral.
- The first appointment is the hinge
- 58% of booked appointments are kept. Leads with no kept appointment close at 4%; leads with one close at 39%.
- 287 leads have gone quiet with no task against them
- Tagged New Lead more than 30 days ago, never moved stage, and no task or appointment since.
working
Sales rep performance
last quarter
| Rep | Leads | Disq. | Won | Revenue | Refunds | Referrals |
|---|---|---|---|---|---|---|
| Dana R. | 412 | 96 | 71 | $148K | $6.2K | 24 |
| Priya S. | 351 | 74 | 66 | $139K | $2.1K | 31 |
| Marcus T. | 388 | 121 | 58 | $121K | $11.4K | 18 |
| Owen K. | 214 | 63 | 39 | $78K | $4.8K | 9 |
| Unassigned | 98 | 41 | 3 | $6K | $0 | 2 |
working
Coaching notes
lead #4821 · Marcus T.
- Mar 3 Inbound from paid search. Tagged New Lead.
- Mar 4 Call. Note: "left voicemail".
- Mar 11 Second call. Note: "interested, wants pricing". Tagged Qualified.
- Mar 18 Proposal sent. No follow-up task created.
- Apr 2 Tagged Lost. Note: "went with another vendor, cheaper".
- Seven days between the first call and the second
- Paid-search leads that closed this quarter were reached again within two days. Coach: end every call by booking the next one.
- The proposal went out with nothing scheduled behind it
- Fifteen days of silence, then the lead answered for someone else. Coach: a proposal is not sent until its follow-up task exists.
- Budget and decision date were never captured
- The notes hold interest and a pricing request, not a number or a deadline, and the loss was on price. Coach: qualify both before the proposal, and put them in the fields, not the notes.
Connects to any client that speaks the Model Context Protocol.
- Claude
- ChatGPT
- Codex
- Cursor
One definition
One question. The same answer, wherever you ask it.
A saved report in ReportMojo and a reply from your agent draw on the same datasets and apply the same rules, so the figures agree. Here is "sales by lead source, last quarter" both ways.
Sales by lead source
saved report · Sales / Pipeline
By source
| Lead source | Leads | Won | Sales | Cancelled | Net | Close rate |
|---|---|---|---|---|---|---|
| Referral | 186 | 61 | $118,400 | −$2,900 | $115,500 | 32.8% |
| Webinar | 241 | 54 | $96,300 | −$4,150 | $92,150 | 22.4% |
| Paid search | 318 | 39 | $71,200 | −$9,800 | $61,400 | 12.3% |
| Organic | 127 | 22 | $38,900 | −$1,200 | $37,700 | 17.3% |
| Unknown | 46 | 5 | $8,100 | $0 | $8,100 | 10.9% |
| Total | 918 | 181 | $332,900 | −$18,050 | $314,850 | 19.7% |
Data as of today, 00:05 · Run 14 of 14 · Export · Share
Claude Desktop · connected to acme-co
You
How did sales by lead source look last quarter?
Claude
Net sales for acme-co last quarter were $314,850 across 181 won opportunities from 918 leads, a 19.7% close rate.
Referral is the strongest source on every measure: a third of its leads close. Paid search brings the most leads and closes 12.3% of them, and carries more than half of all cancellations.
| Source | Leads | Net | Close |
|---|---|---|---|
| Referral | 186 | $115,500 | 32.8% |
| Webinar | 241 | $92,150 | 22.4% |
| Paid search | 318 | $61,400 | 12.3% |
| Organic | 127 | $37,700 | 17.3% |
| Unknown | 46 | $8,100 | 10.9% |
applied — a cancellation is a separate negative row, not a flag; "Unknown" is a real source value
acme-co · data as of today, 00:05 · want this saved as a report?
The saved report takes parameters, remembers its defaults, keeps every run and exports. The agent's answer is a conversation — and one it can turn into that saved report when you ask.
See it working
Your numbers, the way you would actually look at them.
Pick a lead source. Every figure moves with it, because they all read the same governed datasets your agent does — one definition of a lead, one definition of a sale, whoever is asking.
Lead performance
2026 year to date · All sources
New leads
1,269
Opportunities won
296
Sales
$562.4K
Lead to won
23.3%
| Source | New leads | Won | Sales | Lead to won |
|---|---|---|---|---|
| Paid search | 486 | 84 | $142.8K | 17.3% |
| Referral | 231 | 96 | $198.4K | 41.6% |
| Webinar | 344 | 61 | $96.3K | 17.7% |
| Organic | 152 | 47 | $112.5K | 30.9% |
| Unknown | 56 | 8 | $12.4K | 14.3% |
| All sources | 1,269 | 296 | $562.4K | 23.3% |
Ask for anything. Keep what matters.
Connect ReportMojo to Claude and ask whatever you want — it reads your governed datasets, not raw CRM tables, so the answer already knows your rules. The questions worth asking again become saved reports that run themselves.
your assistant · connected to acme-co
You
Which lead sources should we put more money behind next quarter?
Organic and referral customers are each worth 20–40% more than one from paid search, and they cost a fraction as much to acquire. Paid search is buying volume, not value.
- Best value
- $2,394
- Lowest cost
- $18
- Worst return
- 2.1x
Worth knowing: 212 orders are not classified yet, so they sit outside these totals. Your data summary flagged them and told me how to fix it.
Net revenue per customer, by source
- Organic $2,394
- Referral $2,067
- Paid search $1,700
- Webinar $1,579
Referral customers acquired, by month
68 in Sep
Then ask it to keep the report.
The answer above was written for one question. Ask your assistant to save it and it becomes a report in your account — same definitions, same rules, running against tonight's data and every night after.
From there it takes parameters, exports, and shares as a link with the values you choose locked.
Customer value by source
saved report · Sales
By source
| Source | Customers | Net revenue | Avg each |
|---|---|---|---|
| Referral | 96 | $198,400 | $2,067 |
| Organic | 47 | $112,500 | $2,394 |
| Paid search | 84 | $142,800 | $1,700 |
| Webinar | 61 | $96,300 | $1,579 |
| Unknown | 8 | $12,400 | $1,550 |
| All sources | 296 | $562,400 | $1,900 |
applied — a cancellation is a separate negative row, not a flag — these are net of them, which is usually the first figure that stops matching whatever was used before
What you can do
Build it, share it, or ask for it.
The same modelled datasets sit behind everything, so whichever way you work you get the same numbers.
Build reports yourself
Describe the report you want and refine it turn by turn — columns, filters, totals, a chart, the parameters it should ask for. Each change is a draft you can undo or publish. What you keep is a report, not a transcript.
Share them
A share is a link to a live report with its parameters locked, so a colleague or a client opens today's numbers without an account and cannot widen it to rows you did not mean to show. Revoke it and the link dies.
Build dashboards in Claude Desktop
Add your account's connector and Claude reads the datasets, their rules and the real filter values before it queries. Ask for a dashboard and it builds one; share it the way you share anything else from Claude.
Ask in the app
A question about a number, asked next to the number. The same datasets and the same rules answer, and an answer worth keeping becomes a saved report.
Your data, modelled
Data shaped and defined for AI agents to understand.
Every Keap account is modelled the same way: a contact in the middle, the things that happen to a contact around it, and what they are grouped by at the edges. Each dataset states its grain, its key and its rules, so an agent knows what a row is before it counts one.
- orders joins to contacts on contact_id
- order_items joins to orders on order_id
- order_items joins to products on product_id
- payments joins to orders on order_id
- payments joins to contacts on contact_id
- transactions joins to payments on payment_id
- transactions joins to contacts on contact_id
- subscriptions joins to contacts on contact_id
- subscriptions joins to products on product_id
- contact_tags joins to contacts on contact_id
- contact_tags joins to tags on tag_id
- contacts joins to users on owner_id
- contacts joins to companies on company_id
- contacts joins to lead_sources on lead_source_id
Your vocabulary
Your business, defined once. Every agent and every report inherits it.
The standard datasets are your CRM as Keap records it, with no opinions. Your business has opinions: which tags mean a lead is real, which three of eleven statuses mean it is still being worked, what a sale is worth, whose records to leave out.
None of that is in the data, and no agent can guess it. ReportMojo models it into custom datasets for your account, with the rule and the reason written beside each column — documentation an agent actually reads, not a document nobody opens.
leads
custom dataset · as the agent sees it
- grain
- One row per lead. A contact becomes a lead the first time it is tagged New Lead, and only once — a second tagging is the same lead.
- is_active
- Tagged New Lead or Nurture, no Do Not Contact tag, and no opportunity already won or lost. Agreed with the account owner.
- source
- The lead source on the contact, or the campaign that applied the tag when the contact carries none. Never blank: unknown is a value here.
- excluded
- Staff, test records, and any contact tagged Vendor. They exist in the CRM and never appear in a report.
Illustrative. Your own definitions replace these, in your own words.
- Written where the agent reads it
- Each rule lives in the dataset's own description, next to the column it governs: the grain, what every column means, how completely it is filled in, and the traps that make a number wrong when ignored. An agent reads that before it queries. A colleague reads the same text in the app.
- One definition, every surface
- A definition is written once and answered from everywhere: your agent over the connector, the in-app chat, the report builder and every saved report. Change it, and every answer changes with it.
- Built with you, not guessed
- We capture your definitions in an interview about your business — what a customer is, what counts as a sale, what each tag means — and model them into your warehouse. You approve each one before anything relies on it.
Connect your AI agent today.
Connect a Keap account and let the first import run. Then add ReportMojo to Claude Desktop, ask it about your business, and have it build the reports you need.