Consent + suppression

PAD enforces consent at send-time. Marketing messages require an opt-in; transactional messages don't. Suppressions (bounces, complaints, manual blocks) override everything.

How a send is gated

  1. Resolve the recipient's email from their profile.
  2. Check suppressions for (workspace, email, channel). If present ⇒ status=suppressed.
  3. Check consents for (workspace, profile, channel, category):
    • category=marketing requires granted=true; default is opt-out
    • category=transactional defaults to opt-in; explicit granted=false still blocks
  4. Pass ⇒ render template, attach List-Unsubscribe headers, deliver.

Recording consent

await pad.consents.set({
  externalId: 'user_42',
  channel: 'email',
  category: 'marketing',
  granted: true,
  source: 'signup-form',
});

Preference center

Every send includes a signed link to /preferences/[token]. The recipient toggles categories there and PAD writes the consent rows on their behalf. No login required — the token authenticates the link.

Suppressions

Auto-added on hard bounce + complaint. Manually added via the dashboard or API. Cannot be removed via the API (defense against re-engaging known bad addresses); the dashboard has a danger-zone removal flow for ops.

List-Unsubscribe

Both List-Unsubscribe: <mailto:>, <https:> and List-Unsubscribe-Post: List-Unsubscribe=One-Click are set on marketing sends. Gmail and Outlook treat one-click unsubscribe as a strong deliverability signal.