Applies to: Orders API
Learn how to create, update, cancel, and split an order fulfillment.
A seller might add fulfillment information to an order when it's created or updated. They can use Square products or your Orders API-integrated application to manage their fulfillments.
Did you know?
If you want to track the progress of order fulfillments that are managed in a Square product, you should subscribe to Orders webhooks for notification of fulfillment events triggered outside of your application.
The Orders API stores fulfillment information in the Order.fulfillments field (an array of Fulfillment objects). Each Fulfillment includes the following:
uid- A Square-assigned unique identifier.type- The type of fulfillment.state- Initially, the fulfillment state isPROPOSED.- Fulfillment details - Depending on the
type, fulfillment details are stored in pickup_details, shipment_details, delivery_details, or in_store_details.
The Orders API supports fulfillments of these types:
DELIVERY(Beta)IN_STORE(Beta)PICKUPSHIPMENT(Beta)
- One fulfillment limit - Developers can add only one fulfillment to an order using the Orders API, either during or after creation.
- No fulfillment splitting - All items for an order created with the Orders API must be fulfilled at the same location.
- Limited delivery fulfillment support - Any order you create with the DELIVERY fulfillment type is not available to a seller and not shown in the Square Point of Sale unless you have a formal partnership agreement with Square. Please reach out to your Square Partner Manager to request Beta access. To become an app partner, submit a partnership request.
- Limited in-store fulfillment support - The
IN_STOREfulfillment type is available as a restricted (closed) Beta. If your application isn't enrolled in the Beta, requests that include anIN_STOREfulfillment return an error. Reach out to your Square Partner Manager to request Beta access. To become an app partner, submit a partnership request. - Only paid orders are visible - Orders with fulfillments appear on Square products (such as the Square Dashboard and Point of Sale application) only after they're paid for. Sellers can then manage fulfillments for these orders using these Square products.
- Immutable fields - Most fulfillment fields are immutable based on the fulfillment
state. Editable fields include:state(if the order is being managed through a developer's application).delivery_detailsfields, such as thedeliver_atordropoff_notesfield.in_store_detailsfields, such as thenotefield.pickup_detailsfields, such as thepickup_atornotefield.recipientfield, such asaddressorphone_number.shipment_detailsfields, such astracking_numberortracking_url.
A seller can create orders using your application or through Square products like Square Online. Orders retrieved by your application may have multiple fulfillments, which track the fulfillment of order line items across different seller locations.
For information about how a seller can create a multiple-fulfillment order using Square, see Manage cross location orders with Square for Retail.
Note
If your application retrieves a DELIVERY fulfillment order, it cannot access fulfillment delivery_details unless you are a Square partner developer and have signed up for the closed DELIVERY Beta. For more information, see DELIVERY type fulfillment.
If your application lets sellers see the state of any order fulfillments in their Square account, then it should handle cases where the Order.fulfillments array contains multiple items. While your application can only create single-fulfillment orders, it has access to fulfillment orders created by Square applications.
The following Order fragment shows a SHIPMENT Fulfillment:
{ "order": { "id": "uuVIIBP9Nl8L7xq6MJQayNuo8LdZY", "location_id": "S8GWD5R9QB376", "line_items": [ … ], "fulfillments": [ { "type": "SHIPMENT", "shipment_details": { "recipient": { "display_name": "John Doe" } } } ] } }
The recipient.display_name is the only shipment_details field required when a fulfillment is created. Other shipment_details fields are optional: carrier, shipping_note, shipping_type, tracking_number, and tracking_url.
As a SHIPMENT fulfillment order moves through stages, the fulfillment state is updated and corresponding timestamps are set:
in_progress_at- state changes toRESERVEDpackaged_at- state changes toPREPAREDshipped_at- state changes toCOMPLETEDcanceled_at- state changes toCANCELEDfailed_at- state changes toFAILED
This Order fragment shows a PICKUP Fulfillment scheduled for delivery ASAP but with a 30 minute prep time. Note the pickup_at time is 30 minutes after the order is created:
{ "order": { "id": "sfADX2Xqb8F4uZaFuAp3xlShefbZY", "location_id": "S8GWD5R9QB376", "line_items": [ … ], "fulfillments": [ { "type": "PICKUP", "state": "PROPOSED", "uid": "pickup1", "pickup_details": { "schedule_type": "ASAP", "prep_time_duration": "PT30M15S", "recipient": { "customer_id": "{{customer_id}}" } } } ], } }
The pickup_at and recipient.display_name fields are the only pickup_details fields required when creating a fulfillment. The following apply for the other pickup_details fields:
- The
schedule_typevalue determines the following:- If set to
SCHEDULED,pickup_atis required. - If set to
ASAP,prep_time_durationorpickup_atis required.
- If set to
- These fields can only be set while the order fulfillment
stateisPROPOSED:expires_at,auto_complete_duration,prep_time_duration, andschedule_type.
A scheduled order does not move to the 'Active' tab in Order Manager (and show up on a KDS or print from kitchen printers) until pickup time minus prep time. Although prep_time_duration is not required for the SCHEDULED type, Square recommends that your application sets the value. If a prep time is not provided, a SCHEDULED order becomes active immediately — behaving the same as an ASAP order — rather than waiting until the scheduled pickup time.
If the schedule_type is ASAP and the prep_time_duration is set then Square sets the pickup_at time to now plus prep_time_duration. If your application sets pickup_at for an ASAP pickup, prep_time_duration is ignored even if you've set that value too.
As a PICKUP fulfillment order moves through stages, the fulfillment state is updated and corresponding timestamps are set:
accepted_at- The state changes toRESERVEDready_at- The state changes toPREPAREDpick_up_at- The state changes toCOMPLETED.canceled_at- The state changes toCANCELEDrejected_at- The state changes toFAILED
This is a restricted (closed) Beta. You need to be a Square partner developer and have signed up for the closed DELIVERY Beta. Please reach out to your Square Partner Manager to request Beta access. To become an app partner, submit a partnership request.
Important
Requests to create a DELIVERY fulfillment order succeed with a 200 response even if you don't have a partnership agreement and are enrolled in the delivery beta program. However, the delivery order you create cannot be accessed by a seller and does not appear in the Square Order Manager.
This Order fragment shows a DELIVERY fulfillment:
{ "order":{ "id":"MgVVrx8GhOy4K7LO7LtYwgM3RUaZY", "location_id":"7WQ0KXC8ZSD90", "line_items":[ { } ], "fulfillments":[ { "uid":"uYJmomsp8OjA2iY8PZR2IC", "type":"DELIVERY", "state":"PROPOSED", "delivery_details":{ "recipient":{ "display_name":"John Doe", "phone_number":"2065129261", "address":{ "address_line_1":"111 Maple", "locality":"Seattle" } }, "deliver_at":"2022-05-25T20:59:33.123Z" } } ] "state":"OPEN", "version":1, } }
Note the following about delivery_details:
The following information is required when creating a delivery fulfillment:
recipientdetails - Thedisplay_name,address, andphone_numberare required if there's no third-party managing delivery (managed_deliveryis set tofalse).schedule_type- It can be set toSCHEDULED(default) orASAP.deliver_at- If