Knowledge base

Seeding campaigns with control addresses

automatic inline seeding
Someone else’s mailboxes instead of your own

The task is one and old: find out where a message lands — in the Inbox or in Spam. Neither accounting nor metrics answer it: the receiver responds “accepted” the same way in both cases. The only way is control mailboxes at the mailbox providers themselves.

The vendor offers to do this for you. The addresses are set up on its side, the engine inserts them into a campaign by itself, and the result is visible in its tool.

The mechanism is independent of event export. <signals> and seeding are enabled separately; but if both are used, the subaccounts must be consistent — the vendor stipulates this separately, and adds that there is no rule-based selection here at all, unlike with the export.

The scope is set with a separate line — enable-inline-seeding, and it has three levels: node, pool, sending address. The inheritance rule is the usual one, the pool is stronger than the node. A subtlety: the value true without a subaccount does not inherit the subaccount from above but resets it.

The main trap is treating seeding as a deliverability measurement. It measures folder placement for a handful of control addresses, not for your recipients. It is an indicator, not statistics: it catches the direction of changes, not their size.
What the Hub does. It does not use it.

🔎 The task, however, is ours. Control mailboxes — what we planned to use to measure folder placement — run into a problem the vendor has solved here for money: polling mailboxes from one address ends with them being blocked, which means a proxy is needed. For now this part is postponed, and the dashboard shows deliverability by receiver responses (250 / 4xx / 5xx), not by folder.

🔎 The mechanism’s limitations are worth knowing for our own implementation too: a message must carry a job ID, be no larger than 20 MB and have a sender header. We have the first; the rest are reasonable conditions for any such scheme.

Recommended values

The mechanism has no values of its own — it is assembled from the block and the scope line:

What With what Default
access to the service api-key in the block none, mandatory
scope enable-inline-seeding true on the node if the block exists
conversation rhythm batch-frequency, persist-threshold 15 seconds, 5 messages
decision cache eligibility-ttl 5 minutes
The four operating conditions, the message requirements, the campaign definition, independence from event export and the scope inheritance rule come from the manual (§ 11.2, § 11.2.1). The “indicator, not statistics” assessment is ours.
Example configuration
# the block grants access, the scope line says where exactly to seed
<inline-seeding>
    api-key 0123456789abcdef012345678901234567890123
</inline-seeding>

enable-inline-seeding true,subaccount=555
<virtual-mta v3>
    enable-inline-seeding true
</virtual-mta>
v3 has the value true without a subaccount: it will not inherit the node’s subaccount but reset it. This is not a vendor typo but documented behavior.
yellow — — directive names, blue — blocks. They are highlighted the same way in the text of the card.
▲

Common mistakes and problems

what people get wrong and how it ends3 mistakes▶

Expecting seeding for a mailing without a job ID

§ 11.2

What it costsA campaign is defined by the job ID, the domain and the subaccount. Without an ID there is no campaign, and nothing to seed.
How to spot itSome mailings get seeded, some do not.
How to do it rightSet a job ID on all mailings.

Writing true without a subaccount on a sending address

§ 11.2.2.1

What it costsA value without a subaccount does not inherit it from above but resets it. This stream’s seeding data will go out without being tied to a client.
How to spot itSome streams have an empty subaccount in the data.
How to do it rightSpecify the subaccount explicitly at every level where the scope line is written.

Reading the seeding result as deliverability statistics

our experience

What it costsWhat is measured is folder placement for a handful of control addresses. It does not and cannot give the rate across your list.
How to spot itAccording to seeding “everything is in the Inbox,” while complaints and bounces grow.
How to do it rightTreat it as an indicator of direction, and calculate the rate from receiver responses and complaints.
Compatibility
PowerMTA 6.0
described in the manual of this version · platform: any
The vendor does not state the first version for every directive — there is no note here. The name also appears in the 5.0 edition of the manual.
Inheritance
The mechanism itself has no inheritance, but the scope line does, and it is three-level: node → pool → sending address, with the pool stronger than the node. Settings inside the block are not inherited at all — there is one block on a node.
How to check on the node
Its operation is visible in the engine log and in the vendor’s tool:
grep -i "seed\|inline" /var/log/pmta/log | tail -20
Calls to the service mean the mechanism works. Seeds in the mailing itself look like ordinary recipients in accounting — only the metrics tell them apart, by the srcType label.
In the Hub
Cost of a mistake
reversible: harms only while it is set
Scenarios
Troubleshoot deliverability · Seeding and seed mailboxes