FulfillmentService
Overview
A fulfillment provider is the shipping provider used to fulfill orders and deliver them to customers. An example of a fulfillment provider is FedEx.
By default, a Medusa Backend has a manual
fulfillment provider which has minimal implementation. It allows you to accept orders and fulfill them manually. However, you can integrate any fulfillment provider into Medusa, and your fulfillment provider can interact with third-party shipping providers.
A fulfillment provider is a service that extends the AbstractFulfillmentService
and implements its methods. So, adding a fulfillment provider is as simple as creating a service file in src/services
.
The file's name is the fulfillment provider's class name as a slug and without the word Service
. For example, if you're creating a MyFulfillmentService
class, the file name is src/services/my-fulfillment.ts
.
Identifier Property
The FulfillmentProvider
entity has 2 properties: identifier
and is_installed
. The identifier
property in the class is used when the fulfillment provider is created in the database.
The value of this property is also used to reference the fulfillment provider throughout Medusa. For example, it is used to add a fulfillment provider to a region.
Methods
calculatePrice
This method is used in different places, including:
- When the shipping options for a cart are retrieved during checkout. If a shipping option has their
price_type
set to calculated, this method is used to set the amount of the returned shipping option. - When a shipping method is created. If the shipping option associated with the method has their
price_type
set tocalculated
, this method is used to set theprice
attribute of the shipping method in the database. - When the cart's totals are calculated.
Example
An example of calculating the price based on some custom logic:
If your fulfillment provider does not provide any dynamically calculated rates you can return any static value or throw an error. For example:
Parameters
data
object of the selected shipping option.data
object that is different based on the context it's used in:
- If the price is being calculated for the list of shipping options available for a cart, it's the
data
object of the shipping option. - If the price is being calculated when the shipping method is being created, it's the data returned by the validateFulfillmentData method used during the shipping method creation.
- If the price is being calculated while calculating the cart's totals, it will be the data object of the cart's shipping method.
Either the Cart or the Order object.
Returns
Promise
Promise<number>RequiredUsed to set the price of the shipping method or option, based on the context the method is used in.
Promise
Promise<number>RequiredcanCalculate
This method is used to determine whether a shipping option is calculated dynamically or flat rate. It is called if the price_type
of the shipping option being created is set to calculated.
Example
Parameters
data
object of the shipping option being created. You can use this data to determine whether the shipping option should be calculated or not.
This is useful if the fulfillment provider you are integrating has both flat rate and dynamically priced fulfillment options.Returns
Promise
Promise<boolean>RequiredIf this method returns true
, that means that the price can be calculated dynamically and the shipping option can have the price_type
set to calculated.
The amount property of the shipping option will then be set to null. The amount will be created later when the shipping method is created on checkout using the calculatePrice method.
If the method returns false
, an error is thrown as it means the selected shipping option is invalid and it can only have the flat_rate
price type.
Promise
Promise<boolean>Requiredtrue
, that means that the price can be calculated dynamically and the shipping option can have the price_type
set to calculated.
The amount property of the shipping option will then be set to null. The amount will be created later when the shipping method is created on checkout using the calculatePrice method.
If the method returns false
, an error is thrown as it means the selected shipping option is invalid and it can only have the flat_rate
price type.cancelFulfillment
This method is called when a fulfillment is cancelled by the admin. This fulfillment can be for an order, a claim, or a swap.
Example
This is the basic implementation of the method for a fulfillment provider that doesn't interact with a third-party provider to cancel the fulfillment: