Query `order.fulfillmentOrders` to retrieve the fulfillment order ID and its current assigned location; verify the fulfillment order status is OPEN before attempting to move it
Call `fulfillmentOrderMove(id: $fulfillmentOrderId, newLocationId: $locationId)` to reassign the fulfillment order to a different location; the mutation returns the moved fulfillment order and any remaining unfulfilled quantity at the original location
Confirm the fulfillment order's `assignedLocation` reflects the new location before creating the fulfillment
Call `fulfillmentCreateV2(fulfillment: { lineItemsByFulfillmentOrder: [{ fulfillmentOrderId: $id, fulfillmentOrderLineItems: [{ id: $lineId, quantity: 1 }] }], trackingInfo: { number: "1Z...", company: "UPS", url: "https://..." }, notifyCustomer: true })` to create the fulfillment and mark the items as shipped
Read the returned `fulfillment.id` and `fulfillment.status` (should be `SUCCESS`) and store this for order tracking
Subscribe to the `fulfillments/create` webhook to receive fulfillment events asynchronously rather than polling the order
Known gotchas
fulfillmentCreateV2 is deprecated in newer API versions in favor of `fulfillmentCreate` — check the API version you are targeting; in 2025-04+ prefer fulfillmentCreate with the same input shape
fulfillmentOrderMove can result in a split: the original fulfillment order may have a MOVED status while a new fulfillment order is created at the destination — your code must handle both objects
Moving a fulfillment order that has a fulfillment hold (status HOLD) will fail — you must release the hold with fulfillmentOrderReleaseHold before moving
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp