The email builder
Every marketing email — campaign sends, standalone emails, and automation designs — is built in the same full-screen editor. You open it by editing an email from Marketing → Emails, from a campaign’s email list, from an automation’s email design, or from Marketing → Templates. What you design is a document of sections and blocks; your store’s fonts, colors, and logo are layered on live at render time, so updating Template Branding (under Marketing → Settings) restyles every email you’ve already designed — nothing is baked in.
The builder at a glance
- Top bar — the email’s name with a Saved / Unsaved badge, a
desktop/mobile preview toggle, undo and redo (
⌘Z/⌘⇧Z), a ⋯ menu (Email styles, Save as template), Send test, and Save. - Left panel — the Sections tree: header, body sections (drag to reorder), and footer, with hover insertion points between body sections. Selecting a section or block swaps the panel to the inspector, a settings form for exactly that element, with a back arrow and a remove button.
- Canvas — the Email details card followed by a device-framed live preview. Hovering a section in the preview outlines it in blue; the selected section keeps a persistent outline; hovering between sections reveals an + Add section pill at that spot. Clicking a section in the preview selects it.
- Add section — a floating button at the bottom of the canvas opens the searchable section palette (see Sections and blocks).
The header and footer are pinned — they can be restyled but not deleted or moved. The footer always carries the unsubscribe link; it’s required by law and can’t be removed, only recolored and relabeled.
The Email details card
The card at the top of the canvas holds everything about the email that isn’t body content:
| Field | What it does |
|---|---|
| Name | Internal only — buyers never see it. Required before saving. |
| To | Campaign and standalone emails only: the email’s audience (all customers, a segment, or a manual customer list) with a live reach summary. See Customers & segments. |
| Subject | What recipients see in their inbox. This is the only place the subject is edited — there is no subject field anywhere else in Marketing. |
| Preview text | The inbox snippet shown after the subject. Optional. |
| From | Read-only — your verified sender from Marketing Settings. See Store emails. |
A blank subject blocks the save — the builder surfaces “Add a subject — this email can’t be saved or sent without one.” rather than saving silently. The one exception is an automation’s email design: there the subject placeholder reads “Leave blank to use the built-in subject”, and an empty field falls back to the automation’s default subject line.
For campaign emails, the audience opens in a modal from the To row. Audience changes apply when you save the email, and the audience locks once the email has started sending — after that the modal is view-only.
Sections and blocks
Add section opens a searchable palette grouped into four sections:
| Group | Contents |
|---|---|
| Elements | Text, Button, Image, Video, Countdown, Divider, Product, Collection, Express checkout, Gift card, Discount — plus the Product Grid and Collection Grid sections |
| Reengagement | Abandoned browse, Abandoned cart, Abandoned checkout, Back in stock, Price drop, Cross-sell |
| Layout | Section (an empty container you fill with blocks), Image with text, Multicolumn, Spacer |
| Custom | Custom Liquid |
Picking a single element inserts a plain section seeded with that one block; inside a section, hover between blocks to add more from the block menu.
Reengagement sections are gated by context. They stay visible in every email’s palette, but each one is enabled only in the email of its matching automation — an Abandoned checkout section needs that trigger’s checkout data to render, so it’s disabled (with a tooltip explaining why) everywhere else. This is enforced at save too: an email that uses a reengagement section outside its automation is rejected with a hard error, not silently dropped.
Blocks worth knowing
- Countdown — enter a deadline (for example
2027-01-15 23:59) and at send the block renders a live, ticking countdown GIF in the recipient’s inbox. The editor shows a styled banner instead. An empty or already-past deadline is skipped at send, so you never ship an expired countdown. - Express checkout — pick a product and the block builds a direct-to-checkout buy link from its first available variant (a cart permalink that seeds a cart and redirects straight to checkout). You can set a quantity (1–10), attach a discount that applies automatically at checkout, or override the whole thing with a custom link.
- Gift card — two modes: pick a gift-card product to feature it with a
buy button, or leave the product empty to display a code (the default code
field is the
{{ gift_card.code }}merge tag, filled by campaign sends that attach a gift card). - Discount — shows a code in large lettering with an optional shop button. Pick a discount from your store — its code, value, and requirements fill the block — or type a literal code. Add as many Discount sections as you need, each featuring its own code. Discounts themselves are created in Discounts, not in Marketing.
- Custom Liquid — write your own Liquid. It renders in a sandbox: no
file access, sanitized output, a 50 KB output cap, and access to shop,
product, and collection data — but not per-recipient customer fields. If
you build an email entirely from Custom Liquid blocks, the renderer
requires the source to include
unsubscribe_urlorunsubscribe_link(andopen_trackingwhen open tracking is on) — compliance is not optional just because the layout is custom.
Personalization with merge tags
Every text setting in the inspector has an insert variable menu listing the merge tags that will actually fill for this email’s context. Tags use Liquid syntax — type them by hand or insert from the menu.
These groups fill in every email:
| Group | Example tags |
|---|---|
| Customer | {{ customer.first_name }}, {{ customer.name }}, {{ customer.email }}, {{ customer.orders_count }}, {{ customer.total_spent | money }}, {{ customer.tags | join: ', ' }} |
| Recipient | {{ recipient.email }}, {{ recipient.name }} |
| Shop | {{ shop.name }}, {{ shop.url }}, {{ email.subject }}, {{ email.preview_text }} |
| Compliance | {{ unsubscribe.url }}, {{ unsubscribe_link }}, {{ current_year }} |
These groups are context-scoped — they only appear in the menu (and only fill at send) for the matching email:
| Available in | Tags |
|---|---|
| Campaign emails | {{ gift_card.code }}, {{ gift_card.amount }} — stamped by the campaign send when a gift card is attached |
| Post-purchase automations | {{ order.number }}, {{ order.item_count }}, {{ order.subtotal }}, {{ order.total }} |
| Abandoned checkout | {{ abandoned_checkout.url }}, {{ total_price | money }}, {{ line_items }}, {{ item_count }}, {{ checkout_email }} |
| Abandoned cart | {{ abandoned_visit.url }}, {{ abandoned_visit.products_added_to_cart }} |
| Abandoned browse | {{ abandoned_visit.url }}, {{ abandoned_visit.products_viewed }} |
| Back in stock | {{ product.title }}, {{ product.url }}, {{ product.variant_title }}, {{ product.price }} |
| Price drop | {{ product.title }}, {{ product.new_price }}, {{ product.old_price }}, {{ product.discount_percent }}, {{ product_count }} — the headline (deepest-discount) product; the Price drop section loops the full list |
Previewing
The canvas preview is rendered by the same engine that sends the email, with your store’s real products, collections, currency, and branding. Recipient details are placeholders — a sample customer named Alex Rivera — which is why the preview carries a Preview · sample data badge: sample names and trigger content are representative, not a broken template. Product blocks and starter layouts seed themselves from your store’s real best-sellers; a brand new store with no products falls back to a built-in sample catalog so the preview never breaks.
Use the desktop/mobile toggle in the top bar to switch the frame between 600px and 375px widths and check how sections stack on a phone.
Saving, autosave, and the unsaved-changes guard
- Save persists the document plus the details card (name, subject, preview text, and any pending audience change) in one step.
- Autosave runs roughly every 20 seconds — but only for drafts. A scheduled email never autosaves, so exploratory edits can’t silently change a message that’s already queued to go out; press Save deliberately.
- Unsaved changes are guarded. Closing the tab or exiting the builder with unsaved edits prompts “Leave without saving?” first.
Send yourself a test
-
Select Send test in the top bar.
-
Enter the address to send to. Only this address receives the test.
-
Select Send test. The builder saves your current edits first, then sends the email rendered with sample data.
Test sends use the same sample recipient as the preview, so merge tags fill with placeholder values — check the real audience and consent rules on the email itself before the actual send. See Marketing & automation for how sends, consent, and suppressions work.
Save a design as a template
Open the ⋯ menu and choose Save as template, then name it. The design lands in Marketing → Templates, where you (or anyone on your team) can start future emails from it. Templates store the section document only — branding stays live, so a template created before a rebrand still renders in your current look.
Troubleshooting
The builder surfaces problems in an error panel directly under the top bar:
| Message | What it means |
|---|---|
| Couldn’t save | The save was rejected — most often a blank subject or name, or an incomplete audience. Fix the field and save again. |
| The live preview is temporarily unavailable | The renderer couldn’t be reached. Your edits are safe; the preview retries on your next change. |
| This email has issues to fix before it can send | The renderer found template errors — each one is listed. The email won’t send until they’re resolved. |
Common causes of template errors:
- A reengagement section in the wrong email — for example an Abandoned cart section in a campaign. The error names the section and the automation it belongs to; remove it or move the design to that automation.
- Custom Liquid syntax mistakes — an unclosed tag pair (an
ifwithoutendif, aforwithoutendfor) or a stray brace. The renderer reports the failure instead of sending broken markup. - A Custom Liquid–only email without an unsubscribe tag — add
unsubscribe_urlorunsubscribe_linkto the source. - Hand-typed merge tags that don’t exist — these usually render blank
rather than erroring. If a personalization “disappears” at send, compare
the tag against the insert menu; context-scoped tags (like
{{ abandoned_checkout.url }}) only fill in their matching automation.
If the editor itself fails to load its section catalog, you’ll see a full-page error with a Retry button — this is a connectivity issue, not a problem with your email.
Related pages
- Marketing & automation — the marketing hub: campaigns, sends, consent, and settings.
- Customers & segments — build the segments you target from the To row.
- Sales attribution — how email clicks turn into attributed orders.
- Store emails — sender verification and deliverability.
- Discounts — create the codes you feature in Discount blocks.