SparkPost, now under the MessageBird / Bird umbrella, is the platform that ESPs themselves trust for transactional and high-volume marketing traffic. It runs on top of the same Momentum MTA that moves a meaningful slice of the world's legitimate email. The dashboards are enterprise-grade: deliveries, bounces, complaints, latency per pool. None of them tell you whether the email actually landed in the inbox.
Use the SparkPost /transmissions API with a cc_header containing the seed list, or add seed recipients inside the recipients array tagged via substitution_data. One subaccount per sending stream keeps reporting clean. Send placement data lands next to your throughput charts.
Why enterprise volume needs seeds more, not less
A startup sending 5,000 emails a day can feel their way through deliverability problems — support tickets pile up when the reset email is missing. An enterprise sending 50 million a month cannot. A 1% inbox drop on 50M is 500,000 lost placements, and it surfaces as a slight revenue dip three weeks later that nobody can attribute. Seeds give you the leading indicator, not the trailing one.
SparkPost's transmissions API is the right hook: every send flows through it, whether from a worker, a campaign tool, or a templating layer. Seed once at the API boundary, cover every stream.
Seeding via the transmissions API
SparkPost supports two clean patterns for adding seeds. The first is a global cc_header, which adds a single Cc-type delivery for every recipient in the batch. The second is adding explicit recipient objects in the recipients array with a flag that marks them as seeds for internal reporting.
POST /api/v1/transmissions
Authorization: your-api-key
Content-Type: application/json
{
"options": {
"open_tracking": true,
"click_tracking": true,
"transactional": false
},
"campaign_id": "fall-promo-2026",
"content": {
"from": {
"email": "promo@send.acme.io",
"name": "Acme"
},
"subject": "Autumn offers inside",
"html": "<p>...</p>",
"headers": {
"Cc": "seed1@inboxcheck.io,seed2@inboxcheck.io,seed3@inboxcheck.io"
}
},
"recipients": [
{ "address": { "email": "real-user@example.com" } }
]
}The Cc header approach is the simplest: SparkPost treats it as a standard SMTP header and the seed providers all receive a copy. The downside is that your real recipient sees the Cc line in their mail client. For marketing that is unusual and some recipients will complain.
The recipients-array pattern (recommended)
The better pattern is adding seed addresses as full recipients with a substitution flag so you can filter them in reports:
{
"campaign_id": "fall-promo-2026",
"content": { "from": "...", "subject": "...", "html": "..." },
"recipients": [
{ "address": "real-user@example.com" },
{
"address": "seed1@inboxcheck.io",
"substitution_data": { "is_seed": true, "seed_pool": "gmail" },
"tags": ["seed"]
},
{
"address": "seed2@inboxcheck.io",
"substitution_data": { "is_seed": true, "seed_pool": "outlook" },
"tags": ["seed"]
}
]
}With tags: ["seed"] on the seed entries, SparkPost reporting will let you filter the seed tag out of open/click metrics so seeds do not dilute your real-audience engagement numbers.
Subaccount setup for clean attribution
SparkPost subaccounts are isolated sending identities that share the parent account's IPs and billing but carry their own API keys, sending domains and reporting. For seed testing at scale the right topology is:
- Per-stream subaccount. One subaccount per product surface:
sa-transactional,sa-marketing,sa-product-notifications. Reputation, bounces and complaints attribute cleanly. - Seed events surface per subaccount. When seeds land in Junk on the marketing subaccount but Primary on transactional, you know the shared IP pool is fine — the marketing content or authentication is the issue.
- Dedicated IP pools per subaccount (at volume). Over 1M sends/month consider a dedicated pool. Seed placement is the leading signal for whether the pool is warming healthily.
The free Inbox Check tool generates 20+ fresh seed addresses per test across Gmail, Outlook, Yahoo, Mail.ru, Yandex, ProtonMail and more. No signup, no credit card.
What the SparkPost reports miss
SparkPost dashboards are excellent at what they measure. Placement is not one of those things. Here is the gap, concretely:
- Delivered is not inboxed. A 250 response from Gmail means Gmail accepted the message. The dashboard shows “delivered”. Gmail may still have filed it in Spam or Promotions.
- Engagement lags. Open rate eventually reflects poor placement, but by then you have burned through a full campaign. Seed placement is instant: within five minutes of the send you know folder distribution.
- Per-provider blind spots. SparkPost tells you global bounce rate. It does not tell you that Outlook-only Junk rate jumped while Gmail stayed clean — the kind of asymmetry that points to SPF alignment or DKIM domain selector problems.
The operational pattern at scale
Treat seed tests as a first-class observability surface, not a one-off QA activity. A pattern that works at enterprise volume:
- Pre-flight seed. For any campaign over 100K recipients, send to a seed-only segment 10 minutes before the real transmission. Pipeline aborts on Junk-rate > 10%.
- Continuous seed on transactional. Seed 0.1% of every transactional stream. Alerting fires when Gmail Primary rate drops below 90% on a 1-hour rolling window.
- Post-mortem seed. When bounce or complaint spikes trigger an incident, a manual seed test gives you per-provider current state while the support thread is still open.