Who can see it
- Permission
fulfillment.read(View fulfillment). - The order’s location in your Location access.
Where
- In Deliveries, open To close or Delivery problems and select the order number.
- On the order’s page, Follow the delivery (shown to members with any custody permission). See Create and track orders.
- After confirming a reception, the link under the confirmation message.
- On the pick screen of an order that is no longer being prepared, the Tracking order #1042 link.
- Direct path:
console.muveya.com/fulfillment/:orderId.
What the screen shows
The screen is titled Tracking order #1042, with Back to deliveries to return to the queue.Facts and next step
Below the facts, the screen offers the next step when it is yours to take:
For closing, see Close the order.
Boxes
Boxes lists every box assigned to the order. On a phone, each box is shown as a labeled card.
When a box was separated at pick time, the list shows the new container, not the original box. If no box is assigned, the screen says “No boxes are assigned to this order.”
History
History lists what happened, one entry per event, each with the person and the date and time in your browser’s format. People are named by their team name; the signed-in person reads as You, actions muveya took by itself as Muveya (automatic), and people who left the team as Former team member. Stock movements come first, oldest first. Each reads “movement · box code · quantity change”, for example “Dispatched · BX-000123 · -10”. Movements that do not change the quantity on hand omit the number, for example “Picked · BX-000123”.
Custody records follow the movements:
If nothing has happened yet, the section says “Nothing has happened yet.”
Movements made on the original box of a separation show Box no longer in the ledger in place of its code, because the Boxes list only names the new container. Open the original box from Boxes to see its own history.
Use it for audits and disputes
A typical dispute review:
1
Confirm the chain of people
Check that the person who picked, the person who dispatched and the person who confirmed the delivery are the ones you expect on the origin side, and that the reception was made by the destination side.
2
Compare delivered and received
Every box in the delivery must appear once in the reception, as accepted or disputed.
3
Follow each disputed box
Find its Returned movement and its current Box state. If it came back in quarantine, decide what to do with it from its box page.
4
Check the lot if needed
If the problem may affect a whole lot, continue in Lot recall.
What the screen does not show
- The Evidence of the problem text typed at reception. It is stored but not shown on the console or returned by the API today.
- The per-box notes of a dispute and the quarantine choice. The API returns both.
- The carrier reference typed at dispatch.
GET /v1/fulfillmentsreturns it ascarrierRef. - The audit log. There is no audit log screen on the console today.
- An export. To keep custody histories outside muveya, read them from the API.
Read it from the API
The operationGET /v1/fulfillments/{orderId} returns the same custody history for integrations and reporting.
- Authentication: an API key (
mvy_test_...) in theAuthorization: Bearerheader. API keys are not created from the console today; see Authentication. - Scope:
fulfillment:read. See Scopes. - Reach: the key’s whole dental clinic account. There is no location filter on a key.
- Read-only: custody steps (pick, dispatch, delivery, reception, close) cannot be performed through the API or MCP.
Response
string
required
The order id.
string
required
The custody status:
allocating, allocated, picking, dispatched, delivered, exception, received, partially_fulfilled or closed.object[]
required
The order’s stock movements, oldest first. Each has
movementId, type, boxId, catalogItemId, quantityDelta, actorId, occurredAt and recordedAt, and when they apply reservedDelta, fromWarehouseId, toWarehouseId, reasonCode, secondActorId, idempotencyKey and correlationId.object
Present once the delivery was confirmed:
actorUserId, deliveredAt, boxIds and, for a delivery problem, exception with reason and optional note.object
Present once the reception was confirmed:
actorUserId, receivedAt, acceptedBoxIds and disputed, a list of boxId, reason, quarantine and optional note.object
Present once the order was closed:
actorUserId and closedAt.Example response
- It returns ids, not names or box codes. Read a box’s code and state with
GET /v1/inventory/boxes/{boxId}(scopeinventory:read), and a supply withGET /v1/catalog/items/{itemId}(scopecatalog:read). actorIdandactorUserIdare member ids. Actions muveya took by itself carrysystem:fulfillment.- The status
allocatingcan appear briefly while the reservation runs; the console shows it as Reserving stock. - It answers
404when the order does not exist, belongs to another dental clinic account, or has no custody record yet (an approved order whose stock is not reserved). - Other answers:
401for a missing or invalid key,403when the key lacksfulfillment:read,429when the key exceeds its rate limit. See Errors and Rate limits.
GET /v1/fulfillments with the optional status filter, limit (1 to 200, default 50) and cursor. Each item has orderId, status, createdAt, updatedAt and, when they apply, sourceWarehouseId, dispatchedAt and carrierRef. See Pagination.
The MCP tool
fulfillment.get_pick_list needs the fulfillment.pick permission, which the current read-only OAuth scope set does not grant, so it is refused on the /mcp endpoint today. See MCP tools.Related pages
Deliveries overview
Lifecycle, permissions and parties.
Delivery and receipt
How the delivery, reception and closure records are made.
Boxes
The full history of a single box.
API scopes
Which scope each read needs.