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

How-to guide

How to Compare 9 Salesforce Enrichment Tools (On Your Own 100 Contacts)

Listicles rank tools by who pays for placement. Run the same 100 Salesforce contacts through each tool and score the output yourself.

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

You do not need a ranked list of nine tools. You need a 100-contact test file, a scoring script and one afternoon. This guide gives you all three.

I did not run nine vendors for you. A list I wrote would be my data, not yours. Your Salesforce org has its own gaps, so the only fair test uses your records.

Related reading: best enrichment tools for Salesforce, more guides on the blog, what enrichment is and what waterfall enrichment is.

TL;DR

  • Export 100 random Salesforce contacts, send the same file to each tool, and score fill rate, match rate and bounce rate with one script.
  • Time: about 2 hours for the first tool, then 20 minutes per tool. Nine tools fit in two working days.
  • LeadOcean cost: up to 100 of the 1,000 records on the Free plan. Misses and sizing counts are free.

Prerequisites

  • A Salesforce login that can run a report and export CSV (Contacts with Id, Email, Title, Account Name, Website).
  • A free LeadOcean account and key, saved as $LEADOCEAN_API_KEY. Sign up at app.leadocean.io, no card.
  • Python 3.10 or newer and curl.
  • Trial or sample access to each tool you want to test. Ask each vendor for a 100-row sample. Do not pay before the test.

Step 1: Pull a random 100-contact test file

Random beats "our best accounts". Run a Salesforce report of Contacts, export it, then sample 100 rows with a fixed seed so every tool gets the same file.

python
import csv, random
rows = list(csv.DictReader(open("sf_contacts.csv")))
random.seed(42)
sample = random.sample(rows, 100)
w = csv.DictWriter(open("test100.csv", "w", newline=""), fieldnames=rows[0].keys())
w.writeheader(); w.writerows(sample)

Keep the Salesforce Id column. You join every result back on it.

Now blank out nothing. Tools see the same fields your reps see, because that is what your enrichment job will send in production.

Step 2: Size the market before you pay anyone

Check that a tool's coverage claim holds for your segment. The LeadOcean count is free, so use it as a reference point for how many people exist.

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

count=true goes in the query string, not the body. technologies narrows to companies whose website shows Salesforce. The response has meta.total and no data rows, so it costs nothing.

Step 3: Run the match test on LeadOcean

Enrich each test contact by LinkedIn URL or email. Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup.

python
import csv, os, requests, time
H = {"x-api-key": os.environ["LEADOCEAN_API_KEY"]}
out = []
for r in csv.DictReader(open("test100.csv")):
    body = {"email": r["Email"], "reveal_email": True}
    res = requests.post("https://api.leadocean.io/v1/people/enrich", json=body, headers=H)
    out.append({"Id": r["Id"], "status": res.status_code, "json": res.text if res.ok else ""})
    time.sleep(0.25)   # stay under 5 requests a second on Free
w = csv.DictWriter(open("leadocean_result.csv", "w", newline=""), fieldnames=out[0].keys())
w.writeheader(); w.writerows(out)

A person LeadOcean holds nothing for returns 404 and costs nothing. So your match rate is the share of 200 responses, and your spend is that same count.

Step 4: Send the same file to the other eight tools

Use each vendor's own import, sample or API path. Do not change the file between tools. Save every output as {tool}_result.csv with the Salesforce Id column intact.

Record three things per tool at upload time:

  1. The date and the plan or sample terms you ran under.
  2. The fields it promises to fill (work email, phone, title, company size).
  3. The price it quotes for 10,000 rows, with the pricing page URL.

For tools that run inside Salesforce, check their own install docs for which fields they write back. Describe only what their docs show.

Step 5: Score every tool with one script

Fill rate is the share of rows with a value. Match rate is the share of rows with any result. Agree on definitions before you see the numbers.

python
import csv, glob, collections
def score(path):
    rows = list(csv.DictReader(open(path)))
    n = 100
    got = lambda col: sum(1 for r in rows if (r.get(col) or "").strip())
    return {"match": len(rows)/n, "email": got("email")/n, "phone": got("phone")/n, "title": got("title")/n}
for p in sorted(glob.glob("*_result.csv")):
    print(p, score(p))

Adjust the column names per tool. Then send the emails it returned to a verifier and count hard bounces on a small, real send. A fill rate without a bounce rate rewards tools that guess.

Step 6: Check the title and company fields against Salesforce

An enrichment tool that overwrites a correct title with a stale one hurts you. Compare each returned title and employer with the Salesforce value, and hand-check 20 disagreements.

LeadOcean person enrich returns career history since October 2026: past roles, education, certifications and awards. Use the current role in contact_data.contact_current_experiences[] for the title field and keep past employers for context only.

What you get

This is the free LeadOcean count for a segment you might test, run through the MCP tool leadocean_count_leads on 2026-10-21. It spent 0 records.

json
{
  "filters": {
    "jobLevel": ["VP"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "technologies": ["Salesforce"]
  },
  "total": 4760,
  "totalIsExact": true,
  "totalAll": 8923,
  "distinctCompanies": 900,
  "credits": 0
}

The 4,760 is the mailable count: verified, catch-all valid or catch-all email. Those people work at 900 companies. Without the email condition the same filters match 8,923 people.

The record-level shape of an enrich response, from the API reference, with placeholder values:

json
{
  "success": true,
  "data": {
    "profile_data": { "...": "Jane Doe, headline, location" },
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "contact_emails": [{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }],
      "contact_phones": [{ "phone": "+14155550133", "type": "mobile" }],
      "contact_current_experiences": [{ "...": "VP Sales at Acme" }]
    },
    "resume_data": { "...": "past roles, education, certifications" }
  }
}

The values are placeholders, not a real person.

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY
429More than your plan's rate limit (5 a second on Free, 200 on Agency)Sleep between calls and honor the Retry-After header
402The 1,000 Free records are spentMove to Solo at $97 a month, or narrow the test
404 on enrichLeadOcean holds nothing for that personCount it as a miss. It costs no record
Empty search resultsAn enum value that is not an exact string, such as vp for jobLevelCheck leadocean_list_enum_values; jobLevel takes VP, seniority takes vp
Export refusedOver 50,000 rows a request or 500,000 a daySplit the export by filter. Bulk CSV export is not on Free

FAQ

Why 100 contacts?

It is enough to see big gaps and small enough to run nine tools in two days. If two tools land close on 100 rows, rerun both on 500.

Should I trust vendor accuracy claims?

Trust the number you measured on your own rows. Vendor figures use their own definition of "accurate" and their own sample.

Is one tool enough, or do I need a waterfall?

Run the test first. If the best single tool still leaves gaps in fields you need, a waterfall of two tools is worth the extra setup.

What does the LeadOcean side cost?

The Free plan covers the test: 1,000 records for life, no card. After that, Solo is $97 a month and Agency is $497 a month for teams. See pricing.

Score your Salesforce data before you sign a contract

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

Get your free API key →