# Reservations

A reservation is made after an order has been assigned to a facility. The reservation reserves an existing or future stock for a customer. If no stock is available, the reservation is saved and assigned to the first available stock.

## Creating reservations

A reservation is created when an [order](/documentation/by-pillar/order-management/orders.md) is placed or a [delivery promise](/documentation/by-pillar/availability-and-promising/delivery-promise.md) is made to a consumer. fulfillmenttools continuously evaluates existing reservations redistributes them when necessary. During reservation creation, the system identifies the most suitable stock — a process called [candidate selection](#stock-candidate-selection).

### Stock candidate selection

When realizing or reassigning a reservation, fulfillmenttools finds the best stock to place it on based on various criteria.

A **stock** qualifies as a candidate if:

* Available quantity is greater than 0 (quantity minus existing reservations).
* Has `PICKABLE` and `ACCESSIBLE` traits. Both [inventory traits](/documentation/by-pillar/global-inventory-hub/inventory-traits.md) are enabled by default.
* [`availableUntil`](/documentation/by-pillar/global-inventory-hub/stock/stock-availability.md#stock-properties-and-available-until) is later than the current time (if the order has no desired delivery day) or the order's delivery date.

An **expected stock** qualifies as a candidate if the order has a desired delivery date and:

* Available quantity is greater than 0.
* Arrival date of the stock ([`purchaseOrder`](/documentation/by-pillar/global-inventory-hub/inbound-process/purchase-order.md)`.requestedDate`) is before the [latest possible pick start](/documentation/by-pillar/store-operations/picking/latest-picking-start.md).
* Not delayed (`purchaseOrder.requestedDate` is in the future).

**Ranking:**

* **Stock** candidates: ranked by picking sequence location score if configured (highest first), then `availableUntil` (earliest expiring first), then `receiptDate` (oldest first).
* **Expected stock** candidates: ranked by expected date (latest first), then `availableUntil` (earliest expiring first).
* Expected stock is ranked higher than regular stock to avoid blocking inventory that could serve other demand.

## Redistributing reservations

After a reservation has been assigned to an (expected) stock, fulfillmenttools continuously ensures that the reservations can still be fulfilled. If reservations can't be fulfilled anymore, fulfillmenttools will try to redistribute them to possible (expected) [stock candidates](#candidate-selection).

The system reevaluates reservations whenever stock or expected stock changes, for example, when:

* **Stock is updated**
* **Stock is deleted**
* **Stock becomes non-pickable or non-accessible**: This could mean the stock was relocated within the facility to a location without the pickable or accessible trait.
* **Expected stock arrival date changes:** If users are notified of changes to a delivery's arrival date, we recommend adjusting the requested date in the purchase order. This will trigger a check to ensure that all reservations can still be fulfilled.
* **Expected stock quantity changes:** If users are notified of changes to the requested items in a delivery, we recommend updating the purchase order to reflect those changes. This will trigger a check to ensure that all reservations can still be fulfilled.
* **A purchase order is canceled**

{% hint style="warning" %}
When a reservation is removed from expected stock (for example, because an order was canceled), the system doesn't use this newly released expected stock to resolve any existing over‑reservations automatically.
{% endhint %}

{% hint style="info" %}
Reservations in a facility can be manually rechecked and optimized, for example, to determine whether reservations can be reassigned to a later-arriving expected stock.

This functionality is intended for troubleshooting and is available only upon request. If you encounter reservation issues, [contact our Support team](https://ocfulfillment.atlassian.net/servicedesk/customer/portal/1/group/11/create/39) to trigger this process.​
{% endhint %}

### Exceptions to automatic reassignment

Reservations aren't automatically moved if:

* **Expected stock becomes delayed:** In this case, users are expected to update the requested date of the purchase order via the [API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#patch-/api/purchaseorders/-purchaseOrderId-) or cancel the purchase order (via [API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#patch-/api/purchaseorders/-purchaseOrderId-) or [Backoffice](/documentation/backoffice/facility-view/inventory/inbound.md#how-to-cancel-an-inbound-process)).
* **Stock expires or reaches its available until date:** In this case, users are expected to mark expired stock as non-pickable, non-accessible, or delete it completely. This can be done via the [stock API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#put-/api/stocks/-stockId-) or Backoffice.

## Over-reservations

If no stock is available when a reservation is created, an over-reservation is automatically created. It's automatically assigned once stock meeting the reservation criteria becomes available.

In Backoffice, over-reservations appear alongside all other reservations in the [Stock overview view](/documentation/backoffice/network-view/inventory.md). Facilities with over-reservations show an info icon and tooltip.

An over-reservation is calculated when the sum of reserved and safety stock exceeds the available pickable and accessible stock. An over-reservation is only reported when other reservations exist. If safety stock alone exceeds the available stock but there are no reservations, an over-reservation isn't shown.

{% hint style="info" %}
The order remains available for picking during the defined timeframe. If a short‑pick is reported, the system can re‑route the order or allow a manual reassignment.
{% endhint %}

## Reservation prioritization

When stock becomes available at a facility, reservations are handled in a clear, defined order.

### 1. Over-reservations (reservations without stock)

These are handled first.

Sorting:

* Reservations of orders that must be picked earliest
* Largest reservation quantity (For example, a reservation for 5 items is prioritized over one for 2 items.). This is done to avoid orders being shipped in multiple shipments.

### 2. Reservations on expected stock

Only applies if `expectedStock.generateFromRoutingPlan = true`.

Sorting:

* Earliest `availableFrom`
* Largest reservation quantity

{% hint style="info" %}
For details, refer to [the Global Inventory Hub configurations article](/documentation/by-pillar/global-inventory-hub/configurations.md).
{% endhint %}

### 3. Tie-breaker

If several reservations qualify at the same time, the reservation with the earliest pick start is improved first.

## Removing reservations

Reservations are removed when fulfillment progresses or is canceled. By default, reservations are automatically removed after the related pick job is closed, aborted, rerouted, or canceled.

There are three independent release paths:

<table><thead><tr><th width="209.49609375">Path</th><th width="320.6640625">Trigger</th><th>Scope</th></tr></thead><tbody><tr><td><strong>Facility unassignment</strong></td><td>Routing plan unassigned (due to reroute or cancellation).</td><td>All reservations for the routing plan.</td></tr><tr><td><strong>Operational release</strong></td><td><p>Pick job closed/aborted/rerouted, or handover job completed/aborted.</p><p>Use the <a href="/pages/f04705edca90b8525cf450fdb9592a5126893b06#reserved-stock-configuration">reserved stock configuration</a> to define a different removal event.</p></td><td>All reservations for the routing plan.</td></tr><tr><td><strong>Action API</strong></td><td>If a facility doesn't use operational entities (such as pick or handover jobs), reservations can be removed via the <a href="https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#post-/api/reservations/actions">REST API</a>.</td><td>Individual reservations by ID, order reference, routing plan reference, or predicate. See <a href="#reservations-actions">reservation actions for more information</a>.</td></tr></tbody></table>

{% hint style="info" %}
Stock can be marked as outbound first and removed later using the [outbound stock configuration](/documentation/by-pillar/global-inventory-hub/stock/outbound-stocks.md).
{% endhint %}

## Use case examples

### Reservation completed without issues (happy path)

A customer places an order online. Physical stock is available, and all conditions are met.

**Starting situation**

<table data-header-hidden><thead><tr><th width="374"></th><th></th></tr></thead><tbody><tr><td><strong>Order</strong></td><td>Online order via webshop</td></tr><tr><td><strong>Order delivery date</strong></td><td>15 February 2026</td></tr><tr><td><strong>Stock</strong></td><td>50 units, pickable and accessible</td></tr><tr><td><strong>Expected stock</strong></td><td>0</td></tr><tr><td><strong>Stock expiry date</strong></td><td>31 March 2026 (after delivery date)</td></tr><tr><td><strong>Configuration</strong></td><td>Default configuration</td></tr></tbody></table>

**Timeline**

<table><thead><tr><th width="115.91015625">Timeline</th><th width="327.4296875">Event</th><th>Action</th></tr></thead><tbody><tr><td>1</td><td>The consumer places an order, and it's assigned to a facility. Valid stock is checked.</td><td>Stock is pickable, accessible, and valid until 31 March 2026. All conditions met. A reservation is created on the physical stock.</td></tr><tr><td>2</td><td>Pick job is started</td><td>Users begin picking the reserved items.</td></tr><tr><td>3</td><td>Pick job is closed</td><td>Reservations and stock are automatically removed.</td></tr></tbody></table>

**Result**

The reservation is completed without manual intervention.

### Delayed delivery (expected stock)

**Starting situation**

<table data-header-hidden><thead><tr><th width="374"></th><th></th></tr></thead><tbody><tr><td><strong>Order</strong></td><td>Online order via webshop</td></tr><tr><td><strong>Order delivery date</strong></td><td>20 February 2026</td></tr><tr><td><strong>Stock</strong></td><td>0</td></tr><tr><td><strong>Expected stock</strong></td><td>Purchase order: 100 units, planned arrival 12 February 2026</td></tr><tr><td><strong>Stock expiry date</strong></td><td>-</td></tr><tr><td><strong>Configuration</strong></td><td>Default configuration</td></tr></tbody></table>

**Timeline**

<table><thead><tr><th width="115.91015625">Timeline</th><th width="327.4296875">Event</th><th>Action</th></tr></thead><tbody><tr><td>1</td><td>Order is received</td><td>System finds no physical stock. Expected stock arriving on 12 February qualifies (arrival before pick start). A reservation is placed on the expected stock.</td></tr><tr><td>2</td><td>Supplier reports delay: new arrival 25 February 2026</td><td>The new date is in the future, but now falls after the order's delivery date (20 February). Expected stock is now treated as delayed.</td></tr><tr><td>3</td><td>Reservation can no longer be fulfilled in time</td><td>The reservation on the expected stock is not automatically redistributed. It remains in place but can no longer be fulfilled as-is.</td></tr><tr><td>4</td><td>User resolves the situation manually</td><td>The info icon and tooltip in Backoffice indicate the facility has over-reservations. The user must update the purchase order or adjust the stock manually in Backoffice.</td></tr><tr><td>5</td><td>Pick job is started and closed</td><td>Users begin picking the reserved items. Reservations and stock are automatically removed after the pick job is finished.</td></tr></tbody></table>

{% hint style="warning" %}
Important: The system doesn't automatically reassign reservations on delayed expected stock. A manual action is required. For example, correct the purchase order date, update the stock in the facility, or reroute the order.
{% endhint %}

**Result**

The reservation is held until the delayed delivery arrives. If it arrives too late, the order's promised delivery date will be missed. To ensure on-time fulfillment, manual intervention is needed.

**What should I do as a user?**

* Update the purchase order in the system to reflect the new arrival date.
* Check whether an alternative source or another facility can fulfill the order.
* Notify the customer of the delay and update the delivery date if needed.

### Over-reservation

**Starting situation**

<table><thead><tr><th width="374"></th><th></th></tr></thead><tbody><tr><td><strong>Order</strong></td><td>Two orders of 10 units each (Order A and Order B)</td></tr><tr><td><strong>Order delivery date A</strong></td><td>18 February 2026 (earlier)</td></tr><tr><td><strong>Order delivery date B</strong></td><td>22 February 2026 (later)</td></tr><tr><td><strong>Stock</strong></td><td>0</td></tr><tr><td><strong>Expected stock</strong></td><td>0</td></tr><tr><td><strong>Stock expiry date</strong></td><td>-</td></tr><tr><td><strong>Configuration</strong></td><td>Default configuration</td></tr></tbody></table>

**Timeline**

<table><thead><tr><th width="115.91015625">Timeline</th><th width="327.4296875">Event</th><th>Action</th></tr></thead><tbody><tr><td>1</td><td>Both orders are received</td><td>No stock available. System creates over-reservations for both orders. These appear in Backoffice with an info icon.</td></tr><tr><td>2</td><td>New goods receipt: 10 units arrive</td><td>System detects available stock. Prioritization begins.</td></tr><tr><td>3</td><td>System prioritizes over-reservations</td><td>Order A has the earlier delivery date and is served first. Order A receives a reservation for the 10 units.</td></tr><tr><td>4</td><td>Order B remains an over-reservation</td><td>No further stock available. Order B remains over-reserved until additional stock arrives.</td></tr><tr><td>5</td><td>Another new goods receipt: 10 units</td><td>Order B is now also assigned stock. Over-reservation is resolved.</td></tr><tr><td>6</td><td>Pick jobs are started and closed</td><td>Users begin picking the reserved items. Reservations and stock are automatically removed after the pick jobs are finished.</td></tr></tbody></table>

**Result**

Over-reservations are resolved automatically as soon as matching stock becomes available. Priority is based on the earliest delivery date. So, no manual action needed.

**What do I see in Backoffice?**

* Facilities with over-reservations show an info icon with a tooltip.
* Over-reservations appear in the reservations list alongside all other reservations.
* Once the stock arrives, the over-reservation is automatically resolved.

## Using the reservations endpoints

### Search reservations

To search for reservations, execute the following POST request with a JSON body:

{% tabs %}
{% tab title="Endpoint" %}

```http
POST https://{projectId}.api.fulfillmenttools.com/api/reservations/search
```

{% endtab %}

{% tab title="Request body" %}

```json
{
    "query": {
        "tenantArticleId": {
            "eq": "11111"
        },
        "facilityRef": {
            "eq": "d083f631-9f4c-463b-85d4-9414fb19239f"
        },
        "relatedRefs": {
            "routingPlanRefs": {
                "contains": {
                    "eq": "85d25d89-f8a7-4600-9082-0d8b2d89a6af"
                }
            }
        }
    }
}
```

The example above searches for reservations matching a specific `tenantArticleId`, `facilityRef`, and `routingPlanRef`.
{% endtab %}
{% endtabs %}

### Reservations actions

The reservation actions endpoint uses the following fields to define its scope:

* The `reservationSelector` field selects reservations at a high level, for example, by order.
* The `reservationPredicate` field refines the selection made by the `reservationSelector`. This allows for more granular control, such as removing reservations for only specific line items within an order.
* The response provides insights into the success of the operations to remove reservations and reduce stock.

#### Remove reservations and reduce stock

To remove reservations and the corresponding reserved stock, use the `REMOVE_RESERVATIONS_REDUCE_STOCKS` action.

Execute the following POST request with the specified JSON body:

{% tabs %}
{% tab title="Endpoint" %}

```http
POST https://{projectId}.api.fulfillmenttools.com/api/reservations/actions
```

{% endtab %}

{% tab title="Request body" %}

```json
{
    "name": "REMOVE_RESERVATIONS_REDUCE_STOCKS",
    "reservationSelector": {
        "orderRefs": [
            "order-id-01"
        ],
        "reservationPredicate": {
            "and": [
                {
                    "facilityRef": {
                        "eq": "facility-id-01"
                    }
                },
                {
                    "tenantArticleId": {
                        "eq": "tenantarticleid-01"
                    }
                }
            ]
        }
    }
}
```

{% endtab %}

{% tab title="Response body" %}
A successful request returns a `200 OK` response with the following body.

```json
[
    {
        "reservation": {
            "id": "reservation-id-01"
        },
        "status": "DELETED",
        "stockOperations": [
            {
                "status": "REDUCED",
                "stock": {
                    "id": "stock-id-01",
                    "version": 1
                }
            }
        ]
    }
]
```

{% endtab %}
{% endtabs %}

#### Remove reservations and keep stock

To remove only the reservations without reducing stock, use the `REMOVE_RESERVATIONS_KEEP_STOCKS` action. In this transaction, no stock is reduced.

Execute the following POST request with the specified JSON body:

{% tabs %}
{% tab title="Endpoint" %}

```http
POST https://{projectId}.api.fulfillmenttools.com/api/reservations/actions
```

{% endtab %}

{% tab title="Request body" %}

```json
{
    "name": "REMOVE_RESERVATIONS_KEEP_STOCKS",
    "reservationSelector": {
        "orderRefs": [
            "order-id-01"
        ],
        "reservationPredicate": {
            "and": [
                {
                    "facilityRef": {
                        "eq": "facility-id-01"
                    }
                },
                {
                    "tenantArticleId": {
                        "eq": "tenantarticleid-01"
                    }
                }
            ]
        }
    }
}
```

{% endtab %}

{% tab title="Response body" %}
A successful request returns a `200 OK` response with the following body.

```json
[
    {
        "reservation": {
            "id": "reservation-id-01"
        },
        "status": "DELETED"
    }
]
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.fulfillmenttools.com/documentation/by-pillar/global-inventory-hub/reservations.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
