Skip to content

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.

Sales dashboard

2026 year to date

New leads

1,284

Opportunities won

312

Sales

$486K

New leads by month

Opportunities by stage

Opportunities by stage, illustrative figures
Contacted 918
Qualified 604
Proposal sent 371
Won 312
Sources contacts orders lead_sources governed datasets acme-co, data as of 2 hours ago

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

Period: Last quarter Rep: All
Net sales
$314,850
Won
181
Close rate
19.7%

By source

Sales by lead source, last quarter, illustrative figures
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.

The agent's table of the same figures
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%

New leads by month peak 157 in Sep
Sales by source
Sources contacts orders lead_sources governed datasets acme-co, data as of 2 hours ago

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

Jan May 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

Period: Year to date Value: Net of refunds
Customers
296
Net revenue
$562,400
Avg per customer
$1,900

By source

Customer value by source, illustrative figures
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

Sources contacts orders lead_sources governed datasets Data as of today, 00:05 Export · Share

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.

The standard Keap datasets and how they join contacts + custom fields users companies lead_sources tags contact_tags transactions orders order_items products payments subscriptions
  • 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
Facts: one row per thing that happened Dimensions: what they are grouped by Custom fields land on contacts, one column each.

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.