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

How-to guide

How to Audit Cold Email Deliverability When Your Sequencer Says Green (Gmail and Postmaster)

A green sequencer only means the server accepted the mail. Here is a 30-minute audit with real queries, and a list check you can run for free.

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

A green sequencer dashboard means the receiving server accepted your message. It does not mean the message reached an inbox. Gmail can accept a message and then file it as spam.

This audit checks what Gmail itself thinks of you, then checks the one input you control most: the list.

TL;DR

  • Check three things in order: Google Postmaster spam rate, DNS authentication, and the email status mix of your list.
  • It takes about 30 minutes. The counts are free. An optional 500-row pilot export spends 500 LeadOcean records.
  • Google asks senders to keep the spam rate below 0.10% and never reach 0.30% (Google, September 2026). Above that, fix the list before you touch copy.

Prerequisites

  • A sending domain you can add a DNS TXT record to.
  • Access to the Google Postmaster Tools site for that domain.
  • dig on your machine (macOS and Linux have it).
  • A LeadOcean API key in $LEADOCEAN_API_KEY. The Free plan works: 1,000 records for life, no card, 5 requests a second.
  • The CSV or list your sequencer sent from.

Step 1: Read Postmaster before the sequencer

Open Google Postmaster Tools, add your sending domain and verify it with the TXT record Google gives you. Postmaster shows data only on days when you send enough mail to Gmail users. If the charts are empty, your volume is too low to judge, and you should lean on Steps 2 and 3.

Read three panels:

PanelHealthyAct now
Spam rateBelow 0.10%0.30% or higher
Domain reputationHighLow or Bad
Delivery errorsNoneRepeated 421 or 550 codes

A rising spam rate with a flat sequencer dashboard is the exact pattern in the title. The sequencer reports acceptance. Postmaster reports user behavior.

Step 2: Check DNS authentication

Authentication failures are the cheapest finding to fix, so check them before you look at data. A domain that fails here will lose reputation no matter how clean the list is. Run the three lookups below from a terminal, not from a web checker, so you see the raw records.

Gmail expects SPF, DKIM and DMARC on the domain you send from. Query all three:

bash
dig +short TXT acme.com | grep -i spf1
dig +short TXT selector1._domainkey.acme.com
dig +short TXT _dmarc.acme.com

Replace acme.com with your sending domain and selector1 with the selector your sender uses. You want one SPF record, a DKIM key that resolves, and a DMARC record with at least p=none.

Typical output for a healthy domain, with placeholder values:

text
"v=spf1 include:_spf.example.net ~all"
"v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
"v=DMARC1; p=none; rua=mailto:dmarc@acme.com"

Two SPF records, an empty DKIM answer or a missing DMARC line is a finding. Fix it before you send again.

Step 3: Size the risky part of your list for free

Bounces and spam complaints trace back to the list. Every LeadOcean people record carries an email_status, one of 13 values, and you can count by status without spending a record.

Send count=true as a query parameter with limit=1. The response carries meta.total and an empty data array (API reference, September 2026).

The first call counts the people you would have mailed, the default mailable set. The second counts the same audience in statuses you should never send to.

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":["VP"],"jobFunction":["Sales & Business Development"],"country":["US"],
       "emailStatus":["verified","catch_all_valid","catch_all"]}'

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":["VP"],"jobFunction":["Sales & Business Development"],"country":["US"],
       "emailStatus":["spam_trap","invalid","abuse","disposable"]}'

You can run the same counts from Claude or any MCP client with the free leadocean_count_leads tool.

Step 4: Compare against your own list

Open the CSV your sequencer sent. Count the share of addresses that are role accounts (info@, sales@), free-mail domains and addresses with no verification result. If you have no per-row status, your list is unverified, and the gap in Step 3 is your estimate of the exposure.

Then export a small clean pilot for the same audience and send only that for a week. Keep it to 500 rows. The columns list asks for each address and its status, so you can check every row before it goes to the sequencer.

bash
curl -s -X POST https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "clean pilot VP sales US",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Sales & Business Development"],
      "country": ["US"],
      "emailStatus": ["verified", "catch_all_valid"],
      "emailType": ["work"]
    },
    "limit": 500,
    "columns": ["profile_first_name","profile_last_name","current_job_title",
                "current_company_name","current_company_domain","email_N_address","email_N_status"]
  }'

An export takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan. On Free, page a search instead, or use the app's Exports page to see the price first. LeadOcean gives no refund for bounced emails, so read email_status on every row.

Watch Postmaster for a week. If the spam rate drops with the clean pilot and nothing else changed, the old list was the cause. For the mechanics of traps, see what a spam trap is. For the sending side, see how to automate email outreach with a sequencer.

Step 5: Decide what to change first

Do one change at a time, so Postmaster can show which one worked. Use this order.

  1. Fix authentication. A broken SPF or DKIM record makes every other fix useless.
  2. Stop sending to statuses that never convert. That means spam_trap, invalid, abuse and disposable, plus role accounts such as info@.
  3. Cut daily volume per mailbox by half for a week, so fewer people see the mail while you test the other fixes.
  4. Add a visible unsubscribe line and honor it the same day. The spam rate counts user complaints, not bounces.
  5. Only then touch subject lines and copy.

Log the date of each change next to the Postmaster spam rate. A two-column sheet is enough. When the rate falls, you will know which row to thank.

Step 6: Set a standing check

An audit that runs once is a postmortem. Put a recurring check on the calendar: Postmaster spam rate every Monday, a status count before every new list, and a pilot of 500 rows before every new segment.

A tiny script keeps the count step honest. It exits non-zero when the do-not-send share of an audience passes 20%, so you can run it before a campaign launches.

bash
BAD=$(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":["VP"],"country":["US"],"emailStatus":["spam_trap","invalid","abuse","disposable"]}' \
  | jq '.meta.total')
ALL=$(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":["VP"],"country":["US"],"emailStatus":["verified","catch_all_valid","catch_all","risky","unknown","untested","invalid","role","disposable","spam_trap","abuse","derived","none"]}' \
  | jq '.meta.total')
echo "do-not-send: $BAD of $ALL"
[ $((BAD * 5)) -gt $ALL ] && exit 1

The 20% threshold is a house rule for this script, not a Google number. Pick your own. Note that meta.total is capped at 100,000, so on broad audiences narrow the filters until both counts sit below the cap.

What you get

Output from the free leadocean_count_leads MCP tool on 2026-10-21, filters jobLevel VP, jobFunction Sales & Business Development, country US:

text
Default mailable set (verified, catch_all_valid, catch_all)
  total: 129494   totalIsExact: true   distinctCompanies: about 58121 (estimate)
  totalAll (no email condition): 350517

emailStatus = spam_trap, invalid, abuse, disposable
  total: 32700    totalIsExact: true   distinctCompanies: 22098
  credits: 0

These are counts by status, not a promise of deliverability. The first number is the default mailable set. The second is the do-not-send set for the same audience. The do-not-send group is 32,700 of the 350,517 in totalAll, about 9%. An unverified list carries that group with it, and a sequencer will happily send to every one.

Response shape from the API reference for a search page, placeholder values:

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": { "has_email": true, "email_status": "verified", "email_type": "work" },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": null }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported in this shell
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off for the Retry-After seconds, then retry
402Records spent (Free is 1,000 for life)Counts stay free. Pick a paid plan on pricing to export
total: 0 with a valid filterWrong enum string, such as vp instead of VP for jobLevelList exact values with GET /v1/enums or leadocean_list_enum_values
Export refusedOver 50,000 rows a request, 500,000 a day, or on the Free planLower limit or split the request

FAQ

Why does my sequencer say delivered when Gmail sends it to spam?

The sequencer records that the receiving server accepted the message. Placement happens after that, inside Gmail, and only Postmaster and seed tests show it.

What spam rate is too high?

Google says to keep it below 0.10% and avoid reaching 0.30% (Google, September 2026). Treat 0.30% as the line to stop and fix.

Can a clean list fix a bad domain?

It stops new damage. It does not erase history. Pause, fix authentication, send a small clean batch, and scale as Postmaster recovers.

Does a verified status guarantee inbox placement?

No. It lowers bounces and trap hits. Copy, volume and complaint rate still count. Read the CAN-SPAM rules for cold email as well. More guides are in the blog.

Audit your list before the next send

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

Get your free API key →