Shopify POS allows ship-to-customer orders to complete even when products have zero inventory at the constrained fulfillment location, resulting in negative stock levels. This occurs despite having “Continue selling when out of stock” disabled and contradicts the behavior of online checkout which correctly blocks these orders.
Steps to reproduce
Setup
- Create a product (P3) with inventory tracking enabled
- Create a location (L3) with 0 units of P3 in stock
- Deploy a fulfillment constraints function that restricts P3 to only ship from L3
- Ensure “Continue selling when out of stock” is UNCHECKED for P3
Test in online checkout
- Add P3 to cart
- Proceed to checkout
- Result: Checkout is blocked with error “Your order cannot be shipped to the selected address”
- Customer must empty cart to continue
Test in POS
- Open POS app at any location
- Add P3 to cart
- Tap “Ship to customer”
- Enter shipping address
- Result: Shows L3 shipping rate with no errors
- Complete the order successfully
- Check inventory: L3 now shows -1 units of P3
Expected behavior
POS should respect inventory constraints and block ship-to-customer orders when the constrained location has zero stock, matching online checkout behavior.
Actual behavior
POS ignores inventory validation entirely for ship-to-customer orders:
- Shows shipping rates for out-of-stock locations
- Allows order completion without warnings
- Creates negative inventory levels
- Ignores “Continue selling when out of stock” setting
Impact
This inconsistency creates serious operational issues:
- Overselling: Associates unknowingly sell products that cannot be fulfilled
- Inventory discrepancies: Negative stock levels break inventory accuracy
- Customer disappointment: Orders placed in-store may need cancellation later
Technical details
Fulfillment constraints function input/output
Input: {
"cart": {
"retailLocation": {
"id": "gid://shopify/Location/108056412508",
"name": "L1"
},
"deliverableLines": [{
"id": "gid://shopify/DeliverableCartLine/0",
"merchandise": {
"__typename": "ProductVariant",
"id": "gid://shopify/ProductVariant/55171727098204",
"product": { "title": "P3" }
}
}]
}
}
Output: {
"operations": [{
"deliverableLinesMustFulfillFromAdd": {
"deliverableLineIds": ["gid://shopify/DeliverableCartLine/0"],
"locationIds": ["gid://shopify/Location/108056478044"] // L3 with 0 stock
}
}]
}
Comparison table
| Scenario | Online checkout | POS ship-to-customer |
|---|---|---|
| Product constrained to location with 0 stock | Blocks with error | Allows order |
| Shows shipping rates | No | Yes |
| Creates negative inventory | No | Yes |
| Order routing function runs | No | No |
Additional observations
When the same constraint scenario includes products with valid inventory alongside the out-of-stock item, online checkout offers “remove unavailable items” while POS simply processes everything without warning.
Suggested fix
POS ship-to-customer should validate inventory at constrained locations before showing shipping rates, matching online checkout behavior. If validation fails, POS should:
- Show clear error to associate explaining which products cannot be shipped
- Prevent order completion until invalid items are removed
- Respect the “Continue selling when out of stock” setting