Overview
Shopify's current default Order confirmation template can show a bundle parent with its component products nested underneath. If your email still lists components separately, an older customized template probably needs to be reverted or updated. Shopify's bundle data supplies titles, quantities, and variants; customer-entered details can also appear when the template renders the relevant line-item properties. This guide covers the safest update path, required Liquid structure, and final test.
Contents
- Why aren't Shopify bundle components grouped in the order confirmation email?
- What bundle details can a Shopify order confirmation email show?
- Step 1 - Back up the current order confirmation template
- Step 2 - Choose between reverting and editing the template
- Step 3 - Add the grouped bundle output to a customized template
- Step 4 - Test the bundle output from product page to email
- Which Shopify notifications still show bundle components separately?
- Troubleshooting Shopify bundle order emails
Why aren't Shopify bundle components grouped in the order confirmation email?
Current default templates render ordinary products from subtotal_line_items and bundle parents with nested products from line_item_groups. The email can therefore show one bundle title with its components underneath.
A customized template does not automatically gain later default-code changes. It might still render every subtotal line as a flat list even when the order contains a bundle relationship.
Was the notification template customized before Shopify added grouped bundle support?
Go to Settings > Notifications > Customer notifications > Order confirmation. A Revert to default action indicates custom code. Copy the complete template before using it because reverting removes those customizations.
What does Shopify's grouped bundle view display?
The grouped view can display the parent's title, image, quantity, combined price, and discounts. Each nested component can show its product title, quantity, image, and variant choice such as size, colour, or flavour.
For a deeper explanation of why some bundles have this relationship and others remain flat, see Shopify native bundles versus legacy bundles.
What bundle details can a Shopify order confirmation email show?
Shopify's bundle relationship and custom data attached to individual order lines can be rendered together, but one does not replace the other.
| Detail | Liquid source | Typical output |
|---|---|---|
| Bundle parent | line_item_group |
Bundle title, image, quantity, total price |
| Selected products | line_item_group.components |
Component title and quantity |
| Variant selections | component.variant.title |
Size, colour, flavour, or combined option values |
| Customer-entered data | component.properties |
Gift message, engraving, recipient name, or another public property |
How are component titles, quantities, and variant choices shown?
Each item in line_item_group.components is a line item, so the template can read its title, quantity, variant, image, price, discounts, and supported line-item data. A customized email shows only the fields its Liquid outputs.
How do line-item properties display custom bundle information?
Line-item properties are key-value pairs submitted with a product. A customized notification must loop over properties on the relevant order line to show them. In grouped markup, that line is usually the component, not the parent presentation row.
Public properties can be shown to the customer. Filter underscore-prefixed private or app keys out of customer-facing markup even though Liquid can still access them.
Step 1 - Back up the current order confirmation template
Where do you find the Order confirmation notification in Shopify?
Open Settings > Notifications > Customer notifications > Order confirmation, choose Edit code, and copy the entire template into a plain-text file. Save the subject line separately if it contains Liquid or custom wording.
What should you save before reverting or editing the Liquid?
Do not copy only the section you expect to change. Email templates often include branding, translation strings, payment instructions, analytics, and app-specific markup elsewhere in the file. A complete backup gives you a reliable rollback and a clean way to compare your changes.
Tip - Name the backup after the notification and keep it outside Shopify before you click Revert or Save.
Step 2 - Choose between reverting and editing the template
When is reverting to Shopify's default template the safer option?
If the template is close to Shopify's default, the lowest-maintenance route is usually to back it up, revert it, and then reapply the few changes you still need. This restores Shopify's complete current bundle markup, including price and discount handling that is easy to miss in a partial edit.
When should you preserve the custom layout and patch its Liquid?
If the notification has a heavily customized layout, important app integrations, or extensive conditional content, patching the current code can be safer. Use Shopify's grouped bundle template guide as the canonical source and adapt its group block to your existing table structure.
Step 3 - Add the grouped bundle output to a customized template
Find the loop beginning with {% for line in subtotal_line_items %}. Prevent grouped components from rendering there, then render each bundle from line_item_groups.
How do you stop grouped components from rendering again in the flat line-item loop?
{% for line in subtotal_line_items %}
{% if line.groups.size == 0 %}
<!-- Existing line markup -->
{% endif %}
{% endfor %}
Without this condition, the new grouped block can appear correctly while the same components also remain in the old flat list.
How do line_item_groups and components render the bundle parent, choices, price, and discounts?
After the flat loop, use Shopify's full line_item_groups reference block. It calculates the parent price and preserves discount allocations, so avoid rebuilding that logic casually.
{% for line_item_group in line_item_groups %}
<!-- Parent markup -->
{% for component in line_item_group.components %}
<!-- Component markup -->
{% endfor %}
{% endfor %}
How do you render public line-item properties beneath the correct component?
Add the property loop inside the component's description cell, near its variant title. This example skips blank values and underscore-prefixed keys:
{% for property in component.properties %}
{% assign property_first_char = property.first | slice: 0 %}
{% if property.last != blank and property_first_char != '_' %}
<span class="order-list__item-variant">
{{ property.first | escape }}: {{ property.last | escape }}
</span><br>
{% endif %}
{% endfor %}
Properties remain attached to the order line but appear only when the email renders them. If a value belongs to one selected component, loop over that component's properties rather than the parent.
Step 4 - Test the bundle output from product page to email
Which component, quantity, variant, and property combinations should the test order cover?
Use a controlled order with one bundle and one ordinary product. Choose distinctive components, a quantity above one, non-default variants, and a recognizable public property. Include an underscore property if supported to confirm it stays private.
- Add the configured bundle through the storefront rather than recreating its lines manually in admin.
- Complete the order with an approved test payment method for your store.
- Check the received email on desktop and mobile.
- Confirm the parent appears once, every component appears once, quantities and variants match, public properties sit under the correct component, and totals equal the order.
How do you check for missing or repeated properties, pricing errors, and mobile readability?
Inspect the order in admin first: a missing value was either never submitted or not rendered. For duplicates, confirm the flat loop skips grouped lines. For wrong totals, restore Shopify's complete calculation block. Check long names and property values on a narrow mobile screen.
Which Shopify notifications still show bundle components separately?
Why do return-related notifications and split fulfilments use individual lines?
Shopify documents return-created and return-request notifications as flat views, so each product in the bundle appears separately. Fulfilment messages can also be scoped to the physical lines in a particular shipment rather than the original merchandising parent, especially when an order is split. Treat that as a fulfilment view, not evidence that the bundle relationship was lost.
Which order, invoice, POS, staff, and abandoned-checkout notifications support grouping?
Shopify documents grouped bundle output for Order confirmation, Order invoice, pending payment success and error messages, POS customer emails and receipts, New order, New draft order, and abandoned checkout notifications. Return notifications, new return requests, and sales-attribution edits continue to list bundle products separately.
Do not assume that fixing Order confirmation changes every notification. Each customized template has its own code and should be backed up, updated, and tested independently.
Troubleshooting Shopify bundle order emails
Why does a default-looking template still show a flat bundle?
First confirm that the order was created as a Shopify bundle with group data. Then search the template for line_item_groups. A branded template can look close to the default while still using an older flat line-item block, and a copied template can miss Shopify's current group loop even if the visual styling looks standard.
What if a third-party email app sends the confirmation instead of Shopify?
A third-party sender controls its own order query and rendering. Updating Shopify's native Order confirmation template will not change that email. Check whether the provider retrieves Shopify's bundle group relationship and supports nested component output; otherwise, ask the provider for its current bundle-email method.
Can Shopify Support edit a heavily customized notification?
Shopify says Support might help with minor notification adjustments, but it cannot extensively rewrite a complex customized template. For a heavily modified layout, use the official code as the reference and work with the developer who built the email or a Shopify Partner. Keep the full backup available for comparison and rollback.