The properties
The line item properties Bundle Builder writes on every component line — what each one means, and which ones your templates should read.
Grouping in Liquid works because every product added from a builder carries identifying properties. This page is the reference; the template pages use them.
The ones you should read
| Property | Example | What it's for |
|---|---|---|
Bundle SKU | BOX-COFFEE-6 | Visible, human-facing. Your parent product's SKU. Only present when the setting is on. |
_bundle_id | bundle-42-1717070000 | The grouping key. Unique per box the shopper built — two boxes from the same builder in one order get two different ids, so they render as two groups. |
_bundle_builder_id | 42 | Which builder the box came from. Use it if you want different markup per builder. |
_slot_index | 0, 1, 2 … | Position in the box. |
Gifts, packaging, and add-ons
These ride as their own cart lines, separate from the bundle's component lines, so they need their own check if you want to label them instead of hiding them outright:
| Property | Present on |
|---|---|
_bundle_gift | A free gift at a tier. Rides inside the bundle with the same _bundle_id as the rest of the box — merged cart lines only. |
_foxr_gift_box | Gift packaging the shopper opted into. Its own line, outside the bundle. |
_foxr_addon | An add-on product. Its own line, outside the bundle. |
The ones that may or may not be there
These exist for the app's own pricing and merging logic. Read them only as fallbacks, and always guard with != blank.
| Property | When it's present |
|---|---|
_foxr_builder | Individual cart-line mode only. A compact JSON string holding the bundle name and discount. |
_bundle_cart_mode | Individual mode only — the value is individual. |
_bundle_discount | Merged mode, current format, e.g. percentage:50. |
_bundle_name, _bundle_image_url, _bundle_parent_variant, _bundle_discount_type, _bundle_discount_value | Merged mode, legacy format only — stores that haven't republished since the compact format shipped. Don't rely on _bundle_name or _bundle_image_url being there; fall back to the first component's image. |
Underscored properties are hidden from customers, not from you
Shopify hides _-prefixed properties on the storefront and in emails, but they are always visible on the admin order page. That's a Shopify behaviour with no way to turn it off — it's why the app writes as few of them as it can.
Getting the bundle's name
There is no single property that always holds the name, so templates resolve it in this order:
Native group title. On packing slips, a merged bundle exposes line_item.groups; the non-deliverable group's title is the bundle's name.
_foxr_builder. In individual mode, split the JSON string on "n":" and take what's before the next quote — Liquid can't parse JSON, so string-splitting is the only option.
_bundle_name. Present on legacy merged-mode lines.
A literal fallback, like Bundle.
Each template page implements this chain for you — you don't have to write it yourself.
Reading a property in Liquid
Two syntaxes, both valid. Use the bracket form when the name has a space or starts with an underscore:
To hide the raw properties from a row you're rendering yourself, skip the ones you've already displayed in the header (Shopify already hides _-prefixed properties from customer-facing output):
Next
Packing slips — the full worked example.