Matrix: M26M28M29
Open in panel — /app/shaping
Configuration

Shaping & Warmup Policy

PostMTA uses a Kumo-native shaping system driven by epoch bumps and warmup ladders. Shaping controls the rate at which a workspace can inject messages into the delivery network. Warmup is the process of gradually increasing an IP or domain's sending quota to build reputation with recipient mail servers.

Epoch System Overview

An epoch is a named, tiered sending bucket that defines a maximum delivery rate. Each epoch has:

Workspaces start at epoch 0 (minimal sending) and are bumped to higher epochs as their sending history and reputation grow. Epoch bumps can be manual (operator-initiated) or automatic (triggered by sustained good behaviour).

Epoch Reference

EpochNameDaily CeilingBurst AllowancePriorityTypical Stage
epoch_0Cold Start10050/hr max burstlowestNew domain, new IP
epoch_1Warmup500200/hr max burstlowDays 8-14
epoch_2Ramp5,0001,000/hr max burstnormalDays 15-21
epoch_3Production20,000+4x daily / 1hr rollinghighDay 22+
epoch_customCustomConfiguredConfiguredconfiguredEnterprise tiers

Warmup Ladder

The warmup ladder defines the rate at which a new sending identity (IP address or sending domain) increases its daily sending quota over a 30-day ramp. This gradual increase gives recipient mail servers time to learn to accept mail from the new source.

Warmup Schedule

PhaseDaysDaily VolumeTarget Recipients/DayNotes
Phase 1Days 1-7100/day100Seed with major providers (Gmail, Microsoft) first to build seed reputation
Phase 2Days 8-14500/day500Expand to secondary providers and ISP addresses
Phase 3Days 15-215,000/day5,000Broad sending. Monitor bounce rates carefully.
Phase 4Days 22-3020,000+/day20,000+Full production volume. Epoch bump to production recommended.
Do not skip phases. Accelerating through warmup phases risks triggering spam filter heuristics at major providers (Gmail, Outlook, Yahoo). If bounce rates spike during warmup, revert to the previous phase and hold there for 3-5 additional days before retrying.

Apply Shaping Policy

To manually set the epoch or warmup schedule for a workspace, sending domain, or IP pool, POST to the policy apply endpoint:

curl -X POST https://api.postmta.com/v1/panel/policy/apply \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "target_type": "workspace",
    "target_id": "ws_01HXABC123DEF456",
    "policy": {
      "epoch": "epoch_2",
      "warmup_ladder": "default_30day",
      "burst_enabled": true,
      "max_burst_multiplier": 4
    },
    "apply_at": "2026-07-18T12:00:00Z",
    "reason": "Customer upgraded to Growth plan"
  }'

Response:

{
  "policy_job_id": "pj_01HXPOLICY001",
  "target_type": "workspace",
  "target_id": "ws_01HXABC123DEF456",
  "previous_epoch": "epoch_1",
  "new_epoch": "epoch_2",
  "scheduled_at": "2026-07-18T12:00:00Z",
  "status": "scheduled"
}

Policy Jobs

Policy changes are executed as asynchronous jobs. You can query the status of a policy job:

curl https://api.postmta.com/v1/panel/policy/jobs/pj_01HXPOLICY001 \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx"

Job Types

Job TypeDescriptionTypical Duration
epoch_bumpMove a workspace, domain, or IP from one epoch to another. Re-calculates shaping limits and updates queue schedulers.30-60 seconds
warmup_applyAssign or update the warmup ladder for an IP or sending domain. Triggers the daily volume schedule.60-120 seconds
shape_resetEmergency reset of shaping to epoch_0. Used when a sending domain or IP is suddenly blocklisted or reputation-collapses.Immediate

Suppression Enforcement at INJECT Time

When a message is injected into the delivery pipeline, PostMTA checks the recipient against the workspace suppression list in real time. Suppressed recipients are rejected at INJECT, not at send time. This prevents wasted delivery attempts and protects sender reputation.

Suppression checks cover:

{
  "suppression_result": "rejected",
  "reason": "hard_bounce",
  "suppressed_at": "2026-07-18T10:05:32Z",
  "original_bounce_code": "550 5.1.1 User unknown",
  "original_bounce_at": "2026-07-15T08:12:00Z"
}

Messages rejected at INJECT due to suppression do not consume a credit — the HOLD is automatically VOIDed and the credits are returned to the balance.

Verified From Requirement in Production

All production sends (epoch_2 and above) must use a Verified From address. A Verified From address is one where the sending domain has passed DKIM, SPF, and DMARC verification and has been confirmed by PostMTA's verification flow.

How verification works: When you add a sending domain in the PostMTA dashboard or via POST /v1/domains, PostMTA generates the DKIM record and guides you through DNS setup. Verification is complete when all three DNS records (DKIM, SPF, DMARC) are confirmed present and valid.

Attempts to send from an unverified domain in a production epoch return:

{
  "error": "unverified_sending_domain",
  "code": 400,
  "message": "Sending from 'mail.unverified.com' requires domain verification. See POST /v1/domains to add and verify this domain.",
  "domain_status": "pending"
}

View Current Policy State

curl https://api.postmta.com/v1/panel/policy/current \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx"

Response:

{
  "workspace_id": "ws_01HXABC123DEF456",
  "current_epoch": "epoch_2",
  "warmup_ladder": "default_30day",
  "warmup_day": 18,
  "current_daily_limit": 5000,
  "burst_multiplier": 4,
  "burst_current": 1834,
  "burst_reset_at": "2026-07-18T11:00:00Z",
  "suppression_list_count": 1247,
  "last_epoch_bump_at": "2026-07-10T00:00:00Z",
  "next_auto_bump_eligible": "2026-07-24T00:00:00Z"
}

Shaping Policy Alerts

Configure alerts for: