Skip to content
postmark-templates logo

Email Templates with Postmark

postmark-templates

Use when creating, managing, or sending with Postmark server-side email templates — Handlebars syntax, layout inheritance, template validation, and cross-server pushing.

SKILL.md

Full skill instructions

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.

FeatureDescription
SyntaxHandlebars (Mustache-compatible)
RenderingServer-side — no React, no client library
TypesStandard templates and Layout templates
InheritanceStandard templates can inherit from a Layout
ValidationAPI endpoint to test-render templates before sending
Cross-serverPush templates between servers (staging → production)
Limit100 templates per server (contact support for more)

Quick Start

  1. Create a template via API or the Postmark dashboard
  2. Define variables using Handlebars syntax: {{variable_name}}
  3. Send with template using POST /​email/​withTemplate or POST /​email/​batchWithTemplates
  4. 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

TypeTemplateTypeSendablePurpose
Standard"Standard"YesDefines subject, HTML, and text body
Layout"Layout"NoReusable 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

EndpointMethodDescription
/​templatesPOSTCreate a new template
/​templatesGETList all templates (?count=100&offset=0&templateType=Standard)
/​templates/​{idOrAlias}GETGet a single template
/​templates/​{idOrAlias}PUTUpdate a template
/​templates/​{idOrAlias}DELETEDelete a template
/​templates/​validatePOSTValidate template rendering
/​templates/​pushPUTPush templates to another server

Sending with Templates

EndpointMethodDescription
/​email/​withTemplatePOSTSend single email with template
/​email/​batchWithTemplatesPOSTSend 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: '[email protected]',
  To: '[email protected]',
  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

MistakeFix
Using {{html}} for HTML contentUse triple braces {{{html}}} for unescaped HTML
Forgetting {{{@content}}} in LayoutLayout templates must include {{{@content}}} placeholder
Deleting a Layout with dependentsRemove layout association from Standard templates first
Using Template ID across environmentsUse TemplateAlias — it survives re-creation and works across servers
Not validating before deployUse /​templates/​validate to test-render before sending
Sending a Layout directlyLayouts are wrappers — you can only send Standard templates
Missing TemplateModel fieldsHandlebars renders missing variables as empty strings — validate your data
Exceeding 100 templatesContact 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
  • TemplateType is either Standard (sendable) or Layout (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 TemplateId and TemplateAlias work for sending — use one, not both