Announcing Saleor 3.23
Saleor 3.23 brings explicit delivery control, rebuilt search, gift card payments in the Transaction API, simplified stock availability, and major webhook performance improvements.
We're excited to announce the release of Saleor 3.23 โ a major update focused on giving developers more control over checkout delivery flows, dramatically improved search across the platform, and native gift card support in the Transaction API.
In this release
- Explicit delivery โ storefronts choose when shipping webhooks run via
deliveryOptionsCalculate - Search โ PostgreSQL-backed vectors, prefix and boolean queries, better ranking
- Gift cards โ first-class in the Transaction API with partial payments and balance tracking
- Stock availability โ optional simplified mode that removes the shipping-zone dependency from stock checks
- Webhooks โ less redundant work on the request path and fewer surprise emissions
Explicit Delivery Options
The headline feature of 3.23 is the new deliveryOptionsCalculate mutation, which gives storefronts deterministic control over when shipping webhook calls happen.
Previously, SHIPPING_LIST_METHODS_FOR_CHECKOUT and CHECKOUT_FILTER_SHIPPING_METHODS webhooks were fired implicitly inside checkout mutations (e.g., on address changes) and during query resolution. This caused unpredictable latency, uncontrolled webhook traffic, and increased costs.
Read more about explicit delivery options in the companion post:
Overhauled Search
Saleor search has been rebuilt from the ground up with PostgreSQL search vectors. The improvements span products, orders, gift cards, checkouts, pages, and users, and introduce:
- Prefix matching โ partial words like "coff" now match "coffee"
- Boolean operators โ
AND,OR, and-(NOT) for complex queries - Exact phrase matching โ use quotation marks for precise searches
- Accent-insensitive search โ "cafe" matches "cafรฉ"
- Relevance-based ranking โ exact matches score higher than prefix matches
- New
RANKsort field โ sort results by relevance score
Read more about the overhauled search in the companion post:
Gift Cards as a Transaction API Payment Method
Gift cards can now be used as a native payment method within the Transaction API. This brings gift card payments into the same modern flow as other payment methods, with full support for partial payments and transparent balance tracking.
See Gift Cards in Checkout for details.
Simplified Stock Availability
Stock availability no longer depends on shipping zones. Instead, it is determined solely by the warehouse-channel link โ if a warehouse is assigned to a channel, its stock counts toward product availability in that channel.
Previously, a warehouse's stock only counted if the warehouse was also linked to a shipping zone covering the customer's country. This required careful coordination between warehouse, shipping zone, and channel configuration โ and made it easy to accidentally hide stock from customers.
The old behavior is still available behind the useLegacyShippingZoneStockAvailability setting on Shop, which is enabled by default on existing instances to preserve backwards compatibility. It is deprecated and will be removed in a future version โ we recommend disabling it as soon as possible via shopSettingsUpdate.
With the new default:
- Stock checks consider all warehouses assigned to the channel
- Allocation and reservation draw from any channel warehouse, regardless of the customer's country
- Product filters (
IN_STOCK/OUT_OF_STOCK) reflect the full channel inventory
Webhook Performance Improvements
Two significant changes improve webhook performance for order-related events:
- Sync webhooks are no longer pre-fired before async webhook events. Webhooks like
ORDER_CALCULATE_TAXESandORDER_FILTER_SHIPPING_METHODSnow only fire when their data is actually needed. - Order webhook payloads are now built in background tasks, moving expensive serialization off the request path. This speeds up most order mutations.
Plugin Removals
Continuing the shift toward the App ecosystem, 3.23 removes two legacy payment plugins:
- Adyen plugin โ migrate to the Adyen App
- NP Atobarai plugin โ migrate to the NP Atobarai App
GraphQL API Changes
- Attribute fields
name,slug, andtypeare now non-nullable in the schema - New
NonNegativeIntscalar โMinute,Hour, andDayscalars now reject negative values at the GraphQL layer AppInstallInputnow requiresappNameandmanifestUrlin the schema (matching existing validation)- Federation
_entitiesrepresentation type tightened from[_Any]to[_Any!]!
Webhook Emission Changes
Metadata-only changes no longer trigger entity update webhooks (for example ORDER_UPDATED) by default. Only the dedicated metadata webhooks run in that situation, which cuts noise for integrations that do not need a full entity payload when metadata alone changed.
- Default (3.23): metadata updates โ metadata webhooks; no automatic
ORDER_UPDATED-style spam - Legacy: the
useLegacyUpdateWebhookEmissionshop setting restores the old behavior - Deprecation: the legacy setting is deprecated and will be removed in a future version โ plan to rely on metadata webhooks instead
Other Notable Changes
Auth and security
- Google OAuth fix โ OIDC login no longer fails with
invalid_scopewhen refresh tokens are enabled (Google requiresaccess_type=offlineinstead of theoffline_accessscope) - JWT expiration enforced โ the
JWT_EXPIREsetting that allowed disabling token expiration has been removed
Apps and extensions
- App extensions simplified โ legacy
options,mount, andtargetfields removed in favor ofsettings,mountName, andtargetName; validation moved to Dashboard - Apps can install without
tokenTargetUrlin the manifest
Platform and telemetry
- Optional usage telemetry added
Fixes and polish
- Various bug fixes for draft orders, voucher usage tracking, media validation, and more
Deprecations
hasVariantsonProductTypeโ a legacy artifact from the Simple/Configurable product distinction- Export mutations (
exportProducts,exportGiftCards,exportVoucherCodes) โ use the GraphQL API directly Checkout.shippingMethodandCheckout.deliveryMethodโ useCheckout.deliveryinstead
Upgrading
Review the Upgrade Guide (from 3.22 to 3.23) for detailed migration steps, especially for the explicit delivery options change and plugin removals.
That's Saleor 3.23 โ more control, better search, and a leaner core. We'd love to hear what you think.