Production Shopify · Dawn as reference
Ship production Shopify sections on Dawn
Learn how custom section.liquid files belong in a live Dawn (or Dawn-fork) storefront—groups, JSON templates, color schemes, presets, and the mistakes that break merchant editing—before you automate anything.
Production implementation guide · Updated 2026-08-03
When this guide applies
Use this guide when you are extending Shopify’s reference Online Store 2.0 architecture. Dawn is the lab environment because its file names, section groups, and editor conventions are the baseline most forks still inherit.
Applies when
- Dawn (Shopify reference theme) or a lightly customized Dawn fork
- Custom modules that must appear in the theme editor Add section panel
- Homepage, product, collection, or landing JSON templates you control
- Teams that need merchants to edit copy, media, and blocks after handoff
Does not apply when
- Vintage themes without JSON templates (different architecture entirely)
- App embed / theme app extension UI (different packaging and APIs)
- Premium theme quirks that replace Dawn’s group files and token model—those need their own production notes
Shopify architecture you must respect on Dawn
Production failures on Dawn rarely come from “bad Liquid syntax.” They come from putting the right markup in the wrong layer: layout, section group, JSON template instance, or section file.
Dawn’s layout/theme.liquid renders section groups for chrome (header/footer) and then the template’s section stack. Your custom module almost always belongs as a sections/*.liquid file referenced from a JSON template—not pasted into theme.liquid, and not forced into header-group.json unless it is truly global chrome.
layout/theme.liquid
├─ sections/header-group.json → header / announcement chrome
├─ {{ content_for_layout }}
│ └─ templates/index.json (or product.json, page.*.json)
│ └─ sections: { "campaign_hero": { "type": "campaign-hero", ... } }
│ └─ sections/campaign-hero.liquid + {% schema %}
└─ sections/footer-group.json → footer chromeCustom marketing modules almost always land in the JSON template’s sections map—not inside header-group—unless they are global chrome.
Section groups vs template sections
Dawn separates chrome (header-group, footer-group) from page composition (JSON templates). Mixing those layers is the most expensive Dawn-specific mistake we see in client handoffs.
If a module is campaign-specific, seasonal, or belongs on one landing page, it is a template section. If it is announcement or navigation chrome, it may belong in a group—and it must tolerate every template that inherits that group.
color_scheme, Dawn tokens, and CSS scope
Dawn merchants expect sections to participate in the theme’s color schemes—not a one-off hex picker that fights the brand kit. Prefer a color_scheme setting and Dawn’s color-{{ scheme }} class patterns where you need background/text pairing.
Custom CSS must be scoped to the section instance. Unscoped rules overwrite Dawn utilities and create regressions the next time Shopify updates the reference theme.
C1 — Scope CSS to the section instance
{%- style -%}
#shopify-section-{{ section.id }} .campaign-hero {
padding-block: {{ section.settings.padding }}px;
}
{%- endstyle -%}
<section
id="CampaignHero-{{ section.id }}"
class="campaign-hero color-{{ section.settings.color_scheme }}"
>
{% comment %} hero markup {% endcomment %}
</section>Instance scoping prevents your padding or typography from leaking into Dawn’s native image-banner and multicolumn sections on the same template.
C2 — Minimal schema with color_scheme + preset
{
"name": "Campaign hero",
"settings": [
{
"type": "color_scheme",
"id": "color_scheme",
"label": "Color scheme",
"default": "scheme-1"
},
{
"type": "text",
"id": "heading",
"label": "Heading",
"default": "Seasonal campaign"
},
{
"type": "range",
"id": "padding",
"min": 0,
"max": 100,
"step": 4,
"unit": "px",
"label": "Padding",
"default": 36
}
],
"presets": [{ "name": "Campaign hero" }]
}A non-empty presets array is what makes the section appear under Add section in Dawn’s editor. Missing presets is the #1 “we deployed but merchants can’t find it” failure.
Presets and Add section in Dawn’s editor
A section file without presets is invisible to merchants in Add section. Production handoffs fail when developers test by manually injecting JSON instances and never verify the Add section panel.
Name presets the way merchants speak (“Campaign hero”, “FAQ — shipping”), not the way repos speak (“section-hero-v3”).
- Annotated figure (Dawn theme editor): Online Store → Customize → Add section.
- Expect your preset name in the list beside Dawn natives (Image banner, Multicolumn, Collapsible content).
- If the name is missing: open the section schema and confirm presets is a non-empty array, then hard-refresh the editor.
This is the merchant-facing proof that a production section shipped. File presence on disk is not enough.
Real example A — flat campaign hero on Dawn
Flat sections map one HTML region to section.settings. Use them when the layout is fixed: one heading, one subheading, one CTA, one image. This matches how many Dawn homepage campaigns start before marketing asks for slides.
C4 — Flat settings → Liquid outputs
<div class="campaign-hero__inner page-width">
{% if section.settings.heading != blank %}
<h2 class="campaign-hero__heading">{{ section.settings.heading }}</h2>
{% endif %}
{% if section.settings.subheading != blank %}
<p class="campaign-hero__subheading">{{ section.settings.subheading }}</p>
{% endif %}
{% if section.settings.cta_label != blank %}
<a class="button" href="{{ section.settings.cta_link }}">
{{ section.settings.cta_label }}
</a>
{% endif %}
</div>Blank-safe output prevents empty headings from reserving space in the editor preview—merchants notice phantom gaps immediately.
Real example B — FAQ blocks aligned to Dawn patterns
When HTML contains repeating Q&A rows, map them to section.blocks—the same mental model as Dawn’s collapsible-content. Merchants must add, remove, and reorder rows without a developer.
C5 — Blocks loop + shopify_attributes
<div class="campaign-faq">
{% for block in section.blocks %}
<div class="campaign-faq__item" {{ block.shopify_attributes }}>
<h3 class="campaign-faq__question">{{ block.settings.question }}</h3>
<div class="campaign-faq__answer rte">{{ block.settings.answer }}</div>
</div>
{% endfor %}
</div>block.shopify_attributes is what lets Dawn’s editor highlight and select the correct row. Omitting it makes block editing feel “broken” even when Liquid renders.
Blocks schema sketch (FAQ row)
"blocks": [
{
"type": "row",
"name": "FAQ row",
"settings": [
{ "type": "text", "id": "question", "label": "Question" },
{ "type": "richtext", "id": "answer", "label": "Answer" }
]
}
],
"presets": [
{
"name": "Campaign FAQ",
"blocks": [
{ "type": "row" },
{ "type": "row" }
]
}
]Seeding two rows in the preset teaches merchants that repetition is expected—empty block lists look like a broken section.
Registering the section on Dawn JSON templates
Dawn will not show a section on the storefront until a template JSON instance references it. The type string must match the section filename (without .liquid). The instance key must appear in the order array.
C3 — templates/index.json instance sketch
{
"sections": {
"campaign_hero": {
"type": "campaign-hero",
"settings": {
"color_scheme": "scheme-1",
"heading": "Summer dispatch"
}
}
},
"order": [
"campaign_hero"
]
}If type is wrong, Dawn skips the instance. If the key is missing from order, the section exists in JSON but never paints.
C6 — When not to use header-group
Use header-group.json only for chrome that must load on every template
and must tolerate null product/collection context.
Do NOT place:
- Seasonal homepage heroes
- PDP-only upsells
- Page-specific FAQs
Those belong on templates/index.json, product.json, or a custom page JSON.This decision note prevents the most expensive Dawn placement bug we see in production audits.
- Annotated figure: section selected in Dawn’s left sidebar with Color scheme visible in settings.
- Merchants should change scheme without opening code.
- If you only exposed hex color pickers, you skipped Dawn’s design-token contract.
Token-aligned settings reduce post-handoff CSS hotfixes.
- Annotated figure: block list for a Campaign FAQ section showing multiple rows and drag handles.
- Merchants reorder rows here; storefront order must follow without a deploy.
Blocks UX is part of production delivery—not a nice-to-have.
Practice manually
Do this in a Dawn zip or development theme before using any converter. The goal is to own the model—not to generate files you cannot explain.
- 01
Create the section file
Add sections/campaign-hero.liquid with scoped {% style %}, blank-safe settings output, color_scheme, and a named preset.
- 02
Register on a JSON template
Add a typed instance to templates/index.json and include its key in order. Load the homepage preview.
- 03
Verify Add section
On a different template, use Add section and insert Campaign hero from the panel—not from pre-seeded JSON.
- 04
Build a blocks FAQ
Create a second section with blocks, shopify_attributes, and a preset that seeds two rows. Reorder rows in the editor.
- 05
Negative tests
Clear optional settings, switch color schemes, and confirm native Dawn sections on the page are visually unchanged.
Use the converter as a supporting tool
After you can place, preset, and register a section by hand, the converter can accelerate HTML → Liquid drafts. Treat output as a starting point: still verify presets, scoping, template JSON, and merchant editing on Dawn.
Optional acceleration — not a substitute for the architecture above.
What to learn next
Continue as an educational path—not a list of keyword landings.
Beginner
Build literacy before shipping custom modules.
- Shopify Liquid for beginners
Syntax and objects you will read inside section files.
- How Shopify sections work
OS 2.0 section model without theme-specific noise.
Intermediate
Production skills for schema, templates, and blocks.
- Shopify section tutorial
End-to-end shipping workflow for section files.
- Shopify schema guide
Setting types, blocks, and editor UX details.
- Dynamic Shopify blocks guide
Deeper block patterns beyond a single FAQ.
Advanced
Harder production judgment and delivery experience.
- Shopify development experience
How real delivery teams debug theme work under client pressure.
- Dawn theme section tutorial
Extended Dawn section notes from the Knowledge Hub.
- Resources hub
Curriculum index for guides and tools.
Editorial review
Reviewed by the HTML to Liquid Converter team


Content is reviewed by the HTML to Liquid Converter Shopify development team before publication. Technical accuracy is validated against current Shopify Online Store 2.0 conventions and active client theme work.
Last updated:
Questions or corrections? Contact us.