Fulfillment Manager API
Quotes and sales orders: take an order, hold stock for it, pick, pack and ship it, take payment, invoice and refund.
Event-sourced fulfillment (dispatch) service. Owns the sales-order pipeline — draft? → order → allocate → pick → pack → ship → invoice, with a refund path back out — whose shape is configured per organization and snapshotted onto each order, so combining steps (pick+pack for a merchant with no warehouse, ship+invoice for one who invoices on despatch) is configuration rather than a different code path. For tracked SKUs the pick names exactly which serials/lot left the shelf, validated against the registry fold (purchasing receipts, minus what is picked or already dispatched, plus what came back on a refund). Ship authorisation is the cost of sales trigger for accounting. Quantity movements — reserve at allocation, dispatch at ship, return at refund — are commanded through the inventory service, the platform's source of truth for stock levels.
- Base URL
https://fulfillment.getmanifold.io- Auth
- A bearer token on every call. See the quickstart.
- OpenAPI
- fulfillment-manager.openapi.json
workflow
The organization's configurable order pipeline.
- GET
/workflowThe organization's order pipeline - PUT
/workflowReplace the organization's pipeline; an omitted field takes its default
lineProperties
The names an order line's personalisation may carry, and what each means.
- GET
/line-item-propertiesThe organization's line item properties - PUT
/line-item-propertiesReplace the organization's line item properties - GET
/line-item-properties/applicableWhich live definitions apply to each of these SKUs
numbering
How orders, shipments, invoices, payments and refunds are numbered.
orders
The order pipeline: create, confirm, allocate, ship in parcels, invoice, refund.
- GET
/ordersList fulfillment orders from the current read model - POST
/ordersCreate (place) a sales order for a customer, or a draft quote with stage: "draft-quote" - GET
/orders/countHow many orders GET /orders would page through for the same personId / companyId - GET
/orders/talliesHow an order list's tabs count - GET
/orders/defaultsWhat a new order or quote of yours takes when it names nothing - GET
/orders/customer-summaryA customer's lifetime value - GET
/orders/attentionWhat in the order book needs a person today — the home dashboard's fulfilment summary - GET
/orders/boardThe warehouse floor as the operations board shows it - GET
/shipments/queueA pick-pack station's queue - GET
/shipments/dispatchThe orders a station's dispatch tab reads - GET
/orders/{orderId}Fetch one sales order or quote by its ord_ id - GET
/orders/{orderId}/marginsAn order's or quote's margin - POST
/orders/marginsThe margins of an order still being typed - GET
/backordersA page of the organization's backorder queue - POST
/orders/{orderId}/quoteIssue a draft quote to the customer - POST
/orders/{orderId}/reopenTake an issued quote back to draft to revise it - POST
/orders/{orderId}/placePlace a quote — a draft or an issued one — as an order - POST
/orders/{orderId}/channel-placementPlace a channel's quote as the order the channel made of it - POST
/orders/{orderId}/margin-approvalsAsk a sales manager to approve issuing or placing a quote whose lines are below their… - POST
/orders/{orderId}/margin-approvals/{approvalId}/decideApprove or decline a rep's request to sell below the minimum margin - POST
/orders/{orderId}/linksThe signed link a customer opens one of the order's documents by - POST
/orders/{orderId}/links/{linkId}/revokeRevoke a customer link - PUT
/orders/{orderId}/lines/{lineId}/priceChange one line's unit price while the quote is a draft - POST
/orders/{orderId}/cancelWithdraw an order - POST
/orders/{orderId}/allocateRun allocation again for an order waiting on stock - POST
/orders/{orderId}/lines/{lineId}/allocationMove a line's held stock to another site - POST
/orders/{orderId}/shipmentsOpen a parcel over some of the order's allocated quantity - POST
/orders/{orderId}/shipments/{shipmentId}/pickRecord what the operator physically took for this parcel - POST
/orders/{orderId}/shipments/{shipmentId}/packClose the parcel for despatch, optionally with the cartons it went in - POST
/orders/{orderId}/shipments/{shipmentId}/shipShip a parcel: the point its stock leaves the shelf and its cost becomes the cost of the… - POST
/orders/{orderId}/invoicesRaise a sales invoice - POST
/orders/{orderId}/paymentsRecord money received against the order - POST
/orders/{orderId}/collectionsAsk the sales channel an order came from to take the order's money through the channel's… - POST
/orders/{orderId}/collections/{collectionId}/answerThe app providing the order's channel answers a collection it was asked for - POST
/orders/{orderId}/collections/{collectionId}/resolveA person settles a collection that needs checking - POST
/orders/{orderId}/costsJournal an additional cost on the order by hand - POST
/orders/{orderId}/costs/{costId}/reverseReverse a cost on the order - PUT
/orders/{orderId}/payment-termsChange whether this order may ship before it is paid - PUT
/orders/{orderId}/sales-repRe-attribute an order or a quote: set its sales rep, or null for none - PUT
/orders/{orderId}/customer-poSet, change or clear the buyer's PO number on an order or quote - POST
/orders/{orderId}/editsEdit an order in place - POST
/orders/{orderId}/notesLeave a note on the order's activity stream - POST
/orders/{orderId}/transcriptsKeep a voice conversation's transcript on the order or quote it built - POST
/orders/{orderId}/transcripts/{sessionId}/linkA five-minute link to one of the order's call transcripts - POST
/orders/{orderId}/refundsRefund money and, for lines marked restock, walk the stock movements backwards
shelf
The batch/serial/expiry registry's shelf view.
writeOffs
Stock write-offs: the damaged/expired/lost exit path.
shipping
Carrier accounts and the consignments booked with them: labels, tracking, manifests, and the boxes parcels are packed in.
- GET
/carrier-accountsThe carrier accounts the organization books labels with - PUT
/carrier-accounts/{carrierAccountId}A shipping app connects the account it books with - POST
/carrier-accounts/{carrierAccountId}/disconnectIts app lets a carrier account go - GET
/carrier-accounts/{carrierAccountId}/consignmentsOne account's consignments for the app that keeps it - GET
/carrier-accounts/{carrierAccountId}/consignments/{consignmentId}Everything the account's app books one consignment by - POST
/carrier-accounts/{carrierAccountId}/consignments/{consignmentId}/answerThe app answers a requested consignment - POST
/carrier-accounts/{carrierAccountId}/consignments/{consignmentId}/trackingThe app reports where a booked parcel has got to - POST
/carrier-accounts/{carrierAccountId}/consignments/{consignmentId}/labelThe account's app stores the label it booked - POST
/orders/{orderId}/consignments/{consignmentId}/labelA link to print a consignment's label from - POST
/orders/{orderId}/shipments/{shipmentId}/consignmentsPut a packed parcel to a carrier account to book - POST
/orders/{orderId}/consignments/{consignmentId}/voidCancel a consignment - POST
/orders/{orderId}/consignments/{consignmentId}/paymentRecord what was paid to the carrier for a booked parcel - GET
/carrier-accounts/{carrierAccountId}/manifestsOne carrier account's manifests - POST
/carrier-accounts/{carrierAccountId}/manifestsHand over the day's parcels - POST
/carrier-accounts/{carrierAccountId}/manifests/{manifestId}/answerThe account's app answers a manifest - POST
/carrier-accounts/{carrierAccountId}/manifests/{manifestId}/documentThe account's app stores the carrier's manifest document for a manifest it lodged - POST
/carrier-accounts/{carrierAccountId}/manifests/{manifestId}/document-linkA link to open or print a manifest's carrier document from, signed for fifteen minutes - GET
/boxesThe organization's box catalogue - PUT
/boxes/{boxId}Add a box to the catalogue - POST
/boxes/{boxId}/archiveArchive a box: nothing more is packed into it - GET
/orders/{orderId}/shipments/{shipmentId}/packingThe cartons a parcel would go out in
rates
Live rates: what a parcel would cost with each of the organization's carrier accounts.
- POST
/ratesLive rates from every carrier account with a quoteUrl, each coded <car_>:<service> - GET
/channels/{channelId}/rate-rulesHow a sales channel's checkout shows the carriers' rates - PUT
/channels/{channelId}/rate-rulesReplace a sales channel's checkout rate rules, whole - POST
/channels/{channelId}/ratesWhat a cart would cost to send
history
History: orders from before Manifold, kept for the record, mirrored while their source still works them.
- GET
/historical-ordersA page of the organization's historical orders - GET
/historical-orders/{orderId}One historical order as last recorded - PUT
/historical-orders/{orderId}Record an order from before Manifold as history - POST
/historical-orders/{orderId}/refundsRefund a historical order after go live - POST
/historical-orders/{orderId}/adoptionSay an open mirrored order became a live order when the organization went live
payouts
Payouts: what payment providers sent the merchant, settling the orders' payments.
- POST
/payoutsRecord a payment provider's payout as the provider reports it now - GET
/payoutsA page of the organization's payouts - GET
/payouts/reconciliationHow each payment provider's money stands - GET
/payouts/{payoutId}One payout as last reported
tenders
Store credit and gift cards: balances customers hold, spent and given back by an order's payments and refunds.
- GET
/creditA customer's store credit - POST
/creditGive a person or a company store credit by hand - POST
/credit/{creditId}/reverseTake back credit given by hand - GET
/gift-cardsA page of the organization's gift cards - POST
/gift-cardsIssue a gift card by hand - GET
/gift-cards/{giftCardId}One gift card by id: its last four - POST
/gift-cards/{giftCardId}/disableStop a gift card — lost - POST
/gift-cards/{giftCardId}/enableLet a disabled gift card be used again, with its balance as it stood - POST
/gift-cards/checkWhat a gift card code is good for
customer
What a organization's customer reaches through a signed link: one document, and the quote's answer.
- GET
/customer/{tenantId}/{token}The one document a customer link opens - POST
/customer/{tenantId}/{token}/viewedRecord that the customer opened the link - POST
/customer/{tenantId}/{token}/acceptThe customer accepts the quote the link opens - POST
/customer/{tenantId}/{token}/declineThe customer declines the quote the link opens
printing
Label printing: the printers at each site, and print jobs taken and reported by the site's print agent.
- GET
/printersThe organization's printers - PUT
/printers/{printerId}Add a printer to a site - POST
/printers/{printerId}/removeRemove a printer: nothing more is sent to it and it is the default for nothing - POST
/print-jobsPrint a document at a site - GET
/print-jobsThe newest print jobs - GET
/print-jobs/{jobId}One print job as it stands: queued, sent, printed or failed with the reason - GET
/print-agent/jobsThe calling print agent's open jobs - POST
/print-jobs/{jobId}/claimTake a job to print it - POST
/print-jobs/{jobId}/outcomeSay how a job went: printed
events
The fulfillment append-only event log.