Skip to main content
Liorry Herisnor
Runtime state: Running in productionInfrastructure

DNS Pre-warming Before Sending

Resolve every recipient domain before the first message leaves, and refuse to start when too few resolve — turning a confusing class of deferral into an immediate, legible failure.

Runtime state: Runs on every campaign start in the delivery engine, and the success-ratio floor genuinely aborts a start rather than warning.

Business objective
Never begin a send into an unknown routing picture, because the resulting deferrals look identical to throttling and get misdiagnosed hours later.
Trigger
A campaign start, before any message is transmitted.
Inputs
  • The campaign's recipient domain set
  • Configured minimum resolution success ratio
  • Whether pre-warm is required for this lane
Outputs
  • A warmed routing cache for the campaign's destinations
  • A resolution success ratio measured against the floor
  • Either a started campaign, or an aborted start with a specific reason

Why this exists

Deferrals caused by unresolved routing look exactly like deferrals caused by throttling. An operator sees a campaign delivering slowly, assumes the receiving provider is rate-limiting, and starts tuning concurrency — which does nothing, because the problem is that we cannot route to the destination at all.

The realization cost is hours, and it lands mid-campaign. This workflow moves the discovery to before the first message, where it costs a restart.

The workflow

Pre-warm and gate

The abort is the point. A warmed cache without a gate is an optimization; with a gate it is a safeguard.

  1. Automated software

    Collect the campaign's recipient domains

    Distinct destination domains extracted from the campaign's index.

  2. External service

    Resolve routing records

    Every distinct domain resolved concurrently, populating the routing cache.

  3. Automated software

    Measure the success ratio

    Successful resolutions as a proportion of distinct domains attempted.

  4. Approval gate

    Compare against the configured floor

    Decision point: Below the floor and pre-warm is required for this lane? Abort the start. Otherwise proceed with a warmed cache.

  5. Human action

    Operator sees a specific reason

    An explicit refusal naming the ratio, not a campaign that silently underperforms.

  6. Automated software

    Delivery starts with warm routing

    Workers resolve from cache rather than paying lookup latency on the first message to each destination.

  • Human action
  • Automated software
  • External service
  • Approval gate

Decision points

  • Is pre-warm required for this lane? Configured per lane, because a lane sending to a small, well-known destination set has different risk from one sending broadly.
  • Is the success ratio above the floor? The single gate. Below it, the start is refused.

Responsibilities

AI / LLM

  • Nothing. No model participates in this workflow at any point.

Deterministic

  • Domain extraction and deduplication.
  • Concurrent resolution and cache population.
  • Success ratio calculation.
  • The floor comparison and the abort decision.

Human approval points

  1. Configuring the floor and whether pre-warm is required for a lane.
  2. Deciding what to do after an abort — investigate the domain set, or proceed with pre-warm disabled for a lane where that is genuinely appropriate.

Failure handling

FailureResponse
Individual domain fails to resolveCounted against the ratio; the campaign is not blocked by one bad domain.
Success ratio below the floorAbort the start with the measured ratio in the message.
Resolver itself unavailableRatio collapses, gate aborts. Correct behavior — we genuinely cannot route.
Pre-warm not required for the laneCache is still warmed; the gate does not abort.

Monitoring

Resolution success ratio per campaign start, abort count and reason, cache hit rate during delivery, and resolution latency. A rising abort rate is a signal about list quality, not about the resolver.

More workflow designs

Back to the library