3 min readOct 18, 2026by jakub

Collective Packaging

Sell the products your customers buy in multiples the way they buy them: as a 6-pack, a 12-pack or a case, each at its own price, without creating extra SKUs, extra stock or a second product to maintain. The pack is a choice on the product page; the cart, the order, the warehouse and your reports keep counting the units.

Latest version: 1.0.0 — changelog

The product page of a bottle of water offering a single unit, a 6-pack, a 12-pack and a case of 24, each with its price per unit, the 12-pack preselected and its price worked out underneath

Who it's for

  • Food, drink and household stores whose customers buy by the six or by the case, and who want one SKU and one stock pool behind every pack size.
  • Wholesale and B2B stores that sell a trade pack to one customer group and single units to everyone else, since every pack can be limited to a website and a customer group.
  • Stores on Hyvä as well as Luma: the companion module renders the same selector, units panel and cart offers in Alpine.js, including under Hyvä's strict Content Security Policy build.
  • Headless and marketplace integrations that add packs to carts through REST, where the pack travels as a product option and is validated on the server.

Why it matters

  • Higher basket values without discount codes: a shopper who came for one bottle sees the per-unit saving of the 6-pack beside it and the exact pack price before adding it.
  • No phantom stock: a 12-pack reserves, ships, cancels and returns 12 units of the one SKU, so a case sold online never oversells the single units on the shelf.
  • One price list to maintain: a pack is a percentage off the unit, an amount off each unit or a fixed pack price, and it coexists with special prices, tier prices and catalog rules under a policy you choose.
  • Fewer abandoned carts on odd quantities: a customer who needs 25 units types 25 and gets the cheapest exact combination of packs and singles in one click, never a silent round-up.
  • Carts that repackage themselves: when two 6-packs cost more than a 12-pack, the cart says so and applies the change in one click, always showing the real change in what the customer pays.

See it in action

  • You set a 12-pack at a fixed $11.99 on a $1.20 bottle → the product page shows 12 units for $11.99 instead of 12 x $1.20 = $14.40 under the selected pack, and the main price reads $11.99.
  • You set a 6-pack at 10% off the unit price → the hint reads 6 units x $1.20 = $7.20, minus 10% = $6.48, and the cart charges $6.48 per 6-pack.
  • A customer types 25 units of that water → the page proposes 1 x Case of 24 + 1 x Single unit for $22.80 and adds both lines with one click.

The units panel of a product page with 25 typed in and the proposed combination of one case of 24 and one single unit

  • A customer has two 6-packs (12.96) in the cart → the cart offers Same 12 units for $0.97 less: 1 x 12-pack and swaps the lines when they accept.
  • An integration adds collective_pack_option_id of the 6-pack with quantity 2 through REST → the cart line prices at 6.48 with a subtotal of 12.96.

The cart's offer to repackage two 6-packs as one 12-pack for less, with an Apply button

What you can do

FeatureBenefit
Setting up packs on a productAdd pack rows to any simple, virtual, downloadable, configurable or bundle product in the product form, each with its own size, price type, scope and default, saved with the product.
Packs on the product pageCustomers choose a pack where they decide, see the price per unit, the pack total and the saving, and the main price follows their choice on Luma and Hyvä.
Buying by units and cart offersA typed unit count becomes the cheapest exact combination of packs, and the cart proposes cheaper repackaging or the next full pack with its true cost.
Orders, shipments and stockOrder lines keep the pack they were sold as, and reservations, shipments, cancellations and credit memos move stock by the units inside.
REST APICreate and read packs, plan a unit count and add packs to headless carts through documented endpoints.

The Collective Packaging fieldset of a product in the admin, with two pack rows, one of them limited to the Wholesale group

An order line sold as a 6-pack in the admin, with its Packaging row under the product name

Competing solutions

The right-hand column describes common market practice, not any particular vendor.

QoliberTypical marketplace extension
GitLab accessFull access to the module's GitLab repository — source, history, issues and merge requestsVaries by vendor
Packagist installationInstalled and updated with Composer from our private Packagist (qoliber.repo.packagist.com)Varies by vendor
Slack access to the development teamA shared Slack channel with the developers who build and maintain the moduleUsually ticket-based
Unit tests54 PHPUnit unit tests (17 classes) in the repositoryNot typically published
Integration tests49 Magento integration tests (14 classes), run before every releaseNot typically published
E2E Playwright tests22 Playwright end-to-end tests (10 spec files) on Luma and Hyvä, run before every releaseNot typically published
Hyvä supportA companion module renders the selector, the units panel and the cart offers in Alpine.js, verified on Hyvä 1.5.2Varies by vendor
PHP / Magento rangePHP 8.1 to 8.5, Magento Open Source and Adobe Commerce 2.4.6 to 2.4.9 with MSIVaries by vendor
DocumentationFull docs portal: install, configuration, usage, API referenceVaries by vendor
  • Hyvä-native. Qoliber_CollectivePackagingHyva ships CSP-safe Alpine.js templates for the product page and the cart.
  • API-first. Pack options are a REST resource and a product extension attribute; carts take a pack through the product option.
  • No SaaS. Everything runs inside your Magento store: no external service, no data leaves it.

Good to know

  • Packs are not a product type. A product keeps its SKU and its stock item; a pack is a quantity choice on it, so grouped products and mixed-SKU kits are out of scope.
  • Buy by units and cart offers skip bundle products, lines with custom options and lines with decimal quantities, and never plan more than the configured maximum of units.
  • A dynamic bundle sold as a pack can differ by one cent between the pack price shown and the sum of its selection rows, because Magento rounds every quote line on its own.
  • The admin order-create screen has no pack selector; reorders and cart edits keep the original pack.
  • The module requires Magento Inventory (MSI); stores running the legacy CatalogInventory stock alone are not supported.

Supported versions: Magento Open Source and Adobe Commerce 2.4.6 to 2.4.9, PHP 8.1 to 8.5. Release gates ran on 2.4.9, PHP 8.3, Luma and Hyvä 1.5.2.

Install the extension · Configure it · Licensing and partnership

Collective Packaging — Catalog & Products — Extensions | qoliber Docs