4 min readOct 18, 2026by jakub
Changelog
Current version: 1.0.0
1.0.0 — 2026-10-18
Rebuild of the open-source qoliber/m2-product-pack (2.0.0) under a new name.
Not an in-place upgrade: the pack product type, its table and its configuration
paths are gone.
Verified
- Release gates (unit, integration, browser, static analysis, production DI compile) ran on Magento Open Source 2.4.9, PHP 8.3, Luma and Hyvä 1.5.2. The declared 2.4.6 - 2.4.8, PHP 8.1 / 8.2 / 8.4 / 8.5 and Hyvä 1.3 - 1.5.1 combinations are covered by static guards only.
- Known: a dynamic bundle priced as a pack can differ by one cent between the pack price shown and the sum of its selection rows (see the usage pages).
Fixed (pre-release review of 2026-10-18)
- Cart offers compare the real cart total (cart rules and their thresholds, tax) and never advertise a saving that raises what the customer pays.
- Cart offers leave lines with decimal quantities alone instead of rounding them.
- Offers and unit plans are priced from the product's own unit price, never from the pack a cart line already carries (the stack policy discounted such packs twice).
- Fixed pack amounts reach the storefront in the display currency and tax mode, so live-priced selections (bundles) show the right figure.
- Pack-only mode is enforced at the cart on every channel, not only hidden on the product page.
- A variant whose packs belong to another customer group no longer blocks the parent's packs at the cart; product page and server apply one rule.
- Credit memos of configurable pack lines return the variant's units once (the parent item is no longer counted too); reservation compensation counts the same lines as MSI; refunds of invoiced virtual and downloadable packs return units, not packs.
- Selections of a bundle shipped separately weigh their units: the shipping-weight limitation is gone.
- A product save that did not touch packs writes nothing; deleting a size and adding it again in one save no longer collides on the unique key.
- Production DI compilation works (no object defaults in constructors); the units button binds CSP-safely under Hyvä's Alpine build.
- Request-scoped caches reset on long-running processes (through a stand-in interface, so the module still loads on Magento 2.4.6); listing lookups are bounded to the listing; product-page availability is one salable-quantity lookup per SKU.
- Bundles get their fixed pack amounts in display currency and tax mode too (the first fix covered products with precomputed prices only).
- Cart offer amounts are a grand-total difference: converted to the display currency, no longer taxed a second time by the catalog display rule.
Security
- The cart offers and the unit planner never solve more than the configured maximum of units (itself capped at 100 000), whatever quantity a cart line carries.
- The unit planner answers only for products the store sells (enabled, in the website).
- The product page's selector configuration is written HTML-safe inside its script block.
- Pack ownership is checked with the quote's customer group on every channel, REST included.
Added
- Pack options on simple, virtual, downloadable, configurable and bundle products (no dedicated product type any more).
- Three price types per option: percent off the unit price, fixed amount off each unit, fixed total pack price.
- Website and customer-group targeting, active switch and default option per pack.
- Configurable products: options on the parent apply to every variant; a variant with its own options (ones the customer may buy: active, in the website, open to the customer's group) replaces the parent list; the server applies the same rule as the product page.
- Bundle products: options on the bundle multiply the whole line; options on a selection product act as quantity tiers for that selection.
- Server-side validation of the selected pack; the buy request carries only the option id and the validated pack is snapshotted on the quote and order items.
- One price calculator shared by the storefront, the cart, REST and the tests.
- MSI reservations, shipments, cancellations and credit memos count physical units exactly, including several pack sizes of the same SKU in one order.
- REST endpoints for pack options and a cart item processor for headless carts.
- Buy by units: the product page plans the cheapest exact combination of packs and single
units for a typed count, never rounding without the shopper choosing an alternative;
GET /V1/qoliber-collective-packaging/products/:productId/units-planfor headless clients. - One-click cart upgrades: cheaper repackaging of the same units and the next full pack, each shown with its true change in the cart total.
- Shareable links:
?collective_pack=IDpreselects a pack,?collective_units=Nprefills the unit count. - The Packaging row in cart, checkout, order views and emails spells out the price per unit ("6-pack (6 units) at $1.08 per unit"), switchable in configuration.
- Dynamic bundle lines show their real line price in the cart's price column; core rebuilt it from add-time selection prices, which know neither selection tiers nor packs.
- The product's main price follows the selected pack (pack total or price per unit) on Luma and Hyva, and a hint under the selection spells out how the pack price is worked out (switchable under Product Page).
- Luma pack selector; Hyva selector shipped as
qoliber/collective-packaging-hyva.