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

Request · application/json
{
  "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

Request · application/json
{
  "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

Request · application/json
{
  "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

Request · application/json
{
  "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

Request · application/json
{
  "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

Request · application/json
{
  "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

Request · application/json
{
  "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.