skills/sales-postmark/SKILL.md
Postmark platform help — transactional email delivery via REST API (`POST /email`, `POST /email/batch`), SMTP relay, Message Streams (transactional vs broadcast isolation), Handlebars Templates with layout inheritance, Inbound Email parsing, Webhooks (bounce, delivery, open, click, spam complaint, subscription change, inbound), DMARC Monitoring, Bounce Management (Rebound), Suppressions, Statistics, Bulk API, Sender Signatures, and domain authentication. Use when transactional emails aren't arriving, Postmark bounce rates are climbing, unsure how to separate transactional from broadcast streams, templates aren't rendering correctly, inbound email parsing is broken, webhooks aren't firing, or DMARC reports show authentication failures. Do NOT use for general email marketing strategy (use /sales-email-marketing), cross-platform email deliverability (use /sales-deliverability), email open/click tracking strategy (use /sales-email-tracking), or SendGrid-specific questions (use /sales-sendgrid).
npx skillsauth add sales-skills/sales sales-postmarkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Help the user with Postmark (ActiveCampaign) platform questions — from transactional email via the REST API and SMTP relay through Message Streams, Handlebars Templates, Inbound Email, Webhooks, DMARC Monitoring, Bounce Management, Suppressions, Statistics, and integrations. Postmark is laser-focused on transactional email with best-in-class deliverability (98.7% inbox placement), originally built by Wildbit (Natalie & Chris Nagele) and acquired by ActiveCampaign in 2022.
If references/learnings.md exists, read it first for accumulated knowledge.
Ask the user:
What area of Postmark do you need help with?
POST /email, POST /email/batch), SDKsWhat's your role?
What are you trying to accomplish? (describe your specific goal or question)
If the user's request already provides most of this context, skip directly to the relevant step. Lead with your best-effort answer using reasonable assumptions (stated explicitly), then ask only the most critical 1-2 clarifying questions at the end — don't gate your response behind gathering complete context.
Note: If the user needs a specialized skill, route them there with a brief explanation of why that skill is a better fit.
If the request maps to a specialized skill, route:
/sales-email-marketing/sales-deliverability/sales-email-tracking/sales-sendgrid/sales-integration/sales-funnelOtherwise, answer directly from platform knowledge using the reference below.
Read references/platform-guide.md for detailed module documentation, pricing, integrations, and data model.
You no longer need the platform guide details — focus on the user's specific situation.
Based on the user's specific question:
Sending transactional email via the API:
npm install postmark for Node.js)const client = new postmark.ServerClient("YOUR_SERVER_TOKEN")From, To, Subject, HtmlBody/TextBody (or use TemplateId + TemplateModel)ErrorCode: 0 (success) or specific error codesPOSTMARK_API_TEST as the server token during development to test without sending real emailSetting up Message Streams for transactional and broadcast:
"MessageStream": "your-broadcast-stream-id" to route to the broadcast streamSetting up Handlebars templates with layout inheritance:
{{{@content}}} placeholder where content templates will be injectedLayoutTemplate field{{variable}}, {{#if condition}}, {{#each items}}POST /templates/{id}/validate) with sample dataProcessing inbound email:
10 inbound.postmarkapp.comSetting up DMARC monitoring:
v=DMARC1; p=none; rua=mailto:[email protected]p=none -> p=quarantine -> p=reject as you confirm all legitimate senders are authenticatedBest-effort from research — verify details against current Postmark documentation.
dmarc.postmarkapp.com with its own authentication tokens and endpoints. Do not try to use your Postmark server or account token for DMARC API calls — they are different systems with different credentials, even though both are Postmark products.references/learnings.md with today's date./sales-email-marketing — Email marketing strategy and best practices (platform-agnostic)/sales-deliverability — Cross-platform email deliverability — SPF/DKIM/DMARC, warmup, inbox placement/sales-email-tracking — Email open and click tracking strategy/sales-sendgrid — SendGrid platform help — if you need SendGrid-specific guidance instead/sales-integration — Connect Postmark to other tools via Zapier, Make, or API/sales-do — Not sure which skill to use? The router matches any sales objective to the right skill. Install: npx skills add sales-skills/sales --skill sales-doUser says: "I need to send order confirmation and shipping notification emails from my Rails app using Postmark." Skill does:
smtp.postmarkapp.com, port 587, token as username and password)postmark-rails gem for native API integration instead of SMTP for better error handling{{order_number}}, {{items}}) and one for shipping notification (with {{tracking_url}})User says: "We're sending both password resets and a weekly newsletter through Postmark. Our newsletter unsubscribes are hurting our transactional delivery." Skill does:
"MessageStream": "newsletter" in API callsUser says: "We want customers to reply to support emails and have those replies automatically create or update tickets in our system." Skill does:
support.company.com) pointing to inbound.postmarkapp.com*@support.company.com)Symptom: API calls return error code 406 "You tried to send to a recipient that has been marked as inactive" for addresses that should be valid
Cause: The recipient previously hard-bounced or filed a spam complaint, and Postmark automatically added them to the suppression list for that message stream. Postmark blocks further sends to protect your sender reputation.
Solution: Check the suppression list for the relevant message stream via the API (GET /message-streams/{stream}/suppressions/dump) or in the UI under Suppressions. If the underlying issue has been resolved (e.g., the recipient's mailbox was full but is now fixed), reactivate the address by deleting the suppression (POST /message-streams/{stream}/suppressions/delete with the email address in the body). For hard bounces, verify the address is valid before reactivating — sending to an address that bounces again will re-suppress it.
Symptom: Your webhook endpoint processes the same event multiple times, causing duplicate records or actions in your system
Cause: Postmark retries webhook delivery if your endpoint does not return a 2xx status code within the timeout window, or if there is a network interruption during delivery. The retry fires the same event payload again.
Solution: Make your webhook handler idempotent — use the MessageID field in the webhook payload as a deduplication key. Before processing, check if you have already handled an event for that MessageID and event type. Store processed event IDs in a cache or database. Ensure your endpoint returns a 200 status code quickly (within a few seconds) — move heavy processing to a background queue. If you are seeing excessive retries, check your endpoint's response time and error rate.
Symptom: Sent emails show literal {{variable_name}} text instead of the rendered values
Cause: The template model data is not being passed correctly in the API call, or the variable names in the template do not match the keys in the TemplateModel object. Another common cause is using POST /email (raw send) instead of POST /email/withTemplate (template send).
Solution: Verify you are using the template send endpoint (POST /email/withTemplate) and passing TemplateId (or TemplateAlias) plus TemplateModel with the correct variable names. Variable names are case-sensitive — {{OrderNumber}} requires "OrderNumber" in the model, not "orderNumber". Use the template validation endpoint (POST /templates/{id}/validate) to test rendering with sample data before sending. Check the Postmark Activity log for the rendered message to see what was actually sent versus what you expected.
tools
Waitlister platform help — pre-launch waitlist platform with hosted landing pages, points-based viral referrals, built-in email broadcasts, REST API, and five HMAC-signed webhook events. Use when choosing Free (100 subscribers) vs Launch $15/mo (unlimited subs, referrals + broadcasts) vs Growth $49/mo (API, webhooks, Klaviyo/Mailchimp/Kit sync, fraud detection unlock here) vs Business $129/mo, building a webhook handler that verifies X-Webhook-Signature, webhooks auto-disabled after 10 consecutive failures, API signups bypassing referral fraud detection because client_ip/fingerprint weren't forwarded, granting bonus points or pulling top referrers via the API for reward fulfillment, broadcast send caps forcing an ESP handoff, automating without Zapier (Waitlister has none — webhooks/API only), or comparing Waitlister vs LaunchList/KickoffLabs/GetWaitlist/Prefinery. Do NOT use for list-growth strategy (use /sales-audience-growth) or LaunchList help (use /sales-launchlist).
development
LaunchList platform help — viral pre-launch waitlist platform with one-time lifetime pricing, gamified referrals (queue jumping, leaderboard, position inflation), embed widget + custom form POST endpoint, new_user/email_verify webhooks, Zapier, and spam protection. Use when choosing Free (100 submissions) vs Launch $29 (500) vs Grow $79 one-time (10K — webhooks, Zapier, team unlock here), wiring waitlist signups into Mailchimp/Kit/HubSpot or a CRM because LaunchList has no email broadcast system, needing programmatic access when there is no public REST API yet (form POST + webhook workaround), building a webhook handler with referred_by referral attribution, blocking disposable-email or bot signups on a viral waitlist, a custom signup form not submitting or not tracking referrals, or comparing LaunchList vs KickoffLabs/Viral Loops/Prefinery/GetWaitlist on one-time vs subscription pricing. Do NOT use for list-growth strategy (use /sales-audience-growth) or KickoffLabs help (use /sales-kickofflabs).
development
UpViral platform help — viral referral marketing and list-building platform (by Emarky) for viral sweepstakes, giveaway/reward campaigns, pre-launch waiting lists, and milestone referrals, with REST API (`app.upviral.com/api/v1/`, form-encoded `uvapikey` + `uvmethod`), Callback-URL webhooks, IP-based fraud detection, and 30+ ESP/CRM integrations. Use when campaigns aren't tracking referral points, deciding between Starter $79/mo (10K leads, NO API) vs Business $119/mo (API + webhooks) vs Premium $319/mo, the API erroring because you're on Starter where API/webhooks are gated, building a pipeline with `add_contact`/`get_leads`/`get_leads_points`, interpreting same-IP suspicious-referral flags, or picking UpViral over Viral Loops/Vyper/Gleam. Do NOT use for newsletter audience growth (use /sales-audience-growth), KickoffLabs help (use /sales-kickofflabs), merge-tag referrals (use /sales-referralkit), SparkLoop recommendations (use /sales-sparkloop), or multi-level Level 1/2/3 tracking (use /sales-referralhero).
tools
ReferralHero platform help — full-stack referral, affiliate, waitlist, contest, and NPS platform with REST API, webhooks, Zapier, native ESP connectors, multi-level referral tracking (Level 1/2/3), coupon groups, anti-fraud, and a 5,000 calls/hour limit. Use when referrals aren't tracking, deciding between Free (no API) vs PRO $199/mo (API + webhooks) vs PREMIUM $399/mo (ReCaptcha + SMS Verification), auth failing with `no_token` or `Bearer` vs `X-API-Key`, Level 2/3 counts off from calling `level_2_all_referrals` not `level_2_referrals`, bulk 429s from not chunking the 500-transaction `add_bulk_transactions` limit, coupon endpoints 404 without a coupon group, reward fulfillment (`promote` then `unlock_promoted_reward`) failing, or comparing to SparkLoop/ReferralKit/GrowSurf. Do NOT use for newsletter audience growth (use /sales-audience-growth), merge-tag referrals (use /sales-referralkit), SparkLoop recommendations (use /sales-sparkloop), or affiliate strategy across tools (use /sales-affiliate-program).