โ ๏ธ Breaking Change
Impact Score: 7/10
Saleor 3.12.0 โ Release Notes & Engineering Impact
Source available โ automated, not human-reviewed
Component: saleor ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-02.
Breaking-change evidence from the source
Breaking changes - Change the discount rounding mode - #12041 by @IKarbowiak
โก Executive Summary (TL;DR)
Saleor 3.12.0. Source highlight: Welcome to the 3.12 release of Saleor!
Who Does This Impact? (Role-Based Analysis)
๐ป Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
๐ Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
โ๏ธ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
โ ๏ธ Breaking Changes & Deprecations (1)
- Breaking changes - Change the discount rounding mode - #12041 by @IKarbowiak
โจ New Features & Capabilities (6)
- Add support for AVIF images, added `AVIF` and `ORIGINAL` to `ThumbnailFormatEnum` - #11998
- Add support for bulk saving all attributes types in `BulkAttributeValueInput` - #12095
- Add the possibility to remove `stocks` and `channel listings` in `ProductVariantBulkUpdate` mutation.
- Add meta fields to `ProductMedia` model - #11894
- Introduce custom headers for webhook requests - #11978
- Add new asynchronous events related to media - #11918
โก Performance & Enhancements (2)
- Improve GraphQL playground by storing headers in the local storage - #12176
- Enhance webhook's subscription query validation. Apply the validation and event inheritance to manifest validation - #11797
๐ง Bug Fixes & Patches (3)
- Fix saving `metadata` in `ProductVariantBulkCreate` and `ProductVariantBulkupdate` mutations - #12097
- Fixes for GraphiQL playground - #12192
- Fix GraphQL playground when the `operationName` is set across different tabs - #11936
๐ View Raw Release Notes (Original Developer Log)
Welcome to the 3.12 release of Saleor!
### Breaking changes
- Change the discount rounding mode - #12041 by @IKarbowiak
- Change the rounding mode from `ROUND_DOWN` to `ROUND_HALF_UP` - it affects the discount amount and total price of future checkouts and orders with a percentage discount applied.
The discount amount might be 0.01 greater, and the total price might be 0.01 lower. E.g. if you had an order for $13 and applied a 12.5% discount, you would get $11.38 with a $1.62 discount, but now it will be calculated as $11.37 with $1.63 discount.
- Include specific products voucher in checkout discount - #12191 by @IKarbowiak
- Make the `specific product` and `apply once per order` voucher discounts visible on the `Checkout.discount` field.
Previously, the discount amount for these vouchers was shown as 0.
- `stocks` and `channelListings` inputs for preview `ProductVariantBulkUpdate` mutation have been changed. Both inputs have been extended with:
- `create` input - list of items that should be created
- `update` input - list of items that should be updated
- `remove` input - list of objects ID's that should be removed
If your platform relies on this preview feature, make sure you update your mutations stocks and channel listings inputs from:
```
{
"stocks/channelListings": [
{
...
}
]
}
```
to:
```
{
"stocks/channelListings": {
"create": [
{
...
}
]
}
}
```
- Media and image fields now default to returning 4K thumbnails instead of original uploads - #11996 by @patrys
### GraphQL API
- Add support for AVIF images, added `AVIF` and `ORIGINAL` to `ThumbnailFormatEnum` - #11998 by @patrys
- Add support for bulk saving all attributes types in `BulkAttributeValueInput` - #12095 by @SzymJ
- Add the possibility to remove `stocks` and `channel listings` in `ProductVariantBulkUpdate` mutation.
- Move `orderSettings` query to `Channel` type - #11417 by @kadewu:
- Mutation `Channel.channelCreate` and `Channel.channelUpdate` have new `orderSettings` input.
- Deprecate `Shop.orderSettings` query. Use `Channel.orderSettings` query instead.
- Deprecate `Shop.orderSettingsUpdate` mutation. Use `Channel.channelUpdate` instead.
- Add meta fields to `ProductMedia` model - #11894 by @zedzior
- Make `oldPassword` argument on `passwordChange` mutation optional; support accounts without usable passwords - @11999 by @rafalp
- Introduce custom headers for webhook requests - #11978 by @zedzior
- Fix saving `metadata` in `ProductVariantBulkCreate` and `ProductVariantBulkupdate` mutations - #12097 by @SzymJ
- Improve GraphQL playground by storing headers in the local storage - #12176 by @zaiste
- Fixes for GraphiQL playground - #12192 by @zaiste
### Other changes
- Enhance webhook's subscription query validation. Apply the validation and event inheritance to manifest validation - #11797 by @zedzior
- Fix GraphQL playground when the `operationName` is set across different tabs - #11936 by @zaiste
- Add new asynchronous events related to media - #11918 by @zedzior
- `PRODUCT_MEDIA CREATED`
- `PRODUCT_MEDIA_UPDATED`
- `PRODUCT_MEDIA_DELETED`
- `THUMBNAIL_CREATED`
- CORS is now handled in the ASGI layer - #11415 by @patrys
- Added native support for gzip compression - #11833 by @patrys
- Set flat rates as the default tax calculation strategy - #12069 by @maarcingebala
- Enables flat rates for channels in which no tax calculation method was set.
- Users created by the OIDC plugin now have unusable password set instead of empty string - #12103 by @rafalp