This is a reference for advanced users who want to edit the raw HTML of Single's notification emails. It explains what each part of the default template does, which areas are safe to change, and what the curly-brace placeholders mean. If you just want to add a logo, brand color, or custom link, see Customizing Email HTML and Whitelabeling Email Notifications instead — you may not need to touch the HTML at all.
Heads up: Editing these templates requires comfort with HTML and email-specific quirks. A broken template can cause emails to render incorrectly across mail clients. Always test before saving, and you can revert to the original at any time with the Reset button.
Before you start
A Gold subscription (required to edit full email HTML)
Comfort reading and editing HTML and inline CSS
Access to Settings > Notifications > Customize Email HTML
How the templates work: Handlebars
These templates are written in Handlebars, a templating language. Alongside normal HTML, you'll see curly braces that Single fills in with real data (the customer's purchase, your shop name, your brand color, etc.) at the moment the email is sent.
The main syntax you'll encounter:
{{variable}}— inserts a value, e.g.{{shopName}}. HTML-escaped.#{{{variable}}}— triple braces insert a value without escaping, used where the value may contain HTML (like a formatted title or body).{{#if x}} ... {{else}} ... {{/if}}— shows a block only when a value exists/is true.{{#unless x}}is the opposite.{{#each items}} ... {{/each}}— repeats a block once per item (for example, once per purchased product).{{#listName}} ... {{/listName}}— a list name used directly as a block loops over that list. The template relies on this for its main loops, e.g.{{#purchases}} … {{/purchases}}renders once per purchase. It's shorthand for{{#each}}over that list.../and@root— reach a value from a parent or the top-level context while inside a loop (e.g.{{../primaryColor}}).Helpers — small functions the template can call. Available helpers:
or,and,not,equals,notEquals,greaterThan,lessThan,formatDate, andurl. The default template uses a couple you'll see right away —{{#or this.header this.body}}(show a block if either value exists) and{{url myshopifyDomain}}(build a store URL). Note the asymmetry: a made-up variable just renders empty, but a made-up helper is rejected when you Save (see below).
Rule of thumb: you can freely change the text, styling, and layout around these tags. Be careful when moving, renaming, or deleting the tags themselves — that's where templates usually break.
Anatomy of the template
Every template follows the same four-part structure.
1. Head & CSS
Everything above <body> is plumbing that makes the email render consistently across mail clients. It includes meta tags, a web-font import (Roboto), Outlook-specific fixes (the <!--[if mso]> comments), a CSS reset, and the responsive/mobile media queries.
Best left alone unless you know email CSS well. The comments in this section describe what each rule protects against. Two things you may want to touch here:
The link color rule —
a { color: {{#if primaryColor}}{{primaryColor}}{{else}}#8126B5{{/if}} }— controls link color and falls back to Single purple.The button hover styles under
.button-td:hoverif you want a different hover treatment.
2. Header
The top band of the email. It renders your logo when {{logoUrl}} is set, and otherwise falls back to the Single logo. The colored top border also uses {{primaryColor}}.
Preheader & inbox preview: immediately after <body> there's a hidden preview <div> ("Thanks for your purchase!"), and up in the head there's the <title>. Both control the preview snippet recipients see in their inbox next to the subject line — safe, high-value text to customize.
Note: setting a logo also whitelabels the email — when {{logoUrl}} exists, the Single-branded footer at the bottom is hidden automatically.
3. Body
The main content, made up of several conditional sections that appear only when relevant to that order. The big {{#if ...}} blocks decide which sections show:
containsLivestreams— livestream/event access, watch buttons, and event dates. Ticket-transfer help appears only for giftable/ticketed events (when{{giftTicketUrl}}is present), and the Event FAQ button only when{{faqUrl}}is set.containsDigitalPurchases— the standard digital fulfillment message, using{{title}}and{{body}}.containsNonCustodialNfts— the "Claim Digital Collectible" intro.containsNfts— distinct fromcontainsNonCustodialNfts; gates the "For help claiming your digital collectible" line in the Support Text block.{{#purchaseGroups}}/{{#purchases}}— loops that render one row per purchased item: artwork, title, artist, and the call-to-action button (label varies by item type — see below).boostlinkCampaign— optional promotional share links shown beneath the purchases.
Below those is the Support Text block, which renders a "Questions?" line pointing at your support link or email (see the variables table below).
Safe to edit: headings, wording, paragraph copy, button labels (the text inside the .button-a links), spacing, and colors. Edit with care: the loop tags and conditional wrappers — keep every opening tag paired with its closing tag.
4. Footer
The Single-branded footer with the logo, links, and social icons. It is wrapped in {{#if logoUrl}} so it only appears on non-whitelabeled emails. If you've set a logo, this section won't render regardless of what you put here.
Key variables reference
The most common placeholders you'll see, and what each becomes when the email is sent. This is not every variable in the template, but it covers the ones you're most likely to work with.
Variable | What it renders |
| Your brand accent color for links, buttons, and the top border. Falls back to Single purple ( |
| Your custom logo image. When present, also hides the Single footer (whitelabel). |
| The headline and message for the digital purchase section (rendered with triple braces so they may include formatting). |
| The name of the purchased release, product, or membership. |
| The group/community name in the "You've joined {group}" fan-subscription greeting. |
| The artist name and any featured artists for a purchased item. |
| The customer's download / access URL, used on the main call-to-action button. |
| Cover art / thumbnail image for the item. |
| Expected availability date, shown for presale items. The "expected {date}" line is hidden when the release date is confidential ( |
| Livestream page link and event date/time. |
| Your store name and the order number, used in copy and prefilled support emails. |
| Support destination. The template prefers a support link, then a custom support email, then your shop email — see the conditionals below. |
| A true/false flag for whether a custom support email is set — not the address itself. The address lives in |
Common conditionals you'll see
A few patterns repeat throughout the template:
Fallbacks with default values:
{{#if primaryColor}}{{primaryColor}}{{else}}#8126B5{{/if}}uses your setting if present, otherwise the default. You'll see this everywhere color is applied.Support routing: the Support Text and ticket-transfer buttons check
supportLinkfirst, thencustomSupportEmail/supportEmail, then fall back toshopEmail— with a prefilled subject line containing the order number, shop name, and your myshopify domain.Item type switches: the call-to-action button label changes based on the item — Listen Now for standard purchases; claim your collectible for non-custodial NFTs (but view your collectible for custodial ones); Log In for fan subscriptions; and Watch Now or Log In to Watch for livestreams (live vs. upcoming).
Tips & gotchas
Keep styles inline. Many mail clients strip
<style>blocks, which is why colors and spacing are set inline on elements. Follow the same pattern when you add content.Outlook is fussy. The
<!--[if mso]>comments target desktop Outlook specifically. Don't remove them unless you're testing in Outlook.Match every tag. Each
{{#if}},{{#each}},{{#purchases}}, etc. needs a matching closing tag ({{/if}},{{/each}}…). If you miss one, the editor won't let you save — it rejects the template and names the unclosed block with its line and column. What it can't catch is broken HTML/CSS, or a block that's balanced but moved to the wrong place, so preview those yourself.Don't invent variables or helpers. Only the placeholders already present in the template will be filled in — a made-up
{{myField}}renders as empty. A made-up helper is stricter: it's rejected when you Save, with an error naming the unknown helper.Test with real combinations. Use the Test Email Delivery section to send yourself samples, and combine item types (e.g. a digital release + a livestream) to see how the conditional sections behave together.
If something goes wrong
When you click Save, Single compiles the template and checks the Handlebars: an unclosed block or an unknown helper is rejected on the spot, with an error naming the offending tag and its line and column — so those mistakes can't reach live emails.
What the editor can't catch is invalid HTML/CSS or a block that's balanced but placed in the wrong spot, so always send yourself a test before relying on an edit.
To start over, open the template editor and click Reset to restore Single's original HTML for that template. Customizations only go live when you Save, so an untested edit won't affect live emails until then.
