Skip to main content

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.

Prerequisites
  • 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.

note

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.

ColumnWhat it shows
SKUThe SKU of the product, as your warehouse ships it
ProductThe product name
TotalThe units available across every connected provider
StatusWhether 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:

StatusTotal units
Out of stock0 — a provider answered, and the answer is none left
Low stock1 up to and including the threshold
In stockmore than the threshold
Unknowna provider did not answer and what was read is at or below the threshold
Not mappedno 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:

ColumnWhat it shows
IntegrationThe integration, as you named it
Matched asThe 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
StockThe 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.
tip

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.

note

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.