# Step 3: Managing Your Orders
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import Tooltip from '_core/components/Tooltip/Tooltip';
This guide walks you through the full FBPI order lifecycle — from receiving a webhook notification to handing the shipment off to noon logistics. By the end, your system will process live orders end to end.
## How It Works
Every FBPI order follows this sequence:
```mermaid
sequenceDiagram
participant noon as noon
participant W as Your Webhook
participant S as Your System
participant SL as Seller Lab
noon->>W: POST order notification (order_nr)
W-->>noon: HTTP 200 (acknowledgment)
S->>noon: GET /fbpi/v1/fbpi-order/{order_nr}/get
noon-->>S: Full order details (items, statuses)
S->>noon: POST /fbpi/v1/fbpi-order/update (mark OOS items, if any)
noon-->>S: Update confirmed
S->>noon: POST /fbpi/v1/shipment/create
noon-->>S: Shipment created
S->>SL: Create manifest (manual step)
noon->>W: Pickup from warehouse or you drop off
```
Key points about this flow:
- **Acknowledgment happens at the webhook level.** Returning HTTP 200 to noon's webhook notification is how you acknowledge receipt. noon retries delivery on any non-2xx response.
- **Retrieving full details requires a GET call.** The webhook payload contains only `order_nr`. Call `GetFbpiOrder` to get items, statuses, and pricing.
- **Marking items out of stock is optional.** Only call `UpdateOrder` if some items cannot be fulfilled. Skip it entirely if all items are available.
- **Manifestation is manual.** There is no API for creating manifests. You must complete this step in Seller Lab.
- **Unacknowledged orders become Killed.** If your webhook fails to return HTTP 200 after all retries, noon marks the order as Killed and the partner absorbs the impact.
## Prerequisites
- Active FBPI Integration Warehouse with a webhook URL — see [Warehouse Setup][fbpi/warehouse-setup]
- Stock and pricing pushed for your SKUs — see [Product and Inventory Setup][fbpi/product-inventory]
- Authenticated API session — see [Authenticating Your Requests][authenticating-requests]
---
## Step 1 — Retrieve Your Order Details
When a customer places an order, noon sends a notification to your webhook. Return HTTP 200 immediately, then call `GetFbpiOrder` (`GET /fbpi/v1/fbpi-order/{fbpi_order_nr}/get`) to retrieve the full order.
:::warning
Return HTTP 200 to the webhook as quickly as possible — before any downstream processing. If noon does not receive a 2xx within the timeout window, it will retry, and eventually mark the order as **Killed**.
:::
```python
session = get_authenticated_session()
order_nr = "NFBO123456789" # extracted from the webhook payload
response = session.get(
f"https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/{order_nr}/get",
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
order = response.json()
```
```javascript
const client = await getAuthenticatedClient();
const orderNr = "NFBO123456789"; // extracted from the webhook payload
const response = await client.get(
`https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/${orderNr}/get`,
{ headers: { "User-Agent": "MyApp/1.0.0" } }
);
const order = response.data;
```
**Response:**
```json
{
"fbpi_order_nr": "NFBO123456789",
"mp_code": "noon",
"mp_order_nr": "NF123456789",
"mp_country_code": "ae",
"customer_country_code": "ae",
"merchant_code": "STR-12345",
"currency_code": "AED",
"warehouse_code": "WH-NOON-001",
"order_created_at": "2026-04-09T08:42:15Z",
"items": [
{
"mp_item_nr": "NFBO123456789-1",
"partner_sku": "MY-SKU-001",
"mp_status": "MP_ITEM_STATUS_CONFIRMED",
"integration_status": "INTEGRATION_ITEM_STATUS_ACKNOWLEDGED",
"delivered_invoice_price": 149.99,
"cancellation_reason_code": null
}
]
}
```
**`mp_status` values** — the marketplace's view of the item:
| Value | Meaning |
|---|---|
| `MP_ITEM_STATUS_CONFIRMED` | Item confirmed and active on the marketplace |
| `MP_ITEM_STATUS_CANCELLED` | Item cancelled by the marketplace |
| `MP_ITEM_STATUS_UNSPECIFIED` | Default — treat as unresolved |
**`integration_status` values** — your integration's view of the item:
| Value | Meaning |
|---|---|
| `INTEGRATION_ITEM_STATUS_ACKNOWLEDGED` | Order received and acknowledged by your webhook |
| `INTEGRATION_ITEM_STATUS_OUT_OF_STOCK` | Item marked out of stock by your integration |
| `INTEGRATION_ITEM_STATUS_SHIPPED` | Shipment created for this item |
| `INTEGRATION_ITEM_STATUS_UNSPECIFIED` | Default — treat as unresolved |
**You'll know this worked when** you receive a response with `items` populated and `integration_status` set to `INTEGRATION_ITEM_STATUS_ACKNOWLEDGED`.
To retrieve customer shipping details, call `GetFbpiOrderCustomerData` (`GET /fbpi/v1/fbpi-order/{fbpi_order_nr}/customer-details/get`). See [GetFbpiOrderCustomerData][fbpi-customer-data].
---
## Step 2 — Mark Out-of-Stock Items
If any items in the order cannot be fulfilled, call `UpdateOrder` (`POST /fbpi/v1/fbpi-order/update`) to mark them as out of stock before creating a shipment. Skip this step if all items are available.
:::warning
Unacknowledged items that are not marked OOS and not shipped within the SLA window cause the order to become **Killed**. A Killed order cannot be recovered.
:::
```python
session = get_authenticated_session()
response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/update",
json={
"fbpi_order_nr": "NFBO123456789",
"items": [
{
"mp_item_nr": "NFBO123456789-2",
"status": "UPDATE_ORDER_REQUEST_ITEM_STATUS_OUT_OF_STOCK"
}
]
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()
```
```javascript
const client = await getAuthenticatedClient();
const response = await client.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/fbpi-order/update",
{
fbpi_order_nr: "NFBO123456789",
items: [
{
mp_item_nr: "NFBO123456789-2",
status: "UPDATE_ORDER_REQUEST_ITEM_STATUS_OUT_OF_STOCK"
}
]
},
{ headers: { "Content-Type": "application/json", "User-Agent": "MyApp/1.0.0" } }
);
```
The `status` field accepts one value: `UPDATE_ORDER_REQUEST_ITEM_STATUS_OUT_OF_STOCK`.
**You'll know this worked when** a subsequent `GetFbpiOrder` call shows the marked items with `integration_status: INTEGRATION_ITEM_STATUS_OUT_OF_STOCK`.
For the full schema, see [UpdateOrder][update-fbpi-order].
---
## Step 3 — Create a Shipment
Call `CreateShipment` (`POST /fbpi/v1/shipment/create`) to register each shipment with noon. Include the noon-issued AWB for each package.
**Getting an AWB:** Call `GetNoonLogisticsAWBs` (`POST /fbpi/v1/shipment/noon-logistics-awbs/get`) to get AWB numbers from noon. You can request them in bulk (e.g. 500 at a time) for pre-allocation, or one per shipment.
```python
session = get_authenticated_session()
response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/shipment/create",
json={
"warehouse_code": "WH-NOON-001",
"integration_shipment_nr": "SHIP-2026-001",
"fbpi_order_nr": "NFBO123456789",
"awbs": [
{
"courier": "noon",
"awb_nr": "AWB123456789"
}
],
"items": [
{
"mp_item_nr": "NFBO123456789-1"
}
]
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()
```
```javascript
const client = await getAuthenticatedClient();
const response = await client.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/shipment/create",
{
warehouse_code: "WH-NOON-001",
integration_shipment_nr: "SHIP-2026-001",
fbpi_order_nr: "NFBO123456789",
awbs: [
{
courier: "noon",
awb_nr: "AWB123456789"
}
],
items: [
{
mp_item_nr: "NFBO123456789-1"
}
]
},
{ headers: { "Content-Type": "application/json", "User-Agent": "MyApp/1.0.0" } }
);
```
Key request fields:
| Field | Type | Description |
|---|---|---|
| `warehouse_code` | string | Your integration warehouse code |
| `integration_shipment_nr` | string | Your internal shipment ID — no specific format required |
| `fbpi_order_nr` | string | The FBPI order number from Step 1 |
| `awbs[].courier` | string | `"noon"` for noon logistics, or your courier's name |
| `awbs[].awb_nr` | string | AWB number from GetNoonLogisticsAWBs or your courier |
| `items[].mp_item_nr` | string | Marketplace item number for each item in this shipment |
**Response:**
```json
{}
```
A successful `CreateShipment` call returns HTTP 200 with an empty body — the status code is the success signal. The response carries no shipment identifier, so use the `integration_shipment_nr` you supplied (or `fbpi_order_nr`) to look the shipment up afterwards.
**You'll know this worked when** a subsequent `GetShipment` call returns the shipment with a confirmed AWB. See [GetShipment][fbpi-get-shipment].
If a shipment must be cancelled, use [CancelShipment][fbpi-cancel-shipment].
---
## Step 4 — Complete the Manifest
Once shipments are created, they appear as pending in Seller Lab. noon will not schedule a pickup until you create a manifest. There is no API for this step — complete it manually in Seller Lab.
1. Log in to [noon Partner Platform][noon-partner-platform].
2. Click the menu icon (☰) at the top left and select **Fulfilled by Partner → Manifestation**.
![Manifestation Navigation][fbpi/manifestation-navigation]
3. Select your warehouse.
![Select Warehouse][fbpi/manifestation_1]
4. Click **Create Manifest**.
![Create Manifest Button][fbpi/manifestation_2]
5. Enter the number of shipments you are handing over and click **Save Changes**.
![Manifestation Creation][fbpi/manifestation_3]
:::info
We are working on an automatic manifestation option that will make this step optional.
:::
**You'll know this worked when** the manifest appears as confirmed in Seller Lab and the shipments are no longer in pending status.
---
## Step 5 — Pack and Hand Over
**Packing:** Pack the order in noon-approved packaging material and print the shipment label returned by `GetShipment`. Affix the label to the package.
**Handover:** noon collects based on the handover preference you selected during warehouse setup:
- **Pickup** — noon's courier collects from your warehouse based on processing time, manifestation data, and your handover settings.
- **Drop-off** — you deliver the packages directly to a noon logistics hub.
Once handed over, the shipment status updates automatically in the noon system.
---
## Testing
Use `CreateSandboxOrder` (`POST /fbpi/v1/sandbox-order/create`) to place a test order against your warehouse without involving a real customer.
```python
session = get_authenticated_session()
response = session.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/sandbox-order/create",
json={
"warehouse_code": "WH-NOON-001",
"idempotency_key": "test-001",
"items": [
{
"status": "MP_ITEM_STATUS_CONFIRMED",
"partner_sku": "MY-SKU-001"
}
],
"country_code": "ae"
},
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
sandbox_order = response.json()
# sandbox_order["fbpi_order_nr"] — use this to run the full order flow
```
```javascript
const client = await getAuthenticatedClient();
const response = await client.post(
"https://noon-api-gateway.noon.partners/fbpi/v1/sandbox-order/create",
{
warehouse_code: "WH-NOON-001",
idempotency_key: "test-001",
items: [
{
status: "MP_ITEM_STATUS_CONFIRMED",
partner_sku: "MY-SKU-001"
}
],
country_code: "ae"
},
{ headers: { "Content-Type": "application/json", "User-Agent": "MyApp/1.0.0" } }
);
const sandboxOrder = response.data;
// sandboxOrder.fbpi_order_nr — use this to run the full order flow
```
Key notes for `CreateSandboxOrder`:
- `idempotency_key` must be unique per test run and at most 10 characters.
- `partner_sku` is optional — the server assigns a dummy value if omitted.
- `country_code` defaults to `"ae"` if omitted.
**Running the test:**
1. Call `CreateSandboxOrder` — your webhook receives a notification with the returned `fbpi_order_nr`.
2. Confirm your webhook returns HTTP 200.
3. Call `GetFbpiOrder` with the sandbox `fbpi_order_nr` and verify the response includes all expected fields.
4. Run the acknowledgment and shipment steps as you would in production.
5. Check the [FBPI Orders Dashboard][fbpi/dashboard] — the sandbox order should show a successful webhook acknowledgment and a created shipment.
**Common failures:**
| Symptom | Likely cause | What to do |
|---|---|---|
| Webhook never fires | Warehouse not active or webhook URL misconfigured | Check warehouse status in Seller Lab |
| `GetFbpiOrder` returns 404 | Order not yet created or wrong `fbpi_order_nr` | Wait a few seconds and retry |
| Shipment creation fails | AWB already used or invalid `mp_item_nr` | Use a new AWB from `GetNoonLogisticsAWBs`; verify item numbers match |
| Order shows as Killed | Webhook timed out or returned non-2xx | Check webhook logs; ensure your endpoint responds within the timeout |
---
## Next Steps
- [Webhook Order Data][fbpi/webhook-order-data] — full reference for parsing the webhook payload and calling the order data APIs
- [FBPI Orders Dashboard][fbpi/dashboard] — monitor webhook attempts, acknowledgments, and shipment events
- [GetFbpiOrder API Reference][get-fbpi-order] — full response schema
- [CreateShipment API Reference][fbpi-create-shipment] — full request and response schema
- [CreateSandboxOrder API Reference][fbpi-sandbox-order] — full sandbox order schema