> ## Documentation Index
> Fetch the complete documentation index at: https://www.adorabl.info/llms.txt
> Use this file to discover all available pages before exploring further.

# Sales orders & fulfillment

> Manage sales orders and warehouse fulfillment.

Sales orders capture customer demand; fulfillments move inventory through pick, pack, and ship. adorabl links orders to [invoices](https://www.adorabl.info/accounts-receivable/invoices-and-adjustments.md), [payments](https://www.adorabl.info/accounts-receivable/incoming-payments.md), and inventory relief at ship time. You can also [compare rates and buy a shipping label](https://www.adorabl.info/commerce/shipping-labels.md) from the order or fulfillment.

## Prerequisites

Before creating sales orders:

* [Customers](https://www.adorabl.info/accounts-receivable/customers.md) exist for B2B accounts (B2C may use a pooled customer).
* [Items](https://www.adorabl.info/products/items.md) with stock in a [warehouse](https://www.adorabl.info/products/warehouses.md).
* Default **shipping warehouse** configured under Products setup.
* Optional: [Sales channel](https://www.adorabl.info/commerce/sales-channels.md) tagged for reporting and fulfillment defaults.
* Optional: packaging **boxes** and **scales** configured under Commerce setup for the pack workspace.

| Prerequisite | Where |
| - | - |
| Customer | Accounts Receivable → Customers |
| Items & stock | Inventory → Items, Stock on hand |
| Shipping warehouse | Warehouses → default shipping flag |
| Channel defaults | Settings → Commerce → Sales channels |

## Sales order lifecycle

| Status | Meaning |
| - | - |
| **Draft** | Editable; no inventory commitment |
| **Open** | Submitted and confirmed; eligible for fulfillment |
| **Fulfilled** | All lines fully shipped |
| **Invoiced** | AR invoice posted from order |
| **Closed** | Complete with no further action |
| **Cancelled** | Order voided |

## Create and submit a sales order

**1. Open Sales Orders**

1. In the sidebar, open **Commerce**.
2. Click **Sales Orders**.

The list shows order #, customer, channel, status, totals, and dates. Use **Workflow summary** in the header to open the channel-based order → ship → invoice guide.

**2. Create a new order**

Click **New order**.

Set header fields:

| Field | Notes |
| - | - |
| **Customer** | Required |
| **Order date** | Defaults to today |
| **Warehouse** | Ships from; defaults to org shipping warehouse |
| **Ship to** | Customer delivery address saved with the order and reused in pack, ship, and label workflows |
| **Channel** | Shopify Web, Shopify POS, Amazon FBA, B2B Portal, etc. |
| **Channel order number** | Read-only. The label follows the channel (**Shopify - Web order number**). When the order came from a connected channel and adorabl has enough of a link, the number opens that order in the channel. |
| **External ID** | Marketplace order reference |
| **Fulfillment method** | Read-only on saved orders — derived from channel and customer defaults at submit time. The method decides whether the fulfillment buys a shipping label. |

The header also shows the customer's terms and contact details. A collections note appears when dunning is paused. On closed orders, header fields display as read-only. Payments recorded against the order are listed on the **Payments** tab; click one to open the incoming payment.

The **Details** card header summarizes the applied workflow — the next step and a row of step dots. Expand it to see every step for this order's fulfillment method.

**3. Add lines**

On the line grid, pick **items** from the catalog, enter **qty ordered**, and confirm **unit price**. Choosing an item fills the description with that item's name, including when you change the item on a line that already has a description. adorabl also shows:

* **On hand** for the selected ship-from warehouse. A warning appears when ordered quantity is greater than available stock.
* **Unit cost** from the item's standard cost.
* **Margin**, calculated as `(unit price − unit cost) ÷ unit price`.
* **Supply**, where eligible lines can use **Purchase to order**.

Non-stock, purchase-to-order, and drop-ship lines do not show an on-hand quantity.

Line numbers are fixed once the order is first saved. You can drag lines into a different order only on an unsaved draft; after that, new lines append after the last existing number and removed lines leave a gap, so audit history always refers to the same line.

**4. Save and submit**

* **Save as Draft** — keeps editing without confirming. Drafts show as **Draft order** in lists and the header; the order number is assigned when you confirm.
* **Save** — moves status to **Open**, assigns the order number, and enables fulfillment creation.

Confirmed orders appear in fulfillment workflows and dashboard order KPIs. External fulfillment methods create a waiting fulfillment automatically. Customer pickup is prepared for pickup without a manual pick step.

On an **Open** order the primary header action becomes **Fulfill**, which starts the first fulfillment. Once a fulfillment is already in pick or pack, the same button reads **Fulfill remaining** and opens that fulfillment — a pick-state order lands on the picking list, and a pack-state order lands on packing. The **Next:** hint in the Details header links to the same place.

> [!TIP]
>
> Expand the workflow summary in the **Details** card header on the order to see how this order's channel defaults map to pick, pack, ship, and invoicing steps.

## Fulfillment workflow (pick → pack → ship)

Fulfillments track warehouse work against a sales order. Each fulfillment carries the order's fulfillment method from channel defaults, and the method decides what the fulfillment needs: only **In-house** fulfillments weigh a package and buy a shipping label. 3PL, customer pickup, marketplace, and supplier drop-ship fulfillments skip both.

| State | Meaning |
| - | - |
| **Created** | Fulfillment document exists |
| **Pick** | Picking in progress — capture picked quantities and bin allocations |
| **Pack** | Packing in progress — assign lines to boxes with weight and dimensions, then buy the label |
| **Fulfilled** | Shipment or pickup recorded; inventory and COGS post when the method uses your stock |
| **Cancelled** | Fulfillment voided |

### Fulfillment detail layout

The **Details** card header carries the workflow strip — the method badge, progress dots, a **Next:** hint for the current stage, and a **Workflow** expander that lists every stage with units completed. The totals strip includes **Postage**: the label charge, **No label purchased**, or a caption such as **Quote — not bought** when a rate was quoted and not purchased. While a fulfillment is in **Picking**, **Packing**, or **Ready for pickup**, the Details card starts collapsed with a one-line summary (warehouse · sales order · units) so the pick list or pack workspace sits at the top of the screen. Click the card head to expand it.

### Orders list

**Commerce → Sales Orders** lists each order with **Channel** and **ext. order number** beside the adorabl order number. **Channel** is the source, such as **Shopify - Web** or **Amazon FBA**. **ext. order number** is the order number in that channel. **Workflow summary** in the header opens the path each channel takes from order to invoice.

### Fulfillments list

**Commerce → Fulfillments** lists every fulfillment document — one row per fulfillment, so an order shipped in two parts shows two rows. Each row shows the fulfillment number, its sales order, customer, warehouse, method, status, requested / picked / packed quantities, fulfilled date, and the invoice created from it.

Click a tile at the top to scope the list:

| Tile | Shows |
| - | - |
| **Ready to fulfill** | Fulfillments created but not yet started |
| **Picking** | In the pick step |
| **Packing** | In the pack step |
| **Shipped today** | Fulfilled today |
| **Invoice pending – error** | Shipped fulfillments whose automatic invoice failed — see [Invoicing from fulfillment](#invoicing-from-fulfillment) |

Search matches fulfillment number, sales order number, customer, warehouse, method, status, and tracking number.

**1. Start fulfillment**

Open a submitted sales order and click **Fulfill**, or **Fulfill remaining** when a fulfillment is already in progress.

* **In-house** orders create a fulfillment that begins in Pick. **Fulfill remaining** opens the open fulfillment instead of raising an error that nothing is left to fulfill.
* **Customer Pickup** orders show **Record pickup** and skip manual pick and pack.
* **3PL**, **Marketplace fulfillment**, and **Supplier drop ship** orders already have a waiting fulfillment created during submit.

The fulfillment header keeps **Complete picking** primary during pick. Pack slip, gift note, shipment confirmation, **Cancel**, and **Void** sit in the overflow menu, and **Auto-print** stays available as a toggle.

**2. Work the pick queue**

1. Open **Commerce → Fulfillments** and click the **Picking** tile (or open **Pick batches** for batched picking).
2. Click a row to open fulfillment detail.
3. Enter **qty picked** per line, record short-pick reasons when needed, and allocate quantities to bin locations. When the warehouse uses bin locations, picking cannot complete until every picked unit has a bin.
4. Save pick progress and click **Complete picking** to advance to **Pack**.

**3. Pack and buy the label**

1. Open **Commerce → Pack**, or open the fulfillment from the **Packing** tile.
2. Scan a tote or shipment barcode, or select a ready fulfillment from the queue.
3. Check the **Ship to** address in the Details card. It is editable during pack and verified as you type; a change saves to the order and re-rates the shipment.
4. Assign each package to a **box** from your configured box list, and enter weight manually or read it from a configured **scale**. Add gift notes when needed.
5. **Print pack slip** for warehouse paperwork and save the package.
6. In the **Shipping** panel below the pack workspace, pick a carrier rate and click **Buy label**. Buying the label is how an in-house fulfillment ships: adorabl purchases postage, records tracking, relieves inventory, posts COGS, and accrues the label cost in one step. See [Shipping labels](https://www.adorabl.info/commerce/shipping-labels.md).

Before spending postage, adorabl checks that the shipment can post — every picked unit has a bin when the warehouse uses bins, and every item has a standard or average cost. If something is missing, the panel names it and no label is bought.

Rating and label purchase use the order's assigned warehouse as the ship-from address. If that warehouse's address is incomplete, adorabl stops and names the warehouse rather than shipping from somewhere else.

**4. Record other fulfillment methods**

Fulfillments that do not buy a label finish from their own action instead:

* **Customer Pickup** — click **Record customer pickup**.
* **3PL** — click **Complete fulfillment** when the 3PL confirms shipment. The **Commerce → Ship** queue lists what is waiting.
* **Marketplace fulfillment** — click **Record marketplace fulfillment** when the marketplace confirms.
* **Supplier drop ship** — enter the supplier's tracking and click **Record supplier fulfillment**.

**5. Invoice**

adorabl creates the AR invoice for you when a fulfillment ships — see [Invoicing from fulfillment](#invoicing-from-fulfillment). You can still create an invoice by hand from the order's **Related invoices** section, consolidate several shipments, or invoice service-only orders with **Create from Sales Orders** in [Invoices & adjustments](https://www.adorabl.info/accounts-receivable/invoices-and-adjustments.md).

## Invoicing from fulfillment

An AR invoice is created automatically when a fulfillment ships or is confirmed — whether that is an in-house label purchase, a 3PL confirmation, a customer pickup, or a marketplace (for example, Amazon FBA) confirmation.

* **One invoice per shipped fulfillment.** An order that ships in two fulfillments gets two invoices. The order stays **Open** until every ordered quantity has shipped and been invoiced.
* **Short picks invoice what shipped.** If a fulfillment was short-picked, the invoice covers the posted quantity and the order stays open for the remainder.
* Lines and quantities come from the shipment; prices, tax, discounts, and terms come from the sales order. The invoice date is the shipment confirmation date.
* **Order payments apply automatically.** When the order already carries a successful payment — a checkout deposit, a prepayment recorded on confirm, or any incoming payment tied to the order — adorabl applies the unapplied balance to the new invoice, up to the invoice total. Across several shipments, the remaining cash flows to each later invoice until it is used up. This no longer depends on the channel's **Prepayment expected** flag.
* The fulfillment shows its invoice, and the invoice links back to the fulfillment and order.

Orders with stock lines always wait for a posted fulfillment before any invoice is created, for every fulfillment method. Customer pickup (for example, Shopify POS) and marketplace orders (for example, Amazon FBA) record payment at confirm and invoice when the pickup or marketplace fulfillment is recorded.

**Service-only orders** — no stock lines — are not invoiced automatically and do not need a fulfillment. Invoice them when you are ready with **Create from Sales Orders** on a new invoice. See [Invoices & adjustments](https://www.adorabl.info/accounts-receivable/invoices-and-adjustments.md).

If the invoice cannot be created — for example, an item is missing a revenue account — the fulfillment shows **Invoice pending – error** with the reason, appears under that tile on the Fulfillments list, and adorabl retries automatically once you fix the cause.

## Fulfillment methods

| Method | What you do |
| - | - |
| **In-house** | Pick, pack, weigh the package, and **Buy label** from your warehouse. The label purchase is the ship step. |
| **Customer Pickup** | Open the prepared fulfillment and record pickup. adorabl allocates available bin stock automatically and relieves the store (or order) warehouse. Storefront pickup orders — Shopify POS, for example — are recorded as picked up on import. |
| **3PL** | Open the waiting fulfillment and complete it when the 3PL confirms shipment. |
| **Marketplace fulfillment** | Record fulfillment when the marketplace confirms it. Inventory and COGS relieve from the channel's **Marketplace** warehouse (for example, `AMZ-FBA`). See [Warehouses](https://www.adorabl.info/products/warehouses.md). |
| **Supplier drop ship** | Create the linked supplier PO, enter supplier tracking on the waiting fulfillment, then click **Record supplier fulfillment**. Goods do not enter your warehouse, so no inventory or COGS posts. |

Only **In-house** fulfillments require a weighed package and buy postage. The other methods never offer label purchase. There is no separate label or carrier policy to configure — the method decides.

## Purchase to order

Use **Purchase to order** when you need to buy a stock item for a specific sales order before fulfilling it from your warehouse.

**1. Mark the sales-order line**

On the sales-order line, set **Supply** to **Purchase to order**. Submit the order.

**2. Create the purchase order**

Click **Create purchase order**. adorabl groups eligible lines by preferred supplier and links each PO to the sales order.

**3. Receive the goods**

Open the linked PO and receive it into the sales order's warehouse. After the PO is fully received, click **Fulfill sales order**.

**4. Pick, pack, and fulfill**

adorabl opens the standard in-house fulfillment. Complete pick, pack, and fulfillment using the newly received stock.

## Correct a submitted order

Open orders stay editable. When you save a material change — a quantity, an item, a line added or removed, a warehouse or ship-to change — adorabl asks why and records an **order action** with a full before-and-after snapshot.

**1. Edit the open order**

Change the lines or header fields directly on the order.

**2. Pick a reason**

A bar docks at the bottom of the screen next to **Save changes**. It names the detected change — for example, `Added line 2 (TR-JK-L) qty 3` — and offers reason chips for that kind of change:

| Change | Reason chips |
| - | - |
| Quantity reduced | **Out of stock**, **Damaged**, **Customer reduced qty**, **Supplier delay**, **Partial ship approved** |
| Item substituted | **Equivalent SKU**, **Discontinued**, **Customer requested**, **Size/color swap** |
| Line added | **Customer add-on**, **Missed at entry** |
| Line removed | **Customer cancelled line**, **Could not source** |
| Header change | **Ship-to requested**, **Warehouse reassignment**, **Channel correction** |
| Several changes at once | **Customer requested change**, **Correction** |

Every set also includes **Other**, which asks for a short note. One tap on a chip is enough to save; a note is optional otherwise.

**3. Save changes**

Click **Save changes** in the bar (or the header **Save** icon). adorabl saves the order and the action together. Pressing **Save** without a reason scrolls the bar into view and highlights the first chip.

Recorded actions appear on the order's **Order actions** tab — what changed, who changed it, the quoted reason, and expandable previous → new values by line. The **Activity** tab keeps the field-level log. See [Audit log and record history](https://www.adorabl.info/admin-and-settings/audit-log.md).

Draft orders and notes-only or channel-order-number edits save without a reason.

### Protected work

For a partially fulfilled order, adorabl keeps the order open and protects committed work:

* You can change or remove fully uncommitted lines.
* You can reduce a partially fulfilled line only as far as its fulfilled quantity.
* Item, description, price, and supply method are locked on picked or fulfilled lines.
* Lines assigned to an active fulfillment stay locked until that fulfillment is cancelled.
* Replace a committed item by cancelling its remaining quantity and adding a new line.

Use **Reopen to draft** when an open order has no committed fulfillment activity. Unstarted waiting fulfillments are cancelled automatically. Posted invoices, posted fulfillments, and payment mismatches can block correction.

## Copy an order

Use **Copy order** to start a new draft from an existing sales order. adorabl copies the order details and lines but does not copy fulfillment activity or the channel order number. You can optionally create a draft payment for the new order.

## Example: Trail Ridge Outfitters

Order **SO-8820** for Aspen Sports Co.:

| Line | SKU | Qty | Warehouse |
| - | - | - | - |
| 1 | TR-WS-M | 12 | Denver DC |
| 2 | TR-JK-L | 6 | Denver DC |

Workflow:

1. **Save** → status **Open**, channel **B2B Portal**, method **In-house**
2. Create fulfillment **FL-5501** → pick quantities captured from bin **A-12-3**
3. Pack into **Medium carton** box, weigh it, print pack slip on March 4
4. **Buy label** → postage purchased, inventory reduced, COGS posted, label cost accrued
5. Invoice **INV-1051** created automatically from the shipped fulfillment → AR balance \$1,680.00

Dashboard **Fulfilled on-time** KPI compares ship date to order date (within 2 days = on time).

## Returns

On a **Fulfilled**, **Invoiced**, or **Closed** order, click **Create return**. The order's **Returns** tab lists each return and its **Outcome** — **Received and restocked**, **Customer kept the item**, or the choice still on a draft. See [Customer returns](https://www.adorabl.info/commerce/returns.md).

## Relationship map

Both sales orders and fulfillments expose a **Relationship map** action showing linked invoices, payments, fulfillments, returns, purchase orders, and journal entries — useful when tracing a channel order from demand through supply and cash.

## Related guides

> **[Customer returns](https://www.adorabl.info/commerce/returns.md)**
>
> Authorize a return, restock what comes back, and credit the invoice.

> **[Shipping labels](https://www.adorabl.info/commerce/shipping-labels.md)**
>
> Compare rates, buy postage, and print labels from an order.

> **[Sales channels](https://www.adorabl.info/commerce/sales-channels.md)**
>
> Configure channel fulfillment and shipping defaults.

> **[Invoices & adjustments](https://www.adorabl.info/accounts-receivable/invoices-and-adjustments.md)**
>
> Bill customers after fulfillment — including consolidated invoices.

> **[Stock on hand](https://www.adorabl.info/products/stock-on-hand.md)**
>
> Verify inventory before submitting orders.

> **[Warehouses](https://www.adorabl.info/products/warehouses.md)**
>
> Configure shipping and receiving locations.

## Troubleshooting

> **Save does not confirm the order**
>
> **Save as Draft** keeps the order in draft. The header **Save** icon confirms it. Add at least one valid line with item, quantity, and price, resolve red validation on the line grid, and select a customer.

> **Cannot create fulfillment**
>
> The order must be **Open**. Draft orders need **Save** first. External methods use the waiting fulfillment created when the order was confirmed, so open that record instead of creating another one.

> **Reopen to draft is unavailable**
>
> adorabl blocks reopen when the order has posted invoices, committed fulfillment activity, or payment totals that no longer match the order. Complete or reverse the downstream work first.

> **Customer pickup fails because stock is short**
>
> Customer pickup allocates bin stock automatically. Correct the inventory shortage before recording pickup.

> **Cannot record supplier fulfillment**
>
> Enter the supplier's tracking number on the waiting fulfillment first. Drop-ship fulfillment does not post warehouse inventory or COGS; the linked AP bill records the cost.

> **Cannot invoice the sales order yet**
>
> Complete the workflow shown in the **Details** header. Orders that ship, are picked up, or are fulfilled by a 3PL or marketplace invoice only after that fulfillment is recorded — and adorabl creates the invoice for you at that point.

> **A shipped fulfillment shows Invoice pending – error**
>
> Open the fulfillment and read the reason in the alert — usually a missing revenue account or item GL default. Fix the cause; adorabl retries the invoice automatically. Click the **Invoice pending – error** tile on the Fulfillments list to see every affected shipment.

> **Save is waiting for a reason**
>
> You changed an open order. Choose a reason chip in the bar at the bottom of the screen, then click **Save changes**. Draft orders do not ask for a reason.

> **Rates or label purchase fail with an incomplete ship-from address**
>
> The order's assigned warehouse is missing part of its address. Complete the street, city, region, postal code, and country on that [warehouse](https://www.adorabl.info/products/warehouses.md), then rate again. adorabl does not substitute a different warehouse.

> **Ship fails — insufficient stock**
>
> Check [Stock on hand](https://www.adorabl.info/products/stock-on-hand.md) for the fulfillment warehouse. The ship dialog shows stock issues with a refresh action when bin allocation or on-hand is short.

> **Order stuck in Open after shipping**
>
> Confirm all lines are fully shipped. Short-picked and partial fulfillments invoice what shipped and leave the order **Open** until the remaining quantity ships or the order is closed manually.

> **An order payment was not applied to the invoice**
>
> adorabl applies a successful order-tied payment to each shipment invoice automatically, up to the invoice total. If the payment covered less than the order, later invoices stay open for the difference. Payments recorded as standalone incoming payments without the order reference are applied by hand in [Incoming payments](https://www.adorabl.info/accounts-receivable/incoming-payments.md).

> **Pack workspace will not save**
>
> In-house fulfillments need a box and a package weight before the label can be bought. Configure boxes and scales under Settings → Commerce if the dropdowns are empty.

> **Buy label is blocked before any postage is spent**
>
> adorabl checks that the shipment can post before buying. Read the message in the Shipping panel: assign bins for every picked unit (**Review allocations**) when the warehouse uses bin locations, or add a standard or average cost to the named items. Then buy the label again.

> **I don't see a Shipping panel on this fulfillment**
>
> Only **In-house** fulfillments buy labels. 3PL, customer pickup, marketplace, and drop-ship fulfillments finish from their own action in the header. Check the fulfillment method badge in the Details header.

> **Need carrier rates or a printable label**
>
> Open the fulfillment at the **Packing** stage and use the **Shipping** panel below the pack workspace. Save a weighed package, pick a rate, and buy a label. See [Shipping labels](https://www.adorabl.info/commerce/shipping-labels.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.