To warm up a Gmail or Google Workspace mailbox, authenticate the domain, send a few wanted emails a day and raise the volume slowly while bounces and spam reports stay near zero. Google publishes no day-by-day schedule. It publishes rules, and the ramp below is built on them.
This guide is the short version. It covers what Google says, then the one part LeadOcean can do: build a verified-only list and cut it into daily batches. LeadOcean does not send or warm mailboxes. Your sending tool does that.
TL;DR
- Takes about 30 minutes to set up and three weeks to ramp, with a 10-minute daily check.
- Costs 0 records to size the list and about 300 records to export it on the example ramp. Free has 1,000 records for life, but bulk CSV export needs Solo ($97 a month).
- Google tells you to start low, send at a steady rate and watch spam rate in Postmaster Tools (Google, September 2026). The numbers below are our plan, not an official schedule.
Prerequisites
- A Gmail or Google Workspace mailbox on a domain you control, with DNS access.
digon your machine.- A LeadOcean API key exported as
$LEADOCEAN_API_KEY. Get one free at app.leadocean.io. - Python 3 for the batch script in Step 4.
- Google Postmaster Tools set up for your sending domain.
Step 1: Know the Google rules
Three numbers from Google's sender guidelines decide how you ramp (Google, September 2026).
Authentication SPF or DKIM for all senders; SPF, DKIM and DMARC at 5,000+ messages a day
Spam rate keep it below 0.10% in Postmaster Tools; never reach 0.30%
Volume start low, send at a consistent rate, avoid bursts, avoid doubling suddenlyGoogle also says that if messages start bouncing or deferring, you should cut volume until errors fall, then increase slowly again. Messages that fail authentication can be rejected with a 5.7.26 error.
Check your DNS now:
dig +short TXT acme.com | grep spf
dig +short TXT google._domainkey.acme.com
dig +short TXT _dmarc.acme.comStart DMARC at p=none with a reporting address, and tighten it later.
v=DMARC1; p=none; rua=mailto:dmarc@acme.comStep 2: Size a verified-only list for free
A new Gmail sender has no history, so early bounces hurt most. Warm up on addresses marked verified, not the wider default that includes catch-all. Count first. A count costs no records.
From Claude, call the free MCP tool:
leadocean_count_leads
jobLevel: ["C-Team"]
jobFunction: ["Sales & Business Development"]
country: ["US"]
emailType: ["work"]
emailStatus: ["verified"]Or over REST, with count=true as a query parameter and limit 1:
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"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailType": ["work"],
"emailStatus": ["verified"]
}'meta.total is capped at 100,000. The call spends nothing.
Step 3: Export exactly what the ramp needs
Match the export limit to the ramp, not to a round number. The example ramp below sends 300 emails, so ask for 300 rows.
curl -s https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "gmail-warmup-us-csuite-sales",
"limit": 300,
"preset": "full",
"caps": {"emails": 1, "phones": 1},
"filters": {
"jobLevel": ["C-Team"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailType": ["work"],
"emailStatus": ["verified"]
}
}'Poll GET /v1/exports/{id}, then fetch GET /v1/exports/{id}/download. Each row is one record. The CSV headers come back as email_1_address and email_1_status.
Bulk export is not on Free. On Free, search with POST /v1/people/search, take each row's meta.source_ids.person_id, then call POST /v1/people/enrich with reveal_email: true. That path counts two records per person: the search row and the enrich. The Exports page in app.leadocean.io also shows the record price before you start.
Step 4: Cut the list into a daily ramp
Put the ramp in code so a daily batch is never a judgement call. One mailbox, weekdays only. These numbers are illustrative.
| Week | Sends a day | Sends in the week |
|---|---|---|
| 1 | 5 | 25 |
| 2 | 10 | 50 |
| 3 | 25 | 125 |
That is 200 emails, plus a 100-row reserve for re-sends and replacements, so the export of 300 rows covers it.
import csv
RAMP = {1: 5, 2: 10, 3: 25} # sends per day for one mailbox
with open("gmail-warmup-us-csuite-sales.csv", newline="") as f:
rows = [r for r in csv.DictReader(f) if r["email_1_status"] == "verified"]
day, i = 0, 0
for week, per_day in RAMP.items():
for _ in range(5): # Monday to Friday
day += 1
batch = rows[i : i + per_day]
i += per_day
with open(f"day-{day:02d}.csv", "w", newline="") as out:
w = csv.DictWriter(out, fieldnames=list(batch[0].keys()))
w.writeheader()
w.writerows(batch)
print(f"{i} rows sliced into {day} daily files, {len(rows) - i} held in reserve")Upload one file a day. Send at the same hour each day, in plain text, one question per message. Google asks for a consistent rate, not bursts.
Step 5: Gate each week on Postmaster Tools
Move up a week only when the last one was clean. The thresholds on spam rate are Google's. The bounce line is our rule of thumb.
Advance a week when ALL hold:
spam rate below 0.10% in Postmaster Tools (Google's line)
hard bounces under 2% of the week's sends (our rule)
auth failures none in the DMARC reports
If any fails: repeat the week at the same volume, or cut it, then climb again.Postmaster Tools can show no data for a day when the number of messages is too low (Google Postmaster Tools help, October 2026). At 5 sends a day you will rely on bounce counts and replies first. Do not read an empty dashboard as a clean one.
After week three, add 20 to 30 percent a week. Widen the list in this order: add a country or job function with verified, then catch_all_valid, then catch_all in its own batch so you can see its bounce rate alone. Re-run the Step 2 count for each slice.
What you get
The Step 2 count, run on 2026-10-21 with the free leadocean_count_leads tool:
{
"total": 42829,
"totalIsExact": true,
"distinctCompanies": 17197,
"credits": 0,
"unsupportedFilters": []
}That is 42,829 verified US work addresses for C-Team people in sales and business development, across 17,197 companies. It is far more than the 300-row export needs, and the count cost nothing.
The sliced output is a folder of daily files. This is the shape, with placeholder values:
$ python3 slice.py
200 rows sliced into 15 daily files, 100 held in reserve
$ wc -l day-01.csv day-15.csv
6 day-01.csv
26 day-15.csvEach file has a header row, so day 1 has 5 sends and day 15 has 25.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header. | Re-export $LEADOCEAN_API_KEY from app.leadocean.io and resend. |
| 429 | Requests above the plan's rate limit (5 a second on Free, 200 on Agency). | Honour Retry-After and slow the loop. |
| 402 | Out of records. Free has 1,000 for life. | Add a plan, or lower the export limit. |
| Zero results | A filter value is not an exact enum string, such as c_suite in jobLevel, which wants C-Team. | List valid values with leadocean_list_enum_values or GET /v1/enums. |
400 export_limit_rows | The export limit is above 50,000 rows a request. | Lower limit or split the pull. |
429 export_limit_daily | You passed 500,000 export rows in a day. | Wait for resetsAt in the response. |
FAQ
How long does Gmail warmup take?
Plan on three to four weeks for one mailbox at a few dozen sends a day. Google gives no fixed number. It says to start low and raise volume slowly (Google, September 2026).
Do I need a warmup tool?
No. A tool swaps traffic between mailboxes. You can warm a mailbox with real one-to-one email to verified contacts. A tool does not fix a bad list or missing authentication.
What is Gmail's daily sending limit?
Google's guidelines split senders at 5,000 messages a day, where DMARC and one-click unsubscribe become required (Google, September 2026). Workspace accounts also have their own sending limits. Check Google's current limits page for your plan.
Does LeadOcean warm my mailbox?
No. LeadOcean has no sending, sequencer or warmup. It builds the list and shows each address's email_status. Pair it with a sender. Related guides: inbox warming, inbox warm up and domain warm up.
What does this cost?
Sizing is free. The 300-row export costs 300 records, and bulk export needs Solo at $97 a month. See pricing.
Build your Gmail warmup list from verified addresses only
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →