Skip to content

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:

FieldWhat it does
NameInternal only — buyers never see it. Required before saving.
ToCampaign 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.
SubjectWhat recipients see in their inbox. This is the only place the subject is edited — there is no subject field anywhere else in Marketing.
Preview textThe inbox snippet shown after the subject. Optional.
FromRead-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:

GroupContents
ElementsText, Button, Image, Video, Countdown, Divider, Product, Collection, Express checkout, Gift card, Discount — plus the Product Grid and Collection Grid sections
ReengagementAbandoned browse, Abandoned cart, Abandoned checkout, Back in stock, Price drop, Cross-sell
LayoutSection (an empty container you fill with blocks), Image with text, Multicolumn, Spacer
CustomCustom 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_url or unsubscribe_link (and open_tracking when 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:

GroupExample 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 inTags
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

  1. Select Send test in the top bar.

  2. Enter the address to send to. Only this address receives the test.

  3. 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:

MessageWhat it means
Couldn’t saveThe 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 unavailableThe 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 sendThe 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 if without endif, a for without endfor) 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_url or unsubscribe_link to 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.