Medusa v2 Fulfillment
Before writing code
Fetch live docs:
- Web-search
site:docs.medusajs.com fulfillment module for fulfillment data model and service methods
- Web-search
site:docs.medusajs.com fulfillment provider for the provider abstraction interface
- Web-search
site:docs.medusajs.com shipping option for shipping option configuration
- Fetch
https://docs.medusajs.com/resources/references/fulfillment and review the IFulfillmentModuleService interface
- Web-search
medusajs v2 AbstractFulfillmentProviderService 2026 for 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
calculatePrice accurately — 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_rate and calculated options — 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
data field
Fetch the Medusa v2 fulfillment module documentation and provider interface references for exact method signatures, shipping option configuration, and multi-warehouse patterns before implementing.