Checkout & Conversion

Data Integrity Across Catalog, Inventory, and Sales

Catalog, inventory, and sales tables drift apart over time, causing wrong stock and overselling. Here is how to find reservation and integrity problems.

Jason Schuman · April 2, 2026

Catalog, inventory, and sales data can drift apart

A Magento store keeps product data, stock data, and order data in separate groups of tables. Those groups are supposed to stay consistent, but imports, deletions, and integrations can make them disagree over time.

The results reach customers. A product can show the wrong stock level. An order can reference a product that no longer exists. Salable quantity can differ from the units the business can actually sell. Overselling is the most expensive result.

This article explains how these three data sets become inconsistent, why inventory reservations are a common cause, and how to find the problem before customers report it.

one broken data flow can break the sale

Three data sets must agree

The catalog stores product information in the catalog_product_entity family of tables. Inventory tables store stock information. Sales tables store orders. Each group is the main source for its own type of data, and the groups reference each other.

Those references can break if a product is deleted, an import stops partway through, or an integration writes stock directly. An order item may point to a product ID that no longer exists. A stock record may remain after its product is gone.

The store may continue running after this happens. The problem appears later as wrong numbers on the storefront or in reports, which makes it harder to trace than a direct application error.

Reservations change salable quantity

Multi-Source Inventory calculates salable quantity from stock on hand and inventory reservations. A reservation temporarily reduces the quantity Magento can sell after an order is placed. Magento should clear or compensate for that reservation when the order ships or is cancelled.

This calculation works only when the reservation lifecycle stays consistent. If a reservation is left behind, salable quantity can move away from the physical stock. A product may show out of stock while units sit in the warehouse, or the store may oversell because the reservation math is wrong.

Orphaned inventory reservations are one of the most common data-integrity problems in Magento. They make salable quantity drift from real stock, which shows up as false out-of-stocks or overselling.

Check reservations against orders

Magento includes a command for finding reservation inconsistencies. It compares reservation records with the orders that should own them and reports mismatches.

bin/magento inventory:reservation:list-inconsistencies

The output lists the SKUs and orders where reservations do not match the order state. When Magento finds inconsistencies, the companion inventory:reservation:create-compensations command generates corrective reservation records. Those records bring salable quantity back in line with the order history.

Run the list command on a schedule and after bulk order or import operations. Finding a small mismatch is easier than repairing a large group of reservations later.

Deleted products can break historical links

When a product is deleted, its order history should remain. The link between the order item and the catalog product changes because the product no longer exists. Code that assumes the product is still available can fail.

This can appear as an error on an order page, report, or export that tries to load product data for an old order. The order data is still present. The catalog record it references is missing.

Code that reads order items should check whether the referenced product exists before using its data. To find these cases, inspect the queries and joins that connect product data to historical orders.

Stock status can disagree with quantity

Magento stores a product's stock status and quantity separately. A product can have a positive quantity while its status says out of stock. The reverse can happen too if an import or direct write updates one value and not the other.

Reindexing the inventory and stock indexers can rebuild derived data from the source rows. It cannot repair source data that already contradicts itself. A reindex can spread the contradiction to more parts of the store.

Direct writes to inventory tables are a common cause of this problem, especially in ERP integrations. The integration may update quantity without updating stock status or starting the reindex required to recalculate related data.

Bulk imports create data drift

Much catalog and inventory drift starts with bulk operations. A product import can stop partway through. A stock update can write directly to tables. A feed can run without validating the data first. Each case can leave the data sets out of sync.

Direct writes are risky because they bypass the logic that keeps related tables consistent. An ERP that updates cataloginventory_stock_item directly, without using Magento's API, can change quantity without updating stock status or triggering the reindex that should reconcile the data.

The safer path is to write through Magento's service contracts and APIs. Those interfaces apply the logic that maintains relationships between tables. If an integration requires direct writes, add it to the data-integrity audit and verify every related update.

Data integrity protects revenue

Data integrity across catalog, inventory, and sales controls what the store displays, sells, and reports. If those data sets disagree, the store can show incorrect stock, sell units it does not have, or report numbers the team cannot trust.

Check reservation consistency, product references in order history, and the relationship between stock status and quantity. These checks turn quiet data drift into a specific repair list for a checkout-focused platform review.