Release history
Saleor releases
Django based open-sourced e-commerce storefront.
All releases
71 shown
- Added CUSTOMER_DELETED webhook subscription for apps.
- CheckoutDelete mutation (Port) added to GraphQL schema.
Full changelog
What's Changed
- Added subscription to CUSTOMER_DELETED by @lkostrowski in https://github.com/saleor/saleor/pull/19174
- [3.23] CheckoutDelete mutation (Port) by @lkostrowski in https://github.com/saleor/saleor/pull/19196
- Change graphql-inspector to run against proper branch (#19197) by @lkostrowski in https://github.com/saleor/saleor/pull/19198
- Allow apps to receive their own lifecycle webhooks by @lkostrowski in https://github.com/saleor/saleor/pull/19160
- Release 3.23.5 by @lkostrowski in https://github.com/saleor/saleor/pull/19201
Full Changelog: https://github.com/saleor/saleor/compare/3.23.4...3.23.5
- dep: CVE-2026-40192 — FITS GZIP decompression bomb in Pillow
- dep: CVE-2026-42308 — Integer overflow when processing fonts in Pillow
- dep: CVE-2026-42309 — Heap buffer overflow with nested list coordinates in Pillow
Full changelog
What's Changed
Upgraded cryptography, Pillow, and Django to latest security hotfixes:
Pillow package (image processor) (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19183):
- CVE-2026-40192: FITS GZIP decompression bomb in Pillow
- CVE-2026-42308: Pillow has an integer overflow when processing fonts
- CVE-2026-42309: Pillow has a heap buffer overflow with nested list coordinates
- CVE-2026-42310: Pillow has a PDF Parsing Trailer Infinite Loop (DoS)
- CVE-2026-42311: Pillow has an OOB Write with Invalid PSD Tile Extents (Integer Overflow)
Cryptography package (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19183):
- CVE-2026-39892: Cryptography vulnerable to buffer overflow if non-contiguous buffers were passed to APIs
- CVE-2026-34073: cryptography has incomplete DNS name constraint enforcement on peer names
Django (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19187):
- CVE-2026-5766: Enforced DATA_UPLOAD_MAX_MEMORY_SIZE in MemoryFileUploadHandler on ASGI
- CVE-2026-6907: Prevented caching of requests when Vary header contains an asterisk
- CVE-2026-35192: Ensured Vary header is sent when setting session cookie with SESSION_SAVE_EVERY_REQUEST=True
Other changes (non-security):
- Added validation for incorrect cursor shape by @lkostrowski in https://github.com/saleor/saleor/pull/19154
- fix: add logs for GraphQL validation errors by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19176
- Handle RequestDataTooBig error by @lkostrowski in https://github.com/saleor/saleor/pull/19180
Full Changelog: https://github.com/saleor/saleor/compare/3.23.3...3.23.4
- dep: CVE-2026-40192 — FITS GZIP decompression bomb in Pillow
- dep: CVE-2026-42308 — Integer overflow when processing fonts in Pillow
- dep: CVE-2026-42309 — Heap buffer overflow with nested list coordinates in Pillow
Full changelog
What's Changed
Upgraded cryptography, Pillow, and Django to latest security hotfixes:
Pillow package (image processor) (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19184):
- CVE-2026-40192: FITS GZIP decompression bomb in Pillow
- CVE-2026-42308: Pillow has an integer overflow when processing fonts
- CVE-2026-42309: Pillow has a heap buffer overflow with nested list coordinates
- CVE-2026-42310: Pillow has a PDF Parsing Trailer Infinite Loop (DoS)
- CVE-2026-42311: Pillow has an OOB Write with Invalid PSD Tile Extents (Integer Overflow)
Cryptography package (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19184):
- CVE-2026-39892: Cryptography vulnerable to buffer overflow if non-contiguous buffers were passed to APIs
- CVE-2026-34073: cryptography has incomplete DNS name constraint enforcement on peer names
Django (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19188):
- CVE-2026-5766: Enforced DATA_UPLOAD_MAX_MEMORY_SIZE in MemoryFileUploadHandler on ASGI
- CVE-2026-6907: Prevented caching of requests when Vary header contains an asterisk
- CVE-2026-35192: Ensured Vary header is sent when setting session cookie with SESSION_SAVE_EVERY_REQUEST=True
Other changes (non-security):
- fix: add logs for GraphQL validation errors by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19177
Full Changelog: https://github.com/saleor/saleor/compare/3.22.49...3.22.50
- CVE-2026-40192 — FITS GZIP decompression bomb in Pillow
- CVE-2026-42308 — Integer overflow when processing fonts in Pillow
- CVE-2026-42309 — Heap buffer overflow with nested list coordinates in Pillow
Full changelog
What's Changed
Upgraded cryptography, Pillow, and Django to latest security hotfixes:
Pillow package (image processor) (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19185):
- CVE-2026-40192: FITS GZIP decompression bomb in Pillow
- CVE-2026-42308: Pillow has an integer overflow when processing fonts
- CVE-2026-42309: Pillow has a heap buffer overflow with nested list coordinates
- CVE-2026-42310: Pillow has a PDF Parsing Trailer Infinite Loop (DoS)
- CVE-2026-42311: Pillow has an OOB Write with Invalid PSD Tile Extents (Integer Overflow)
Cryptography package (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19185):
- CVE-2026-39892: Cryptography vulnerable to buffer overflow if non-contiguous buffers were passed to APIs
- CVE-2026-34073: cryptography has incomplete DNS name constraint enforcement on peer names
Django (by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19189):
- CVE-2026-5766: Enforced DATA_UPLOAD_MAX_MEMORY_SIZE in MemoryFileUploadHandler on ASGI
- CVE-2026-6907: Prevented caching of requests when Vary header contains an asterisk
- CVE-2026-35192: Ensured Vary header is sent when setting session cookie with SESSION_SAVE_EVERY_REQUEST=True
Full Changelog: https://github.com/saleor/saleor/compare/3.21.57...3.21.58
- CVE-2026-42175 – SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10); fixed by upgrading requests‑hardened to v1.2.1.
- Stock related webhooks now include webhook events info
Full changelog
What's Changed
- Extend stock related webhooks with webhooks events info by @IKarbowiak in https://github.com/saleor/saleor/pull/19156
- Fix CVE-2026-42175 - SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10) by upgrading
requests-hardenedto v1.2.1 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19163
Full Changelog: https://github.com/saleor/saleor/compare/3.23.2...3.23.3
- CVE-2026-42175 — SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10) fixed by upgrading `requests-hardened` to v1.2.1
Full changelog
What's Changed
- Fix CVE-2026-42175 - SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10) by upgrading
requests-hardenedto v1.2.1 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19165
Full Changelog: https://github.com/saleor/saleor/compare/3.21.56...3.21.57
- CVE-2026-42175 – SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10); fixed by upgrading `requests-hardened` to v1.2.1
Full changelog
What's Changed
- Fix failed request handler in AvataxPlugin by @korycins in https://github.com/saleor/saleor/pull/19120
- Fix CVE-2026-42175 - SSRF bypass via unfiltered RFC 6598 shared address space (100.64.0.0/10) by upgrading
requests-hardenedto v1.2.1 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19164
Full Changelog: https://github.com/saleor/saleor/compare/3.22.48...3.22.49
- Allow STAFF app users to perform metadata CRUD operations
- Promisify checkout calculate‑taxes webhook
- Add channel‑scoped stock availability webhooks
Full changelog
What's Changed
- Allow metadata crud for STAFF for apps by @lkostrowski in https://github.com/saleor/saleor/pull/19116
- Promisify checkout calculate taxes webhook by @korycins in https://github.com/saleor/saleor/pull/19091
- Fix failed request handler in AvataxPlugin by @korycins in https://github.com/saleor/saleor/pull/19122
- Add channel-scoped stock availability webhooks by @IKarbowiak in https://github.com/saleor/saleor/pull/19144
Full Changelog: https://github.com/saleor/saleor/compare/3.23.1...3.23.2
Minor fixes and improvements.
Full changelog
What's Changed
- Upgraded Django to 5.2 by @patrys & @NyanKiyoshi in #19109 + #19125
- Added support for PostgreSQL 18 by @patrys in #19109
Full Changelog: https://github.com/saleor/saleor/compare/3.21.55...3.21.56
- Introduce maximum file size limit for uploaded images
Full changelog
[!WARNING]
This is the last release for 3.20. We recommend upgrading as soon as possible to 3.23, 3.22, or 3.21 (the latter not being recommended due to being planned for removal in the near future)
What's Changed
- feat(graphql): mark slow spans as errored by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19061
- Fix a possible crash that could happen when channel would be deleted (#19015) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19043
- fix(accounts): missing validations for accountRegister by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19078
- fix(graphql): missing error handling when no channel in DB by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19079
- fix(graphql): increase mutation limit to 4 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19099
- Introduce maximum file size limit for uploaded images by @wcislo-saleor in https://github.com/saleor/saleor/pull/19086
Full Changelog: https://github.com/saleor/saleor/compare/3.20.118...3.20.119
- Mark slow GraphQL spans as errored
- Add additional GraphQL metrics
Full changelog
What's Changed
- feat(graphql): mark slow spans as errored by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19059
- feat(graphql): add additional metrics by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19063
- Fix a possible crash that could happen when channel would be deleted (#19015) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19041
- fix(accounts): missing validations for accountRegister by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19083
- fix(graphql): missing error handling when no channel in DB by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19082
- fix(graphql): increase mutation limit to 4 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19097
- Introduce maximum file size limit for uploaded images by @wcislo-saleor in https://github.com/saleor/saleor/pull/19088
Full Changelog: https://github.com/saleor/saleor/compare/3.22.47...3.22.48
- Introduce maximum file size limit for uploaded images
- feat(graphql): mark slow spans as errored
- feat(graphql): add additional metrics
Full changelog
What's Changed
- Allow to assigning product without variant to collection by @korycins in https://github.com/saleor/saleor/pull/19044
- feat(graphql): mark slow spans as errored by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19058
- feat(graphql): add additional metrics by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19062
- Fix a possible crash that could happen when channel would be deleted (#19015) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19040
- Legacy shipping zone stock availability improvements by @IKarbowiak in https://github.com/saleor/saleor/pull/19065
- Add missing mock to deferred payload test by @korycins in https://github.com/saleor/saleor/pull/19071
- fix(accounts): missing validations for accountRegister by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19085
- fix(graphql): missing error handling when no channel in DB by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19084
- fix(graphql): increase mutation limit to 4 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19096
- Introduce maximum file size limit for uploaded images by @wcislo-saleor in https://github.com/saleor/saleor/pull/19089
- Extract stock logic from webhook plugin to webhook module by @IKarbowiak in https://github.com/saleor/saleor/pull/19092
Full Changelog: https://github.com/saleor/saleor/compare/3.23.0...3.23.1
- Mark slow GraphQL spans as errored
- Add additional GraphQL metrics
Full changelog
What's Changed
- feat(graphql): mark slow spans as errored by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19060
- feat(graphql): add additional metrics by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19064
- Fix a possible crash that could happen when channel would be deleted (#19015) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19042
- fix(accounts): missing validations for accountRegister by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19080
- fix(graphql): missing error handling when no channel in DB by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19081
- fix(graphql): increase mutation limit to 4 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/19098
- Introduce maximum file size limit for uploaded images by @wcislo-saleor in https://github.com/saleor/saleor/pull/19087
Full Changelog: https://github.com/saleor/saleor/compare/3.21.54...3.21.55
- Adyen gateway users must switch to the app integration before upgrading.
- NP Atobarai payment gateway users must migrate to the corresponding app.
- Legacy digital product API consumers need to adopt the documented approach (https://docs.saleor.io/recipes/digital-products).
- Removed `partial` field from GraphQL type `Payment`.
- Removed support for the legacy digital products API.
- Removed Adyen plugin (payment gateway) – switch to app integration.
- Explicit delivery options calculation via `deliveryOptionsCalculate` mutation and new `Checkout.delivery` field.
- Added sorting and filtering support for `transactions` query (by CREATED_AT, MODIFIED_AT, date ranges, transaction events).
- Introduced `PasswordLoginMode` setting to control password‑based authentication (DISABLED or CUSTOMERS_ONLY).
Full changelog
Saleor 3.23.0 🐰
Following changelog contains brief summary of changes that differ from latest 3.22 version.
Saleor backports most of patches to at least one version behind, hence following changelog is not a full list of commits, but a summary of functional changes.
Please read the announcement post to get familiar with the release.
Follow migration guide for safe upgrade.
Breaking changes
-
Made
refundSettingsfield onRefundSettingsUpdatemutation nullable to correctly reflect that it can benullwhen errors occur. -
Fix missing denormalization of shipping methods metadata when creating an order.
- Shipping method metadata is now copied to dedicated order fields (
shipping_method_metadataandshipping_method_private_metadata) during checkout-to-order conversion. This ensures that order metadata remains consistent even if the original shipping method is modified or deleted. As a result, updates made to a shipping method's metadata after order creation will no longer be reflected in the order'sshippingMethod.metadatafield. - Shipping method metadata is now also denormalized during draft order finalization, ensuring consistent behavior across all order creation flows.
- Shipping method metadata is now copied to dedicated order fields (
-
Fields
options,mountandtargetare removed fromAppExtensionandAppManifestExtensiontypes. UsemountName,targetNameandsettings -
Deprecate the
hasVariantsfield onProductType. This setting is a legacy artifact from the former Simple/Configurable product distinction. Products can have multiple variants regardless of this flag. Previously, it only prevented assigning variant attributes to a product type; this restriction will no longer apply. -
Improved error handling in Federation - #18718 by @NyanKiyoshi
The type for GraphQL field
representationsin{ _entities(representations: [_Any!]!) { ... } }was changed.Before:
[_Any]
After:[_Any!]!Make sure to adapt your GraphQL queries if you use the
_entitiesquery. -
Mutations
channelCreateandchannelUpdatenow raise GraphQL errors insteadINVALIDwhen negativeMINUTE/HOUR/DAYvalues are passed. -
AppInstallInputforappInstallmutation now requiresappNameandmanifestUrlfields in the schema, matching the validation that was always enforced by the mutation logic. -
Removed Adyen plugin (payment gateway). Switch to the app.
-
Removed
partialfield from thePaymentGraphQL type. This field was an Adyen-specific workaround and always returnedfalseafter the Adyen plugin removal. Ensure you are not relying on this field (on Adyen gateway in general) before upgrading. -
Removed the NP Atobarai payment gateway plugin (
saleor.payment.gateways.np_atobarai). Use the App instead. -
Removed support for the legacy digital products API - #18952 by @NyanKiyoshi
Important: digital products are still fully supported in Saleor. Only the legacy,
undocumented digital content API has been removed, the supported approach is documented here: https://docs.saleor.io/recipes/digital-products -
Product media images from external URLs are now fetched asynchronously via background tasks in
productMediaCreateandproductBulkCreatemutations, improving response times. During download, the API returns HTTP 503 for the media image. -
Shipping-zone-based stock filtering is deprecated and will be removed in a future release. A new
useLegacyShippingZoneStockAvailabilityshop setting controls the behavior: when disabled, stock availability across checkouts, orders, and product queries is resolved via the direct warehouse-channel link instead of shipping zones.
GraphQL API
- Gift cards support as payment method within Transaction API (read more in the docs).
Attributefieldsname,slugandtypeare now non-nullable in schema.- Added new scalar
NonNegativeIntwhich allows integer values greater than or equal to zero. - Scalars
Minute,HourandDaynow inherit fromNonNegativeInt, which mean GraphQL disallows negative values for time units. - Removed
partialfield from thePaymentGraphQL type. - Added sorting and filtering support for
transactionsquery:- sort by
CREATED_AT,MODIFIED_AT; - filter by
createdAt,modifiedAtdate ranges and by transaction events (type,createdAt).
- sort by
- Added
PasswordLoginModesetting to control password-based authentication. When set toDISABLED, all password authentication mutations (tokenCreate,setPassword,passwordChange,requestPasswordReset,tokenRefresh) return errors. When set toCUSTOMERS_ONLY, staff users who log in with a password are treated as customers without staff
permissions. staffDeletemutation now always deletes the staff user. Previously, staff members with existing orders were only deactivated (is_staffset toFalse); now they are fully removed regardless of order history.
Webhooks
- For order webhook events, sync webhooks (such as
ORDER_CALCULATE_TAXESandORDER_FILTER_SHIPPING_METHODS) are no longer pre-fired before sending async webhook events. Sync webhooks are now only triggered when their data is actually requested, improving performance and decoupling async event delivery from sync webhook execution. - Building payloads for webhook order events (including draft orders and fulfillments) is now delegated to a separate background task. This speeds up the execution of most order mutations by deferring the expensive payload serialization out of the request path.
Explicit delivery options
-
Introduced
deliveryOptionsCalculatemutation to give storefronts explicit, deterministic control over when shipping webhook calls happen. PreviouslySHIPPING_LIST_METHODS_FOR_CHECKOUTandCHECKOUT_FILTER_SHIPPING_METHODSwebhooks were fired implicitly, inside checkout mutations (e.g., on address change) and while resolving query fields, causing unpredictable latency, uncontrolled webhook traffic, and increased costs. Developers can now decide exactly when to fetch delivery options by callingdeliveryOptionsCalculate, which returns a list ofDeliveryobjects.The selected delivery method is available on the new
Checkout.deliveryfield, which replaces the deprecatedCheckout.shippingMethodandCheckout.deliveryMethodfields.To help storefronts detect when the delivery method requires attention, two new problem types are introduced in
Checkout.problems:CheckoutProblemDeliveryMethodStale: the currently selected method may be outdated due to checkout changes (e.g., a different shipping address, an applied voucher). This problem does not block checkout completion but triggers re-validation of the delivery method whencheckoutCompleteis called. CallingdeliveryOptionsCalculatewill re-validate the assigned delivery.CheckoutProblemDeliveryMethodInvalid: the selected delivery method is no longer valid (e.g., the shipping address no longer falls within it). This problem blockscheckoutCompleteuntil a valid delivery method is assigned viacheckoutDeliveryMethodUpdate.
See the upgrading guide to learn more.
-
checkoutDeliveryMethodUpdatemutation now acceptsCheckoutDeliveryID asdeliveryMethodId(ID returned bydeliveryOptionsCalculatemutation). Usage ofShippingMethodID is deprecated in favor ofCheckoutDeliveryID.
EditorJS (Rich Text Editor)
-
Made the EditorJS parser stricter. We no longer accept unknown/extra fields. - #18969 by @NyanKiyoshi
-
Removed the following deprecated behaviors:
-
EDITOR_JS_LINK_RELconfiguration behavior has changed.
Links rendered by EditorJS (<a href="..." rel="...">) now default to
rel="noopener noreferrer"instead of an empty value.
Learn more in the documentation. -
UNSAFE_EDITOR_JS_ALLOWED_URL_SCHEMEShas been removed.
It's no longer possible to extend the list of allowed URL schemes via settings.If you require support for additional URL schemes, open a request:
https://github.com/saleor/saleor/issues
(Via #18976 by @NyanKiyoshi)
-
Other changes
- Fix Google OAuth OIDC login failing with
invalid_scopeerror whenenable_refresh_tokenis enabled. Google does not support theoffline_accessscope; useaccess_type=offlineauthorization parameter instead. - #18919 by @dnplkndll - Add
saleor.graphql.field.usageOTel metric to track GraphQL field resolver call counts. The metric is emitted for deprecated fields (detected automatically) and for fields explicitly opted in withmonitor_usage=Trueon aBaseFielddeclaration. - Fix send order confirmation email to staff - #18342 by @Shaokun-X
- Validation on
AppExtensionis now removed. Saleor will accept string values formountandtargetfrom Manifest during App installation and JSON value foroptionsfield.
Validation is now performed on the frontend (Dashboard). This change increases velocity of features related to apps and extensions, now Dashboard is only entity that ensures the contract - Add optional usage telemetry. - #18789 by @wcislo-saleor
- The app can now be installed without providing a
tokenTargetUrlin the manifest file. - Removed the setting
JWT_EXPIREwhich allowed to configure Saleor to ignore the JWT token expiration. - #18856 by @NyanKiyoshi - Removed support for custom
UserDB models in./manage.py createsuperusercommand. - #18890 by @NyanKiyoshi - OIDC: When an existing user is claimed by an OIDC provider for the first time, their password is now invalidated to prevent login with stale credentials. This covers the case where a previously deleted staff account is recreated via OIDC.
Search improvements
- Improved page search with search vectors. Pages can now be searched by slug, title, content, attribute values, and page type information.
- Improve user search. Use search vector functionality to enable searching users by email address, first name, last name, and addresses.
- Improved checkout search with search vectors. The
search_index_dirtyflag is set whenever indexed checkout data changes, and a background task runs every minute to update search vectors for dirty checkouts, processing the oldest first. Search results are returned in order of best match relevance. - Enhanced search functionality across key entities (products, orders, gift cards, checkouts, pages, and users) with advanced query capabilities:
- Prefix matching: partial word searches (e.g., "coff" matches "coffee")
- Boolean operators:
AND,OR, and-(NOT) for complex queries - Exact phrase matching: use quotation marks
" "for precise searches - Accent-insensitive search: queries automatically normalize diacritical marks, allowing searches to match regardless of accents (e.g., "cafe" matches "café")
- Relevance-based ranking: exact matches score higher than prefix matches and appear first by default (can be overridden with
sortByparameter) - New
RANKsort field available when using search filters to sort by relevance score
Direct warehouse-channel stock availability
- Added
useLegacyShippingZoneStockAvailabilitysetting toShopandShopSettingsInput. When enabled (default for existing installations), stock availability is filtered through shipping zones and the destination address. When disabled stock availability is determined by the direct warehouse-channel link, ignoring shipping zones. - Checkout mutations (
checkoutCreate,checkoutLinesAdd,checkoutLinesUpdate,checkoutShippingAddressUpdate,checkoutCreateFromOrder) now respect the new setting during stock validation and reservation. - Order mutations (
draftOrderCreate,draftOrderComplete,orderLinesCreate,orderLineUpdate) and the fulfillment flow now respect the setting during stock allocation. - Product filtering by stock availability and
Product.isAvailableresolver now respect the setting. - Webhook payloads for checkout and fulfillment events select the warehouse based on the setting.
- Deprecated the
addressargument onProductVariant.stocks,ProductVariant.quantityAvailable, andProduct.isAvailable. WhenuseLegacyShippingZoneStockAvailabilityis disabled, the address argument is ignored.
Deprecations
- Deprecate the
hasVariantsfield onProductType. - Deprecate export mutations (
exportProducts,exportGiftCards,exportVoucherCodes). All data can be fetched via the GraphQL API and parsed into the desired format by apps or external tools. - Deprecate
voucherinput field onDraftOrderInputandDraftOrderCreateInput. UsevoucherCodeinstead.
- Default `GRAPHQL_BATCH_MAX_COUNT` lowered to 1; applications using GraphQL query batching must increase the env var accordingly.
- Default `GRAPHQL_ALIAS_COUNT_LIMIT` set to 100; queries with >100 aliases now require raising this limit.
- Default `GRAPHQL_MUTATION_COUNT_LIMIT` set to 3; requests containing more than three mutations per call must raise this limit.
- CVE-2026-33756 — Denial of service via unbounded GraphQL query batching
- CVE-2026-35401 — Resource exhaustion vulnerability in GraphQL queries
- CVE-2026-35407 — Cross‑account email change via unbound confirmation token
Full changelog
What's Changed
- Fixed CVE-2026-33756: Denial of service via unbounded GraphQL query batching
- Fixed CVE-2026-35401: Resource exhaustion vulnerability in GraphQL queries
- Fixed CVE-2026-35407: Cross-account email change via unbound confirmation token
- Fixed CVE-2026-39851: User enumeration vulnerability due to different error messages
[!WARNING]
Potential breaking changes are included:
If you use GraphQL query batching, the environment variable
GRAPHQL_BATCH_MAX_COUNTshould be increased. By default it is set to1, meaning only 1 query can be sent inside a single batch. You need to audit your usages and choose the correct value for your use-case.Example request that uses batching (JSON arrays):
$ json_data='[ {"query": "{ products(first: 1) { __typename } }"}, {"query": "{ categories(first: 1) { __typename } }"} ]' $ curl --json "$json_data" https://example.com/graphql/If you use GraphQL aliases, and use more than 100 of them within a single query, you need to increase
GRAPHQL_ALIAS_COUNT_LIMIT(defaults to100)Example query using aliases:
query myQuery { products(first: 10) { alias1: id alias2: id alias3: id } }If you send more than 3 GraphQL mutation per API call, you need to increase
GRAPHQL_MUTATION_COUNT_LIMIT(default to3), for example, the following GraphQL query uses two mutations within a single request:mutation { productUpdate(input: {name: "my-product"}, id: "UHJvZHVjdDox") { product { id } } collectionUpdate(input: {name: "my-collection"}, id: "Q29sbGVjdGlvbjoy") { collection { id } } }
Full Changelog: https://github.com/saleor/saleor/compare/3.20.117...3.20.118
- Audit and adjust `GRAPHQL_BATCH_MAX_COUNT` if you rely on GraphQL query batching.
- If your queries use >100 aliases, increase `GRAPHQL_ALIAS_COUNT_LIMIT` accordingly.
- If you send >3 mutations per API call, raise `GRAPHQL_MUTATION_COUNT_LIMIT` as needed.
- Default `GRAPHQL_BATCH_MAX_COUNT` lowered to 1; increase it if batching is used.
- New limit `GRAPHQL_ALIAS_COUNT_LIMIT` defaults to 100 for alias usage in a single query.
- New limit `GRAPHQL_MUTATION_COUNT_LIMIT` defaults to 3 for mutations per API call.
- CVE-2026-33756 — Denial of service via unbounded GraphQL query batching
- CVE-2026-35401 — Resource exhaustion vulnerability in GraphQL queries
- CVE-2026-35407 — Cross‑account email change via unbound confirmation token
Full changelog
What's Changed
- Fixed CVE-2026-33756: Denial of service via unbounded GraphQL query batching
- Fixed CVE-2026-35401: Resource exhaustion vulnerability in GraphQL queries
- Fixed CVE-2026-35407: Cross-account email change via unbound confirmation token
- Fixed CVE-2026-39851: User enumeration vulnerability due to different error messages
[!WARNING]
Potential breaking changes are included:
If you use GraphQL query batching, the environment variable
GRAPHQL_BATCH_MAX_COUNTshould be increased. By default it is set to1, meaning only 1 query can be sent inside a single batch. You need to audit your usages and choose the correct value for your use-case.Example request that uses batching (JSON arrays):
$ json_data='[ {"query": "{ products(first: 1) { __typename } }"}, {"query": "{ categories(first: 1) { __typename } }"} ]' $ curl --json "$json_data" https://example.com/graphql/If you use GraphQL aliases, and use more than 100 of them within a single query, you need to increase
GRAPHQL_ALIAS_COUNT_LIMIT(defaults to100)Example query using aliases:
query myQuery { products(first: 10) { alias1: id alias2: id alias3: id } }If you send more than 3 GraphQL mutation per API call, you need to increase
GRAPHQL_MUTATION_COUNT_LIMIT(default to3), for example, the following GraphQL query uses two mutations within a single request:mutation { productUpdate(input: {name: "my-product"}, id: "UHJvZHVjdDox") { product { id } } collectionUpdate(input: {name: "my-collection"}, id: "Q29sbGVjdGlvbjoy") { collection { id } } }
Full Changelog: https://github.com/saleor/saleor/compare/3.21.53...3.21.54
- Audit and adjust `GRAPHQL_BATCH_MAX_COUNT` (default 1) for GraphQL query batching usage.
- If your queries use more than 100 aliases, increase `GRAPHQL_ALIAS_COUNT_LIMIT` accordingly.
- For requests containing >3 mutations, raise `GRAPHQL_MUTATION_COUNT_LIMIT` from its default of 3.
- Default `GRAPHQL_BATCH_MAX_COUNT` lowered to 1; applications using GraphQL query batching must set a higher value via env var.
- Default `GRAPHQL_ALIAS_COUNT_LIMIT` limited to 100; queries exceeding this now fail and require increasing the limit via `GRAPHQL_ALIAS_COUNT_LIMIT`.
- Default `GRAPHQL_MUTATION_COUNT_LIMIT` capped at 3; requests with more than three mutations must raise the limit using `GRAPHQL_MUTATION_COUNT_LIMIT`.
- CVE-2026-33756 — Denial of service via unbounded GraphQL query batching
- CVE-2026-35401 — Resource exhaustion vulnerability in GraphQL queries
- CVE-2026-35407 — Cross‑account email change via unbound confirmation token
Full changelog
What's Changed
- Fixed CVE-2026-33756: Denial of service via unbounded GraphQL query batching
- Fixed CVE-2026-35401: Resource exhaustion vulnerability in GraphQL queries
- Fixed CVE-2026-35407: Cross-account email change via unbound confirmation token
- Fixed CVE-2026-39851: User enumeration vulnerability due to different error messages
[!WARNING]
Potential breaking changes are included:
If you use GraphQL query batching, the environment variable
GRAPHQL_BATCH_MAX_COUNTshould be increased. By default it is set to1, meaning only 1 query can be sent inside a single batch. You need to audit your usages and choose the correct value for your use-case.Example request that uses batching (JSON arrays):
$ json_data='[ {"query": "{ products(first: 1) { __typename } }"}, {"query": "{ categories(first: 1) { __typename } }"} ]' $ curl --json "$json_data" https://example.com/graphql/If you use GraphQL aliases, and use more than 100 of them within a single query, you need to increase
GRAPHQL_ALIAS_COUNT_LIMIT(defaults to100)Example query using aliases:
query myQuery { products(first: 10) { alias1: id alias2: id alias3: id } }If you send more than 3 GraphQL mutation per API call, you need to increase
GRAPHQL_MUTATION_COUNT_LIMIT(default to3), for example, the following GraphQL query uses two mutations within a single request:mutation { productUpdate(input: {name: "my-product"}, id: "UHJvZHVjdDox") { product { id } } collectionUpdate(input: {name: "my-collection"}, id: "Q29sbGVjdGlvbjoy") { collection { id } } }
Full Changelog: https://github.com/saleor/saleor/compare/3.22.46...3.22.47
- CVE-2026-3902 — ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277 — Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292 — Privilege abuse in ModelAdmin.list_editable
Full changelog
What's Changed
- Fix error handling and parse errors when dealing with unexpected and/or incorrect JSON payloads (#19016) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19023
- Upgraded django to 4.2.30 in https://github.com/saleor/saleor/pull/19032, fixes:
- CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277: Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292: Privilege abuse in ModelAdmin.list_editable
- CVE-2026-33033: Potential denial-of-service vulnerability in MultiPartParser via base64-encoded file upload
- CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass
- More info: https://www.djangoproject.com/weblog/2026/apr/07/security-releases/
Full Changelog: https://github.com/saleor/saleor/compare/3.20.116...3.20.117
- Upgraded Django to version 4.2.30 (includes the above security patches)
- CVE-2026-3902 — ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277 — Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292 — Privilege abuse in ModelAdmin.list_editable
Full changelog
What's Changed
- Fix error handling and parse errors when dealing with unexpected and/or incorrect JSON payloads (#19016) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19022
- Upgraded django to 4.2.30 in https://github.com/saleor/saleor/pull/19031, fixes:
- CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277: Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292: Privilege abuse in ModelAdmin.list_editable
- CVE-2026-33033: Potential denial-of-service vulnerability in MultiPartParser via base64-encoded file upload
- CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass
- More info: https://www.djangoproject.com/weblog/2026/apr/07/security-releases/
Full Changelog: https://github.com/saleor/saleor/compare/3.21.52...3.21.53
- Upgraded Django to version 5.2.13; review the Django 5.2 release notes for any compatibility changes.
- CVE-2026-3902 — ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277 — Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292 — Privilege abuse in ModelAdmin.list_editable
Full changelog
What's Changed
- Fix error handling and parse errors when dealing with unexpected and/or incorrect JSON payloads (#19016) by @wcislo-saleor in https://github.com/saleor/saleor/pull/19021
- Upgraded django to 5.2.13 in https://github.com/saleor/saleor/pull/19030, fixes:
- CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation
- CVE-2026-4277: Privilege abuse in GenericInlineModelAdmin
- CVE-2026-4292: Privilege abuse in ModelAdmin.list_editable
- CVE-2026-33033: Potential denial-of-service vulnerability in MultiPartParser via base64-encoded file upload
- CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass
- More info: https://www.djangoproject.com/weblog/2026/apr/07/security-releases/
Full Changelog: https://github.com/saleor/saleor/compare/3.22.45...3.22.46
- Added `PRODUCT_VARIANT_DISCOUNTED_PRICE_UPDATED` webhook event
Full changelog
What's Changed
- Add
PRODUCT_VARIANT_DISCOUNTED_PRICE_UPDATEDwebhook event by @IKarbowiak in https://github.com/saleor/saleor/pull/18973 - Fix duplicate attributes in inCategory/inCollection filters by @IKarbowiak in https://github.com/saleor/saleor/pull/19002
- Fix deadlocks on checkout and order by @IKarbowiak in https://github.com/saleor/saleor/pull/19000
Full Changelog: https://github.com/saleor/saleor/compare/3.22.44...3.22.45
- Metric introduced to track GraphQL field usage
Full changelog
What's Changed
- Introduce a metric for tracking GraphQL field usage by @przlada in https://github.com/saleor/saleor/pull/18957
Full Changelog: https://github.com/saleor/saleor/compare/3.22.43...3.22.44
Fixed a memory leak affecting cached states.
Full changelog
What's Changed
- Fix memory leak for cached states by @IKarbowiak in https://github.com/saleor/saleor/pull/18946
- Validate empty product ID in ProductMediaCreate mutation by @lkostrowski in https://github.com/saleor/saleor/pull/18942
- Fix creation of the event. (#18959) by @wcislo-saleor in https://github.com/saleor/saleor/pull/18960
Full Changelog: https://github.com/saleor/saleor/compare/3.22.42...3.22.43
- Introduce a metric for tracking GraphQL field usage
Full changelog
What's Changed
- Fix memory leak for cached states by @IKarbowiak in https://github.com/saleor/saleor/pull/18947
- Introduce a metric for tracking GraphQL field usage by @przlada in https://github.com/saleor/saleor/pull/18956
- Fix creation of the event. (#18959) by @wcislo-saleor in https://github.com/saleor/saleor/pull/18961
Full Changelog: https://github.com/saleor/saleor/compare/3.21.51...3.21.52
Fixed a memory leak in cached states.
Full changelog
What's Changed
- Fix memory leak for cached states by @IKarbowiak in https://github.com/saleor/saleor/pull/18948
- Fix creation of the event. (#18959) by @wcislo-saleor in https://github.com/saleor/saleor/pull/18962
Full Changelog: https://github.com/saleor/saleor/compare/3.20.115...3.20.116
- CVE-2026-32597 — upgraded pyjwt to the latest version
Full changelog
What's Changed
- Upgraded pyjwt to latest to fix CVE-2026-32597 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18936
Full Changelog: https://github.com/saleor/saleor/compare/3.20.114...3.20.115
- Deprecation warning: legacy Adyen plugin `Payment.partial` field is deprecated and will be removed in a future release.
- CVE-2026-32597 — upgraded pyjwt to latest version
Full changelog
What's Changed
- Deprecated legacy Adyen plugin
Payment.partialfield by @lkostrowski in https://github.com/saleor/saleor/pull/18924 - Upgraded pyjwt to latest to fix CVE-2026-32597 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18934
Full Changelog: https://github.com/saleor/saleor/compare/3.22.41...3.22.42
- CVE-2026-32597 — upgraded pyjwt to latest version
Full changelog
What's Changed
- Upgraded pyjwt to latest to fix CVE-2026-32597 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18935
Full Changelog: https://github.com/saleor/saleor/compare/3.21.50...3.21.51
- Deprecated digital contents; plan migration away from this feature.
- CVE-2026-28802 — authlib upgraded to latest version
Full changelog
What's Changed
- Deprecated digital contents by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18798
- Fixed unsafe access to writer warnings by @wcislo-saleor in https://github.com/saleor/saleor/pull/18824
- Upgraded authlib to latest to fix CVE-2026-28802 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18907
Misc:
- Fixed flaky tests due to relying on the order of returned shipping methods in tests (#17597) by @wcislo-saleor in https://github.com/saleor/saleor/pull/18826
Full Changelog: https://github.com/saleor/saleor/compare/3.20.113...3.20.114
- CVE-2026-28802 — upgraded authlib to the latest version
Full changelog
What's Changed
- Fixed empty permissions in
AppInstallmutation by @IKarbowiak in https://github.com/saleor/saleor/pull/18884 - Fixed
TypeErrorwhen app manifest contains emptyextensionsandwebhooksby @IKarbowiak in https://github.com/saleor/saleor/pull/18889 - Upgrade authlib to latest to fix CVE-2026-28802 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18910
Full Changelog: https://github.com/saleor/saleor/compare/3.22.40...3.22.41
- CVE-2026-28802 — authlib vulnerability fixed by upgrading to latest version
Full changelog
What's Changed
- Deprecated digital contents by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18797
- Fixed unsafe access to writer warnings by @wcislo-saleor in https://github.com/saleor/saleor/pull/18819
- Upgrade authlib to latest to fix CVE-2026-28802 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18908
Misc:
- tests: fixed missing cache in account tests by @korycins in https://github.com/saleor/saleor/pull/18800
Full Changelog: https://github.com/saleor/saleor/compare/3.21.49...3.21.50
- Added `metadata` field to `CustomerOrderWhereInput` allowing metadata-based query filtering
Full changelog
What's Changed
- Extend
CustomerOrderWhereInputwithmetadataby @IKarbowiak in https://github.com/saleor/saleor/pull/18882
Full Changelog: https://github.com/saleor/saleor/compare/3.22.39...3.22.40
- Make USED_IN_ORDER gift card events accessible for users with MANAGE_ORDERS permission
- Extend user.orders query with where filtering option
Full changelog
What's Changed
- Make
USED_IN_ORDERgift card events accessible for users withMANAGE_ORDERSby @IKarbowiak in https://github.com/saleor/saleor/pull/18868 - Extend
user.orderswith where option by @IKarbowiak in https://github.com/saleor/saleor/pull/18866 - Fix
trackInventorynot being applied inproductBulkCreateby @IKarbowiak in https://github.com/saleor/saleor/pull/18875 - Fix media creation mutations when
altfield isnullby @przlada in https://github.com/saleor/saleor/pull/18873
Full Changelog: https://github.com/saleor/saleor/compare/3.22.38...3.22.39
- Address validation preserves extra fields not present in allowed list
- CountryCodeEnum now includes missing descriptions
Full changelog
What's Changed
- Add missing descriptions to the CountryCodeEnum by @patrys in https://github.com/saleor/saleor/pull/18836
- Allow preserving address extra fields not present in allowed once during address validation by @IKarbowiak in https://github.com/saleor/saleor/pull/18825
Full Changelog: https://github.com/saleor/saleor/compare/3.22.37...3.22.38
- Media validation extends the allowed MIME type list
Full changelog
What's Changed
- Media validation - extend MIME type allowlist by @przlada in https://github.com/saleor/saleor/pull/18832
Full Changelog: https://github.com/saleor/saleor/compare/3.22.36...3.22.37
- AppProblem API
Full changelog
What's Changed
- [3.22] Add AppProblem API by @lkostrowski in https://github.com/saleor/saleor/pull/18808
- Fix the missing descriptions in the LanguageCodeEnum by @patrys in https://github.com/saleor/saleor/pull/18823
- Fix unsafe access to writer warnings by @wcislo-saleor in https://github.com/saleor/saleor/pull/18820
- Release 3.22.36 by @lkostrowski in https://github.com/saleor/saleor/pull/18815
Full Changelog: https://github.com/saleor/saleor/compare/3.22.35...3.22.36
Fixed pagination for resolvers that operate on lists.
Full changelog
What's Changed
- Fix pagination for resolvers operates on lists by @IKarbowiak in https://github.com/saleor/saleor/pull/18811
- Release 3.22.35 by @IKarbowiak in https://github.com/saleor/saleor/pull/18814
Full Changelog: https://github.com/saleor/saleor/compare/3.22.34...3.22.35
- Deprecate digital contents in Saleor v3.22
Full changelog
What's Changed
- Add missing cache to account tests by @korycins in https://github.com/saleor/saleor/pull/18801
- Deprecate digital contents in Saleor v3.22 by @NyanKiyoshi in https://github.com/saleor/saleor/pull/18796
- Refactor media validation in product mutations by @przlada in https://github.com/saleor/saleor/pull/18803
Full Changelog: https://github.com/saleor/saleor/compare/3.22.33...3.22.34
Minor fixes and improvements.
Full changelog
What's Changed
- Prevent app already installed error in quiet mode (#18742) by @cmiacz in https://github.com/saleor/saleor/pull/18763
- Release 3.20.113 by @cmiacz in https://github.com/saleor/saleor/pull/18792
Full Changelog: https://github.com/saleor/saleor/compare/3.20.112...3.20.113
- Added `transactions` query and extended order transactions filter with `pspReference`
Full changelog
What's Changed
- Prevent app already installed error in quiet mode (#18742) by @cmiacz in https://github.com/saleor/saleor/pull/18765
- Add
transactionsquery and extend order transactions where filter withpspReferenceby @IKarbowiak in https://github.com/saleor/saleor/pull/18759 - Fix products export with filters by @IKarbowiak in https://github.com/saleor/saleor/pull/18774
Full Changelog: https://github.com/saleor/saleor/compare/3.22.32...3.22.33
Fixed products export failing when using filters.
Full changelog
What's Changed
- Prevent app already installed error in quiet mode (#18742) by @cmiacz in https://github.com/saleor/saleor/pull/18764
- Fix products export with filters by @IKarbowiak in https://github.com/saleor/saleor/pull/18768
Full Changelog: https://github.com/saleor/saleor/compare/3.21.48...3.21.49
- CVE-2025-13473 — fixed by upgrading Django
- CVE-2025-14550 — fixed by upgrading Django
- CVE-2026-1207 — fixed by upgrading Django
Full changelog
What's Changed
- Upgraded Django to latest version to fix CVE-2025-13473, CVE-2025-14550, CVE-2026-1207, CVE-2026-1285, CVE-2026-1287, and CVE-2026-1312 (more details at https://www.djangoproject.com/weblog/2026/feb/03/security-releases/ ) by @przlada in https://github.com/saleor/saleor/pull/18751
Full Changelog: https://github.com/saleor/saleor/compare/3.22.31...3.22.32
- CVE-2025-13473 — security release
- CVE-2025-14550 — security release
- CVE-2026-1207 — security release
Full changelog
What's Changed
- Upgraded Django to latest version to fix CVE-2025-13473, CVE-2025-14550, CVE-2026-1207, CVE-2026-1285, CVE-2026-1287, and CVE-2026-1312 (more details at https://www.djangoproject.com/weblog/2026/feb/03/security-releases/ ) by @przlada in https://github.com/saleor/saleor/pull/18754
Full Changelog: https://github.com/saleor/saleor/compare/3.20.111...3.20.112
- CVE-2025-13473 — fixed in Django upgrade
- CVE-2025-14550 — fixed in Django upgrade
- CVE-2026-1207 — fixed in Django upgrade
Full changelog
What's Changed
- Upgraded Django to latest version to fix CVE-2025-13473, CVE-2025-14550, CVE-2026-1207, CVE-2026-1285, CVE-2026-1287, and CVE-2026-1312 (more details at https://www.djangoproject.com/weblog/2026/feb/03/security-releases/ ) by @przlada in https://github.com/saleor/saleor/pull/18753
Full Changelog: https://github.com/saleor/saleor/compare/3.21.47...3.21.48
- Configurable dedicated Celery queue for data migration tasks
Full changelog
What's Changed
- Enable configurable dedicated Celery queue for data migration tasks by @przlada in https://github.com/saleor/saleor/pull/18740
Full Changelog: https://github.com/saleor/saleor/compare/3.22.30...3.22.31
- Configurable dedicated Celery queue for data migration tasks
Full changelog
What's Changed
- Enable configurable dedicated Celery queue for data migration tasks by @przlada in https://github.com/saleor/saleor/pull/18741
Full Changelog: https://github.com/saleor/saleor/compare/3.21.46...3.21.47
- Enable configurable dedicated Celery queue for data migration tasks
Full changelog
What's Changed
- Do not return installed/created app token when not needed (#18704) by @cmiacz in https://github.com/saleor/saleor/pull/18706
- Enable configurable dedicated Celery queue for data migration tasks by @przlada in https://github.com/saleor/saleor/pull/18743
Full Changelog: https://github.com/saleor/saleor/compare/3.20.110...3.20.111
Fixed Kosovo being unrecognized as a valid country during checkout.
Full changelog
What's Changed
- Do not return installed/created app token when not needed (#18704) by @cmiacz in https://github.com/saleor/saleor/pull/18708
- Improve voucher validations in draft orders by @IKarbowiak in https://github.com/saleor/saleor/pull/18727
- Fix Kosovo not recognized as valid country in checkout by @IKarbowiak in https://github.com/saleor/saleor/pull/18729
Full Changelog: https://github.com/saleor/saleor/compare/3.22.29...3.22.30
Fixed Kosovo being incorrectly rejected as a valid country during checkout.
Full changelog
What's Changed
- Do not return installed/created app token when not needed (#18704) by @cmiacz in https://github.com/saleor/saleor/pull/18707
- Improve voucher validations in draft orders by @IKarbowiak in https://github.com/saleor/saleor/pull/18726
- Fix Kosovo not recognized as valid country in checkout by @IKarbowiak in https://github.com/saleor/saleor/pull/18730
Full Changelog: https://github.com/saleor/saleor/compare/3.21.45...3.21.46
- GHSA-r6fj-f4r9-36gr — CVE-2026-24136
Full changelog
What's Changed
- Fix CVE-2026-24136 by @korycins in https://github.com/saleor/saleor/pull/18712
Full Changelog: https://github.com/saleor/saleor/compare/3.21.44...3.21.45
- GHSA-r6fj-f4r9-36gr (CVE-2026-24136) — security vulnerability fixed
Full changelog
What's Changed
- Fix CVE-2026-24136 by @korycins in https://github.com/saleor/saleor/pull/18713
Full Changelog: https://github.com/saleor/saleor/compare/3.22.28...3.22.29
- GHSA-r6fj-f4r9-36gr — CVE-2026-24136
Full changelog
What's Changed
- Fix CVE-2026-24136 by @korycins in https://github.com/saleor/saleor/pull/18711
Full Changelog: https://github.com/saleor/saleor/compare/3.20.109...3.20.110
- Deactivates single‑use vouchers when a draft order is completed
Full changelog
What's Changed
- Deactivate single use voucher when completing draft order by @IKarbowiak in https://github.com/saleor/saleor/pull/18697
Full Changelog: https://github.com/saleor/saleor/compare/3.22.27...3.22.28
Minor fixes and improvements.
Full changelog
New release fixing missing missing docker image for v3.20.108. No changes were made in the code since v3.20.108.
Full Changelog: https://github.com/saleor/saleor/compare/3.20.108...3.20.109
- Deactivates single‑use vouchers when a draft order is completed
Full changelog
What's Changed
- Deactivate single use voucher when completing draft order by @IKarbowiak in https://github.com/saleor/saleor/pull/18690
Full Changelog: https://github.com/saleor/saleor/compare/3.21.43...3.21.44
- Run `./manage.py clean_editorjs_fields` to scan and optionally apply cleaning for CVE‑2026‑22849.
- Run `./manage.py remove_invalid_files` to scan uploaded files and optionally delete invalid ones for CVE‑2026‑23499.
- Review configuration settings if using custom HTML attributes, URL schemes, deep lists, or additional file mime types as noted in the upgrade notes.
- CVE-2026-22849 – Lack of proper HTML sanitization in rich text fields (stored XSS).
- CVE-2026-23499 – Stored XSS via unrestricted file uploads.
Full changelog
- Fixed CVE-2026-22849 - Lack of proper HTML sanitization in rich text fields
- Fixed CVE-2026-23499 - Stored XSS via Unrestricted File Uploads
Upgrade Notes (Important)
[!NOTE]
This a security release with major changes, we recommend to read the release notes carefully.
This release fixes two stored XSS vulnerabilities, if you believe you are impacted, or if you are unsure or want to verify, you should run the following commands:
- CVE-2026-22849:
./manage.py clean_editorjs_fields- this scan all rich text fields and will display
any differences detected. You should look for suspicious differences (e.g., unexpected javascript code)
and if you want to fix the differences, run./manage.py clean_editorjs_fields --apply - CVE-2026-23499:
./manage.py remove_invalid_files- scans all uploaded files (in the media storage,
e.g., the filesystem, a S3 bucket, etc.). You should look for unexpected files, if you see differences,
then either:- Change the configuration so that Saleor allows the file (see the
File Uploadssection below) - Delete the file manually or automatically (
./manage.py remove_invalid_files --apply)
- Change the configuration so that Saleor allows the file (see the
Am I impacted by the major changes?
Question Answer Do you use HTML attributes in EditorJS? If yes, you may need to look at allowing custom HTML attributes, and our documentation for allowing custom attribute values Do you use URL schemes other thanhttp(s)://, tel:, and mailto: in EditorJS?
If yes, look at our documentation for allowing custom URL schemes (UNSAFE_EDITOR_JS_ALLOWED_URL_SCHEMES)
Do you use lists that are deeper than 10 levels? For example this is a 2 levels list: - level 1
- level2
EDITOR_JS_LISTS_MAX_DEPTH
Do you use the mutations fileUpload() and digitalContentCreate()? And do you upload files in any format other than the following?
- Images: AVIF, GIF, JPEG, BMP, PNG, TIFF, WebP
- Documents: Word documents (.docx, .doc), Excel Files (.xls, .xlsx), Powerpoints (.ppt, .pptx)
- Videos: MP4, WebM, QuickTime (.mov), Vorbis (.ogg, .ogv)
- Audio: MP3, .m4a, .weba, Vorbis (.oga, .ogg), Wav (.wav)
- Text: CSV (.csv), plain text (.txt)
UPLOAD_ADDITIONAL_ALLOWED_MIME_TYPES)
Huge thanks to the security researchers who reported these issues responsibly: @vuquyen03, and @lukasz-rybak.
Full Changelog: https://github.com/saleor/saleor/compare/3.22.26...3.22.27
- Run `./manage.py clean_editorjs_fields` to scan and optionally apply fixes for CVE‑2026‑22849.
- Run `./manage.py remove_invalid_files` to scan uploaded files; review unexpected files or adjust configuration (`UPLOAD_ADDITIONAL_ALLOWED_MIME_TYPES`) before applying removals with `--apply`.
- CVE-2026-22849 — Lack of proper HTML sanitization in rich text fields
- CVE-2026-23499 — Stored XSS via unrestricted file uploads
Full changelog
- Fixed CVE-2026-22849 - Lack of proper HTML sanitization in rich text fields
- Fixed CVE-2026-23499 - Stored XSS via Unrestricted File Uploads
Upgrade Notes (Important)
[!NOTE]
This a security release with major changes, we recommend to read the release notes carefully.
This release fixes two stored XSS vulnerabilities, if you believe you are impacted, or if you are unsure or want to verify, you should run the following commands:
- CVE-2026-22849:
./manage.py clean_editorjs_fields- this scan all rich text fields and will display
any differences detected. You should look for suspicious differences (e.g., unexpected javascript code)
and if you want to fix the differences, run./manage.py clean_editorjs_fields --apply - CVE-2026-23499:
./manage.py remove_invalid_files- scans all uploaded files (in the media storage,
e.g., the filesystem, a S3 bucket, etc.). You should look for unexpected files, if you see differences,
then either:- Change the configuration so that Saleor allows the file (see the
File Uploadssection below) - Delete the file manually or automatically (
./manage.py remove_invalid_files --apply)
- Change the configuration so that Saleor allows the file (see the
Am I impacted by the major changes?
Question Answer Do you use HTML attributes in EditorJS? If yes, you may need to look at allowing custom HTML attributes, and our documentation for allowing custom attribute values Do you use URL schemes other thanhttp(s)://, tel:, and mailto: in EditorJS?
If yes, look at our documentation for allowing custom URL schemes (UNSAFE_EDITOR_JS_ALLOWED_URL_SCHEMES)
Do you use lists that are deeper than 10 levels? For example this is a 2 levels list: - level 1
- level2
EDITOR_JS_LISTS_MAX_DEPTH
Do you use the mutations fileUpload() and digitalContentCreate()? And do you upload files in any format other than the following?
- Images: AVIF, GIF, JPEG, BMP, PNG, TIFF, WebP
- Documents: Word documents (.docx, .doc), Excel Files (.xls, .xlsx), Powerpoints (.ppt, .pptx)
- Videos: MP4, WebM, QuickTime (.mov), Vorbis (.ogg, .ogv)
- Audio: MP3, .m4a, .weba, Vorbis (.oga, .ogg), Wav (.wav)
- Text: CSV (.csv), plain text (.txt)
UPLOAD_ADDITIONAL_ALLOWED_MIME_TYPES)
Huge thanks to the security researchers who reported these issues responsibly: @vuquyen03, and @lukasz-rybak.
Full Changelog: https://github.com/saleor/saleor/compare/3.21.42...3.21.43
- Run `./manage.py clean_editorjs_fields` to scan and optionally apply fixes for CVE-2026-22849.
- Run `./manage.py remove_invalid_files` to scan uploaded files; review unexpected entries or adjust configuration (UPLOAD_ADDITIONAL_ALLOWED_MIME_TYPES, UNSAFE_EDITOR_JS_ALLOWED_URL_SCHEMES) before applying changes.
- CVE-2026-22849 — Lack of proper HTML sanitization in rich text fields (stored XSS)
- CVE-2026-23499 — Stored XSS via unrestricted file uploads
Full changelog
[!WARNING]
Docker image is missing for this release due to a build issue, use v3.20.109 instead.
- Fixed CVE-2026-22849 - Lack of proper HTML sanitization in rich text fields
- Fixed CVE-2026-23499 - Stored XSS via Unrestricted File Uploads
Upgrade Notes (Important)
[!NOTE]
This a security release with major changes, we recommend to read the release notes carefully.
This release fixes two stored XSS vulnerabilities, if you believe you are impacted, or if you are unsure or want to verify, you should run the following commands:
- CVE-2026-22849:
./manage.py clean_editorjs_fields- this scan all rich text fields and will display
any differences detected. You should look for suspicious differences (e.g., unexpected javascript code)
and if you want to fix the differences, run./manage.py clean_editorjs_fields --apply - CVE-2026-23499:
./manage.py remove_invalid_files- scans all uploaded files (in the media storage,
e.g., the filesystem, a S3 bucket, etc.). You should look for unexpected files, if you see differences,
then either:- Change the configuration so that Saleor allows the file (see the
File Uploadssection below) - Delete the file manually or automatically (
./manage.py remove_invalid_files --apply)
- Change the configuration so that Saleor allows the file (see the
Am I impacted by the major changes?
Question Answer Do you use HTML attributes in EditorJS? If yes, you may need to look at allowing custom HTML attributes, and our documentation for allowing custom attribute values Do you use URL schemes other thanhttp(s)://, tel:, and mailto: in EditorJS?
If yes, look at our documentation for allowing custom URL schemes (UNSAFE_EDITOR_JS_ALLOWED_URL_SCHEMES)
Do you use lists that are deeper than 10 levels? For example this is a 2 levels list: - level 1
- level2
EDITOR_JS_LISTS_MAX_DEPTH
Do you use the mutations fileUpload() and digitalContentCreate()? And do you upload files in any format other than the following?
- Images: AVIF, GIF, JPEG, BMP, PNG, TIFF, WebP
- Documents: Word documents (.docx, .doc), Excel Files (.xls, .xlsx), Powerpoints (.ppt, .pptx)
- Videos: MP4, WebM, QuickTime (.mov), Vorbis (.ogg, .ogv)
- Audio: MP3, .m4a, .weba, Vorbis (.oga, .ogg), Wav (.wav)
- Text: CSV (.csv), plain text (.txt)
UPLOAD_ADDITIONAL_ALLOWED_MIME_TYPES)
Huge thanks to the security researchers who reported these issues responsibly: @vuquyen03, and @lukasz-rybak.
Full Changelog: https://github.com/saleor/saleor/compare/3.20.107...3.20.108
- Improved OIDC plugin compatibility with AWS Cognito
Full changelog
What's Changed
- Improve OIDC plugin compatibility with AWS Cognito by @wcislo-saleor in https://github.com/saleor/saleor/pull/18676
Full Changelog: https://github.com/saleor/saleor/compare/3.21.41...3.21.42
- Improved OIDC plugin compatibility with AWS Cognito
Full changelog
What's Changed
- Improve OIDC plugin compatibility with AWS Cognito by @wcislo-saleor in https://github.com/saleor/saleor/pull/18673
Full Changelog: https://github.com/saleor/saleor/compare/3.22.25...3.22.26
Minor fixes and improvements.
Full changelog
What's Changed
- Add missing celery conf and reapply migration for fixing shared address instances by @IKarbowiak in https://github.com/saleor/saleor/pull/18670
Full Changelog: https://github.com/saleor/saleor/compare/3.22.24...3.22.25
- Improved OIDC plugin compatibility with AWS Cognito
Full changelog
What's Changed
- Improve OIDC plugin compatibility with AWS Cognito by @wcislo-saleor in https://github.com/saleor/saleor/pull/18664
Full Changelog: https://github.com/saleor/saleor/compare/3.20.106...3.20.107
Fixed incorrect spelling of 'address' in shared address instances.
Full changelog
What's Changed
- Ensure there is no memory build-up during test execution by @wcislo-saleor in https://github.com/saleor/saleor/pull/18661
- Fix shared adress instances by @IKarbowiak in https://github.com/saleor/saleor/pull/18650
Full Changelog: https://github.com/saleor/saleor/compare/3.22.23...3.22.24
Fixed shared address instance handling bug.
Full changelog
What's Changed
- Ensure there is no memory build-up during test execution by @wcislo-saleor in https://github.com/saleor/saleor/pull/18660
- Fix shared adress instances by @IKarbowiak in https://github.com/saleor/saleor/pull/18647
Full Changelog: https://github.com/saleor/saleor/compare/3.21.40...3.21.41