Commerce Bulk Pricing icon

Commerce Bulk Pricing

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() and getPriceRows(), the same lookup in PHP.
  • EVENT_APPLY_BULK_PRICING now carries an ApplyBulkPricingEvent with the order, whether a bulk price was applied, the row and the field, and is documented (#12). It still extends LineItemEvent, 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 keeping getContentColumnType() for Craft 4.
  • On Commerce 5, the effective price is applied via the line item's promotionalPrice (Commerce 5 made salePrice a read-only, derived property). Behaviour on Commerce 4 is unchanged.
  • Variant detection now uses maxVariants on Commerce 5 to avoid the deprecated ProductType::hasVariants warning.
  • The taxIncluded snapshot flag is now written via setSnapshot() on Commerce 5 (where snapshot is 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