Product Page Section Stacks That Actually Convert
The product template section order, block architecture, and @app slots we use on high-converting client stores — based on dozens of PDP rebuilds, not generic CRO blog advice.
Share with Shopify developers — useful guides spread faster in theme dev communities.
Product pages measured in basis points, not vanity metrics, punish the wrong section order. K2 Devworks maps every product.json section key to a job — buy box, social proof, cross-sell, education, SEO FAQ — before adding a single custom module, because renaming keys without migrating settings wipes merchant customizations.
Product pages are where theme development meets revenue. A homepage hero might win a design award; a product page either adds to cart or it does not. After forty-plus product template rebuilds across supplements, apparel, electronics, and B2B wholesale, K2 Devworks stopped treating product.json as a dumping ground for every section marketing likes. The stack below covers section types, order, schema patterns, and the mistakes we still fix when another agency shipped a beautiful PDP that loads in six seconds and hides the variant picker on iPhone SE. Related: app blocks versus theme sections and how sections work.
Start with templates/product.json, not random sections
Online Store 2.0 product pages are JSON templates. The file templates/product.json defines which sections render and in what order. Merchants experience this as draggable sections in the theme editor; developers experience it as a contract you either honor or fight forever. Before we add a single custom section, we read the existing product.json on the client's theme — Dawn, Prestige, custom fork — and map every section key to a job: buy box, social proof, cross-sell, education, SEO FAQ. If you are new to JSON template wiring, read How Shopify Sections Work and Section Schema Explained before renaming section keys. Changing a key without migrating merchant settings wipes their product-page customizations.
{
"sections": {
"main": {
"type": "main-product",
"blocks": {
"title": { "type": "title", "settings": {} },
"price": { "type": "price", "settings": {} },
"variant_picker": { "type": "variant_picker", "settings": {} },
"buy_buttons": { "type": "buy_buttons", "settings": {} },
"description": { "type": "description", "settings": {} }
},
"block_order": ["title", "price", "variant_picker", "buy_buttons", "description"]
},
"trust_band": { "type": "product-trust-icons", "settings": {} },
"related": { "type": "related-products", "settings": { "products_to_show": 4 } },
"faq": { "type": "product-faq", "settings": {} }
},
"order": ["main", "trust_band", "related", "faq"]
}
main-product blocks: the buy box is sacred
Dawn's main-product section is the reference architecture for OS 2.0 product pages. Blocks inside the section — title, price, variant_picker, buy_buttons, description, collapsible_tab — reorder in the theme editor without duplicating Liquid. We customize main-product only when the buy-box UX is contractual: subscription selectors, B2B quantity breaks, or regulated disclaimers next to add-to-cart. Otherwise we add marketing bands as separate sections below. Every edit to main-product.liquid is merge debt when Shopify updates Dawn or when you need to diff against upstream for a bug. Nishad's rule on client calls: if marketing wants a testimonial carousel on the product page, that is a new section in sections/, not a sixth block wedged above buy_buttons unless analytics prove it.
Reserving @app slots without wrecking layout
Merchants install reviews, bundles, subscriptions, and loyalty apps that inject app blocks. Your main-product schema must include { "type": "@app" } in blocks — often twice: once near title for star ratings, once below buy buttons for complex widgets. We document which apps the client pays for before designing block_order. Duplicate review widgets happen when a custom section also hardcodes Judge.me embed code while the app block is active — conversion drops from visual noise, not missing stars. Read App Blocks vs Theme Sections for the full decision matrix; on product pages the answer is usually hybrid.
{%- comment -%} Inside main-product — render app blocks in a dedicated stack {%- endcomment -%}
{%- for block in section.blocks -%}
{%- if block.type == '@app' -%}
{% render block %}
{%- endif -%}
{%- endfor -%}
Section stack patterns that repeat across winning PDPs
We do not copy the same product.json for every client, but patterns recur. The high-converting stacks share structure: buy box first, immediate trust signals second, education third, cross-sell last. Below is the mental model we whiteboard with clients before Figma moves a single pixel.
- Layer 1 — Buy box (main-product) — gallery, title, price, variants, ATC, pickup, payment badges; minimal scrolling to purchase on mobile
- Layer 2 — Micro trust (product-trust-icons or icon row section) — shipping, returns, guarantee; three icons max above the fold on mobile via sticky or inline
- Layer 3 — Education (tabs, comparison, ingredients) — collapsible tabs inside main-product or dedicated accordion section; keeps long copy off the first screen
- Layer 4 — Social proof (reviews section or app block) — full review list, UGC gallery, press quotes; lazy-loaded below fold
- Layer 5 — Cross-sell (related-products, complementary collection) — four to eight tiles with limit enforced in Liquid
- Layer 6 — FAQ (product-faq blocks) — schema-friendly FAQ for on-page SEO and objection handling
Mobile-first stack discipline
Seventy percent of client PDP traffic is mobile. A section stack that looks logical on a 1440px Figma frame fails when the variant picker sits below three editorial bands. We prototype product.json order on iPhone width first: can a shopper reach add-to-cart in one thumb zone without collapsing tabs? Sticky add-to-cart bars — separate sections or header extensions — are controversial. We add them for high-AOV apparel when the gallery is tall, but we remove them when they cover accessibility controls or conflict with cookie banners. Test on real devices, not only Chrome devtools. Performance checklist before launch includes PDP-specific image and JS budgets we enforce before UAT.
Gallery and media sections
Product media usually lives inside main-product, not a standalone section — splitting gallery from buy box breaks Dawn's JS variant sync. Custom themes sometimes extract a product-gallery section; then you own synchronizing selected variant images with picker state. We have seen rescue projects where a fancy gallery section desynced from hidden variant inputs and shoppers added the wrong SKU. If Figma shows a cinematic full-bleed gallery, negotiate whether it belongs on product.json or on a landing page template instead. Not every design compromise is worth conversion risk.
Custom sections we ship on product templates
Beyond core main-product, we build reusable sections tuned for PDP context: product-trust-icons (flat settings, three to four icon+text rows), product-comparison-table (blocks for feature rows), product-ingredients (richtext + metafield fallback), product-story (editorial image + copy), and product-faq (block accordion). Each gets presets, scoped CSS, and product-aware optional settings — e.g. hide section when a metafield flag is false. We convert HTML modules through the converter workspace and refine schema with Schema Generator so merchants see labels like Shipping message not field_3.
{%- comment -%} sections/product-trust-icons.liquid — PDP trust band {%- endcomment -%}
{% if section.settings.heading != blank %}
{{ section.settings.heading }}
{% endif %}
{% for block in section.blocks %}
-
{% if block.settings.icon != blank %}
{{ block.settings.icon | image_url: width: 48 | image_tag: loading: 'lazy', alt: '' }}
{% endif %}
{{ block.settings.label }}
{% endfor %}
Metafields and dynamic section visibility
Not every product needs every section. Supplement brands show ingredient panels only when a metafield is populated; B2B products hide consumer FAQ. We gate sections with Liquid at the top of the file — if product.metafields.custom.show_comparison != true, skip rendering — but the section still appears in the editor unless you use advanced patterns. Merchants prefer toggles: a checkbox setting Show comparison table defaulting from metafield via Liquid assign. Document which metafields drive visibility so operations teams know why a section disappeared on a SKU. Metafields beginner tutorial covers namespace conventions we use on PDPs.
Cross-sell without killing performance
related-products and complementary product sections are conversion levers that become performance traps. We always set {% for product in recommendations.products limit: section.settings.max %} or collection loops with hard caps — default four on mobile, eight on desktop grids. Use image_url widths matching card layout, loading="lazy", and avoid nested loops scanning all collections. Shopify's Search & Discovery app influences recommendations; custom collection pickers are fallback when merchandising wants manual control. Dhruv adds a section setting Collection fallback when recommendations API returns empty — prevents blank bands on new launches.
Schema UX on product-specific sections
Product template sections get edited by operations teams under time pressure. Labels must be plain language: Cross-sell heading not Section title line 1. Group advanced controls under header settings — Layout, Colors, Visibility. Use blocks for repeatable rows; flat settings for global toggles. We follow merchant-friendly schema patterns on every PDP section because a confused merchant reorders blocks randomly and blames development. Presets seed realistic copy — Free shipping on orders over $50 — so the editor demo matches launch state.
QA script for product section stacks
Before client UAT we run a PDP QA script on five product archetypes: single variant, multi-variant with swatches, sold out, on sale with compare-at, and long-title SKU. For each: verify block_order in editor matches storefront, test app blocks with client's installed apps, confirm related products respect limit, check FAQ accordion keyboard access, run Lighthouse on mobile with throttling. We screenshot theme editor block_order and attach to the PR so future developers know why reviews sit below buy buttons. Section tutorial is the doc we link for merchants after handoff.
Conversion mistakes we still fix on rescue PDPs
- Buy buttons below three full-width editorial sections on mobile — ATC buried.
- Duplicate review widgets — app block plus hardcoded embed.
- Variant picker using broken JavaScript while Liquid fallback was removed.
- related-products without limit on large catalogs — 4s TTFB.
- product.json order array missing a section key — orphaned section invisible on storefront.
- Hardcoded product.handle in upsell section — breaks when merchandising renames handles.
When to split PDP into multiple templates
Some catalogs need product.t-shirt.json versus product.bundle.json when layouts diverge materially — subscription builder versus simple SKU. Shopify supports alternate product templates via template suffix. We create separate JSON templates when block_order inside main-product would require so many conditional Liquid branches that a second template is clearer. Do not multiply templates for color swaps; do multiply when an entire section stack differs. Assign templates per product in admin; document in handoff which products use which suffix.
Sticky buy box and secondary ATC patterns
Sticky add-to-cart bars solve tall gallery problems on mobile but create accessibility and z-index wars with cookie banners, chat widgets, and announcement bars. When we implement sticky ATC as a separate section or header extension, we scope it to product templates only and test focus order — screen reader users must reach variant controls before the sticky bar duplicates them. We disable sticky ATC when main-product buy_buttons are already visible in viewport using IntersectionObserver in theme JS. Schema for sticky sections stays minimal: show/hide toggle, optional trust line, background color_scheme. Merchants enable after launch when analytics show scroll-depth drop-off, not by default on every build.
Structured data and PDP sections
Product structured data usually lives in theme.liquid or a dedicated snippet — not scattered across marketing sections — but FAQ sections can emit FAQPage schema when content is substantive. We avoid duplicate Product JSON-LD from multiple sections. Review apps inject their own schema; custom FAQ sections need valid question-answer pairs in visible HTML, not hidden SEO spam blocks. When clients ask for SEO sections on product.json, we educate: editorial bands help conversion; keyword stuffing in accordion sections hurts trust.
Measuring stack changes without breaking editor UX
A/B testing product section order is rare on Shopify compared to headless stacks, but merchants still reorder sections in the editor after launch. We document baseline block_order and index.json order in handoff so reversions are easy. If a client tests moving reviews above related products, duplicate the theme first — never experiment on live during BFCM. Analytics events on add-to-cart and scroll depth inform whether social proof should move up; development supplies flexible JSON templates, marketing owns order experiments within trained bounds.
Subscription and bundle sections on product.json
Consumable brands increasingly stack subscription app blocks with custom education sections — how it works, cancellation policy, savings calculator. Theme sections handle static education; subscription widgets stay app blocks with @app slots in main-product. We never rebuild subscription checkout logic in Liquid. Bundle builders that change line item properties need coordination between product form sections and cart drawer display of properties — cart drawer patterns show how line item properties render. When bundle section and app both modify quantity rules, pick one owner; dual logic causes cart errors that look like theme bugs but are integration failures.
Wholesale and volume pricing bands
B2B product templates often add sections for volume pricing tables fed by metafields or B2B apps. These sit below main-product, not inside buy_buttons, unless the app requires block injection. Liquid loops over tier rows from metaobjects — each row is block-like but often static per product type. Merchants edit tiers in admin, not theme editor, when data is SKU-specific. Clarify edit path in handoff to prevent operations opening theme editor looking for price breaks that live in metafields.
Launch week PDP monitoring
First seventy-two hours after PDP stack launch: monitor add-to-cart rate by device, scroll depth heatmaps if client has tooling, and support tickets mentioning variant selection or missing reviews. Hotfix on duplicate theme. Common launch issues — app block not enabled in migrated main-product, related products limit unset causing slow load, trust band hidden by empty metafield gate. Keep rollback theme published and ready one click away through end of week one.
Long-term, we review PDP stack quarterly with retained clients: analytics, new apps, seasonal sections. Sections added ad hoc without stack discipline recreate the mess migrations solve. Quarterly review keeps product.json intentional — not fifteen bands because five stakeholders each added one promo section.
The best product page stack is the one the merchant can edit without calling you — and the shopper can buy from without scrolling through a brand manifesto.
Implementing your next product stack
Audit your current product.json this week. Label each section's job, measure mobile scroll depth to add-to-cart, and compare against installed apps for duplicate widgets. Build one new PDP section — trust band or FAQ — through our section workflow, register it below main-product, and run the five-product QA script. Conversion optimization is iterative; the stack is the foundation. Get the JSON architecture right and A/B tests have something stable to measure.
Frequently asked questions
Should reviews live inside main-product or as a separate section below?
If the reviews app supports an app block inside main-product, place stars near the title for social proof above the fold. Long-form review widgets almost always belong in a dedicated section below the buy box to avoid pushing add-to-cart below the fold on mobile.
How many sections belong on a product template?
We typically ship six to ten sections on product.json: main-product, optional sticky bar, trust icons, comparison table, FAQ, related products, and one editorial band. More than twelve sections without lazy loading hurts mobile performance and dilutes focus.
Can merchants reorder product page sections safely?
Yes on JSON templates — but educate them that moving main-product breaks the page. We lock critical sections with documentation and use clear section names like Product — main buy box so accidental deletion is rare.
What is the best block order inside main-product?
Title, price, variant picker, quantity, buy buttons, then pickup availability, then collapsible tabs for description and specs. App blocks for reviews usually sit after title or before buy buttons depending on A/B results — document the default.
Do section stacks differ for luxury versus DTC supplement brands?
Yes. Luxury stacks emphasize editorial imagery and minimal buy-box clutter; supplement and consumable brands stack trust badges, subscription widgets, and ingredient FAQs higher. The JSON architecture is the same — order and block density change.
Topic cluster
Shopify Sections
OS 2.0 sections, JSON templates, and section architecture.
Convert HTML to Shopify Liquid
Paste HTML & generate Liquid with schema, blocks, and scoped CSS. No signup required.
Share
Share this guide
Found this guide useful? Share it with other Shopify developers on LinkedIn, X, or Reddit.
Authors
About the authors
Practical Shopify section workflows from the developers who build and maintain this tool.

Dhruv Goyani
3 years web design + 3 years Shopify development experience
Dhruv combines web design and Shopify theme development — converting Figma and static HTML into merchant-editable OS 2.0 sections for client stores. He focuses on schema structure, section presets, and clean handoffs between design and Liquid.
Follow Dhruv on LinkedIn
Nishad Kikani
2 years web design + 6 years Shopify development experience
Nishad has six years of Shopify theme engineering — Dawn migrations, JSON templates, performance tuning, and complex block-based sections. He leads client delivery, code review, and the production standards behind every export from HTML to Liquid Converter.
Follow Nishad on LinkedInRelated articles from our team
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.