โ† Blog

Updates,

Announcing Saleor 3.23

ลukasz Ostrowski

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:

โ†’ Explicit Delivery Options

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 RANK sort field โ€” sort results by relevance score

Read more about the overhauled search in the companion post:

โ†’ Improved Full-Text Search

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.

Decorative illustration: on a gift-card style panel labeled Gift cards and Transaction API, a small card with a magnetic stripe moves into a payment flow area labeled Payment flow.

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:

  1. Sync webhooks are no longer pre-fired before async webhook events. Webhooks like ORDER_CALCULATE_TAXES and ORDER_FILTER_SHIPPING_METHODS now only fire when their data is actually needed.
  2. 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:

GraphQL API Changes

  • Attribute fields name, slug, and type are now non-nullable in the schema
  • New NonNegativeInt scalar โ€” Minute, Hour, and Day scalars now reject negative values at the GraphQL layer
  • AppInstallInput now requires appName and manifestUrl in the schema (matching existing validation)
  • Federation _entities representation 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 useLegacyUpdateWebhookEmission shop 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_scope when refresh tokens are enabled (Google requires access_type=offline instead of the offline_access scope)
  • JWT expiration enforced โ€” the JWT_EXPIRE setting that allowed disabling token expiration has been removed

Apps and extensions

  • App extensions simplified โ€” legacy options, mount, and target fields removed in favor of settings, mountName, and targetName; validation moved to Dashboard
  • Apps can install without tokenTargetUrl in 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

  • hasVariants on ProductType โ€” a legacy artifact from the Simple/Configurable product distinction
  • Export mutations (exportProducts, exportGiftCards, exportVoucherCodes) โ€” use the GraphQL API directly
  • Checkout.shippingMethod and Checkout.deliveryMethod โ€” use Checkout.delivery instead

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.

    Get more useful guides, tech insights, and free learning materials by subscribing to our list.
    All human-written!

    By registering you agree to our Privacy Policy.
    The form is protected by reCAPTCHA - Privacy Policy and Terms of Service.