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

How-to guide

How to Decide When Cold Email Makes Sense in Your GTM Strategy

Four tests, one free count and one break-even number. You can run all of it in 20 minutes without spending a record.

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

Cold email makes sense under three conditions. Your buyers read email, you can name a reachable list of a few thousand of them, and the math clears break-even at a reply rate you can defend. If any of the three fails, pick another channel. This guide gives you a test for each, with queries you can run today.

TL;DR

  • Cold email fits when buyers use email at work, the offer is specific, and a reply is worth more than it costs to get one.
  • The check takes about 20 minutes and spends 0 LeadOcean records. A count is free.
  • Size the list first. If the count is under a few hundred, the channel is too small to learn from.

Prerequisites

  • A LeadOcean account on the free plan: start free, no card. The free plan has 1,000 records for life and 5 requests a second.
  • An API key exported as $LEADOCEAN_API_KEY.
  • curl and python3. Nothing else.
  • Your own numbers: average deal value, close rate, and what a month of sending costs you.

Step 1: Run the four tests on paper

Answer four questions before you touch a tool. A single "no" is enough to stop.

  1. Do your buyers work in email? A VP of Sales does. A line cook or a site foreman mostly does not. If the role lives on a phone or a job site, use the phone or an ad.
  2. Is the deal worth the effort? A cheap, self-serve product rarely repays a human-written sequence. A deal worth several hundred dollars or more does.
  3. Is the offer specific? "We do marketing" gets deleted. "We run outbound for Series A SaaS in the US" gets read.
  4. Does the math close? Step 4 below turns this into one number.

Write the answers down as config in gtm-channel-check.yaml so the next person can challenge them.

yaml
buyer_role: "VP Sales, US, B2B software"
reads_email_at_work: true
avg_deal_value_usd: 12000
close_rate_from_meeting: 0.20
offer_one_liner: "Outbound for Series A SaaS"
verdict_if_any_false: "pick another channel"

Step 2: Count the buyers you can reach (free)

Count the audience before you write a word. A count call is free and tells you if the channel has enough people in it. Send count=true as a query parameter with limit=1. The filters go in a flat JSON body, as arrays.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobLevel": ["C-Team", "VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"]
  }'

meta.total is capped at 100,000 on this endpoint. If you hit the cap, the audience is large and you should narrow it by industry or company size. If you work from an AI client, the MCP tool leadocean_count_leads runs the same count and also returns facets.

For companies, GET /v1/companies/count is the free equivalent, with breakdowns by industry, headcount band and HQ country.

Step 3: Check how many of them are mailable

A big list means nothing if the addresses bounce. Filter the count by email status to see the share you can send to. Valid values include verified, catch_all_valid and catch_all. Check them with leadocean_list_enum_values before you use one, because enum values are exact strings.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobLevel": ["C-Team", "VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "emailStatus": ["verified", "catch_all_valid", "catch_all"]
  }'

Compare the two totals. In the run below, 954,471 people match the role filters and 279,115 have an address worth sending to. That is about 29%. Plan for the smaller number.

LeadOcean does not refund bounced emails. Read email_status before you send.

Step 4: Compute your break-even reply rate

This is the test most guides skip. Take the numbers from Step 1 and solve for the reply rate at which cold email pays for itself. Save this as breakeven.py.

python
deal_value   = 12000   # average first-year value, USD
close_rate   = 0.20    # meeting to closed-won
meeting_rate = 0.40    # positive reply to booked meeting
monthly_cost = 1500    # tools + domains + your time, USD
emails_sent  = 4000    # per month

value_per_positive_reply = deal_value * close_rate * meeting_rate
breakeven_replies = monthly_cost / value_per_positive_reply
breakeven_rate = breakeven_replies / emails_sent

print(f"positive replies needed: {breakeven_replies:.1f}")
print(f"break-even positive reply rate: {breakeven_rate:.2%}")

With these placeholder inputs the script prints:

text
positive replies needed: 1.6
break-even positive reply rate: 0.04%

Swap in your own figures. If the break-even rate is above what you have seen from similar offers, cold email does not make sense yet. Fix the offer or the list before you scale volume.

Step 5: Read a small sample before you commit (optional)

Pull 25 real prospects and read them. If the titles and companies look wrong, your filters are wrong, and you learned that for 25 records instead of 25,000. This step spends records: one per person returned.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobLevel": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "emailStatus": ["verified"],
    "limit": 25
  }'

Page further with the cursor value from the response. One search pages to 10,000 rows, so narrow the filters rather than walking the whole index.

What you get

A real count run on 2026-10-21 through the leadocean_count_leads MCP tool, filters jobLevel: C-Team, VP, jobFunction: Sales & Business Development, country: US. It spent 0 records.

text
mailable (verified, catch_all_valid, catch_all): 279,115 people
all matching people, no email filter:             954,471
distinct companies:                               about 106,332 (not exact)
seniority split:  vp 129,494 | owner 127,722 | c_suite 21,899

This count is not a verified-only count. It is the default mailable set, which includes catch-all domains. The owner rows come from the C-Team level filter. Add employeeRange if you do not want owners of very small companies.

The response shape from the API reference for a count call, with placeholder values:

json
{
  "success": true,
  "data": [],
  "meta": {
    "total": 100000,
    "totalIsExact": false,
    "countOnly": true,
    "credits": 0
  }
}

data is empty on a count call. meta.total stops at 100,000, and totalIsExact: false marks it as a floor.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck that $LEADOCEAN_API_KEY is set in this shell and sent as x-api-key.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for the Retry-After header, then slow the loop.
402The free 1,000 records are spentCounts still work. Move to Solo ($97 a month) or Agency ($497 a month) to keep searching.
Empty resultsA filter value that is not an exact enum stringCall leadocean_list_enum_values or GET /v1/enums and copy the value exactly (C-Team, not c-team).
count rejected in the bodycount=true was sent in the JSON bodyMove it to the query string, as in Step 2.
Export stops50,000 rows a request or 500,000 a day reachedSplit the export by filter and run it over more than one day. Bulk CSV export is not on Free.

FAQ

When does cold email not make sense?

It does not make sense when your buyers rarely read work email or your reachable list is a few hundred people. It also fails when the break-even reply rate is above what you can get. In those cases an ad, a phone call or content works better.

How big should the list be before I start?

Big enough to learn from. A few thousand mailable contacts lets you test two or three offers and still have people left. The count in Step 2 tells you in seconds.

Does a larger list fix a weak offer?

No. A weak offer sent to more people produces more spam complaints and burned domains, not more meetings. Fix the offer on a small sample first.

Do I need a warm-up tool and a sequencer?

Yes, once you decide to send. LeadOcean supplies the data and the export. It has no sequencer, dialer or CRM. See the best cold email warm-up tools and the best cold email campaigns for the sending side, and using AI to personalize cold emails for the copy. More guides are in the blog.

What does it cost to find out?

Nothing for the decision. Counts are free, and the free plan includes 1,000 records for life. See pricing for paid plans.

Count your cold email audience before you buy a sequencer

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

Get your free API key →