Skip to main content
Fulfillment constraints are business rules that block locations from fulfilling specific orders. When a constraint applies, the affected locations are completely removed from consideration during checkout.
Constraints are “hard” rules. If the only location with available stock is blocked by a constraint, the customer will see an error and no shipping options will appear at checkout.

Constraints vs order routing

Charlie offers two ways to control where orders are fulfilled from:
Fulfillment constraintsOrder routing rules
EffectBlocks locations entirelyDeprioritizes locations
When no matchCheckout blocked, no shipping optionsFalls back to next priority
Use caseHard business requirementsOptimization preferences
Use constraints when a location must not fulfill certain orders under any circumstances. Use order routing when you prefer certain locations but can accept alternatives.

How constraints work

When a customer reaches checkout, Charlie evaluates each constraint rule against the cart. For every rule that matches:
  1. The specified locations are removed from the eligible fulfillment pool
  2. Shopify then checks inventory only at remaining locations
  3. If no remaining location has stock, checkout is blocked
When checkout is blocked, customers see an error message indicating which items cannot be shipped: Shopify checkout error when no shipping options are available

Constraint types

Charlie supports three types of constraints, each triggered by different conditions:

Filtering locations

Each constraint rule specifies which locations to block using one of these filters:
FilterDescriptionExample
Specific locationsBlock or allow only named locations”Block fulfillment from Paris Store”
Location tagsBlock or allow locations by tag”Block all locations tagged no-fragile
Location typeBlock or allow by type (Store or Warehouse)“Block all Stores, allow only Warehouses”
You can choose to either:
  • Exclude matching locations (block them)
  • Include only matching locations (block everything else)
Before using constraints, make sure your locations are properly configured with the right types and tags.

Use cases

Bulky items from small stores

A fashion retailer sells oversized dresses that require large packaging. Their smaller retail locations don’t have the storage space or packaging materials to ship these items. Setup:
  • Constraint type: Product rule
  • Condition: Cart contains products from the “Bulky Dresses” collection
  • Filter: Exclude locations tagged small-store
Result:
  • Regular items → All locations eligible
  • Bulky dresses → Only large stores and warehouses can fulfill
  • If only a small store has a bulky dress in stock → Checkout blocked

High-value orders from warehouse only

A luxury brand wants to ensure that high-value orders (over €500) are only fulfilled from their central warehouse where they have dedicated packaging and insurance processes. Setup:
  • Constraint type: Cart rule
  • Condition: Total amount > €500
  • Filter: Include only locations tagged central-warehouse
Result:
  • Orders under €500 → All locations eligible
  • Orders over €500 → Only the central warehouse can fulfill
  • If central warehouse is out of stock on a €600 order → Checkout blocked

B2B orders from dedicated locations

A wholesaler needs to ensure B2B customers are only served from locations with proper invoicing and bulk packaging capabilities. Setup:
  • Constraint type: Customer rule
  • Condition: Customer is B2B
  • Filter: Include only locations tagged b2b-enabled
Result:
  • Regular customers → All locations eligible
  • B2B customers → Only B2B-enabled locations can fulfill
  • If no B2B location has stock → Checkout blocked