postmark — Claude Code skill: email, templates, webhooks
A routing skill for Postmark: it tells the agent which sub-skill to use for sending mail, inbound processing, templates or webhooks.
npx skills add ActiveCampaign/postmark-skills --skill postmark -a claude-codeWhat postmark does
The skill sends nothing itself. It reads the task and points the agent at one of the sub-skills: postmark-send-email for single, batch and template-based mail, postmark-inbound for incoming email over webhooks, postmark-templates for server-side Handlebars templates, postmark-webhooks for delivery events, and postmark-email-best-practices for SPF, DKIM, DMARC and CAN-SPAM, GDPR and CASL compliance.
Inside there is a routing table keyed to phrases like sending an email or setting up bounce handling, a token reference, and an SDK install table matched to project files: package.json gets npm install postmark, requirements.txt gets pip install postmarker, Gemfile gets gem install postmark, composer.json gets composer require wildbit/postmark-php, *.csproj gets dotnet add package Postmark. You need a Server API Token from the Postmark dashboard, sent in the X-Postmark-Server-Token header.
The real trap is webhooks. Outbound events and inbound email run on separate infrastructure with different retry schedules: outbound retries up to 9 times over roughly 72 minutes and only on 5xx, 408, 429 and timeouts, while inbound retries up to 10 times over roughly 10.5 hours on any non-200 response. Carry one model over to the other and your handler will behave in ways you did not plan for. Also worth knowing: transactional and broadcast mail must not share a stream, because that hurts deliverability.
What it helps with
- send a transactional email through the Postmark API
- turn incoming email into support tickets
- build a server-side Handlebars template and send with it
- wire up webhooks for bounces, opens and spam complaints
- find out why a webhook endpoint got paused
Example prompts for the agent
- Send a signup confirmation email through Postmark
- Set up inbound email processing in Postmark and open a ticket for each message
- Create an email template in Postmark and send it to the list
How to install postmark
1Skills CLI (Vercel)
npx skills add ActiveCampaign/postmark-skills --skill postmark -a claude-code2Manually: put the files in place
~/.claude/skills/postmark/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/postmark/
1Skills CLI (Vercel)
npx skills add ActiveCampaign/postmark-skills --skill postmark -a codex2Manually: put the files in place
.agents/skills/postmark/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add ActiveCampaign/postmark-skills --skill postmark -a cursor2Manually: put the files in place
.cursor/skills/postmark/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install ActiveCampaign/postmark-skills postmark2Manually: put the files in place
.github/skills/postmark/SKILL.md1Skills CLI (Vercel)
npx skills add ActiveCampaign/postmark-skills --skill postmark -a gemini-cli2Platform CLI
gemini skills install https://github.com/ActiveCampaign/postmark-skillsManually: put the files in place
.devin/skills/postmark/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add ActiveCampaign/postmark-skills --skill postmark -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about postmark
How do I install postmark in Claude?
Run npx skills add ActiveCampaign/postmark-skills --skill postmark -a claude-code. The skill lands at ~/.claude/skills/postmark/SKILL.md.
What does the postmark skill do?
It works out what the agent is being asked to do and hands the job to the right sub-skill: sending, inbound, templates, webhooks or deliverability best practices.
How do outbound and inbound Postmark webhooks differ?
They are separate systems with separate retry schedules. Outbound retries up to 9 times over about 72 minutes and only on 5xx, 408, 429 and timeouts; inbound retries up to 10 times over about 10.5 hours on any non-200 response.
Source text
SKILL.md · MIT
--- name: postmark description: Use when working with Postmark email platform - routes to specific sub-skills for sending emails, processing inbound email, managing templates, or configuring webhooks. license: MIT metadata: author: postmark version: "1.0.0" --- # Postmark Skills Postmark is a transactional email platform built for developers, with 15+ years of deliverability expertise. These skills teach AI agents how to use the Postmark API effectively. ## Sub-Skills | Feature | Skill | Use When | |---------|-------|----------| | **Sending emails** | `postmark-send-email` | Sending transactional or broadcast emails — single, batch, bulk, or with templates | | **Inbound processing** | `postmark-inbound` | Processing incoming emails via webhooks, building reply-by-email, email-to-ticket, or document extraction | | **Template management** | `postmark-templates` | Creating, editing, or sending with Postmark's server-side Handlebars templates and layouts | | **Webhooks** | `postmark-webhooks` | Setting up outbound webhooks for delivery, bounce, open, click, spam complaint, and subscription change events — including endpoint verification, per-webhook statistics, and retry behavior | | **Best practices** | `postmark-email-best-practices` | Deliverability setup, compliance (CAN-SPAM/GDPR/CASL), email design, list management, testing, and sending reliability | ### Outbound and inbound webhooks are different systems `postmark-webhooks` covers **outbound** event webhooks; `postmark-inbound` covers **inbound** email webhooks. They run on separate infrastructure and have **different retry schedules** — do not apply one to the other: | | Outbound webhooks (`postmark-webhooks`) | Inbound webhooks (`postmark-inbound`) | |---|---|---| | Retries | Up to **9** retries over ~**72 minutes** (3 standard + 6 backoff) | Up to **10** retries over ~**10.5 hours** | | Retried on | 5xx, 408, 429, network timeouts only — every other 4xx is permanent | Any non-200 response | Endpoint verification and per-webhook statistics are outbound features — see `postmark-webhooks`. ## Quick Routing - **"Send an email"** → `postmark-send-email` - **"Send a batch of emails"** → `postmark-send-email` - **"Send using a template"** → `postmark-send-email` (template section) or `postmark-templates` (to create/manage templates) - **"Handle incoming email"** → `postmark-inbound` - **"Process inbound webhooks"** → `postmark-inbound` - **"Create an email template"** → `postmark-templates` - **"Track deliveries/bounces/opens"** → `postmark-webhooks` - **"Set up bounce handling"** → `postmark-webhooks` - **"Verify a webhook endpoint" / "my webhook is unverified"** → `postmark-webhooks` - **"Webhook statistics / failure rate / why is my webhook paused"** → `postmark-webhooks` - **"Webhook retries"** → `postmark-webhooks` (outbound events) or `postmark-inbound` (inbound email) - **"Set up SPF/DKIM/DMARC"** → `postmark-email-best-practices` - **"Email compliance / GDPR / CAN-SPAM"** → `postmark-email-best-practices` - **"Domain warm-up"** → `postmark-email-best-practices` - **"List hygiene / suppression management"** → `postmark-email-best-practices` - **"Design a transactional email"** → `postmark-email-best-practices` - **"Test email safely"** → `postmark-email-best-practices` ## Common Setup ### Authentication Postmark uses two types of API tokens: | Token | Header | Scope | |-------|--------|-------| | **Server Token** | `X-Postmark-Server-Token` | Sending emails, templates, bounces, webhooks, message streams | | **Account Token** | `X-Postmark-Account-Token` | Managing servers, domains, sender signatures | Get your Server API Token from [Postmark Servers](https://account.postmarkapp.com/servers). ### SDK Installation Detect the project language and install the appropriate SDK: | File | Language | Install Command | |------|----------|----------------| | `package.json` | Node.js / TypeScript | `npm install postmark` | | `requirements.txt` / `pyproject.toml` | Python | `pip install postmarker` | | `Gemfile` | Ruby | `gem install postmark` | | `composer.json` | PHP | `composer require wildbit/postmark-php` | | `*.csproj` / `*.sln` | .NET | `dotnet add package Postmark` | ### Message Streams Postmark separates email by intent into **Message Streams**: | Stream | Value | Purpose | |--------|-------|---------| | **Transactional** | `outbound` | 1:1 triggered emails (welcome, password reset, receipts) — **default** | | **Broadcast** | `broadcast` | Marketing, newsletters, announcements | Never mix transactional and broadcast email in the same stream — it damages deliverability. ## Resources - [Postmark Developer Docs](https://postmarkapp.com/developer) - [API Reference](https://postmarkapp.com/developer/api/overview) - [Postmark API for LLMs](https://postmarkapp.com/llms.txt) - [Postmark Dashboard](https://account.postmarkapp.com)
© postmark · MIT · ActiveCampaign/postmark-skills