StockFlow Pro 6.0.5
# Ordrivo StockFlow Pro 6.0.5
Inventory & purchasing for WordPress · Bilge Baykus · 13 October 2026
## Install and start
1. Back up your WordPress database and files. Test on a staging site first.
2. WordPress → Plugins → Add New → Upload Plugin. Select the installable StockFlow ZIP, install and activate.
3. Open StockFlow from the WordPress admin menu. A fresh catalog receives 300 editable demo products, ten industry categories, one warehouse and one location. Initial stock is zero.
4. Choose your interface language in the header. English is the default. Add staff in WordPress → Users, using StockFlow Manager or StockFlow Operator.
5. Set your currency in Settings. Review the sample prices, minimum quantities, units and names before use. Products → Opening stock records an initial receipt at a chosen location with an opening-inventory audit reference. Use Stock actions on the same row for receive, issue, transfer or count.
6. For a staff terminal on a WordPress page, insert `[ordrivo_stock_terminal]`. Authorized signed-in staff can use it; visitors cannot access inventory.
Requirements: WordPress 6.4 or newer, 64-bit PHP 7.4 or newer, MySQL/MariaDB with InnoDB and permission to create tables. The verified environment is WordPress 7.1.3, PHP 8.3.6 and MariaDB 10.11.14. Other advertised minimum versions have not been tested in this environment. HTTPS is required for camera access. The terminal needs JavaScript and a modern browser supporting Intl and dialogs. This release has no subscription check or license server.
## Ten industries, 300 editable products
Each industry has 30 specific sample products: retail shop, car workshop, wholesale, restaurant, café, office supplies, cleaning company, beauty salon, construction trade and ecommerce. These are examples, not ten separate company accounts. A WordPress installation shares one stock database. Categories have realistic illustrative images; products inherit their category image until a manager assigns a product-specific image through the WordPress Media Library.
Products → Opening stock is visible for active products with zero total stock. It adds the entered quantity to the selected location; it is not an absolute balance setter. Products → Stock actions offers direct Receive stock, Issue stock, Transfer stock and Stock count dialogs. Stock count sets the absolute total in one location and remains manager-only. The editor includes guidance and a Stock actions shortcut opening a preselected product in the terminal. On mobile the catalog displays product cards so stock actions stay visible.
Products → Edit lets managers change name, SKU, barcode, category, image, unit, cost, selling price, minimum quantity and active status. SKUs must be unique. If a new or edited SKU already belongs to another product, StockFlow shows a clear validation message before saving; the current product may keep its own SKU while editing. Categories → Edit changes the display name and image. Category slugs and a location's warehouse association remain fixed after creation to protect references. Archive records through Inactive; stock history stays available. Demo records are ordinary editable records. Demo catalog seeding runs once on an empty catalog and is not reapplied over your edits.
## Languages
English, Swedish, Finnish, German, Turkish, Arabic, Persian and Kurdish (Kurmanji, Latin script). Each staff member has a saved interface language. Arabic and Persian use right-to-left layout. Navigation, forms, operational messages and report labels use local bundled dictionaries, with no translation API dependency. Product names, category names, units and references are your business data and are edited manually; this is not automatic content translation. Native-speaker certification has not been performed.
## Warehouses, locations and stock terminal
Create warehouses, then their locations. The same stock controls are available from the catalog; the Terminal searches products by name, SKU or barcode. Enter an exact SKU/barcode and press Enter for direct selection. Keyboard-style USB/Bluetooth scanners can supply that text. Camera scanning is an optional browser BarcodeDetector feature; availability varies. Manual entry remains available. Mobile browser viewports were tested for stock entry; physical camera/scanner hardware has not been verified.
Receive adds to a location. Issue deducts from a location and rejects insufficient stock. Transfer deducts from one location and adds to another in the same transaction. Count sets the absolute quantity counted in one location and requires manager permission. Every operation needs a reference and records the actor, UTC timestamp, before/after balances and operation type. Retries reuse the operation key so a repeated request does not add or subtract stock twice; changing an already-used request produces a conflict.
Quantities and prices support up to four decimal places using integer storage. Values are nonnegative, up to 999999999.9999; stock balances have the same maximum. There is one configurable currency with no exchange-rate conversion. The dashboard's low-stock figure compares each active product's total stock across locations to its minimum. It is a dashboard indicator, not an automated purchase or email notification.
## Purchasing
Create a supplier with editable company/contact details. Purchasing → Add creates a draft with up to 100 lines. Search products, select quantities/costs and add a reference. Mark the draft Ordered when appropriate. Receive each order line into a location; partial receipts update the order to Partial, and completed lines update it to Received. Receiving above the outstanding quantity is rejected. Draft, ordered and partial orders can be cancelled; cancelling does not undo already received stock. If a delivery must be returned, record a referenced Issue.
This is an internal purchase record. It does not send orders to suppliers, create invoices, calculate tax, process payments or replace accounting software. Prices do not include a tax calculation.
## WooCommerce stock mirror
WooCommerce is optional. When inactive, its enable/location/import controls are disabled and the interface explains that it must be activated. To use the mirror:
1. Activate WooCommerce and configure its store.
2. Enable WooCommerce → Settings → Products → Inventory → Manage stock.
3. In StockFlow → Settings set the same currency as WooCommerce, enable the mirror, select an active warehouse location, and Save.
4. Import WooCommerce products becomes available when all prerequisites are satisfied. The interface shows WooCommerce's currency for reference; prices are not converted.
If the integration is disabled, inventory management is off, the mirror location/warehouse is inactive or the currencies differ, Import is disabled and the relevant corrective instruction is displayed. The backend rechecks these conditions. If a configuration changes after a page loads, the operation displays an actionable error and refreshes controls; an expected conflict uses HTTP 409, not an unexplained HTTP 400. An actual server/database failure is reported rather than presented as success.
Supported: published simple products and variations that manage their own stock with backorders disabled. Products sharing parent stock, unmanaged/backorder-enabled stock, conflicting SKUs and locally archived linked records are skipped. The import summary reports imported/skipped counts. Unsupported local stock quantities are not rounded into supported values. Imported products use WooCommerce name, SKU, image and price initially. Later product metadata edits are not synchronized automatically. WooCommerce stock changes, order deductions and stock restoration update the linked StockFlow location. WooCommerce may store 12.000000 after a stock update; StockFlow strips only redundant fractional zeros, preserving the exact quantity and rejecting meaningful precision beyond four decimals.
WooCommerce owns the selected mirror location. Local StockFlow movements for a linked product at that location are blocked, preventing a second deduction. Catalog/terminal movement dialogs exclude this mirror location for linked products; use WooCommerce to change its balance. Local movement choices require an active independent location, and transfers need two eligible locations. Other warehouse locations can be managed independently and do not add to WooCommerce's sellable stock. This is a one-way stock mirror, not combined warehouse availability or two-way synchronization. Once linked products exist, the mirror location cannot be changed through Settings. If a sync fails, the dashboard shows a warning; correct the source data/configuration and use Refresh on the linked product. Do not change currencies while relying on existing imported prices; no automatic price conversion occurs.
## Access, reports and privacy
Administrators and StockFlow Managers manage catalog, suppliers, warehouses, purchasing, counts and settings. Operators can view inventory/history/supplier details and receive, issue, transfer and receive purchase lines; they cannot edit catalog, count or change settings. Grant these roles only to trusted staff. Frontend and AJAX operations require WordPress sign-in, capability checks and nonces. There is no public customer booking portal in this inventory plugin.
Products and ledger use 50-row pagination. Purchasing shows the latest 100 orders; Balances shows up to 1000 location balances. Stock and ledger CSV exports include all matching rows and escape common spreadsheet formula prefixes. Large exports load rows in PHP memory: choose suitable hosting for your catalog and benchmark your own workload. This release has no documented enterprise load benchmark.
WordPress privacy export/erasure supports supplier contacts by email. Erasure removes email, phone and address while retaining the supplier company name and stock audit. Database/file backups may still contain earlier contacts according to your backup retention policy. The plugin has no built-in telemetry or external stock service. Category assets are local, unless you configure an external image URL.
## Maintenance and limits
Back up the database together with uploaded media before updates. Disable caching for authenticated terminal pages. Dashboard statistics and the selected terminal product refresh about every ten seconds while the tab is visible; this is polling, not a push service. Other screens refresh on navigation/actions. Deactivation retains data; deleting the plugin also retains its tables and role capabilities in this release. Removing historical inventory data requires a deliberate separate database cleanup.
The catalog uses product cards on mobile; other wide tables scroll inside their own container. Real Chrome stock entry was tested at desktop and 390px mobile width, including Arabic RTL/English LTR switching. Verify your physical phone, scanner/camera and WordPress theme before launch. There are no serial/lot numbers, expiry tracking, reservations, picking routes, multi-company separation or accounting integrations. Marketplace acceptance and buyer demand are not guaranteed.
## Image license
All ten bundled JPEG category images are GPL-2.0-or-later, the same as the code. They may be modified and redistributed under GPL terms, including commercially and outside this plugin/demo. See IMAGE-SOURCES.md and assets/images/LICENSE.txt.
## Verify your workflow after setup
Create/edit/delete an unused product, create/edit/delete unused categories, warehouses and locations, assign product/category images from the Media Library, record Opening stock from the catalog, then receive/issue quantities, transfer between locations and perform a physical count. Check Stock by location and Movement history. Create/edit/delete an unused supplier, create/place a purchase order and receive it partially and completely. If using WooCommerce, import supported products, update their WooCommerce stock and verify the selected mirror balance. Do not enter the same mirror stock a second time in StockFlow. TEST-RESULTS.md documents the release tests.
## Remove demo products or delete unused products
Open StockFlow → Settings → Demo catalog → Remove demo products. Review the confirmation before proceeding. The result shows deleted and protected counts. On a fresh installation, all 300 untouched products can be removed, leaving an empty Products list. Categories and operational setup remain for your own use. Removed samples are not recreated by updates or reactivation.
Products with any stock movement (even after stock returns to zero), any purchase-order item (including draft/cancelled orders), any non-zero stock balance or a WooCommerce link are protected. No stock/history reset is provided. A protected product can be marked inactive instead. Individual Products rows have Delete product; the button is disabled with an explanatory tooltip when references exist. The server independently checks protection and permissions.
New installations mark demo provenance explicitly. When upgrading from earlier releases, only records whose original catalog name, SKU, barcode, category, unit, prices, minimum and image state match are recognized, and WooCommerce-linked records are excluded. Edited legacy products are retained; use individual deletion after reviewing them if they have no references. Do not use a SKU alone as evidence of sample origin.
To begin with WooCommerce: remove unused demos, activate WooCommerce and its inventory management, configure matching currency and an active StockFlow mirror location, enable the mirror, then use Import WooCommerce products. Store stock remains owned by WooCommerce. Importing again does not duplicate existing mappings. The cleanup does not remove your WooCommerce products.
## Removing unused setup records
Managers can delete unused categories, warehouses, locations and suppliers from their list. StockFlow asks for confirmation and explains why a record cannot be removed when products, locations, stock movements, WooCommerce or purchase orders still refer to it. Remove or reassign those dependencies first; historical stock and purchasing records are retained. To assign a category image, choose **Choose image**, select an image in the WordPress Media Library and click **Use this image**. The editor returns with the selected image preview.
## Duplicate SKU validation — 6.0.5
Product creation and editing check the submitted SKU against other products before the database write. A conflict displays a translated message asking the manager to enter a unique SKU. Editing a product with its existing SKU is allowed because the duplicate lookup excludes that product ID. The database unique index remains in place as a final integrity safeguard.
---
# StockFlow 6.0.3 — demo cleanup and product deletion verification
Date: 13 October 2026.
## Environment
Clean WordPress 7.1.3 database, PHP 8.3.6, MariaDB 10.11.14, Twenty Twenty-Five 1.5; real Chrome headless shell 151.0.7922.34. Actual WooCommerce 11.2.1 plugin, simple and variable products, no mocked WooCommerce import. Desktop 1440×1000 and mobile 390×844. Test-only mail capture/update suppression remains outside the product.
## Current-version checks
- Final 6.0.3 ZIP installed and activated through native WordPress browser upload on a clean database; interface version verified.
- Native browser Settings → Remove demo products deletes all 300 fresh samples with confirmation, leaving an empty Products list.
- Reactivation does not reseed. Repeated cleanup deletes zero own products.
- Unused own product deleted from its catalog row with confirmation; omitted confirmation rejected server-side.
- From the cleaned inventory, actual WooCommerce import brings in a managed-stock simple product (8 units) and variation (6 units); an unmanaged product is skipped. Re-import remains duplicate-free.
- WooCommerce mapping blocks deletion; stock remains intact.
- Receive 3 then issue 3 leaves zero stock but two movement records; deletion is blocked and ledger preserved.
- A draft purchase-order item blocks deletion even before receipt.
- Operator role has no deletion controls and unauthorized cleanup is rejected on the server.
- Cleanup control is visible at mobile width; no JavaScript exceptions in the completed browser suite.
- A real 6.0.2 installation was upgraded to 6.0.3. With one edited sample, one own product, one sample with a stock movement and one with a purchase reference, cleanup deleted 297 and protected two; the edited/own products also remained. Historical records stayed readable.
## Safety design and limits
The removal operation locks product rows in a database transaction and rechecks moves, purchase items, balances and WooCommerce mappings. Purchase creation also locks product rows, so it cannot create references to a concurrently deleted product. New samples carry an explicit is_demo marker. Legacy identification requires an exact untouched catalog match; this is intentionally conservative. Categories and bundled images remain because users can reuse them; the cleanup removes product records, not the complete database.
This report documents the tested local browser/runtime behavior. No production site data was removed. The complete stock/purchasing/WooCommerce regression browser suite was also rerun on 6.0.3: product create/edit, opening stock, receipts/issues, transfers/counts/balances/ledger, supplier/PO partial and full receipts, simple/variation imports, synchronization, real WooCommerce order stock deduction/restoration, readiness failures and mobile/RTL/operator permissions passed. Prior-version evidence is retained separately for context.
# 6.0.4 — requested record deletion and Media Library fixes
Date: 14 October 2026.
## Verified in the available workspace
- JavaScript syntax check passed for `assets/app.js`.
- `languages/ui.json` parses and all eight locale dictionaries contain deletion labels, confirmation text and clear dependency messages for categories, warehouses, locations and suppliers.
- Static source checks confirm all four list views render manager-only delete actions, the AJAX delete endpoint requires `ordrivo_sf_manage` and explicit confirmation, and the core deletion handler checks the corresponding dependency before removing a record.
- Static source checks confirm stock movements lock their location rows and purchase-order creation locks the supplier row, serializing those operations against deletion.
- Static source checks confirm the WordPress Media Library is enqueued for managers, the picker assigns the selected attachment ID/preview, closes after selection and restores the editor.
- Version declarations and release documentation identify 6.0.4.
## Verification still required on WordPress
This workspace has no PHP CLI, WordPress installation/database, or browser test runtime. Therefore the new PHP code and actual WordPress flows could not be installed or exercised here. Before describing the following as end-to-end tested, run them on a clean WordPress site with a manager account and an operator account: create/edit/delete an unused product, category, warehouse, location and supplier; verify product/category image selection from the Media Library; verify a used category, non-empty warehouse, location with movement/non-zero stock/WooCommerce mapping, and supplier with purchase orders are blocked with the expected explanation; verify managers alone see/use delete controls; and rerun the 6.0.3 stock, purchasing and WooCommerce regression suite. The prior 6.0.3 browser results above are retained as historical baseline and do not claim to test these new 6.0.4 paths.
# StockFlow Pro 6.0.5 — duplicate SKU validation
Date: 15 October 2026.
## Checks performed in this workspace
- `languages/ui.json` parses as valid JSON, has all eight locale dictionaries, and includes the `duplicateSku` message in every locale.
- Static source checks confirm the product lookup runs after validating the target ID and before either `$wpdb->insert()` or `$wpdb->update()`.
- The lookup uses the submitted sanitized SKU and excludes the current product ID, allowing a product to retain its own SKU during edits.
- Duplicate conflicts raise the dedicated `duplicateSku` validation code; the AJAX handler returns the localized message as a validation/conflict response instead of reaching the database write.
- An isolated SQL behavior check passed for duplicate create, unchanged-SKU self-edit, change to a free SKU, duplicate edit rejection and the unique-index fallback. This verifies the lookup predicate behavior, not WordPress integration.
- JavaScript syntax and package ZIP integrity checks passed.
## Retest limitation
This workspace has no PHP CLI, WordPress installation/database, or browser test runtime. I therefore could not run the requested live create/edit workflow against WordPress. Before claiming end-to-end testing, verify in WordPress: create a product with a new SKU; attempt another product with that SKU and confirm a friendly validation message with no database error; edit a product without changing its SKU; change it to a free SKU; and change it to another product's SKU and confirm rejection while the original product remains unchanged. The 6.0.3 browser regression results above are historical and do not cover this 6.0.5 validation change.