Version 3.1.0
October 20, 2026
Prices may change on Commerce 5 stores. A bulk pricing field on a product type's variant layout was ignored when the product type allows unlimited variants (Commerce 5's default). From 3.1 it applies, so carts for those variants will start charging the bulk prices that were entered there. Before updating, check each product type with unlimited variants: if a bulk pricing field on its variant layout holds prices you do not want charged, clear them or remove the field.
Added
craft.bulkPricing.price(purchasable, qty)— the unit price the cart charges at a quantity, sales included (#11).craft.bulkPricing.rows(purchasable)— the price breaks as{heading, qty, price, salePrice}, lowest quantity first (#13).BulkPricingService::getPrice()andgetPriceRows(), the same lookup in PHP.EVENT_APPLY_BULK_PRICINGnow carries anApplyBulkPricingEventwith the order, whether a bulk price was applied, the row and the field, and is documented (#12). It still extendsLineItemEvent, so existing handlers keep working.
Fixed
- A bulk pricing field on the variant is now read on product types with unlimited variants (Commerce 5's default), which were treated as having none — see the warning above.
- A guest no longer causes an error against a group-restricted field with guest pricing on.
- Price breaks apply by quantity whatever order the columns are in.
- A purchasable that is not a product variant no longer causes an error.
Version 3.0.0
July 30, 2026
Added
- Support for Craft CMS 5 and Craft Commerce 5, alongside continued support for Craft 4 / Commerce 4.
Changed
- The field now reports its content column via
dbType()(JSON) on Craft 5, while keepinggetContentColumnType()for Craft 4. - On Commerce 5, the effective price is applied via the line item's
promotionalPrice(Commerce 5 madesalePricea read-only, derived property). Behaviour on Commerce 4 is unchanged. - Variant detection now uses
maxVariantson Commerce 5 to avoid the deprecatedProductType::hasVariantswarning. - The
taxIncludedsnapshot flag is now written viasetSnapshot()on Commerce 5 (wheresnapshotis no longer a public array).
Note
- On Commerce 5, bulk pricing continues to stack with legacy Sales (as before). It does not stack with catalog pricing rules — when a bulk price applies, it is authoritative and any catalog promotional price is cleared for that line item.
Version 2.1.1
October 27, 2022
Fixed
- Bug checking against user group list
Version 2.1.0
August 23, 2022
Added
- Feed Me integration
Version 2.0.0-beta.3
July 15, 2022
Fixed
- craft\element\Address issue: #16
Version 2.0.0-beta.2
July 14, 2022
Fixed
- Depreciation notice: order->user
Version 2.0.0-beta.1
July 13, 2022
Changed
- Craft 4 compatibility
Version 1.1.8
June 10, 2022
Changed
- Change of ownership
Version 1.1.7
April 14, 2022
Fixed
- Fixed a bug in the tax adjuster where the tax wasn't being calcualted correctly for each line item
Version 1.1.6
January 18, 2021
Fixed
- Changelog Fix
Version 1.1.5
January 18, 2021
Fixed
- Changelog Fix
Version 1.1.4
January 18, 2021
Sales are now applied to bulk prices whereas previosuly they weren't. Please check all your products and sales to avoid any unexpected sales being applied.
Added
- Now supports Commerce Sales
Version 1.1.3
December 16, 2020
Fixed
- Fixed a bug when trying to add a new column to a bulk pricing field
Added
- Now requires Craft 3.4+.
- Missing requirement for Craft Commerce 2 or 3.
Version 1.1.2
March 6, 2020
Added
- Set lineitem->salePrice in addition to lineitem->price when calculating bulk price.
Version 1.1.1
March 6, 2020
Changed
- plugin icon.
Version 1.1.0
July 17, 2019
Added
- allowing guest users to see bulk prices
Changed
- if no user groups are selected then all users will see bulk pricing
Version 1.0.12
June 18, 2019
Fixed
- Check that element exists on populate line item handler
Version 1.0.0
January 29, 2019
Added
- Initial release