postmark-templates
Skill46 starsChanged 55 days agoMITView on GitHub
Use when creating, managing, or sending with Postmark server-side email templates — Handlebars syntax, layout inheritance, template validation, and cross-server pushing.
- Reads credentials
In this repository5 other files it gives its agents.
- postmark-email-best-practicesSkill
- postmark-inboundSkill
- postmark-send-emailSkill
- postmark-webhooksSkill
- postmarkSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 79
Always use TemplateAlias over TemplateId — aliases survive re-creation and work across environments:
- Distinctive: line 99
Test-render without sending — useful in CI/CD before deploying template changes:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Email Templates with Postmark
Overview
Postmark templates are server-side email templates using Handlebars syntax. Templates are rendered on Postmark's servers — no client-side rendering library needed.
| Feature | Description |
| Syntax | Handlebars (Mustache-compatible) |
| Rendering | Server-side — no React, no client library |
| Types | Standard templates and Layout templates |
| Inheritance | Standard templates can inherit from a Layout |
| Validation | API endpoint to test-render templates before sending |
| Cross-server | Push templates between servers (staging → production) |
| Limit | 100 templates per server (contact support for more) |
Quick Start
- Create a template via API or the Postmark dashboard
- Define variables using Handlebars syntax:
{{variable_name}} - Send with template using
POST /email/withTemplateorPOST /email/batchWithTemplates - Pass data via
TemplateModel— Postmark renders and sends
Template Syntax (Handlebars)
Hello {{name}}, {{! variable }}
{{{html_content}}} {{! unescaped HTML }}
{{#if premium}}Premium member{{/if}} {{! conditional }}
{{#each items}}{{this.name}}{{/each}} {{! iteration }}
{{customer.address.city}} {{! nested object }}See references/handlebars-syntax.md for the full syntax reference including conditionals, iteration with index, nested objects, and common mistakes.
Template Types
| Type | TemplateType | Sendable | Purpose |
| Standard | "Standard" | Yes | Defines subject, HTML, and text body |
| Layout | "Layout" | No | Reusable wrapper injected via {{{@content}}} |
Standard templates can reference a Layout via LayoutTemplate: "layout-alias". The Standard template's body replaces {{{@content}}} in the Layout at send time.
See references/layout-templates.md for layout creation, assignment, and examples.
API Endpoints
Template CRUD
| Endpoint | Method | Description |
/templates | POST | Create a new template |
/templates | GET | List all templates (?count=100&offset=0&templateType=Standard) |
/templates/{idOrAlias} | GET | Get a single template |
/templates/{idOrAlias} | PUT | Update a template |
/templates/{idOrAlias} | DELETE | Delete a template |
/templates/validate | POST | Validate template rendering |
/templates/push | PUT | Push templates to another server |
Sending with Templates
| Endpoint | Method | Description |
/email/withTemplate | POST | Send single email with template |
/email/batchWithTemplates | POST | Send batch with templates (up to 500) |
Send with Template
Always use TemplateAlias over TemplateId — aliases survive re-creation and work across environments:
const postmark = require('postmark');
const client = new postmark.ServerClient(process.env.POSTMARK_SERVER_TOKEN);
await client.sendEmailWithTemplate({
From: 'hello@yourdomain.com',
To: 'customer@example.com',
TemplateAlias: 'welcome-email',
TemplateModel: {
name: 'Jane Doe',
product_name: 'Acme App'
},
MessageStream: 'outbound'
});Validate a Template
Test-render without sending — useful in CI/CD before deploying template changes:
const validation = await client.validateTemplate({
Subject: 'Welcome {{name}}',
HtmlBody: '<h1>Hello {{name}}</h1>',
TextBody: 'Hello {{name}}',
TestRenderModel: { name: 'Test User' }
});
console.log('Valid:', validation.AllContentIsValid);
console.log('Rendered:', validation.Subject.RenderedContent);See references/template-api.md for full CRUD operations (create, list, update, delete), batch sending, validate, and push between servers.
Common Mistakes
| Mistake | Fix |
Using {{html}} for HTML content | Use triple braces {{{html}}} for unescaped HTML |
Forgetting {{{@content}}} in Layout | Layout templates must include {{{@content}}} placeholder |
| Deleting a Layout with dependents | Remove layout association from Standard templates first |
| Using Template ID across environments | Use TemplateAlias — it survives re-creation and works across servers |
| Not validating before deploy | Use /templates/validate to test-render before sending |
| Sending a Layout directly | Layouts are wrappers — you can only send Standard templates |
| Missing TemplateModel fields | Handlebars renders missing variables as empty strings — validate your data |
| Exceeding 100 templates | Contact Postmark support to increase the per-server limit |
Notes
- Templates use Handlebars (Mustache-compatible) syntax — no React or client-side rendering needed
- Template aliases are strings; template IDs are integers — prefer aliases for portability
TemplateTypeis eitherStandard(sendable) orLayout(wrapper)- Layout inheritance: Standard template body replaces
{{{@content}}}in the Layout - Push templates between servers using the Account Token (not Server Token)
- Maximum 100 templates per server by default
- Template validation (
/templates/validate) lets you test-render without sending - Both
TemplateIdandTemplateAliaswork for sending — use one, not both
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

