Skip to main content
Live. This area is documented as current, user-reliable behavior.

Goal

Build reliable downstream automation from StackShift Mail events without trusting unsigned payloads.

Prerequisites

  • A public HTTPS webhook endpoint
  • Storage for webhook endpoint secret values
  • An idempotent event handler

Workflow

1
List events or inspect a message timeline when debugging.
2
Create a webhook endpoint with a URL and explicit eventTypes.
3
Store the returned secret immediately. It is returned on create and rotate.
4
Verify StackShift webhook signatures with timestamp tolerance before processing.
5
Use delivery detail and retry APIs for failed webhook deliveries.

Event types

  • Message events: mail.message.accepted, mail.message.queued, mail.message.sending, mail.message.mta_accepted, mail.delivery.delayed, mail.delivery.delivered, mail.message.bounced, mail.message.failed, mail.message.suppressed, and mail.message.complained.
  • Suppression events: mail.suppression.created and mail.suppression.deleted.
  • OTP events: mail.otp.created, mail.otp.sent, mail.otp.verified, mail.otp.failed_attempt, mail.otp.failed, mail.otp.expired, and mail.otp.canceled.
  • Template events: mail.template.created, mail.template.updated, mail.template.deleted, mail.template.version.created, and mail.template.test_queued.
  • Domain events: mail.domain.created, mail.domain.verified, mail.domain.failed, and mail.domain.deleted.
  • Webhook events: mail.webhook.created, mail.webhook.updated, mail.webhook.disabled, mail.webhook.delivery.succeeded, and mail.webhook.delivery.failed.
  • Operations events: mail.scheduled.created, mail.scheduled.canceled, mail.scheduled.dispatched, mail.scheduled.failed, mail.batch.created, mail.batch.completed, and mail.batch.failed.
  • Audience and campaign events: mail.audience.created, mail.audience.members.imported, mail.campaign.created, and mail.campaign.queued.
  • Inbound events: mail.inbound.domain.created, mail.inbound.domain.verified, mail.inbound.domain.routing_paused, mail.inbound.received, mail.inbound.quarantined, mail.inbound.failed, and mail.message.replied.
  • Reputation events include workspace/domain watch, throttled, and disabled states; limit changes; recipient-domain throttling; and manual-review outcomes.

Create a webhook

Verify a signature

Operational APIs

  • GET /mail/events filters by type, resourceType, resourceId, messageId, from, to, limit, and cursor.
  • GET /mail/messages/{id}/timeline returns timeline items with type, label, createdAt, and optional metadata.
  • GET /mail/webhooks/{webhookId}/deliveries filters webhook deliveries by status, limit, and cursor.
  • GET /mail/webhook-deliveries/{deliveryId} includes delivery attempts.
  • POST /mail/webhook-deliveries/{deliveryId}/retry requests a retry for a delivery.

Expected result

Your application processes mail lifecycle events once, verifies signatures, and can recover failed webhook deliveries.

Common failures

  • Webhook handler does not preserve the raw request body before JSON parsing.
  • Signature verification uses the wrong secret after rotation.
  • Handler is not idempotent and double-processes retried events.
  • Endpoint repeatedly returns non-2xx responses and deliveries move from failed toward abandoned.

Send email

Send a single outbound email with the official SDK or REST API, then inspect the message, attempts, logs, and timeline.

Bounces, suppressions, and reputation

Handle hard and soft bounces, workspace-scoped suppressions, sending limits, warmup stage, domain reputation, and reputation events.

Templates and OTP

Create versioned templates, preview and test them, send from a template, and use the built-in one-time-code challenge flow.