Medusa v2 Fulfillment
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com fulfillment modulefor fulfillment data model and service methods - Web-search
site:docs.medusajs.com fulfillment providerfor the provider abstraction interface - Web-search
site:docs.medusajs.com shipping optionfor shipping option configuration - Fetch
https://docs.medusajs.com/resources/references/fulfillmentand review theIFulfillmentModuleServiceinterface - Web-search
medusajs v2 AbstractFulfillmentProviderService 2026for latest provider interface
Fulfillment Module Architecture
Entity Relationships
| Entity | Contains | Key Fields | |--------|----------|------------| | FulfillmentSet | ServiceZones, Fulfillments | name, type (shipping, pick-up) | | ServiceZone | GeoZones, ShippingOptions | Geographic area with shipping config | | ShippingOption | Rules | name, price_type, provider_id, type | | GeoZone | — | country, province, city, zip | | Fulfillment | Items, Labels | tracking_numbers, packed/shipped/delivered_at | | StockLocation | Link to FulfillmentSet | Warehouse connection |
Module Links
Fulfillment Module ──link──> Stock Location Module (warehouse)
Fulfillment Module ──link──> Cart Module (shipping methods)
Fulfillment Module ──link──> Order Module (order fulfillments)
Fetch live docs for exact link definitions and how fulfillment sets connect to stock locations.
Fulfillment Provider Interface
All providers extend AbstractFulfillmentProviderService:
// Skeleton: custom fulfillment provider
// Fetch live docs for AbstractFulfillmentProviderService
class MyShippingProvider extends AbstractFulfillmentProviderService {
// Implement: validateFulfillmentData, calculatePrice,
// createFulfillment, cancelFulfillment
// Fetch live docs for exact method signatures
}
Required Provider Methods
| Method | Purpose | Returns | |--------|---------|---------| | validateFulfillmentData | Validate shipping data at checkout | Validated data | | validateOption | Validate shipping option config | Boolean | | canCalculate | Whether provider supports dynamic pricing | Boolean | | calculatePrice | Calculate shipping cost dynamically | Price amount | | createFulfillment | Create fulfillment (generate label) | Fulfillment data | | cancelFulfillment | Cancel an existing fulfillment | void | | getFulfillmentDocuments | Get shipping labels/documents | Document URLs | | createReturnFulfillment | Create return shipment | Return data |
Fetch live docs for exact method signatures, input types, and expected return shapes.
Shipping Options
Shipping Option Type
Shipping options reference a ShippingOptionType entity with a label and code. Types are configurable — common patterns include "express", "standard", "economy". The is_return rule on a shipping option determines if it applies to returns.
Fetch live docs for how ShippingOptionType entities are created and linked.
Price Types
| Price Type | Description | |------------|-------------| | flat_rate | Fixed price defined in shipping option | | calculated | Dynamic price calculated by provider at checkout |
Shipping Option Rules
| Rule Attribute | Example | Description | |----------------|---------|-------------| | enabled_in_store | true | Visible to customers | | is_return | false | Available for returns | | custom attributes | varies | Provider-specific criteria |
Fetch live docs for the full list of rule attributes and how to create custom rules.
Fulfillment Sets and Geo Zones
| Concept | Description | |---------|-------------| | Fulfillment Set | Named group of service zones linked to a stock location | | Service Zone | Geographic area with associated shipping options | | Geo Zone | Specific geographic boundary | | Stock Location Link | Connects fulfillment set to a warehouse |
Geo Zone Types
| Type | Scope | Example | |------|-------|---------| | country | Entire country | country_code: "US" | | province | State/province | province_code: "CA" | | city | City | city: "San Francisco" | | zip | Postal code range | postal_expression: "941*" |
Shipping Profiles
| Concept | Description | |---------|-------------| | Shipping Profile | Links product types to shipping options | | Default Profile | Applies to products without explicit assignment | | Custom Profiles | For oversized, fragile, or special-handling items |
Multi-Warehouse Support
| Entity | Key Fields | |--------|------------| | StockLocation | name, address, FulfillmentSet (link) | | InventoryItem | stocked_quantity, reserved_quantity, incoming_quantity |
Each InventoryItem tracks stock per variant per location.
Fulfillment Routing
| Strategy | Description | |----------|-------------| | Nearest warehouse | Ship from closest location to customer | | Inventory priority | Ship from location with highest stock | | Manual selection | Admin selects fulfillment location |
Fetch live docs for stock location module service methods and inventory allocation strategies.
Fulfillment Lifecycle
Created ──> Packed ──> Shipped ──> Delivered
└─> Return (if needed)
Key Workflows
| Workflow | Purpose | |----------|---------| | createFulfillmentWorkflow | Create fulfillment for order items | | cancelFulfillmentWorkflow | Cancel a pending fulfillment | | createShipmentWorkflow | Add tracking and mark shipped | | markFulfillmentAsDeliveredWorkflow | Mark as delivered |
Key Service Methods
| Operation | Method | |-----------|--------| | Create fulfillment set | fulfillmentModuleService.createFulfillmentSets() | | Create service zone | fulfillmentModuleService.createServiceZones() | | Create shipping option | fulfillmentModuleService.createShippingOptions() | | List shipping options | fulfillmentModuleService.listShippingOptions() | | Create fulfillment | fulfillmentModuleService.createFulfillment() |
Best Practices
Provider Implementation
- Always extend
AbstractFulfillmentProviderService— do not implement from scratch - Implement
calculatePriceaccurately — it directly affects checkout totals - Handle rate API failures gracefully — return cached or fallback rates
- Support both outbound and return fulfillment creation
Shipping Configuration
- Use geo zones to precisely control shipping option availability by location
- Configure shipping profiles for products with different fulfillment requirements
- Set up both
flat_rateandcalculatedoptions — flat rate for simplicity, calculated for accuracy
Multi-Warehouse
- Link each fulfillment set to exactly one stock location
- Configure service zones per warehouse based on geographic proximity
- Support split shipments — one order may be fulfilled from multiple locations
Tracking
- Always set tracking numbers when creating shipments
- Subscribe to fulfillment events for customer notification triggers
- Store shipping labels in the fulfillment
datafield
Fetch the Medusa v2 fulfillment module documentation and provider interface references for exact method signatures, shipping option configuration, and multi-warehouse patterns before implementing.