Shopify Bundles & Packing Slip Formatting

Topic summary

Merchants using Shopify’s Bundles app are frustrated with default packing slip formatting. Currently, packing slips display all individual components of a bundle rather than just the bundle name and price, creating confusion for customers and cluttered documentation.

Key Issues:

  • Customers see itemized components on packing slips despite purchasing a named bundle
  • International shipping requires separate customs declarations for each bundled item instead of one declaration
  • Bundle details aren’t accessible in product page templates, yet only individual items appear at checkout
  • For bundles with many items (e.g., 11+ components), this creates excessively long packing slips

Workarounds Shared:

  • Custom HTML/Liquid code modifications to show only bundle names (code samples provided by daveuk100 and malamutemama9)
  • Using ChatGPT to customize packing slip templates (tutorial link shared by jam_chan)

Current Status:
One merchant reported no response from Shopify’s Bundles team after providing detailed feedback. The discussion remains open with merchants seeking official solutions while sharing their custom code workarounds.

Summarized with AI on October 23. AI used: claude-sonnet-4-5-20250929.

We have been selling bundled items for years as a standard Shopify listing, and are considering switching them to a Bundle HOWEVER

The default Packing Slip formatting doesn’t show the name of the Bundle and its price, rather, it lists all the items in the bundle. We don’t want that.

Is there a way in Bundles to format the Packing slip to just list the Bundle’d Item Name and its Price, and omit all the components of the bundle?

Doing so is a much more pleasing packing slip for the customer, and since our Bundles contain upwards of 11 items it will save 11 line-items on the packing slip.

4 Likes

We have the same feedback and would like a solution to this.

It makes no sense to me that from a bundle product page liquid template, there is no way to even access the details of the individual products that make up the bundled product…but then on the checkout + order admin screen + packing slip it ONLY shows the individual products. That is a very confusing experience for the customer who purchased the bundled item, not the individual products.

This is also a pain when shipping international orders as the custom form will require us to have a declaration for every bundled product, instead of just one declaration for the bundled product itself.

I am in contact with some of the bundle team and I am providing them this + other feedback via email. I hope we will have a solution soon.

2 Likes

If you do get some good feedback - we would love to hear about it. We use a lot of bundles too and the packing slip - the piece of the order the customer sees - has the the breakdown - and the order sheet (that the customer should not see) has the bundle name. Please help!

I am having the exact opposite issue. Care to share your HTML coding?

This is ours that does not do the line by line breakdown.

Packing Slip body { font-family: Arial, sans-serif; font-size: 12px; margin: 20px; } .packing-slip { padding: 20px; width: 600px; } .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } .footer { text-align: center; margin-top: 20px; } .info-container { display: flex; justify-content: space-between; margin-bottom: 20px; } .info { width: 48%; } table { width: 100%; border-collapse: collapse; } th, td { padding: 5px; text-align: left; } th:nth-child(2), td:nth-child(2) { text-align: right; } .separator { border-top: 1px solid black; margin: 10px 0; }

Packing Slip

Order #: {{ [order.name](http://order.name) }}

Date: {{ order.created_at | date: "%B %d, %Y" }}

{% if delivery_method.instructions != blank %}Delivery to{% else %}Ship to{% endif %}:
{{ [shipping_address.name](http://shipping_address.name) }}
{{ shipping_address.address1 }}{% if shipping_address.address2 %}, {{ shipping_address.address2 }}{% endif %}
{{ shipping_address.city }}, {{ shipping_address.province_code }} {{ shipping_address.zip }}, {{ shipping_address.country }} {% if shipping_address.phone != blank %}
{{ shipping_address.phone }} {% endif %}
Bill to:
{{ [billing_address.name](http://billing_address.name) }}
{{ billing_address.address1 }}{% if billing_address.address2 %}, {{ billing_address.address2 }}{% endif %}
{{ billing_address.city }}, {{ billing_address.province_code }} {{ billing_address.zip }}, {{ billing_address.country }}

Order {{ [order.name](http://order.name) }}

ItemsQuantity
{% for line_item in order.line_items %} {% if line_item.bundle_title != blank %} {% endif %} {% endfor %}
{{ line_item.bundle_title }}
{{ line_item.title }} {% if line_item.bundle_variant_title != blank %}
Bundle Variant: {{ line_item.bundle_variant_title }} {% endif %}
{{ line_item.quantity }}
{% if order.note != blank %}

Notes: {{ order.note }}

{% endif %} {% if delivery_method.instructions != blank %}

Delivery Instructions: {{ delivery_method.instructions }}

{% endif %}
{% unless includes_all_line_items_in_order %}

There are other items from your order not included in this shipment.

{% endunless %}

Thank you for supporting our small business!

Company Name
Company Address
Company Email

For what it’s worth, I didn’t hear anything back from the Bundles team contact after I sent them more feedback. I had been using bundles intensively for a few weeks and had a lot of feedback to share (and I certainly did! sent a lot of detailed feedback their way…).

So…I have no idea if they plan to continue investing in this app or not. Bundles just feels like a feature that should already be baked into Shopify, not a separate app. I think some of the weird issues that we see with Bundles today are probably caused by it not being a built-in shopify feature and hitting various limitations as a result of being delivered as a app.

Anyhow…we ended up using the following code in our packing slip. It has worked well for us so far. Instead of showing every item from the bundle on the packing slip, this code will just show the bundle name (1 line item) and will not show the items within the bundle.

{{ shop.name }}

Order {{ order.name }}

{{ order.created_at | date: "%B %e, %Y" }}

{% if delivery_method.instructions != blank %} Delivery to {% else %} Ship to {% endif %}

{% if shipping_address != blank %} {{ shipping_address.name }} {% if shipping_address.company != blank %}
{{ shipping_address.company }} {% endif %}
{{ shipping_address.address1 }} {% if shipping_address.address2 != blank %}
{{ shipping_address.address2 }} {% endif %} {% if shipping_address.city_province_zip != blank %}
{{ shipping_address.city_province_zip }} {% endif %}
{{ shipping_address.country }} {% if shipping_address.phone != blank %}
{{ shipping_address.phone }} {% endif %} {% else %} No shipping address {% endif %}

Bill to

{% if billing_address != blank %} {{ billing_address.name }} {% if billing_address.company != blank %}
{{ billing_address.company }} {% endif %}
{{ billing_address.address1 }} {% if billing_address.address2 != blank %}
{{ billing_address.address2 }} {% endif %} {% if billing_address.city_province_zip != blank %}
{{ billing_address.city_province_zip }} {% endif %}
{{ billing_address.country }} {% else %} No billing address {% endif %}


Items

Quantity

{% comment %}
To adjust the size of line item images, change desired_image_size.
The other variables make sure your images print at high quality.
{% endcomment %}
{% assign desired_image_size = 58 %}
{% assign resolution_adjusted_size = desired_image_size | times: 300 | divided_by: 72 | ceil %}
{% capture effective_image_dimensions %}
{{ resolution_adjusted_size }}x{{ resolution_adjusted_size }}
{% endcapture %}

{% assign activegroup = ‘’ %}
{% for line_item in line_items_in_shipment %}
{% if line_item.groups and line_item.groups.size > 0 %}
{% assign currentgroup = line_item.groups.first.title %}
{% if activegroup == currentgroup %}
{% continue %}
{% else %}
{% assign activegroup = currentgroup %}
{% endif %}

{{ currentgroup }}

{{ line_item.shipping_quantity }} of {{ line_item.quantity }}

{% endif %}
{% endfor %}

{% for line_item in line_items_in_shipment %}
{% unless line_item.groups and line_item.groups.size > 0 %}

{{ line_item.title }} {% if line_item.variant_title != blank %} {{ line_item.variant_title }} {% endif %} {% for group in line_item.groups %} Part of: {{ group.title }} {% endfor %}

{{ line_item.shipping_quantity }} of {{ line_item.quantity }}

{% endunless %}
{% endfor %}


{% if delivery_method.instructions != blank %}

Delivery instructions

{{ delivery_method.instructions }}

{% endif %}

Thank you!

{{ shop.name }}
{{ shop.email }}

Shared our code above too.

@PoshtaDesign

Yes, you can copy and paste the packing slip template into chatgpt and ask it to customize for you. After that, copy and paste the result back into Shopify admin. The result should be usable.

We have been doing so for a while. Feel free to refer to our tutorial: How To Add The Bundle Name To The Packing Slip - BYOB Knowledge Base