# Order Statuses

Every order and every order item carries a status derived from its quantities. Understanding how shipped and cancelled units interact helps you read the orders list correctly — especially for orders that were partially refunded or partially shipped.

## Order statuses

| Status                | Meaning                                                                                                                                   |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `Unfulfilled`         | No units have shipped yet.                                                                                                                |
| `Partially fulfilled` | Some units have shipped, but not all remaining units.                                                                                     |
| `Fulfilled`           | Every shippable item has all of its remaining (non-cancelled) units shipped.                                                              |
| `Not fulfillable`     | The order contains no shippable items, so there is nothing to ship — see [why an item is `Not Shippable`](#why-an-item-is-not-shippable). |
| `Cancelled`           | Every unit of every item was cancelled and nothing shipped.                                                                               |

### Cancelled units reduce the target

Cancelling units lowers the number of units an item needs to reach `Fulfilled` — it does not block the order from completing. An order counts as **fulfilled** when all of its *remaining* units have shipped, even if most units were cancelled along the way. An order is **cancelled** only in the strictest case: every unit of every item cancelled, and nothing ever shipped.

Cancelling never moves money either way: a manual cancellation refunds nothing, so [refund the payment](https://docs.odus.com/docs/guides/payments/refunds.md) separately if the customer is owed one.

## Order item statuses

Each item on the order detail page shows its own status, derived from its quantities:

| Item status           | Condition                                                                                                                                                 |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Not Shippable`       | The purchased product has no SKU, or its price is marked not fulfillable, so there is nothing for a warehouse to pick. It never affects the order status. |
| `Unfulfilled`         | Nothing shipped or cancelled yet.                                                                                                                         |
| `Partial`             | Some units shipped; some remain.                                                                                                                          |
| `Fulfilled`           | All units shipped; none cancelled.                                                                                                                        |
| `Cancelled`           | All units cancelled; none shipped.                                                                                                                        |
| `Partially Cancelled` | Some units shipped, the rest cancelled; nothing remains.                                                                                                  |

### Why an item is `Not Shippable`

Whether an item ships is not decided on the order — it is decided by the product and the price it was bought at, captured at the moment the order was created:

* A product with a SKU produces a shippable item, carrying that SKU and a unit count — unless the price it was bought at opts out, below.
* A product without one — a warranty, shipping protection, a service fee — produces a `Not Shippable` item. It is on the order so you can see what the customer bought, but it has no quantities, is left out of exports and 3PL submissions, and cannot be fulfilled or cancelled.
* A price marked `fulfillable: false` produces that same `Not Shippable` item even when its product does have a SKU. That is how an add-on sold under the same product as the goods is kept out of the warehouse.

An order whose items are all `Not Shippable` is therefore `Not fulfillable`: there is nothing to ship, and it never reaches `Fulfilled`.

If an item you meant to ship came out `Not Shippable`, either its product is missing a SKU or its price is marked `fulfillable: false`. Correcting either applies to every order created from then on; orders already created keep what was captured at the time. See [What the SKU decides](https://docs.odus.com/docs/guides/order-management/how-orders-are-created.md#what-the-sku-decides).

## How statuses change

* Fulfillments increase an item's shipped count.
* [Cancellations](https://docs.odus.com/docs/guides/order-management/cancelling-orders.md) — manual, or automatic after a void, full refund, or failed capture — increase its cancelled count.
* The order status is recalculated immediately after either.

## Aged out orders

`Aged out` marks an order that has still owed shipment for longer than you allow and whose payment was **captured**. It answers "what did we take money for and never ship?"

Set the threshold under **Settings > General > Order management**, in the **Age out unfulfilled orders** field. The days are counted from the moment the payment was authorized, but only orders whose payment was also **captured** are ever marked — an authorization you never captured took no money, so it stays off this list. `0` disables the marking entirely (the default, so nothing changes until you turn it on).

* It never changes the order status underneath. An order that is `Partially fulfilled` **and** aged out keeps saying which units still owe shipment — which is what you need to reconcile or refund it. The order detail page shows both, side by side.
* In the orders list it is shown **instead of** the status: once an order has aged out, that is the thing worth reading off the row. Hover the chip to see the status it stands in for.
* It never cancels anything. Money moved, so closing that loop stays a deliberate act: [cancel the items](https://docs.odus.com/docs/guides/order-management/cancelling-orders.md) or refund the payment.
* It comes back off by itself. A shipment that arrives late, a cancellation that empties the order, or simply raising the threshold all clear the marking.

## On hold orders

`On hold` marks an order your logistics provider is not shipping. It appears in four cases, and the order page says which:

* **Your logistics provider is holding the order.** It accepted the order and then could not ship it: no carrier would take the shipment as addressed — a city that does not match its postal code, an incomplete name, a street the carrier does not know. See [Held by your provider](#held-by-your-provider).
* **Your logistics provider is likely to hold the order.** The customer's details break one of its rules, so you can correct them before it sees them. See [Likely to be held by your provider](#likely-to-be-held-by-your-provider).
* **Your logistics provider refused to fund the order from your prepaid balance.** Nothing on the order needs correcting: it is sent again once the balance covers it. See [Held for your prepaid balance](#held-for-your-prepaid-balance).
* **ShipBob is holding the order.** Something stops ShipBob from shipping it — a payment method it couldn't charge, an address it can't validate, missing customs details. ShipBob ships the order once that is dealt with and it releases the hold: an address by correcting the customer here, anything else in ShipBob. See [Held by ShipBob](#held-by-shipbob).

The first three apply to **NextSmartShip** orders, and the fourth to **ShipBob** orders. In each case:

* It never changes the order status underneath. An order on hold is usually still `Unfulfilled` — nothing has shipped — but if you have shipped or cancelled part of it yourself, the order keeps that status and `On hold` is shown beside it.
* It is shown **instead of** the status — in the orders list and on the order page — and ahead of `Aged out` when an order is both, because it is the one you can act on today. Open the order to see what to correct.
* A cancelled order reads `Cancelled` instead, in the orders list and on the order page, even while your provider still holds it. Whether cancelling it here cancels it at your provider too is covered in [Orders already sent to your provider](https://docs.odus.com/docs/guides/order-management/cancelling-orders.md#orders-already-sent-to-your-provider).

### Held by your provider

The order page says why the order is held and what to correct, and the marking appears within a few minutes of the provider raising it. What to do about it is a how-to: [Resubmitting an order your provider put on hold](https://docs.odus.com/docs/guides/order-management/managing-orders.md#resubmitting-an-order-your-provider-put-on-hold).

Over the API, a held order carries the reason as `holdReasonCode`, one of a fixed set of codes, beside the provider's own words in `holdReason`. [Retrieve an order](https://docs.odus.com/docs/api/oms/order-controller-find-one) lists every code and what to correct for it.

* Ship any part of a held order yourself, or cancel it, and the order page stops offering **Resubmit**. The marking stays beside the status of a part-shipped order until the provider answers, and a cancelled order reads `Cancelled` instead.
* Correcting the customer resubmits the order for you. Within a few minutes of correcting what your provider receives for a customer — their name, phone number or shipping address — every order of theirs your provider is holding is resubmitted with the correction, as long as nothing on it has shipped or been cancelled. Six holds are left for you to resubmit, because a correction to the customer does not fix them: **Recipient tax ID required**, **Customs details missing**, **Restricted by the carrier**, **Carrier temporarily unavailable**, **No reason given** and **Held for another reason** — and so is an order [held for your prepaid balance](#held-for-your-prepaid-balance), which is sent again by itself once the balance covers it.
* It stays `On hold` after it is resubmitted, until the provider answers. The order page says it is waiting. If the provider accepts the order, the marking clears; if it holds the order again, the new reason replaces the old one and you can resubmit again.
* A correction you make while the order waits for that answer is sent for you if the provider holds the order again. If the provider accepts the order instead, it ships with the details it was sent before.
* A hold you release in the provider's own dashboard clears here too, within the hour.
* Nothing else is retried for you. A held order waits until you resubmit it or correct its customer, however long that takes — and so does one whose resubmission the provider refused.

Each hold, each resubmission and each release is recorded in the order's activity, so you can read the sequence back. A resubmission made for you is listed as **Automatic**, after the customer update that caused it.

### Likely to be held by your provider

If you have an active NextSmartShip integration, each order's customer details are checked against NextSmartShip's rules, listed in [Details NextSmartShip is likely to hold an order for](https://docs.odus.com/docs/guides/order-management/automatic-fulfillment.md#details-nextsmartship-is-likely-to-hold-an-order-for). The order page lists each detail at fault and what is wrong with it — for example, `City doesn’t match the postal code.` What to do about it is a how-to: [Correcting an order before your provider holds it](https://docs.odus.com/docs/guides/order-management/managing-orders.md#correcting-an-order-before-your-provider-holds-it).

* Details are checked when the order is created, whenever you correct the customer before the order is sent, and each time the order is sent — automatically, or when you resubmit it. Until the order is sent, the marking clears as soon as a correction fixes every detail. Once it is sent, the marking describes what your provider was sent, so it stays until you resubmit the corrected details. Adding, activating or deactivating an integration does not re-check orders already created.
* Once the order is sent, you don't have to wait for your provider to hold it: correct the customer and **Resubmit** it from the order page. Your provider accepts a correction only while it is holding the order; if it isn't yet, the order page says so, and you can resubmit once it is. A correction made before your provider holds the order is not resubmitted for you.
* The marking itself never stops or delays an order: the order is submitted when its bundling window closes, as it would be without it. A missing required detail is listed among the problems and still stops the order, as [What each provider needs from an order](https://docs.odus.com/docs/guides/order-management/automatic-fulfillment.md#what-each-provider-needs-from-an-order) describes. Once you correct the customer, the order is sent again automatically.
* It clears when the order is fulfilled or cancelled, when it goes to a provider other than NextSmartShip, and when no provider will receive it, for example because no fulfillment route matches it.

### Held for your prepaid balance

NextSmartShip bills each order from a prepaid balance, and refuses to ship an order the balance can't cover. Such an order is `On hold` with the reason **Waiting for 3PL account funds**, and nothing on it needs correcting. Top up your balance with NextSmartShip, and the order is sent again automatically once the balance covers it, usually within an hour of the top-up. If the balance covers only some of your held orders, the others stay on hold until it covers them too.

* To send the order sooner, for example right after you top up, **Resubmit** it from the order page, as you would any held order. The button is offered while NextSmartShip has the order; when NextSmartShip refused the order before creating it, there is nothing to resubmit, and the order waits for the automatic release. If your balance still can't cover it, it stays on hold.
* Correcting the customer does not resubmit it for you, since no detail of the customer fills a balance.
* Once you ship part of the order or cancel it yourself, the order page stops offering **Resubmit**. Like every hold, the marking stays beside the status of a part-shipped order, and a cancelled order reads `Cancelled` instead.
* Over the API, the order has `holdStatus` `held` and `holdReasonCode` `insufficient_funds`. Resubmit it with `POST /orders/{orderId}/resubmit` in the [Order Management API](https://docs.odus.com/docs/api/oms/odus-oms-api) while `externalOrderId` is set; while it is empty, send it again with `POST /orders/{orderId}/retry-submission` instead.

warning

Such an order used to be marked `Waiting for funds` instead, with `tplSubmissionStatus` `awaiting_funds`. That value is no longer in the API reference. If your integration reads it, read `holdStatus` `held` with `holdReasonCode` `insufficient_funds` instead: a filter on `tplSubmissionStatus` `awaiting_funds` returns no orders, without an error.

The order's activity records the hold and, once your balance covers the order, its release.

### Held by ShipBob

ShipBob holds an order when something stops it from shipping it, and releases the hold itself once that is dealt with. Such an order is `On hold` here too, and the order page says what to do. The hold appears, and clears again, usually within an hour of ShipBob holding or releasing the order.

| Why ShipBob holds the order                                                                                                       | Order page                    | `holdReasonCode`          | What to do                                                                                                                                                                              |
| --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| It couldn't charge your payment method                                                                                            | **Payment method declined**   | `insufficient_funds`      | Update your payment method in ShipBob. ShipBob ships the order once a payment goes through.                                                                                             |
| It can't validate the shipping address                                                                                            | **Invalid address**           | `address_invalid`         | Correct the customer's shipping address here. The correction is sent to ShipBob, which checks it again. **Resubmit** on the order page sends ShipBob the address the order already has. |
| Customs details are missing                                                                                                       | **Customs details missing**   | `customs_details_invalid` | Add the customs details in ShipBob, such as a product's tariff code.                                                                                                                    |
| Hazardous items can't be shipped abroad                                                                                           | **Restricted by the carrier** | `shipping_restricted`     | Ask ShipBob how to ship the order.                                                                                                                                                      |
| Anything else — a pick date not reached yet, a hold placed by hand, a packaging preference not set, an automatic processing pause | **Held for another reason**   | `other`                   | Look the order up in ShipBob to see why it is held.                                                                                                                                     |

* ShipBob still has the order, so it is never sent to ShipBob a second time, and it can't be retried. The order page offers **Resubmit** only when ShipBob can't validate the address, and resubmitting sends ShipBob the address rather than the order. Don't create the order in ShipBob again yourself either, or it ships twice.
* An order with part of it already shipped stays on hold, because ShipBob ships the rest once it releases the hold, and the order page shows its `Partially fulfilled` status beside the hold.
* Correcting the customer here is how you fix an address ShipBob can't validate. Within a few minutes, the corrected name, phone number and shipping address are sent to ShipBob for each shipment of the order it is holding, and ShipBob checks the address again. The order stays `On hold` until ShipBob releases it. The order's activity records ShipBob's answer. The correction isn't sent if you have cancelled some of the order's items here, or recorded a shipment of it yourself: ShipBob still has those items in the order it holds, and would ship them once it releases the hold. Correct the address and remove those items in ShipBob instead. If ShipBob didn't accept the address for every shipment it holds, correct the address in ShipBob. If the correction couldn't be sent, or no answer appears within a few minutes, send the address the order has with **Resubmit**, as [Sending an address to ShipBob](https://docs.odus.com/docs/guides/order-management/managing-orders.md#sending-an-address-to-shipbob) describes, or correct it in ShipBob.
* For any other hold, and for an order ShipBob isn't holding, a correction to the customer made here is not sent to ShipBob, which ships the order with the details it has. Correct them in ShipBob if they are wrong there too.
* An order ShipBob holds for more than one reason is shown with one of them. Once ShipBob releases that one, the order page shows the next.
* A hold ShipBob raises after you have fulfilled or cancelled the order here is not shown: the order owes nothing here, so it is no longer checked. A hold shown before that stays, beside the status, until ShipBob releases it.
* Over the API, the order has `holdStatus` `held`, the `holdReasonCode` in the table, and ShipBob's own description of the hold in `holdReason`, such as `Invalid Address`. An order held for your payment method has the same code as an order [held for your prepaid balance](#held-for-your-prepaid-balance); its `holdReason` says it was your payment method. For an order held for `address_invalid`, `POST /orders/{orderId}/resubmit` in the [Order Management API](https://docs.odus.com/docs/api/oms/odus-oms-api) sends ShipBob the address the order has, as **Resubmit** on the order page does. Resubmitting any other order ShipBob holds is refused.

warning

An order held for your payment method used to be marked `Waiting for funds` instead, with `holdStatus` `awaiting_funds`. That value is no longer in the API reference. If your integration reads it, read `held` with `holdReasonCode` `insufficient_funds` instead: a filter on `holdStatus` `awaiting_funds` returns no orders, without an error.

The order's activity records each hold, with ShipBob's reason, and its release.

## Shipped after cancellation

`Shipped after cancellation` marks an order whose logistics provider shipped units you had already cancelled — for example, because a refund cancelled them after the order was sent. Not every cancellation reaches your provider, or reaches it in time (see [Orders already sent to your provider](https://docs.odus.com/docs/guides/order-management/cancelling-orders.md#orders-already-sent-to-your-provider)), so the provider can still ship what it was sent. Today this is detected for orders that **NextSmartShip** and **ShipBob** ship.

* The cancelled units stay cancelled. They do not count as shipped, so the order keeps its status — usually `Cancelled` — and the order page shows the marking beside it.
* Each such shipment is recorded in the order's activity with the units it carried, the carrier and the tracking number. Use them to recover the goods, or to ask the customer to pay for them.
* In the orders list it is shown **instead of** the status, after `On hold` and ahead of `Aged out`. Hover the chip to see the status it stands in for. A cancelled or fulfilled order is not in the list's default view, so pick its status in the **Status** filter to find it.
* It stays on the order. The goods have left the warehouse, whatever you do next.

To prevent it, cancel the order at your provider while it has not shipped, whenever [it is not cancelled there for you](https://docs.odus.com/docs/guides/order-management/cancelling-orders.md#orders-already-sent-to-your-provider).

Over the API, the order carries `cancelledUnitsShippedAt`, when the first such shipment was reported, and each shipment is a `cancelled_units_shipped` entry in `GET /orders/{orderId}/history`. To list every such order, call `GET /orders` with `cancelledUnitsShippedAt[ne]=null` in the [Order Management API](https://docs.odus.com/docs/api/oms/odus-oms-api).

## Statuses in the orders list

**Aged out** and **On hold** are options in the **Status** filter, alongside the five statuses. The filter is multi-select and its options are alternatives: picking `Unfulfilled` and `Aged out` shows orders that are *either*, not only those that are both.

By default the list shows `Unfulfilled`, `Partially fulfilled` and `Aged out` — everything that still needs action. A held order that still owes shipping is among them. One you have since fulfilled yourself leaves the default view with its status and keeps its hold marking; one you have cancelled leaves it too, and reads `Cancelled`. Pick `On hold` on its own to see every order your provider is holding, whatever the reason, including those you have cancelled, which read `Cancelled`. An order that is only likely to be held still owes shipping, so the default view includes it. Exports follow whatever the list is filtered to.
