Flow · 10 steps
Pack parcels into your boxes
List the boxes each location packs with, and let Manifold choose the boxes for a parcel.
Manifold packs a parcel's units, by each SKU's size and weight, into the fewest boxes, then the smallest. The pack screen fills them in, the packer can change them, and a carrier booking uses them when the packer said nothing. Boxes are not stock.
Services involved
A filled dot is a read; a ring is a call that changes something.
- Fulfillment Manager:
https://fulfillment.getmanifold.io - Inventory Manager:
https://inventory.getmanifold.io
Every call carries Authorization: Bearer $MANIFOLD_TOKEN unless its step says otherwise
(getting a token). Run a flow in your sandbox, not your live
organization: see Before you start.
1 Pack by hand
Pick and pack are manual here, so the parcel waits at the bench between them — which is where the packer looks at the suggested cartons before closing it.
PUT /workflow Fulfillment Manager
{
"pick": "manual",
"pack": "manual",
"ship": "manual"
}What the answer holds: the operation's example.
Records fulfillment.workflow-configured.
2 A measured SKU
The packer can only pack what it can measure: the SKU's packed size in millimetres and its weight in grams, as inventory holds them. A SKU without them is listed unmeasured and rides along adding nothing.
POST /items Inventory Manager
{
"sku": "MUG-STONE",
"name": "Stoneware mug",
"quantity": 24,
"weightGrams": 450,
"packedSize": {
"lengthMm": 120,
"widthMm": 100,
"heightMm": 110
}
}Answers 201. What the answer holds: the operation's example.
Records inventory.item-created.
3 Add a box
A carton the warehouse keeps: the room inside it, what it weighs empty and what it may weigh full. all sites pack with it; a listed set narrows it to some. The id is the client's, so saving again is a retry.
PUT /boxes/box_01a15867-874e-7e7f-8a9b-0c1d2e3f4a5b Fulfillment Manager
{
"name": "Mailer box",
"inner": {
"lengthMm": 260,
"widthMm": 210,
"heightMm": 120
},
"tareGrams": 180,
"maxWeightGrams": 10000,
"packaging": "carton",
"sites": {
"_tag": "all"
}
}What the answer holds: the operation's example.
Records fulfillment.box-saved.
4 Save it again
Idempotent by content: the box as it already stands is answered as it is, with no second fact.
PUT /boxes/box_01a15867-874e-7e7f-8a9b-0c1d2e3f4a5b Fulfillment Manager
{
"name": "Mailer box",
"inner": {
"lengthMm": 260,
"widthMm": 210,
"heightMm": 120
},
"tareGrams": 180,
"maxWeightGrams": 10000,
"packaging": "carton",
"sites": {
"_tag": "all"
}
}What the answer holds: the operation's example.
Records nothing.
5 The catalogue
Every box the organization packs with, archived ones too — what Settings › Shipping › Boxes lists.
GET /boxes Fulfillment Manager
What the answer holds: the operation's example.
6 Take an order
Four mugs. Allocation opens the parcel at the site the stock is held at, in the same commit.
POST /orders Fulfillment Manager
{
"reference": "WEB-20417",
"lines": [
{
"sku": "MUG-STONE",
"quantity": 4,
"unitPriceCents": 1800
}
],
"customer": {
"personId": "psn_01a15890-1b2c-7d3e-8f4a-5b6c7d8e9f0a"
}
}Answers 201. What the answer holds: the operation's example.
From your answer, later steps send id as {orderId}, lines[0].id as {lineId} and shipments[0].id as {shipmentId}.
Records fulfillment.order-created, fulfillment.stock-allocated, fulfillment.shipment-created.
7 Pick it
The four mugs come off the shelf; the parcel now waits at the bench to be packed.
POST /orders/{orderId}/shipments/{shipmentId}/pick Fulfillment Manager
{
"lines": [
{
"lineId": "{lineId}",
"quantity": 4
}
]
}What the answer holds: the operation's example.
Records fulfillment.shipment-picked.
8 Ask what it packs into
The parcel's units packed into the boxes its site stocks: four mugs fit one mailer box, which weighs its tare plus the mugs. Nothing is written — the packer is a calculation the pack screen pre-fills from.
GET /orders/{orderId}/shipments/{shipmentId}/packing Fulfillment Manager
What the answer holds: the operation's example.
9 Pack it in that box
The packer accepts the suggestion (or changes it — a carton is only what they say it is). The cartons are kept on the parcel, each naming its box, and are what a carrier booking is made with.
POST /orders/{orderId}/shipments/{shipmentId}/pack Fulfillment Manager
{
"cartons": [
{
"packaging": "carton",
"boxId": "box_01a15867-874e-7e7f-8a9b-0c1d2e3f4a5b",
"weightGrams": 1980,
"size": {
"lengthMm": 260,
"widthMm": 210,
"heightMm": 120
}
}
]
}What the answer holds: the operation's example.
Records fulfillment.shipment-packed.
10 The parcel, packed
Its cartons as the packer recorded them. A consignment booked for it carries these; a parcel packed with none recorded is booked with the packer's suggestion instead.
GET /orders/{orderId} Fulfillment Manager
What the answer holds: the operation's example.
What a recorded fact is: Facts and the journal. Why a repeated step changes nothing: Idempotency and retries.