Skip to content
Saleor
Esc
↑↓navigate↵open⌘Jpreview
On this page

Backorders

Use this pattern when customers can order more units than you can dispatch immediately. Separate sellable availability (how much the customer can order) from fulfillment lead time (when the ordered units can ship).

This commonly occurs when a merchant holds inventory and sources additional units from a supplier. It can also apply to another distribution center with a longer fulfillment lead time.

Choose the Inventory and Fulfillment Model

Use these terms to describe the business requirements:

  • On-hand inventory is inventory physically held at a location. Some units may already be allocated or reserved, so on-hand quantity is not the same as availability for a new order.
  • Sellable availability is the quantity offered for purchase after inventory commitments and applicable limits. It can span multiple inventory sources.
  • Backorders are orders accepted for items that cannot currently be fulfilled and must wait for replenishment. A merchant can have both immediately fulfillable and backordered quantities of the same item in one order.
  • Fulfillment lead time is the time needed to prepare and dispatch an item. A customer delivery estimate must also account for transit time.
  • Dropshipping means a supplier ships directly to the customer. Supplier inventory does not imply dropshipping: goods may first be received at the merchant’s warehouse.

This recipe implements a bounded supply model: represent known, sourceable inventory in separate Saleor warehouses and prioritize the source that can dispatch first. For example, 20 units are available for immediate dispatch and another 200 can be sourced with a two-week dispatch lead time.

Saleor treats both quantities as sellable stock. The supplier warehouse is a representation of supply in this integration, not a native backorder status or a replenishment schedule. This pattern does not cover accepting orders against unknown future supply or calculating date-based availability. Your integration owns sourcing commitments and delivery estimates.

Represent Inventory Sources as Warehouses

For the merchant-and-supplier example, create a merchant warehouse and a supplier warehouse. The supplier warehouse represents the quantity you can source, even if you do not physically hold it yet.

For each product variant:

  • Keep trackInventory enabled.
  • Set 20 units in the merchant warehouse and 200 units in the supplier warehouse.
  • Assign both warehouses to the sales channel.

With no existing allocations or reservations, this makes 220 units available across the two warehouses. Checkout limits can further restrict the quantity a customer can purchase. Disabling inventory tracking would remove stock validation and allocation for both sources.

See warehouse configuration for channel assignment. If your shop uses legacy stock availability, both warehouses must also have the shipping-zone links needed for the customer’s destination.

Prioritize the Immediately Available Source

Set the channel’s allocation strategy to PRIORITIZE_SORTING_ORDER and place the merchant warehouse before the supplier warehouse. You can set the strategy through channelUpdate, using stockSettings.allocationStrategy, and change the warehouse order through channelReorderWarehouses.

Saleor allocates merchant stock first and uses supplier stock for the remainder. With 20 units available at the merchant warehouse, completing a checkout for 25 units allocates 20 to the merchant warehouse and 5 to the supplier warehouse.

Avoid PRIORITIZE_HIGH_STOCK for this pattern: it can prioritize the supplier warehouse because it has more stock. See stock allocation for details. This pattern assumes shipping; local-stock pickup is limited to the selected collection point’s stock.

Query Availability by Warehouse

quantityAvailable provides combined purchase availability. To distinguish immediately available units from supplier units, read the variant’s stock entries from your storefront backend:

query VariantStock($id: ID!, $channel: String!) {
  productVariant(id: $id, channel: $channel) {
    id
    quantityAvailable
    stocks {
      warehouse {
        id
        name
      }
      quantity
      quantityAllocated
      quantityReserved
    }
  }
}

Pass the product variant ID and the storefront’s channel slug as variables. If you use legacy stock availability, pass the customer’s destination using the address argument on both quantityAvailable and stocks. Otherwise, availability is determined by the warehouse-channel links.

The stocks field and the stock quantity fields require MANAGE_PRODUCTS or MANAGE_ORDERS. Make this request with an app token on your backend, keep the token on the server, and return only the availability breakdown needed by the storefront.

Identify each source by its warehouse ID. For a general availability display, calculate the available quantity in each warehouse as:

max(0, quantity - quantityAllocated - quantityReserved)

quantity includes units already allocated to orders, so displaying it directly can overstate what is available. quantityReserved accounts for active checkout reservations. This calculation is a snapshot, not a delivery guarantee: reservations can include the current customer’s checkout, and availability can change before checkout completion. Let Saleor validate the final purchase quantity.

Fulfillment

Show the quantity ready to ship and the estimated dispatch time for the remainder on product pages, in the cart, and at checkout:

20 can ship immediately. The remaining 5 are expected to ship in approximately two weeks.

Offer split shipments using partial fulfillments, or show the later estimate if the entire order ships together. Create fulfillments when goods are dispatched.

Your integration handles supplier purchasing and lead-time updates. Synchronize stock with the quantity you can source, accounting for existing commitments. If goods pass through your warehouse, update stock and allocations to match the fulfillment location without counting the same units twice.

Last updated on October 29, 2026

Was this page helpful?