โ ๏ธ Breaking Change
Impact Score: 7/10
Saleor 3.15.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-01.
Breaking-change evidence from the source
Breaking changes - Remove input and fields related to transaction API and deprecated in 3.13 - #13020 by @korycins
- Until now, checkout mutations ignored the provided shipping address when shipping was not required. After this change, the shipping address is always set when supplied in the input. It might be breaking, as the shipping address affects the country code used for tax calculation.
โก Executive Summary (TL;DR)
Saleor 3.15.0. Source highlight: Welcome to Saleor 3.15 release!
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 (2)
- Breaking changes - Remove input and fields related to transaction API and deprecated in 3.13 - #13020 by @korycins
- - Until now, checkout mutations ignored the provided shipping address when shipping was not required. After this change, the shipping address is always set when supplied in the input. It might be breaking, as the shipping address affects the country code used for tax calculation.
โจ New Features & Capabilities (6)
- Add `Checkout.problems` field
- Add `CheckoutLine.problems` field
- Add `CheckoutSettingsInput` to `ChannelCreateInput` & `ChannelUpdateInput`
- Add `checkoutSettings` field to `Channel`
- [Preview] Add possibility to complete checkout without payment in the transaction flow - #13339 by @kadewu:
- Add ability to use metadata in the `Shop` type - #13128 by @Smit-Parmar, #13364
โก Performance & Enhancements (1)
- Filtering improvements:
๐ง Bug Fixes & Patches (5)
- Fix deleting event payloads by adding batches - #13368
- Fix error handling in the permission check for `Query.webhook` - #13378
- Fix SEO field to accept null value - #13512
- Fix `NOTIFY_USER` allow to create a webhook with only one event - #13584
- Fix error "Cannot return null for non-nullable field [Webhook.name](http://webhook.name/)" - #12989
๐ View Raw Release Notes (Original Developer Log)
Welcome to Saleor 3.15 release!
### Breaking changes
- Remove input and fields related to transaction API and deprecated in 3.13 - #13020 by @korycins
- `WebhookEventTypeEnum.TRANSACTION_ACTION_REQUEST` - Use `TRANSACTION_CHARGE_REQUESTED`, `TRANSACTION_REFUND_REQUESTED`, `TRANSACTION_CANCELATION_REQUESTED` instead.
- `WebhookEventTypeAsyncEnum.TRANSACTION_ACTION_REQUEST` - Use `TRANSACTION_CHARGE_REQUESTED`, `TRANSACTION_REFUND_REQUESTED`, `TRANSACTION_CANCELATION_REQUESTED` instead.
- `WebhookSampleEventTypeEnum.TRANSACTION_ACTION_REQUEST`
- `TransactionItem`:
- `voidedAmount` - Use `canceledAmount` instead.
- `status` - The amounts can be used to define the current status of transactions.
- `type` - Use `name` or `message`.
- `reference` - Use `pspReference` instead.
- `TransactionActionEnum.VOID` - Use `CANCEL` instead.
- `OrderEvent.status` - Use `TransactionEvent` to track the status of `TransactionItem`.
- `OrderEventsEnum`:
- `TRANSACTION_CAPTURE_REQUESTED` - Use `TRANSACTION_CHARGE_REQUESTED` instead.
- `TRANSACTION_VOID_REQUESTED` - Use `TRANSACTION_CANCEL_REQUESTED` instead.
- `TransactionStatus`
- `TransactionEvent`:
- `status` - Use `type` instead.
- `reference` - Use `pspReference` instead.
- `name` - Use `message` instead.
- `TransactionCreateInput`:
- `status` - The amounts can be used to define the current status of transactions.
- `type` - Use `name` or `message`.
- `reference` - Use `pspReference` instead.
- `voidedAmount` - Use `canceledAmount` instead.
- `TransactionEventInput`:
- `status` - Status will be calculated by Saleor.
- `reference` - Use `pspReference` instead.
- `name` - Use `message` instead.
- `TransactionUpdateInput`:
- `status` - The amounts can be used to define the current status of transactions.
- `type` - Use `name` or `message`.
- `reference` - Use `pspReference` instead.
- `voidedAmount` - Use `canceledAmount` instead.
- `TransactionActionRequest` - Use `TransactionChargeRequested`, `TransactionRefundRequested`, `TransactionCancelationRequested` instead.
- Change order of resolving country code in checkout - #13159 by @jakubkuc
- Until now, checkout mutations ignored the provided shipping address when shipping was not required. After this change, the shipping address is always set when supplied in the input. It might be breaking, as the shipping address affects the country code used for tax calculation.
- The order of resolving the checkout country code is always as follows:
1. Shipping address
2. Billing address
3. The channel's default country
- Remove `OrderBulkCreateInput.trackingClientId` field - #13146 by @SzymJ
- Drop backend integration with Open Exchange Rates API - #13175 by @maarcingebala
- Note: this change doesn't affect Saleor Cloud users, as the integration was never enabled there.
- After this change, the following fields in API always return `null` values:
- `ProductPricingInfo.discountLocalCurrency`
- `ProductPricingInfo.priceRangeLocalCurrency`
- `VariantPricingInfo.discountLocalCurrency`
- `VariantPricingInfo.priceLocalCurrency`
### GraphQL API
- Better checkout error feedback - #13458 by @korycins
- Add `Checkout.problems` field
- Add `CheckoutLine.problems` field
- Add `CheckoutSettingsInput` to `ChannelCreateInput` & `ChannelUpdateInput`
- Add `checkoutSettings` field to `Channel`
- [Preview] Add possibility to complete checkout without payment in the transaction flow - #13339 by @kadewu:
- New field `allowUnpaidOrders` in `OrderSettings` for `Channel`
- New bulk mutations ([docs](https://docs.saleor.io/docs/3.x/developer/bulks/bulk-attributes)):
- `attributeBulkCreate` - #13398 by @SzymJ
- `attributeBulkUpdate` - #13532 by @SzymJ
- `productBulkTranslate` - #13329 by @SzymJ
- `productVariantBulkTranslate` - #13329 by @SzymJ
- Metadata API changes:
- Add ability to use metadata in the `Shop` type - #13128 by @Smit-Parmar, #13364 by @maarcingebala
- Add `metadata` and `privateMetadata` in `ShopSettingsInput`.
- Add `Shop.id` field.
- Add support for modifying metadata via generic metadata API.
- Add metadata support for channels. #13230 by @Smit-Parmar
- Add the ability to set address public metadata in the following mutations: - #13248 by @Air-t
- `accountUpdate`, `accountAddressCreate`, `accountAddressUpdate`, `addressCreate`, `AccountAddressUpdate`,
- `checkoutShippingAddressUpdate`, `checkoutBillingAddressUpdate`, `shopAddressUpdate`, `warehouseUpdate`
- Add `metadata` to `AddressInput` field
- Filtering improvements:
- Added `GiftCardFilterInput.createdByEmail` filter - #13132 by @Smit-Parmar
- Add `search` to `giftCards` query - #13173 by @zedzior
- Add `orderNoteAdd` and `orderNoteUpdate` mutations and deprecate `orderAddNote` mutation - #12434 by @pawelzar
- Add ability to update `warehouse` address with `MANAGE_PRODUCTS` permissions: - #13248 by @Air-t
- Add ability to update `site` address with `MANAGE_SETTINGS` permissions: - #13248 by @Air-t
- Add support for unhandled field `Shop.trackInventoryByDefault` for `productVariantCreate` and `productVariantBulkCreate` - #13492 by @Smit-Parmar
- Add `storedPaymentMethods` field to `User` and `Checkout` type - #13581
- Add `lines` to `OrderGrantedRefund` - #13014 by @korycins
- The user can remove a shipping method after it has been assigned to a checkout; `shippingMethodId` is now a nullable input in the `checkoutShippingMethodUpdate` mutation. - #13068 by @FremahA
- Deprecations:
- Deprecate `Order.trackingClientId` field - #13146 by @SzymJ
- Deprecate `WebhookEventTypeAsyncEnum.ANY_EVENTS` and `WebhookEventTypeEnum.ANY_EVENTS`; instead listeners should subscribe to specific webhook events - #13452 by @maarcingebala
- Add missing GraphQL descriptions in the following modules:
- app module - #13163 by @fowczarek
- account module - #13155 by @fowczarek
- channel module - #13166 by @fowczarek
- checkout module - #13167 by @fowczarek
- attribute module - #13165 by @fowczarek
- CSV module - #13184 by @fowczarek
- account module - #13155 by @fowczarek
- webhook module - #13262 by @Smit-Parmar
- shop module - #13295 by @Smit-Parmar
- warehouse module - #13264 by @Smit-Parmar
- product module - #13259 by @FremahA
- invoice module - #13265 by @DevilsAutumn
- discount module - #13261 by @devilsautumn
- shipping module - #13372 by @Smit-Parmar
- translation module - #13410 by @Smit-Parmar
- menu module - #13409 by @devilsautumn
- page module - #13536 by @devilsautumn
- payment module - #13546 by @devilsautumn
### Saleor Apps
- Introduce `Saleor-Schema-Version` HTTP header in app manifest fetching and app installation handshake requests. - #13075 by @przlada
- New webhook events:
- Add `SHOP_METADATA_UPDATED` webhook - #13364, #13388 by @maarcingebala
- Called when metadata is changed for the Shop object via the generic metadata API or the `shopSettingsUpdate` mutation.
- Add `CHANNEL_METADATA_UPDATED` webhook - #13448, by @Air-t
- Called when metadata is changed for the Channel object via the generic metadata API or the `channelUpdate` mutation.
- Add `ACCOUNT_CONFIRMED` webhook - #13471, by @Air-t
- Called when the user confirms an account with the `confirmAccount` mutation.
- Add `ACCOUNT_DELETED` webhook - #13471, by @Air-t
- Called when account deletion is confirmed with the `accountDelete` mutation.
- Add `ACCOUNT_EMAIL_CHANGED` webhook - #13537, by @Air-t
- Called when the `confirmEmailChange` mutation is executed.
- Add `ACCOUNT_SET_PASSWORD_REQUESTED` webhook - #13486, by @Air-t
- Called when `requestPasswordReset` or `customerCreate` mutations are executed.
- Add `STAFF_SET_PASSWORD_REQUESTED` webhook - #13486, by @Air-t
- Called when `requestPasswordReset` or `customerCreate` mutations are executed.
- Add `ACCOUNT_CONFIRMATION_REQUESTED` webhook - #13162 by @SzymJ
- Called after `accountRegister` or `sendConfirmationEmail` mutations are executed.
- Add `ACCOUNT_DELETE_REQUESTED` webhook - #13170 by @SzymJ
- Called after the `accountRequestDeletion` mutation is executed.
- Add `ACCOUNT_CHANGE_EMAIL_REQUESTED` webhook - #13233 by @SzymJ
- Called after the `requestEmailChange` mutation is executed.
### Other changes
- Add the possibility to log in without confirming email - #13059 by @kadewu
- New mutation `sendConfirmationEmail` to send an email with a confirmation link
- New environment variable `CONFIRMATION_EMAIL_LOCK_TIME` to control lock time between new email confirmations
- Type `User` gets the new field `is_confirmed`
- `CustomerInput` gets new field `is_confirmed`
- Use public key thumbprint as KID in JWKS.json #13442 by @cmiacz
- Expand metric units to support more types of products. - #13043 by @FremahA
- Fix deleting event payloads by adding batches - #13368 by @jakubkuc
- Fix error handling in the permission check for `Query.webhook` - #13378 by @patrys
- Fix SEO field to accept null value - #13512 by @ssuraliya
- Fix `NOTIFY_USER` allow to create a webhook with only one event - #13584 by @Air-t
- Fix error "Cannot return null for non-nullable field [[Webhook.name](http://webhook.name/)](http://webhook.name/)" - #12989 by @Smit-Parmar
- Remove unused `django-versatileimagefield` package - #13148 by @SzymJ
- Remove unused `google-measurement-protocol` package - #13146 by @SzymJ
- Drop TranslationProxy and replace the `translated` model property with the `get_translation` function where needed. - #13156 by @zedzior