OxifyOxify

Troubleshooting order templates

The SKU is blank, lines aren't grouping, or the preview looks wrong — what each symptom means.

The SKU is missing in the template preview

Expected. Shopify's packing slip and notification previews render fake line items with no line item properties, so Bundle SKU and _bundle_id are both empty there and nothing groups.

Test with a real order instead:

  • Packing slip — Orders → open a real order with a bundle → More actions → Print packing slips.
  • Notification — place a test order, then Orders → the order → Resend email.

The SKU is missing on a real order

Work down this list:

Is the setting on? Bundle builder → Settings tab → General Settings → Advanced settings → Add the bundle SKU to each product in the order. See Turn on the bundle SKU.

Does the parent product have a SKU? The help text under the checkbox shows the current SKU, or says No SKU is set yet. A new parent product starts with an OXB-… SKU, so a blank one means you cleared it, or the product doesn't exist yet — the app only creates it when you publish or save from inside the builder, not when you switch the builder to Published in the Bundle Builders list. Once the product exists, click Edit Parent Product at the top of the builder to set a SKU.

Did you save after turning it on? The checkbox only reaches the storefront when you click Save on a published builder, or Publish on a draft. (A SKU edit on the parent product syncs on its own — it's the checkbox that needs a save.)

Was the order placed before the change? Properties are stamped when the shopper adds the box to the cart. Existing carts and past orders keep the old set — start a fresh cart and place a new test order.

Lines aren't grouping

  • Check for _bundle_id. Open the order in admin and look at the line item properties on a component. Underscored properties are always visible there. If _bundle_id is absent, the item wasn't added through a bundle builder. (Quantity Break deals on product pages write a different property, _oxify_bundle, which these snippets don't read.)
  • Check your property syntax. line.properties["_bundle_id"] and line.properties._bundle_id both work; line.properties.Bundle SKU does not — a name with a space needs the bracket form.
  • Check the loop variable. Packing slips use line_items_in_shipment; notifications and Order Printer use line_items; themes often use item. A snippet copied from the wrong page loops over nothing and silently prints nothing.
  • Don't depend on line_item.groups. It's a Shopify packing slip variable, and the packing slip snippet uses it only to read the bundle's name. Theme templates don't have it, and Order Printer lists it without describing it. Every snippet groups by _bundle_id.

Two boxes render as one group

They shouldn't — each box gets its own _bundle_id. If they merged, you're probably grouping by _bundle_builder_id (which identifies the builder, not the box) or by the bundle's name (two boxes from the same builder share one) rather than _bundle_id.

One box renders as two groups

The opposite problem, and usually the same cause in reverse: mixing key sources, such as grouping some lines by _bundle_id and others by the bundle's name. Use _bundle_id as the key in every loop, exactly as the packing slip snippet does — every line of a box shares it.

The bundle name says "Bundle"

That's the last fallback in the chain, and it means none of the name sources were present on the line. For a merged box ordered with the current format that's expected: the name isn't written on the lines, and the snippets only read it on packing slips, from the native group title. It's harmless. If the name matters to you, map _bundle_builder_id to a name, or use the SKU, which is the reliable identifier on the line — turn it on and lead the header with it.

Prices don't add up

Sum final_line_price across the components, never price or original_line_price. final_line_price already includes bundle pricing and any of your own automatic discounts, so the group total matches what was charged. In Order Printer that means final_line_price, not the deprecated line_price, which leaves out automatic discounts. The bundle parent line no longer exists on the order, so there's nothing else to read the total from.

Raw properties print on every row

A loop over line_item.properties includes the underscore-prefixed ones (_bundle_id, _slot_index, _oxify_builder …), and the visible Bundle SKU prints on every component row. Skip them in your loop with the first-character check shown in The properties.

A bundle splits across two printed pages

Add page-break-inside: avoid; to your bundle group's CSS class. It's included in the packing slip CSS.

I broke the template

  • Notifications — Settings → Notifications → the notification → Revert to default. This discards all customizations in that template, not just yours.
  • Packing slip — there's no revert button. Paste back the copy you saved before editing.
  • Theme — Online Store → Themes → ⋯ → the older version, or discard the changes in the code editor's file history.

What support can and can't do

We can confirm which properties are on your order lines and what they mean. We can't write or debug Liquid in your store's templates — those belong to your store, and a template edit can affect far more than bundles.