Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Build a Pipeline Coverage Report (Claude Code and LeadOcean)

Your CRM tells you the stage. This report tells you whether each open deal has anyone senior to talk to. Counts are free.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

TL;DR

  • Claude Code reads a CSV export of your open deals and asks LeadOcean how many senior, mailable people exist at each account. Deals with none are your risk list.
  • It takes about 20 minutes and spends 0 LeadOcean records. Counts, filter lists and enum lookups are free.
  • LeadOcean is not a CRM and does not know your deal stages. You bring the CSV. LeadOcean answers who else is there.

Prerequisites

  • A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off, with 5 requests a second.
  • Claude Code installed, and the LeadOcean MCP server added (see Connect LeadOcean to Claude Code). The Claude Code MCP docs cover the command.
  • An API key exported as $LEADOCEAN_API_KEY, for the scripted version in Step 3.
  • A CSV export of open opportunities from your CRM with account, domain, stage, amount and owner columns.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"
claude mcp add --transport http leadocean https://api.leadocean.io/mcp

Step 1: Define "covered" as a filter

Pick the people a deal needs, then write that as filters. Here, covered means at least one mailable VP or Director in Sales & Business Development.

Ask the free tools for exact enum values first. Enum filters are exact strings, so Sales & Business Development works and sales does not.

text
Use leadocean_list_enum_values to confirm the jobFunction value for sales.
Then use leadocean_count_leads with jobLevel ["VP","Director"],
jobFunction ["Sales & Business Development"], country ["US"],
industry ["Software Development"], employeeRange ["51-200"],
facets false. Tell me the total and distinctCompanies.

Counting costs 0 records, however often you run it. By default it counts only verified, catch_all_valid and catch_all addresses, so the total is the mailable audience.

Step 2: Check your whole market once

Before any deal-level work, size the market your deals come from. leadocean_count_companies counts companies and takes the same style of filters.

text
Use leadocean_count_companies with industry ["Software Development"],
employeeRange ["51-200"], hqCountry ["US"], hasMailableContacts true.
Give me the total and the top five HQ states.

REST has the same free call: GET /v1/companies/count. If your open deals sit in one narrow slice of this number, you have a concentration problem the CRM will not show you.

Step 3: Count senior contacts per deal account

Now the deal-level check. Send each domain from the CSV through a free count. count=true goes in the query string, not the body, and limit stays at 1.

bash
tail -n +2 pipeline.csv | cut -d, -f2 | sort -u | while read -r d; do
  n=$(curl -s "https://api.leadocean.io/v1/people/search?count=true" \
    -H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
    -d "{\"domain\":[\"$d\"],\"jobLevel\":[\"VP\",\"Director\"],\"emailStatus\":[\"verified\",\"catch_all_valid\",\"catch_all\"],\"limit\":1}" \
    | jq '.meta.total')
  echo "$d,$n"
  sleep 0.25
done > coverage.csv

The sleep 0.25 keeps you under 5 requests a second on Free. Above the limit you get a 429 with Retry-After. The emailStatus filter keeps only verified and catch-all addresses, so a zero means no senior person you can email, not no senior person. The REST search applies no email default, so leave that filter in.

Step 4: Let Claude Code join it to the pipeline

Claude Code is good at the join and the narrative. Give it both files and a plain instruction.

text
Read pipeline.csv and coverage.csv. Join on domain.
Output a markdown table of open deals with amount over 20000,
sorted by amount, with columns: account, stage, owner, amount, senior_contacts.
Then list every deal where senior_contacts is 0 and name the owner.
Do not call any LeadOcean tool that returns people. Counts only.

The last line matters. Search, get_lead and find_phone spend records. Counts do not.

Step 5: Spend a few records on the gaps

For the worst two or three deals, pull the named people. One search page of 5 is 5 records. This is optional and the only step that spends anything.

bash
curl -s https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
  -d '{"domain":["acme.com"],"jobLevel":["VP","Director"],"limit":5}' | jq '.data | length'

To fill a gap with a direct contact, enrich by person_id with POST /v1/people/enrich. Since October 2026 the response includes career history in resume_data, which helps a rep decide who to approach first.

What you get

The Step 1 count is a real result. We ran it with the free leadocean_count_leads tool on 2026-10-21 (trimmed).

json
{
  "total": 4926,
  "totalIsExact": true,
  "totalAll": 12176,
  "distinctCompanies": 2348,
  "credits": 0
}

That is 4,926 mailable VPs and Directors in sales across 2,348 US software companies with 51 to 200 staff. Without the email condition, the same filters match 12,176 people.

The Step 2 count (leadocean_count_companies, 2026-10-21) returned 6,143 such companies with at least one mailable contact. California held 1,681 of them and New York 621.

The final report looks like this. The rows are placeholders, not real deals.

text
| account | stage    | owner    | amount | senior_contacts |
|---------|----------|----------|--------|-----------------|
| Acme    | Proposal | Jane Doe | 48,000 | 6               |
| Globex  | Demo     | John Roe | 32,000 | 0               |

At risk: Globex (John Roe), no mailable VP or Director on file.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyRe-export $LEADOCEAN_API_KEY from app.leadocean.io.
429Above your plan's rate limit (5 a second on Free, 200 on Agency)Add sleep, or honour Retry-After.
402Out of recordsCounts stay free. Searching and enriching need records or a paid plan.
meta.total is 0 for a known accountEnum value misspelled, or no mailable contactCheck values with leadocean_list_enum_values. Widen jobLevel.
Empty data on a countcount=true returns counts onlyThat is expected. Read meta.total.
Export refusedBulk CSV export is not on Free; limit is 50,000 rows a request and 500,000 a dayUse Solo ($97 a month) or page the search with cursor.

FAQ

Does LeadOcean replace my CRM report?

No. LeadOcean has no deals, stages or sequencer. Your CRM owns stage and amount. LeadOcean adds who is at the account.

Does Claude Code spend my records?

Only if it calls a tool that returns people, such as search or get_lead. Tell it counts only, as in Step 4.

Can I run this on the free plan?

Yes. Counts cost nothing, and the 5-record gap check fits well inside 1,000 records.

How fresh is the data?

The dataset is refreshed monthly, and each record carries its own fetched_at date. Re-run the report monthly.

Where do I go next?

Find out which open deals have nobody senior to call

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →