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

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.40under 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.80and adds both lines with one click.

- A customer has two 6-packs (12.96) in the cart → the cart offers
Same 12 units for $0.97 less: 1 x 12-packand swaps the lines when they accept. - An integration adds
collective_pack_option_idof the 6-pack with quantity 2 through REST → the cart line prices at6.48with a subtotal of12.96.

What you can do
| Feature | Benefit |
|---|---|
| Setting up packs on a product | Add 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 page | Customers 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 offers | A 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 stock | Order lines keep the pack they were sold as, and reservations, shipments, cancellations and credit memos move stock by the units inside. |
| REST API | Create and read packs, plan a unit count and add packs to headless carts through documented endpoints. |


Competing solutions
The right-hand column describes common market practice, not any particular vendor.
| Qoliber | Typical marketplace extension | |
|---|---|---|
| GitLab access | Full access to the module's GitLab repository — source, history, issues and merge requests | Varies by vendor |
| Packagist installation | Installed and updated with Composer from our private Packagist (qoliber.repo.packagist.com) | Varies by vendor |
| Slack access to the development team | A shared Slack channel with the developers who build and maintain the module | Usually ticket-based |
| Unit tests | 54 PHPUnit unit tests (17 classes) in the repository | Not typically published |
| Integration tests | 49 Magento integration tests (14 classes), run before every release | Not typically published |
| E2E Playwright tests | 22 Playwright end-to-end tests (10 spec files) on Luma and Hyvä, run before every release | Not typically published |
| Hyvä support | A companion module renders the selector, the units panel and the cart offers in Alpine.js, verified on Hyvä 1.5.2 | Varies by vendor |
| PHP / Magento range | PHP 8.1 to 8.5, Magento Open Source and Adobe Commerce 2.4.6 to 2.4.9 with MSI | Varies by vendor |
| Documentation | Full docs portal: install, configuration, usage, API reference | Varies by vendor |
- Hyvä-native.
Qoliber_CollectivePackagingHyvaships 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