Manage email content templates from the CLI.
Email Templates
Customize the content of transactional emails that AscendKit sends to your users. Every email AscendKit delivers — verification, password reset, magic link, welcome, and journey emails — is rendered from a template. You can modify the default templates or create new ones for use in journeys.
Templates support HTML and plain-text bodies with {{variable}} placeholders that are filled at send time (e.g., {{userName}}, {{appName}}, {{verificationLink}}). Every update creates a new immutable version, so you can review and roll back changes.
Variable scope
Variables are resolved from the context of the send:
- Auth templates receive auth-specific links such as
{{verificationLink}},{{resetLink}}, and user fields such as{{userName}}and{{userEmail}}. - Journey and campaign templates receive user fields, environment variables set with
ascendkit vars set, and variables explicitly attached to the journey node or campaign send. - Survey invite templates receive the survey link only when the send path attaches a survey.
Event properties used for journey routing are not automatically template variables. If a template needs an event value, copy it into an environment variable, campaign variable, or journey node variable intentionally.
Missing variables render as empty values and are reported as warnings where the CLI or portal can detect them. Use ascendkit template show <template-id> to inspect the latest version and expected placeholders.
List templates
ascendkit template list
ascendkit template list --query "welcome"
ascendkit template list --system true
ascendkit template list --query "receipt"
Create a template
ascendkit template create \
--name "Welcome Email" \
--slug welcome-email \
--subject "Welcome to {{appName}}" \
--body-html "<h1>Welcome, {{userName}}!</h1>" \
--body-text "Welcome, {{userName}}!" \
--category marketing
View a template
ascendkit template show tpl_abc123
Update a template
ascendkit template update tpl_abc123 \
--subject "New subject line" \
--change-note "Updated subject for A/B test"
# --html and --text are accepted as aliases for --body-html and --body-text
ascendkit template update tpl_abc123 \
--html "<h1>Hello, {{userName}}!</h1>" \
--text "Hello, {{userName}}!"
ascendkit template update tpl_abc123 \
--category transactional \
--change-note "This journey email is operational, not marketing"
Each update creates a new immutable version. Previous versions are preserved.
Tip: Run
ascendkit template update <id> --helpto see all available flags before editing.
Template categories
Templates support a category field:
marketinginjects the unsubscribe footer andList-Unsubscribeheaders for journey sends.transactionalskips unsubscribe injection for operational emails like password resets, magic links, OTPs, and receipts.
The CLI defaults new templates to marketing. Set --category transactional when the email should never present an unsubscribe action.
View version history
ascendkit template version list tpl_abc123
ascendkit template version show tpl_abc123 2
Delete a template
ascendkit template remove tpl_abc123
Personalizing templates for your brand
When customizing templates for your app, follow this workflow:
- Set environment variables first — use
ascendkit vars set dashboardUrl "https://yourapp.com/dashboard"so templates can reference{{dashboardUrl}}dynamically. Note:{{appName}}is automatically resolved from your environment name - Use
{{variable}}placeholders — don't hardcode your app name or URLs in template HTML. If you rename your app or change domains, you only need to update the environment variable - Review linked surveys — if you update survey invite templates, also review the survey questions themselves with
ascendkit survey showto ensure they match your branding - Verify after updating — run
ascendkit template show tpl_xxxafter updates to confirm the HTML and variables rendered correctly - Check for warnings — the CLI will warn you if a template update removes variables that were present in the previous version