Inventory
The Inventory page shows how many units of each product your logistics providers are holding right now, side by side in one table. Use it to spot the SKUs that are running out before orders start waiting for stock.
- At least one logistics integration that is active, has its API connection switched on, and has its credentials saved. Integrations that miss any of the three are not shown.
- Products marked Shippable and Active, each with a SKU.
Opening the page
In the Orders view, open Inventory. Every Order Management role — admin, developer, operator, support agent and viewer — can read the page.
If you have no integration with an API connection yet, the page says so and links you to Integrations instead of showing an empty table.
If you enabled Order Management before Inventory shipped, your API key predates the permission Inventory needs to read your product catalog. Order Management grants it to itself the first time the page is opened, so usually there is nothing to do. Granting it needs a dashboard role that can manage API keys, so if yours cannot, the page asks you to repair the addon — ask an admin to open Inventory once, or to click Repair on Order Management under Settings > Addons. See repairing the addon.
What the table shows
There is one row per shippable product in your catalog.
| Column | What it shows |
|---|---|
| SKU | The SKU of the product, as your warehouse ships it |
| Product | The product name |
| Total | The units available across every connected provider |
| Status | Whether the total is healthy, running low, or unavailable |
A Total is only ever a figure your providers actually reported. Where none of them did, it reads — rather than a number, and the status beside it says why: a provider that cannot be reached leaves the total unknown, not zero (see when a provider cannot be reached), and a SKU no provider has been told about reads Not mapped (see when a SKU is not mapped).
The list stays deliberately short — it answers "is this running out?" and nothing else. Which warehouse holds what is a follow-up question, and lives on the product itself.
A shippable product with no SKU is left out of the list: without a SKU there is nothing to reconcile against a warehouse.
Stock status
The status is a traffic light calculated from the Total column against that product's low-stock threshold:
| Status | Total units |
|---|---|
| Out of stock | 0 — a provider answered, and the answer is none left |
| Low stock | 1 up to and including the threshold |
| In stock | more than the threshold |
| Unknown | a provider did not answer and what was read is at or below the threshold |
| Not mapped | no provider reports this SKU at all, and none of them has it mapped |
Out of stock and Not mapped are deliberately different answers. The first is a warehouse telling you the shelf is empty; the second is that no warehouse was ever asked, because nothing knows the SKU. Only one of them is fixed by ordering more stock.
Every product starts on the merchant-wide default of 10 units, and you can give any product a threshold of its own — see setting a low-stock threshold. A pallet item and a fast-moving consumable rarely want the same reorder point, which is what makes the traffic light worth reading.
The status is worked out when you read the page, not when the stock snapshot was taken, so a threshold you have just changed takes effect immediately — including for the Stock status filter and the Status sort.
Opening a product
Selecting a row opens that product's own page at /inventory/<SKU>. It is an ordinary URL: reload
it, bookmark it, or paste it into a support thread. It shows the combined total, the stock status,
the threshold behind it, and one line per connected provider:
| Column | What it shows |
|---|---|
| Integration | The integration, as you named it |
| Matched as | The value that provider is asked about for this SKU — your own product name or SKU while it matches directly, otherwise your product mapping or Not mapped |
| Stock | The units that provider reports |
The Stock figure carries one of three things:
- a number — what the provider reports;
- — — the provider answered, but holds no record for this SKU;
- N/A — the provider could not be reached, so its stock is unknown, not zero, and the total above reads — rather than a figure that leaves it out.
Matched by product name or Matched by internal SKU under Matched as means that provider is matching your catalogue directly — the default, and no mapping is needed. The row names the exact value being used, so an empty Stock figure beside it means that provider holds nothing under that name or SKU: check that the two catalogues spell it the same way, rather than adding a mapping.
Not mapped appears only once the integration keeps mappings, and it means what it says: that SKU is not one of them, so orders containing it are skipped on export and on automatic submission. Map product on that row fixes it without leaving the page.
The stock figures come from the same snapshot as the list, so the two can never disagree.
Mapping a product to a provider
Each provider row carries its own mapping. Map product creates one, and a mapped row offers Edit and Remove instead. The SKU is not asked for — you are already on its page, so only the provider's half of the mapping is a choice:
- for a provider that publishes a catalogue and has an API key stored, you pick from that catalogue, and Odus remembers the product's id and SKU alongside the name;
- otherwise you type the name or SKU exactly as that provider spells it.
On an integration that is still matching directly the action reads Map manually, because there is nothing to repair: it is the override for a product whose name or SKU that provider spells differently. The first mapping ends direct matching for every integration of that provider, so the dialog says so before you save — from then on each of your other SKUs has to be mapped too, or orders containing it are skipped on export.
The stock snapshot is rebuilt as soon as a mapping changes, so the row's Stock figure is right by the time the dialog closes.
Removing a mapping does not delete anything at the provider — it only stops Odus claiming the two are the same product. Orders with that SKU are then skipped when they are exported to that provider, unless the integration is set to match your products directly.
Mapping needs a dashboard role that can change product mappings. A read-only role sees the Matched as column but is offered no action.
Setting a low-stock threshold
On a product's page the threshold is a field you can type in directly — Low stock at or below,
with Save beside it. It is the number of units at or below which the SKU counts as Low
stock. It must be a whole number, and 0 is allowed — it means only an empty stock is worth
flagging, which suits a made-to-order item.
While the number shown is still the merchant-wide default, the field says so underneath. Type over it and save to give this SKU a threshold of its own; a product you never touch keeps using the default.
The status updates as soon as you save, and the list agrees with it on the way back.
Setting a per-SKU threshold needs a dashboard role that can write to inventory, so both admins and operators can do it. Everyone who can read the page can see the threshold. The merchant-wide default is a different setting, and changing it still needs a role that can change Order Management configuration.
A threshold belongs to the SKU, not to one catalogue product. If two products share a SKU they describe the same physical stock, and one threshold covers both.
Finding what needs attention
The list behaves like the other Order Management lists. Filter it by SKU, Product or Stock status, sort it by SKU, Product, Total or Status, and page through the results.
Sorting by Status ascending brings the products that need attention to the top: out of stock first, then low stock, then the ones whose total is unknown, then the ones nothing is mapped to.
Stock status filters on Unknown and Not mapped too, which is how you list everything a provider outage is currently hiding, or every SKU still waiting to be mapped. A Total filter leaves both out: there is no number to compare.
Keeping the figures current
The numbers come from a stored snapshot that is refreshed at most every 15 minutes, so the page stays fast even with several providers connected. The page shows when the snapshot was last updated, and Refresh asks every provider again.
When a provider cannot be reached
Its stock reads N/A on the product, and every Total that depends on it reads — with a status of Unknown — never a figure or an Out of stock you would act on. A provider that is merely slow to answer must not empty your catalogue on screen.
The verdict is still given wherever the missing warehouse could not change it: stock already above a product's threshold is In stock whatever else turns up, because the unreported stock can only add to it. So one provider blipping greys out the products that were near the line, not all of them.
Refresh once the provider is reachable again, and the figures come back.
When a SKU is not mapped
If no connected provider holds a record for a SKU and none of them has it mapped, the row reads Not mapped with a Total of —. Nothing is out of stock: no provider recognised the SKU. Map on that row opens the product, where every provider row says how it is matched and offers to map it — see mapping a product to a provider. The figures appear on the next refresh, which happens as soon as the mapping is saved.
While a provider is unreachable the row reads Unknown instead, because that provider might have recognised the SKU on its own.
Read-only by design
Inventory only reads from your providers. Order Management System never writes stock levels back to a 3PL, so counts, corrections and restocks are always made in the provider's own platform and appear here on the next refresh.