InvFlux makes WooCommerce stock a ledger, not a number that anything can overwrite. Every change to your stock record is recorded — exact from to, and why — whichever screen, order, import or plugin makes it, so you can answer “why is this number what it is?” for any product, any day. On top of it: a stock workbench, a dispatch queue, and purchase orders with receiving. All free.
WooCommerce stores stock as one mutable number. Its checkout now holds stock, so the storefront rarely oversells — but that same number is written from paths checkout never sees: an admin edit to the stock field, an order created or edited over the REST API or in wp-admin, a bulk update, a POS or ERP sync, another plugin. None of those reconcile it or leave a record, so when it drifts there — two edits landing at the same moment, an edit that’s simply wrong — nothing catches it, until it surfaces the costly way, at dispatch, when an order can’t be filled because the unit isn’t really there.
InvFlux makes the ledger the source of truth, and WooCommerce’s stock number becomes a copy kept in sync with it. Stock edits made in InvFlux — the workbench or the product’s Inventory tab — are booked as ledger entries. If anything else writes WooCommerce’s stock number directly — another plugin, WooCommerce’s bulk edit or CSV import, an external sync — the write is discarded and the ledger’s figure stands; you can choose, per plugin, to be notified instead, or to let a trusted plugin’s changes into the ledger. A change made straight to the database is flagged by InvFlux’s diagnostics, which restore the ledger’s figure.
Stock you can trust
The workbench — your catalog and stock in one grid
Dispatch — ship what’s owed
Purchase orders and receiving — a real procurement loop
InvFlux requires WooCommerce with High-Performance Order Storage (HPOS) enabled — the default on current WooCommerce. If HPOS is off, the setup screen says so and links to the WooCommerce setting where you turn it on, and it won’t hand products over until you do; nothing breaks in the meantime. A current database is also expected (MySQL 8.0.16+ or MariaDB 10.6+).
InvFlux runs one install per store. On a WordPress network you can activate it per site or network-wide — either way each site keeps its own independent inventory. See the FAQ on multisite.
Essentials keeps your stock record right, and stays free. InvFlux is designed as composable add-ons rather than one monolith, so as paid extensions arrive you add only what you need:
This plugin can connect to one external service: the InvFlux licensing service at https://license.invflux.com — the service that issues and validates licenses.
Nothing is transmitted until you open Licenses & Add-ons, register, or activate a license. Until you do one of those three things the plugin never contacts the service at all. There is no usage tracking, no analytics and no crash reporting, at any point — we never see how you use the plugin, and your shop’s data never leaves your site.
What is sent, and when:
WP_DEBUG is on and what WordPress reports as the environment type (production, staging, development) — so a staging copy doesn’t consume a production seat, and the versions of PHP and of the database server your site runs on (see the daily check below).You can un-register at any time, from InvFlux Licenses & Add-ons. Doing so releases the site’s license and stops the daily check, after which the plugin does not contact the service again unless you register once more. Every inventory feature keeps working exactly as before.
Your product, stock, order and customer data is never transmitted. It stays in your WordPress database.
Terms of service: https://invflux.com/terms
Privacy policy: https://invflux.com/privacy
Every PHP file in this plugin is the source. The admin screens are the exception: they are SolidJS applications, and what ships in build/ is compiled and minified. Their source, and the tooling that produces those files, lives in a public repository:
https://github.com/invflux/invflux-ui
To reproduce the shipped bundles from a checkout of that repository, with Node 22:
npm install
INVFLUX_PLUGIN_DIR=/absolute/path/to/output npm run build
That writes <output>/build/app/ and <output>/build/product-tab/ — the same two directories this plugin ships under build/. Use an absolute path: the variable is read once per surface, from inside that surface’s own package directory, so a relative one produces two separate output trees. Without it, the output goes to a sibling checkout of this plugin, which is the layout used while developing.
The toolchain is Vite with the SolidJS plugin and Tailwind; versions are pinned in the repository’s package-lock.json, so a build from a given commit is reproducible.
Source maps are not included in the release zip — they would add about 40% to the download for something only a developer reads, and the repository above answers the same question better. bin/build-dist.sh --with-maps produces a build that includes them.
The PHP libraries are third-party packages, listed with the exact versions bundled in composer.json at the root of this plugin. Those under vendor/ are unmodified. Those under vendor-prefixed/ — PhpSpreadsheet and the five packages it depends on — are altered in two mechanical ways at build time: their namespaces are rewritten so they cannot collide with another plugin shipping a different version of the same library, and PhpSpreadsheet’s readers and writers are pruned to the spreadsheet formats this plugin actually uses.