The REST Admin API is a legacy API as of October 1, 2024. All apps and integrations should be built with the GraphQL Admin API. For details and migration steps, visit our migration guide.
The FulfillmentOrder resource represents either an item or a group of items in an order that are to be fulfilled from the same location. There can be more than one fulfillment order for an order at a given location.
Fulfillment orders represent the work which is intended to be done in relation to an order. When the fulfillment of some or all line items has started, a Fulfillment is created by a merchant or third party to represent the ongoing or completed work of fulfillment. See below for more details on creating fulfillments.
Note
Shopify creates fulfillment orders automatically when an order is created. It is not possible to manually create fulfillment orders.
See below for more details on the lifecycle of a fulfillment order.
Retrieving fulfillment orders
All fulfillment orders related to a given order can be retrieved with the Get fulfillment orders by order ID endpoint. API access scopes govern which fulfillments orders are returned to clients. An API client will only receive a subset of the fulfillment orders which belong to an order if they don't have the necessary access scopes to view all of the fulfillment orders.
Fulfillment service apps can retrieve the fulfillment orders which have been assigned to their locations with the
AssignedFulfillmentOrder resource.
The assignment_status
parameter in the
Retrieve a list of assigned fulfillment orders
query controls whether all assigned fulfillment orders
should be returned or only those where a merchant has sent a fulfilment request
and it has yet to be responded to.
The API client must be granted the read_assigned_fulfillment_orders
access scope to access
the assigned fulfillment orders.
A specific fulfillment order can be retrieved with the Get fulfillment order endpoint.
The lifecycle of a fulfillment order
Fulfillment Order Creation
After an order is created, a background worker performs the order routing process which determines which locations will be responsible for fulfilling the purchased items. Once the order routing process is complete, one or more fulfillment orders will be created and assigned to these locations. It is not possible to manually create fulfillment orders.
Once a fulfillment order has been created, it will have one of two different lifecycles depending on the type of location which the fulfillment order is assigned to.
The lifecycle of a fulfillment order at a merchant managed location
Fulfillment orders are completed by creating fulfillments. Fulfillments represents the work done.
For digital products a merchant or an order management app would create a fulfilment once the digital asset has been provisioned. For example, in the case of a digital gift card, a merchant would to do this once the gift card has been activated - before the email being shipped.
On the other hand, for a traditional shipped order, a merchant or an order management app would create a fulfillment after picking and packing the items relating to a fulfillment order, but before the courier has collected the goods.
Learn about managing fulfillment orders as an order management app.
The lifecycle of a fulfillment order at a location which is managed by a fulfillment service
For fulfillment orders which are assigned to a location that is managed by a fulfillment service, a merchant or an Order Management App can send a fulfillment request to the fulfillment service which operates the location to request that they fulfill the associated items. A fulfillment service has the option to accept or reject this fulfillment request.
Once the fulfillment service has accepted the request, the request can no longer be cancelled by the merchant or order management app and instead a cancellation request must be submitted to the fulfillment service.
Once a fulfillment service accepts a fulfillment request, then after they are ready to pack items and send them for delivery, they create fulfillments with the Create a fulfillment for one or many fulfillment orders endpoint. They can provide tracking information right away or create fulfillments without it and then update tracking information for fulfillments.
Learn about managing fulfillment orders as a fulfillment service.
API access scopes
Fulfillment orders are governed by the following API access scopes:
-
The
read_merchant_managed_fulfillment_orders
andwrite_merchant_managed_fulfillment_orders
access scopes grant access to fulfillment orders assigned to merchant-managed locations. -
The
read_assigned_fulfillment_orders
andwrite_assigned_fulfillment_orders
access scopes are intended for fulfillment services. These scopes grant access to fulfillment orders assigned to locations that are being managed by fulfillment services. -
The
read_third_party_fulfillment_orders
andwrite_third_party_fulfillment_orders
access scopes grant access to fulfillment orders assigned to locations managed by other fulfillment services.
Fulfillment service app access scopes
Usually, fulfillment services have the write_assigned_fulfillment_orders
access scope
and don't have the *_third_party_fulfillment_orders
or *_merchant_managed_fulfillment_orders
access scopes.
The app will only have access to the fulfillment orders assigned to their location
(or multiple locations if the app registers multiple fulfillment services on the shop).
The app will not have access to fulfillment orders assigned to merchant-managed locations
or locations owned by other fulfillment service apps.
Order management app access scopes
Order management apps will usually request write_merchant_managed_fulfillment_orders
and
write_third_party_fulfillment_orders
access scopes. This will allow them to manage all fulfillment orders
on behalf of a merchant.
If an app combines the functions of an order management app and a fulfillment service, then the app should request all access scopes to manage all assigned and all unassigned fulfillment orders.
Notifications about fulfillment orders
Fulfillment services are required to register a self-hosted callback URL which has a number of uses. One of these uses is that this callback URL will be notified whenever a merchant submits a fulfillment or cancellation request.
Both merchants and apps can subscribe to fulfillment order webhooks to be notified whenever fulfillment order related domain events occur.
The type of method used to transfer a product or service to a customer.
scheduled
fulfillment order is automatically transitioned to open
.
For example, the fulfill_at
date for a subscription order might be the 1st of each month, a pre-order fulfill_at
date would be nil
, and a standard order fulfill_at
date would be the order creation date.
For more information about fulfillment statuses, refer to the status property.Represents the fulfillment holds applied on the fulfillment order.
The international duties relevant to the fulfillment order.
assigned_fulfillment_orders
access scope.
OPEN
and changes the status of the fulfillment order to ON_HOLD
.merchant_managed_fulfillment_orders
, third_party_fulfillment_orders
.
Moving a fulfillment order will fail in the following circumstances:
- The fulfillment order is closed.
- The destination location has never stocked the requested inventory item.
- The API client doesn't have the correct permissions.
Line items which have already been fulfilled can't be re-assigned and will always remain assigned to the original location.
You can't change the assigned location while a fulfillment order has a
request_status
of submitted
, accepted
,
cancellation_requested
, or cancellation_rejected
.
These request statuses mean that a fulfillment order is awaiting action by a fulfillment service
and can't be re-assigned without first having the fulfillment service accept a cancellation request.
This behavior is intended to prevent items from being fulfilled by multiple locations or fulfillment services.
How re-assigning line items affects fulfillment orders
If the original fulfillment order doesn't have any line items which are fully or partially fulfilled, the original fulfillment order will be moved to the new location. However if this isn't the case, the moved fulfillment order will differ from the original one.
Response
-
original_fulfillment_order
- The final state of the original fulfillment order.
As a result of the move operation, the original fulfillment order might be moved to the new location or remain in the original location. The original fulfillment order might have the same status or be closed. -
moved_fulfillment_order
- The fulfillment order which now contains the moved line items and is assigned to the destination location.
First scenario: All line items belonging to the original fulfillment order are re-assigned.
In this case, this will be the original fulfillment order.
Second scenario: A subset of the line items belonging to the original fulfillment order are re-assigned.
If the new location is already assigned to fulfill line items on the order, then this will be an existing active fulfillment order. Otherwise, this will be a new fulfillment order with the moved line items assigned. -
remaining_fulfillment_order
- this field is deprecated.
merchant_managed_fulfillment_orders
, third_party_fulfillment_orders
.
fulfill_at
datetime.OPEN
or SCHEDULED
merchant_managed_fulfillment_orders
, third_party_fulfillment_orders
.
fulfill_at
field on a scheduled fulfillment order.
The fulfillment order will be marked as ready for fulfillment at this date and time.
Response
-
fulfillment_order
- a fulfillment order with the rescheduled line items.
Fulfillment orders may be merged if they have the samefulfill_at
datetime. If the fulfillment order is merged then the resulting fulfillment order will be returned. Otherwise the original fulfillment order will be returned with an updatedfulfill_at
datetime.
merchant_managed_fulfillment_orders
, third_party_fulfillment_orders
, marketplace_fulfillment_orders
, orders
.
Retrieves a list of fulfillment orders for a specific order.
API access scopes govern which fulfillments orders are returned. An API client will only receive a subset of the fulfillment orders which belong to an order if they don't have the necessary access scopes to view all of the fulfillment orders. In the case that an API client does not have the access scopes necessary to view any of the fulfillment orders belongs to an order, an empty array will be returned.