go-notificationgo-notification
Channels/Email

Postmark

Highest inbox-delivery rate of the major email APIs. Transactional-only by design.

Postmark is opinionated — they only accept transactional mail and actively refuse marketing volume. That single choice is why they consistently top third-party deliverability tests.

Pricing

  • Free trial — 100 emails/month (stays free forever if you don't exceed that).
  • Paid — from $15/month for 10,000 emails.
  • Per-message cost drops to around $1.25 per 1,000 on higher tiers.

https://postmarkapp.com/pricing has the current breakdown.

Setup

  1. Sign up at https://postmarkapp.com.
  2. Create a server (Postmark's term for a sending context) — typically one for Transactional and one for Broadcast.
  3. Add and verify a sender signature (single address) or full domain auth (recommended).
  4. Copy the Server Token from the server's API Tokens tab.
main.go
import "github.com/gopackx/go-notification/channel/mail/postmark"

notifier.RegisterChannel("mail", postmark.New(postmark.Config{
    ServerToken: os.Getenv("POSTMARK_SERVER_TOKEN"),
    From:        "noreply@example.com",
    FromName:    "My App",
    MessageStream: "outbound",
}))

Configuration reference

FieldTypeRequiredDescription
ServerTokenstringyesPer-server API token.
FromstringyesVerified sender address.
FromNamestringnoDisplay name.
MessageStreamstringnoStream name. Default: outbound (transactional).
Timeouttime.DurationnoHTTP timeout per send. Default: 30s.

Why Postmark

  • Deliverability. If a user report "never got the email," Postmark is the fastest fix.
  • Clear separation. Broadcast (marketing) and transactional live on different IPs and streams — a spam complaint on one won't poison the other.
  • Bounce & complaint feedback comes back fast and structured.

Don't use Postmark for

  • Bulk marketing. They will ask you to move it to their Broadcast stream or to a different vendor. Ignoring this gets your account suspended.
  • High-volume low-value mail (signup notifications over millions/month at pennies each) — SES is cheaper.

Troubleshooting

  • 422 Unprocessable Entity — almost always a missing or non-verified sender signature.
  • Inactive recipient — Postmark suppresses previously-bounced addresses. Clear them from the dashboard or use a different address.
  • Multiple streams confused — make sure MessageStream matches an actual stream on the server you're pointing at.