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
- Sign up at https://postmarkapp.com.
- Create a server (Postmark's term for a sending context) — typically one for
Transactionaland one forBroadcast. - Add and verify a sender signature (single address) or full domain auth (recommended).
- Copy the Server Token from the server's API Tokens tab.
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
| Field | Type | Required | Description |
|---|---|---|---|
ServerToken | string | yes | Per-server API token. |
From | string | yes | Verified sender address. |
FromName | string | no | Display name. |
MessageStream | string | no | Stream name. Default: outbound (transactional). |
Timeout | time.Duration | no | HTTP 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
MessageStreammatches an actual stream on the server you're pointing at.