See it in action
From a blank analysis to a full ABC-XYZ matrix and product-level classes — the whole workflow, end to end.
Not every product deserves the same attention
ABC ranks products by the value they drive; XYZ ranks them by how predictable their demand is. Together they tell you exactly where to tighten control and where to stop wasting effort — and now each class cell can drive its own Min/Max reorder rule automatically, opt-in, without ever touching the rules you built by hand.
Everything you need to classify and act
ABC-XYZ matrix
The combined matrix as a pivot — value by class and variability — with a recommended policy on every result line.
Three value bases
Rank by consumption value, consumption quantity or on-hand stock value, whichever fits your decision.
Demand variability
XYZ measures the coefficient of variation of demand across configurable buckets, so forecastable items stand out.
Configurable thresholds
Move the Pareto cut-offs and the variability bands to match your business; re-run and results update instantly.
Write-back to products
ABC, XYZ and the combined cell are stored on each product, ready to filter, group and act on across Inventory.
Snapshots over time
Every analysis keeps its own results, so you can compare how your catalogue shifts quarter to quarter.
Pivot, graph & list
See value by cell, drill into any class, and read the full ranked product list with cumulative shares.
Optional auto-refresh
A built-in (disabled by default) weekly scheduled action keeps the latest analysis current automatically.
Multi-company
Per-company analyses and record rules keep results separated across companies.
Auto-generate reorder rules
Define a reorder policy per ABC(-XYZ) class cell and let it create or update stock.warehouse.orderpoint Min/Max rules for matching products — by hand or on a cron.
Service level & safety-stock Min/Max
Each policy sets a target service level and safety-stock days; the module turns those into a safety factor and computes Min/Max from your demand and lead time.
Never clobbers manual rules
Opt-in per policy and completely safe: only reorder rules the app created are ever touched. Hand-built rules stay untouched, and every sync reports how many were left alone.
Up and running in four steps
Create an analysis
Pick a period and a value basis.
Compute
Products are classified ABC and XYZ instantly.
Read the matrix
See where value sits and how predictable it is.
Act
Group products by class and set the right policy.
Real screens, real data
Every screenshot below is the actual app running on Odoo 19 — no mockups.
Configure & compute
Set the period, value basis and thresholds, then Compute. Products are ranked with cumulative shares and classes, with an audit trail in the chatter.
Read the ABC-XYZ matrix
ABC down, XYZ across, value in every cell. Instantly see how much value is stable and easy versus erratic and risky.
Value by cell
Switch to the graph to compare value across every ABC-XYZ cell at a glance.
Every product, classified
The full ranked list with value, cumulative share, ABC, XYZ and the combined cell — and the recommended policy a click away.
Classes on the product
The classes are written straight onto each product, so you can filter and group your catalogue by ABC or XYZ anywhere in Inventory.
Snapshots over time
Keep a saved analysis per period and watch how your catalogue's value and predictability shift over time.
Stock the right products the right way
Install in seconds. No Enterprise, no external libraries, no lock-in. Works on Odoo 19 Community and Enterprise.
Full manual included. The app ships with a complete in-app documentation page (Apps > this module > Documentation) covering setup, classification, threshold tuning, acting on classes and FAQs. Questions? bambooforge.labs@gmail.com
BambooForge ABC-XYZ Inventory Classification
Stop treating every product the same. This app ranks your catalogue by value (ABC / Pareto) and by demand predictability (XYZ), combines the two into an actionable ABC-XYZ matrix with a stocking recommendation per cell, keeps a snapshot of every run, and writes the classes back onto your products so you can filter and act on them across Inventory.
This page is the complete manual. Follow it top to bottom and you can install, run your first analysis, read the matrix, tune the thresholds, automate refreshes and fix the common issues without contacting support.
Overview
Two complementary classifications, combined:
- ABC (value) — the Pareto principle applied to inventory. A small share of products usually drives most of the value. Class A is the vital few, B the middle, C the trivial many.
- XYZ (demand variability) — how predictable a product's demand is. X is stable and easy to forecast, Y is variable, Z is erratic.
Cross them and you get a 9-cell ABC-XYZ matrix. An AX product (high value, stable) deserves tight, automated replenishment with low safety stock; a CZ product (low value, erratic) is a phase-out or make-to-order candidate. The app spells out a recommended policy for every cell.
It gives you:
- Re-runnable analyses — each keeps its own snapshot of results.
- Configurable ABC — choose the value basis and the A/B thresholds.
- Configurable XYZ — choose the number of demand buckets and the variability cut-offs.
- Write-back to products — ABC, XYZ and the combined cell stored on each product for filtering and grouping across Inventory.
- Matrix pivot, graph and list of the results, plus a per-cell policy.
- Optional weekly cron to keep the latest analysis fresh.
Requirements
- Odoo 17.0.
- The Inventory app (stock). Installing this app pulls it in automatically.
No Enterprise modules and no external Python libraries are required.
Installation
- Copy bambooforge_abc_analysis into your addons path.
- Update the apps list (Apps > Update Apps List).
- Search for ABC-XYZ and click Install.
A new top-level ABC-XYZ app appears, and an ABC-XYZ Analysis entry is added under Inventory > Reporting.
Quick start
- Open ABC-XYZ > Analyses and click New.
- Set the Reference Date and the Period (days) to analyse (365 is a good default).
- Choose the ABC Based On metric:
- Consumption Value — quantity delivered to customers × cost (the classic choice).
- Consumption Quantity — units delivered, ignoring cost.
- On-hand Stock Value — current quantity on hand × cost.
- Leave Compute XYZ ticked to also classify demand variability.
- Click Compute.
The analysis switches to Computed, the Products stat fills in, and the Results tab lists every product with its value, classes and combined cell.
Reading the matrix
Open an analysis and use the Products stat button, or go to ABC-XYZ > Products:
- Pivot — ABC classes down the side, XYZ classes across the top, value in each cell. This is your ABC-XYZ matrix: where does value sit, and how predictable is it?
- Graph — value per ABC-XYZ cell at a glance.
- List — every product with its value, cumulative share, ABC, XYZ, combined cell and the recommended stocking policy.
How classification works
ABC. Products are sorted by the chosen metric, highest first. Running totals give each product a cumulative share. Products are class A until the cumulative share reaches the A Threshold (default 80%), class B up to the A + B Threshold (default 80 + 15 = 95%), and C beyond.
XYZ. The period is split into Demand Buckets (default 12, i.e. monthly over a year). For each product the coefficient of variation (CV = standard deviation / mean) of demand across the buckets is measured. CV up to X max CV is X (stable), up to Y max CV is Y (variable), above is Z (erratic). Products with no movement fall into Z.
All values are expressed in the company currency.
Tuning the thresholds
Everything is on the analysis form:
- A / B Thresholds — move the Pareto cut-offs (their sum must stay below 100).
- Demand Buckets — more buckets = finer variability detection (needs enough history).
- X max CV / Y max CV — tighten or loosen what counts as stable vs erratic.
Re-run the analysis after any change; results update immediately.
Acting on the classes
When Write Back to Products is on, every product gets an ABC-XYZ tab showing its classes and the analysis it came from, plus filterable fields. In the product list (Inventory > Products):
- Group by ABC Class or XYZ Class (search panel > Group By).
- Filter to ABC Class A or Erratic Demand (Z).
- Act on the selection — set reordering rules, adjust safety stock, review suppliers, or plan a phase-out.
Recommended policies
Each result line carries a recommended stocking policy for its cell, for example:
- AX — high value, stable: tight control, automate continuous replenishment, low safety stock.
- AZ — high value, erratic: make-to-order where possible, careful forecasting.
- CZ — low value, erratic: consider phase-out or pure make-to-order.
Automating refreshes
A scheduled action ABC-XYZ: Recompute Latest Analysis ships disabled. Enable it under Settings > Technical > Scheduled Actions to recompute the most recent analysis per company on a schedule (weekly by default), moving the reference date to today each run.
Frequently asked questions
- A product is missing from the results.
- For consumption bases, only products with deliveries to customers in the period appear. For the on-hand stock value basis, products with stock on hand are included.
- Everything is class A (or class C).
- The ABC split depends on spread. Check the A/B thresholds and that your cost prices are set, since value = quantity × cost.
- All products are class Z.
- XYZ needs demand spread across several buckets. With little history, or demand concentrated in one bucket, the variation is high by definition. Lower the bucket count or widen the CV cut-offs.
- Does it work with product variants?
- Classification is computed from delivery moves (per variant) and written back to the product. For variant-heavy catalogues, treat the class as a product-level signal.
- Does it work with multiple companies?
- Yes. Each analysis is scoped to one company, and results are kept separate per company.
Support
Questions or ideas: bambooforge.labs@gmail.com.
Usage
This section walks through a full working cycle: run an analysis, read the results, define reorder policies and let the app maintain your Min/Max reorder rules. It all lives under the top-level ABC-XYZ menu (Inventory users), with manager-only pieces called out below.
Run an analysis
- Open ABC-XYZ > Analyses and click New. The reference is filled from an ABC/##### sequence, so you never have to name it.
- In the Scope group set:
- Reference Date — the analysis is measured up to this day (defaults to today).
- Period (days) — how far back demand and consumption are measured; 365 is the usual choice.
- ABC Based On — Consumption Value (delivered qty x cost), Consumption Quantity, or On-hand Stock Value.
- Write Back to Products — leave on to store the classes on each product.
- Tune the ABC Thresholds and, if Compute XYZ is ticked, the Demand Buckets and X max CV / Y max CV on the right.
- Click Compute. The status moves to Computed, the Products stat button fills in, the Results tab lists every product (A rows highlighted green, C rows muted), and a note is logged in the chatter.
To refresh an existing analysis, open it and click Recompute (it re-reads moves up to the current reference date); Reset to Draft clears the results.
Read the results
Open ABC-XYZ > Products (or the Products stat button on an analysis) to explore the same result lines as a Pivot, Graph and List, grouped by ABC class by default. The pivot with ABC down the side and XYZ across the top is your ABC-XYZ matrix; each list line carries the product, Value, Cumulative %, ABC, XYZ, combined ABC-XYZ cell and a plain-language stocking recommendation. Products also gain an ABC-XYZ tab and filterable ABC/XYZ fields, so in Inventory > Products you can group by ABC Class or XYZ Class and act on, say, every A item or every erratic (Z) item at once.
Define reorder policies
A manager opens ABC-XYZ > Reorder Policies (requires Inventory / Manager) and creates one policy per class cell:
- Under Applies To, pick the ABC Class (required), optionally an XYZ Class (blank = every XYZ class in that ABC class), the Warehouse, and optionally a Product Category. A more specific policy (pinned XYZ and/or category) wins over a wildcard one.
- Under Reorder Parameters, set the Service Level (%), Safety Stock (days), Lead Time (days), Target Cover (days) and Qty Multiple. The app sizes the reorder point from lead-time demand plus a safety buffer (the larger of the service-level buffer and the days-of-cover floor), and the Max from the target cover.
- Leave Auto-create Reorder Rules off to stay in preview, or turn it on to let the app write real rules for matching products.
Example. An AX policy with service level 99%, 3 safety days and a 14-day target cover keeps high-value stable items tightly stocked, while a CZ policy left in preview merely flags low-value erratic items without touching any rule.
Apply the rules
On a Computed analysis, click Preview Reorder Rules to see the Suggested Min / Suggested Max and matched Policy for every line without changing anything. When you are happy, click Apply Reorder Rules and confirm: the app creates or updates stock.warehouse.orderpoint Min/Max rules only for products matched by a policy with auto-create on. It is completely safe and idempotent - it only ever touches the reorder rules it created, so manually-created rules are counted as left untouched and never overwritten. A notification reports how many rules were created, updated and skipped.
Automate the cycle
Two scheduled actions ship disabled under Settings > Technical > Scheduled Actions: ABC-XYZ: Recompute Latest Analysis re-runs the most recent analysis per company (moving the reference date to today), and ABC-XYZ: Sync Reorder Rules keeps auto-create policies' reorder rules aligned to the latest demand. Enable them to run the whole classify-then-replenish loop hands-off.
Upgrading & version compatibility
This build targets Odoo 19.0. Each Odoo major series (17.0, 18.0, 19.0) has its own dedicated build of this module — always install the build that matches your Odoo version. Mixing a build with a different Odoo series is not supported.
Patch upgrades (same series, e.g. 19.0.1.0.0 → later)
Back up your database and filestore first.
Replace the module folder with the newer build.
Restart Odoo with the module updated:
./odoo-bin -c your.conf -u bambooforge_abc_analysis -d your_db
Odoo applies any schema/data changes automatically. Your existing records and configuration are preserved.
Cross-version migration (e.g. Odoo 17 → 18)
Upgrading Odoo itself is a database migration handled by Odoo's standard upgrade tooling. When you migrate the database to the next Odoo series, install the matching build of this module for that series. Data created by this module carries over with the database migration.
After any upgrade the module's scheduled actions resume on their normal cadence — no manual re-activation is required.
Uninstallation
You can remove this module at any time from Apps → (this module) → Uninstall, or from the command line. Uninstalling is clean and reversible by reinstalling — but note what is and is not deleted.
What is removed
- The module's own tables and every record in them (3 models, prefixed abc.*) — this is the data this module created.
- The menus, actions, views and reports this module installed.
- Its scheduled actions (cron jobs) — they stop immediately on uninstall.
What is preserved
- Your standard Odoo data (partners, products, sales, invoices, inventory moves) is not deleted — this module only reads and annotates it; the underlying records stay.
- Attachments and chatter messages on standard records are kept.
As always, take a database backup before uninstalling in production.
Changelog
19.0.1.0.0
Current release for Odoo 19.0. This build includes:
- Auto-generate ABC-driven reorder rules (Min/Max orderpoints) from a service level and safety-stock days, opt-in and never touching manual rules. Also classify products with ABC (Pareto value) and XYZ (demand variability) analysis, combine them into a 9-cell ABC-XYZ matrix with stocking policies, snapshot over time and write the classes back onto products.
Feature additions and fixes ship as new builds on the Odoo Apps store; this page and the module's version reflect the current published release. Always keep the build matched to your Odoo series (see Upgrading & version compatibility).
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module