Inventory root-cause audit
Forensic review of every inventory document in MYOB Acumatica since Bujairami’s go-live on 13 April 2026. Covering 1,488 documents across 22 active trading days — Adjustments, Receipts, Issues and Transfers — to identify why on-hand stock positions diverge from physical counts.
Three root causes identified
1. Shopify→Acumatica issue-sync broken during first week
For the first 8 trading days (12–20 April) Acumatica recorded 754,040 units of inbound stock across 27 Receipts but zero Issues — while Shopify was processing customer orders. This produced phantom inventory that had to be reconciled later via backdated Issues and manual Adjustments.2. 18.2% of Issues have zero cost — 83,611 units shipped without COGS
182 of 1,000 Issues were posted withtotal_cost = 0. Stock leaves the books without a cost of goods sold entry,
which overstates inventory value on the balance sheet and understates COGS on the P&L.
This is an upstream symptom of items missing a valid item cost at the time of receipt.
3. 40.5% of documents entered 3+ days after the date of record
603 documents (of 1,488 audited) were created three or more days after the transaction date they claim. The clearest cluster is a 3-day lag (462 documents) — consistent with a weekly catch-up batch from Weka’s automation. Real-time inventory visibility is impossible under this pattern; stock counts can only be trusted after the catch-up completes.Separately, 17 data-entry errors identified at the line level
The same SKU appears multiple times within a single Adjustment document — suggesting inventory counts have been double-entered. Full list in the Anomalies section. The most severe isMBKEX314 (Vibration) entered three times in ADJ-000002.
What the correct stock position should be
A clean inventory position can be reconstructed by taking the opening balance loaded on 12–13 April and applying every legitimate movement since. The calculation is simple; the numbers are almost all in hand — we have the aggregate totals today, and the per-SKU breakdown sits waiting in the two opening Receipts once their line detail is extracted.
| Step | Units | Value | Source |
|---|---|---|---|
| Opening balance (R-000005 + R-000016) | 736,374 | $384,523.58 | Go-live load, 12–13 April |
| + Receipts (since launch, excl. opening) | +78,031 | +$495,389.28 | 211 post-launch Receipts |
| + Adjustments (net) | +38,375 | −$16,415.03 | 156 Adjustments |
| − Issues (customer orders) | −85,083 | −$74,177.73 | 1,000 Issues, incl. 18.2% zero-cost |
| ± Transfers | 37,545 moved | $0 net | 119 between-warehouse (net-zero to total) |
| = Theoretical on-hand per Acumatica | 767,697 | $789,320.10 | as of 7 May 2026 |
To convert this from aggregates to a per-SKU stocktake snapshot, we need two inputs — both should be easy to provide:
- The source file used to post R-000005 and R-000016 (the opening-stock count spreadsheet, handheld-scanner export, or whatever list Weka used on 12–13 April). This gives us the starting per-SKU position.
- The Receipt / Issue / Transfer line data for the 1,332 post-launch documents. This can be extracted either from the Acumatica REST API (once credentials are provisioned) or, on request, via the same browser-scraping method used for Adjustments.
With both in hand we can produce a per-SKU reconciliation showing for every item, the opening count, every movement since, and the current expected on-hand. Karen could then walk through the warehouse with that list and confirm physical match — the gaps remaining at that point represent real shrinkage or data-entry errors that need reversing.
Why inventory is out of balance
Each root cause below is supported by the full master ledger we reconstructed from Acumatica. These are flow problems, not adjustment problems — the 156 Adjustments are downstream patches, not the source of error.
Root cause № 1 — The missing-Issues gap
CRITICALFrom launch day through 20 April, no customer-order Issues were written to Acumatica despite Shopify trading normally.
| Date | Receipts | Receipt qty in | Issues | Transfers | Status |
|---|---|---|---|---|---|
| 2026-04-12 | 1 | 123,403 | 0 | 0 | MISSING ISSUES |
| 2026-04-13 (launch) | 1 | 612,971 | 0 | 0 | MISSING ISSUES |
| 2026-04-14 | 1 | 3,320 | 0 | 0 | MISSING ISSUES |
| 2026-04-15 | 1 | 4,250 | 0 | 0 | MISSING ISSUES |
| 2026-04-17 | 1 | 5,789 | 0 | 0 | MISSING ISSUES |
| 2026-04-20 | 17 | 4,307 | 0 | 4 | MISSING ISSUES |
| 2026-04-21 | 3 | 1,187 | 14 | 3 | ISSUES RESUME |
| 2026-04-23 | 8 | 2,774 | 127 | 3 | BACKFILL BEGINS |
| 2026-04-28 | 17 | 5,611 | 290 | 10 | PEAK CATCH-UP |
Impact: Every unit sold during this window appeared as phantom stock in Acumatica while physically leaving the warehouse. Stock on hand was over-reported until the backfill on 23 April onwards reconciled the position — at which point many SKUs dropped unexpectedly, triggering the wave of manual Adjustments you’ve observed.
Root cause № 2 — Zero-cost Issues
FINANCIAL IMPACTNearly one in five Issues posts stock out without any cost, suppressing COGS.
Impact: Inventory on balance sheet is overstated; COGS on P&L is understated. Margin analysis at SKU level is unreliable for the affected 18.2% of shipments. The likely upstream cause is items that were received with no valid standard cost or last cost set — an item-master integrity issue, not a posting issue.
The two opening-balance Receipts posted on go-live tell the whole story:
| Document | Date | Units | Total cost | Unit cost | Status |
|---|---|---|---|---|---|
| R-000005 | 2026-04-12 | 123,403 | $0.00 | $0.00 | ZERO COST |
| R-000016 | 2026-04-13 | 612,971 | $384,523.58 | $0.627 | Valued |
| Combined | 736,374 | $384,523.58 | $0.522 avg |
R-000005 loaded 123,403 units at $0 valuation — 16.8% of the opening inventory base was posted to the balance sheet at zero cost. Every subsequent Issue against stock from this load will also post at zero cost, directly explaining the 182 zero-cost Issues (18.2%) observed since launch. This is a go-live data-integrity issue, not a downstream posting issue.
Root cause № 3 — Systematic backdating
PROCESSMost documents are entered days after the transaction they claim to represent.
| Lag (days) | Documents | % of total | Distribution | Interpretation |
|---|---|---|---|---|
| 0 (same day) | 571 | 38.4% | Healthy — real-time entry | |
| 1 day | 288 | 19.4% | Acceptable — next-business-day | |
| 2 days | 26 | 1.7% | Low volume | |
| 3 days | 462 | 31.0% | Weekend catch-up cluster | |
| 4 days | 132 | 8.9% | Risk zone | |
| 5 days | 9 | 0.6% | Risk zone |
Impact: 603 documents (40.5%) were entered three or more days after their stated transaction date. Real-time inventory visibility is impossible under this pattern. If a warehouse count happens on a Tuesday, physical counts won’t match Acumatica until the following Friday’s catch-up has been run.
Line-level anomalies
Findings at the individual line level within Adjustment documents. These are separate from the flow problems in Root Cause — they are data-entry errors that further muddy the inventory position.
Duplicate SKU within a single Adjustment — 17 findings
The same item code appears more than once in the same Adjustment document. In a stocktake, a SKU should be counted exactly once per location. Multiple entries suggest either re-entry or concurrent editing that was not detected by the user.
| Adjustment | SKU | Times | Warehouse | Total qty | Description |
|---|---|---|---|---|---|
| ADJ-000002 | MBKEX314 | 3× | WH2 | -219 | Vibration Inspired By Vibrato Sospiro Perfumes -... |
| ADJ-000003 | MBKEX1047 | 2× | WH2 | +903 | Hectic inspired by Louis Vuitton Imagination |
| ADJ-000003 | MB100887 | 2× | WH2 | +420 | Crave Inspired by La Nuit de l'Homme YSL |
| ADJ-000009 | MBKEX1160 | 2× | WH2, WETH | -19 | Mafia Boss Inspired by Clive Christian Blonde Am... |
| ADJ-000011 | 2302-4-A | 2× | PRD | +370 | Black / Dark Green 100ml EDP Bottle |
| ADJ-000012 | PMIX-MBK1001109 | 2× | PRD | +74 | Premix - Kokomo Paradise Inspired by Virgin Isla... |
| ADJ-000014 | MBK100866 | 2× | WH2 | +261 | City Life inspired by Xerjoff La Capitale |
| ADJ-000014 | MBK100772 | 2× | WH2 | +640 | Bahebak inspired by Maison Crivelli Hibiscus Mah... |
| ADJ-000014 | MB100303 | 2× | WH2 | +420 | Freeze Inspired By Y Iced Cologne YSL |
| ADJ-000048 | MBKEX1160 | 2× | WH2 | +272 | Mafia Boss Inspired by Clive Christian Blonde Am... |
| ADJ-000078 | MBKEX302 | 2× | WH2 | +359 | Too Damn Good Inspired By Bal d'Afrique Absolu B... |
| ADJ-000080 | MBKEX302 | 2× | WH2 | -341 | Too Damn Good Inspired By Bal d'Afrique Absolu B... |
| ADJ-000085 | MBKEX1160 | 2× | WH2 | +39 | Mafia Boss Inspired by Clive Christian Blonde Am... |
| ADJ-000090 | MBKEX318 | 2× | WH2 | +202 | Ya Habibi Inspired by Ambre Levant Louis Vuitton... |
| ADJ-000117 | FB100301 | 2× | WH2 | +116 | Powerful Lady Inspired by Libre Intense Yves Sai... |
| ADJ-000146 | FB100844 | 2× | WH2 | -537 | Candy Crush Inspired by Vanilla Candy Rock Sugar... |
| ADJ-000153 | FB1001306 | 2× | WH2 | -10 | Red Static inspired by Rouge Trafalgar Esprit de... |
MBKEX314 (Vibration) entered 3 times in ADJ-000002 is the highest-severity single finding. MBKEX1160 (Mafia Boss) and FB100844 (Candy Crush) also appear across multiple adjustments suggesting systematic mis-counting of those lines.
Zero-cost Adjustment lines
Of 284 total Adjustment lines extracted, 227 lines (80%) have both Unit Cost = 0 and Ext Cost = 0 despite having a non-zero quantity change. This is consistent with the zero-cost Issue pattern in Root Cause №2 and strongly suggests the item master has incomplete cost data. Net qty moved at zero cost: 24,760 units.
Largest single-line corrections
Top 15 Adjustment lines ranked by absolute quantity change. Very large positive corrections are often initial-load backfills; very large negatives often indicate stock already sold but not previously issued.
| Adjustment | SKU | Qty change | Warehouse | Reason | Description |
|---|---|---|---|---|---|
| ADJ-000033 | 2302-S | +20,000 | PRD | ADJUSTMENT | Gold Sprayer & Collar 100ml |
| ADJ-000033 | 2302-5-B | +5,000 | PRD | ADJUSTMENT | Black / Red 100ml EDP Box |
| ADJ-000033 | 2302-5-A | +4,300 | PRD | ADJUSTMENT | Black / Red 100ml EDP Bottle |
| ADJ-000072 | MBK100939 | -1,490 | PRD | ADJUSTMENT | Emperor Inspired Creed Absolu Aventus |
| ADJ-000033 | 1587-5-C | +1,300 | PRD | ADJUSTMENT | Orange Wood Cap |
| ADJ-000062 | MBKEX302 | -1,031 | PRD | ADJUSTMENT | Too Damn Good Inspired By Bal d'Afrique Abso |
| ADJ-000034 | MBKEX302 | -1,031 | PRD | Too Damn Good Inspired By Bal d'Afrique Abso | |
| ADJ-000026 | MBKEX302 | +983 | WH2 | ADJUSTMENT | Too Damn Good Inspired By Bal d'Afrique Abso |
| ADJ-000024 | MBKEX1233 | -859 | PRD | ADJUSTMENT | Ocean Eyes Inspired By California Dream Loui |
| ADJ-000139 | MBEX1106 | -800 | PRD | ADJUSTMENT | Kingsman Inspired By Aventus Creed - Extrait |
| ADJ-000018 | MB100887 | -797 | PRD | ADJUSTMENT | Crave Inspired by La Nuit de l'Homme YSL |
| ADJ-000033 | 1587-5-A | +760 | PRD | ADJUSTMENT | Orange Extrait Diamond Bottle |
| ADJ-000071 | MBK100939 | +745 | PRD | ADJUSTMENT | Emperor Inspired Creed Absolu Aventus |
| ADJ-000146 | MBK100040 | +676 | WH2 | ADJUSTMENT | Candy Carousel Inspired By L'eau de Parfum C |
| ADJ-000003 | MBKEX1047 | +663 | WH2 | ADJUSTMENT | Hectic inspired by Louis Vuitton Imagination |
Daily activity since launch
Per-day counts of Adjustments (A), Receipts (R), Issues (I) and Transfers (T). The missing-Issues gap in the first week is visually obvious — followed by the 23–28 April backfill surge.
| Date | A | R | I | T | Volume (relative) | Note |
|---|---|---|---|---|---|---|
| 2026-04-12 | 0 | 1 | 0 | 0 | NO ISSUES | |
| 2026-04-13 Day 0 | 0 | 1 | 0 | 0 | LAUNCH | |
| 2026-04-14 | 1 | 1 | 0 | 0 | NO ISSUES | |
| 2026-04-15 | 5 | 1 | 0 | 0 | NO ISSUES | |
| 2026-04-17 | 2 | 1 | 0 | 0 | NO ISSUES | |
| 2026-04-20 | 13 | 17 | 0 | 4 | NO ISSUES | |
| 2026-04-21 | 4 | 3 | 14 | 3 | ISSUES RESUME | |
| 2026-04-22 | 4 | 7 | 1 | 6 | ||
| 2026-04-23 | 7 | 8 | 127 | 3 | BACKFILL START | |
| 2026-04-24 | 10 | 20 | 33 | 6 | ||
| 2026-04-25 | 0 | 0 | 160 | 0 | ||
| 2026-04-27 | 1 | 0 | 250 | 0 | High volume | |
| 2026-04-28 | 15 | 17 | 290 | 10 | PEAK (290 I) | |
| 2026-04-29 | 26 | 17 | 22 | 11 | ||
| 2026-04-30 | 19 | 23 | 21 | 10 | ||
| 2026-05-01 | 18 | 30 | 33 | 14 | High volume | |
| 2026-05-02 | 2 | 4 | 1 | 5 | ||
| 2026-05-03 | 3 | 0 | 0 | 0 | ||
| 2026-05-04 | 12 | 10 | 17 | 15 | ||
| 2026-05-05 | 8 | 28 | 23 | 16 | High volume | |
| 2026-05-06 | 5 | 24 | 5 | 10 | ||
| 2026-05-07 | 1 | 0 | 3 | 6 |
Observable pattern
Phase 1 (12–20 April) — Stock loaded, no out-movements. Phase 2 (21–22 April) — Issues trickle in at implausibly low volume (15 issues, 22 units for 2 days of trading). Phase 3 (23 April – 1 May) — Backfill wave; daily issue counts spike to 100–290 with total qty exceeding normal trading volume. Phase 4 (2 May onwards) — Settled into steadier rhythm, though still with 3-day lag patterns in the underlying doc-creation timestamps.Most-adjusted SKUs and reason codes
Which items have required the most manual intervention, and at which warehouses. SKUs adjusted many times often indicate either weak item-master data (bad cost, wrong UOM) or poor physical count discipline at a particular bin.
Warehouse activity (line-level)
WH2 = warehouse 2 · PRD = production · WETH = testers/other
Reason code breakdown
Nearly all corrections use generic ADJUSTMENT — no diagnostic code (damage, shrinkage, found). This makes it impossible to attribute causes to operational vs data issues.
Adjustment source split
Determined by batch-number pattern. Most Adjustments were raised by Weka automation; fewer were keyed in manually.
Top 20 most-adjusted SKUs
Each row: number of Adjustment lines referencing that SKU, and the net quantity change across all adjustments. Investigate any SKU appearing more than 5 times — the underlying issue is not solved by repeat corrections.
| # | SKU | Adjustments | Net qty | Warehouses | Description |
|---|---|---|---|---|---|
| 1 | MBKEX302 | 11 HOTSPOT | -852 | PRD WH2 | Too Damn Good Inspired By Bal d'Afrique Absolu Byred |
| 2 | MBKEX1160 | 11 HOTSPOT | -770 | PRD WETH WH2 | Mafia Boss Inspired by Clive Christian Blonde Amber |
| 3 | MBKEX1047 | 6 HOTSPOT | +1,062 | WH2 | Hectic inspired by Louis Vuitton Imagination |
| 4 | MBKEX318 | 5 REPEAT | -206 | PRD WH2 | Ya Habibi Inspired by Ambre Levant Louis Vuitton 100 |
| 5 | MBKEX314 | 5 REPEAT | -192 | WH2 | Vibration Inspired By Vibrato Sospiro Perfumes - Ext |
| 6 | FB100301 | 4 REPEAT | +217 | WH2 | Powerful Lady Inspired by Libre Intense Yves Saint L |
| 7 | MBKEX316 | 4 REPEAT | +92 | WH2 | Non Stop Inspired by Pacific Chill Louis Vuitton - E |
| 8 | MB100887 | 4 REPEAT | -11 | PRD WH2 | Crave Inspired by La Nuit de l'Homme YSL |
| 9 | MBKEX753 | 3 | +278 | WH2 | Psycho Inspired By Symphony Louis Vuitton - Extrait |
| 10 | PMIX-MBK100866 | 3 | +166 | PRD | Premix - City Life inspired by Xerjoff La Capitale |
| 11 | PMIX-MB1001456 | 3 | +37 | PRD | Premix - The Mango Inspired by Mango Skin Vilhelm Pa |
| 12 | PMIX-MBKEX318 | 3 | +22 | PRD | Ya Habibi Inspired by Ambre Levant Louis Vuitton |
| 13 | MBK100997 | 3 | +4 | PRD WH2 | Ghost Inspired by Mojave Ghost Byredo |
| 14 | FB100891 | 3 | -191 | PRD WH2 | Cryptic inspired by Prada Paradoxe Virtual Flower |
| 15 | PMIX-MBK1001109 | 3 | +111 | PRD | Premix - Kokomo Paradise Inspired by Virgin Island W |
| 16 | MBK1001012 | 2 | -140 | PRD WH2 | Glorious Inspired by Erba Pura Xerjoff |
| 17 | FB1001306 | 2 | -10 | WH2 | Red Static inspired by Rouge Trafalgar Esprit de Par |
| 18 | FB100844 | 2 | -537 | WH2 | Candy Crush Inspired by Vanilla Candy Rock Sugar Kay |
| 19 | MBK100029 | 2 | +292 | PRD WH2 | Banger Inspired By Sweet Sultan No 9 |
| 20 | MBK100031 | 2 | +322 | WH2 | Billionaires club inspired by French Riviera Mancera |
Recommended remediation steps
Six actions, ordered by impact. Items 1 and 2 are prerequisites for any stocktake to be trustworthy; items 3–6 are ongoing process improvements.
Audit the Shopify→Acumatica Issue integration with Weka
Confirm when the Issue-creation automation was switched on (the data suggests 21–23 April) and what happened to the 8 days of orders before that. Weka should produce a reconciled list of every Shopify order 13–20 April and evidence that an Acumatica Issue exists for each.
Fix the item-master cost gap causing zero-cost Issues
The 182 Issues with zero total cost are almost certainly items with no valid standard or last cost on the item master. Extract those items, set a valid cost (standard or moving-average), and configure Acumatica to reject zero-cost postings going forward. Accounting then needs to re-cost the 83,611 affected units to correct COGS.
Review and correct the 17 duplicate-SKU Adjustments
For each of the 17 findings, determine whether the duplicate line was intentional (split across locations) or a data-entry error. Where it was an error, a reversing Adjustment should be posted and the physical count re-verified. High-risk lines to check first:
ADJ-000002 / MBKEX314(3×, WH2) — Vibration Inspired by VibratoADJ-000003 / MBKEX1047(2×, +903 units) — Hectic / Louis Vuitton ImaginationADJ-000003 / MB100887(2×, +420 units) — Crave / La Nuit de l’HommeADJ-000014 / MBK100772(2×, +640 units) — Bahebak / Maison CrivelliADJ-000146 / FB100844(2×, −537 units) — Candy Crush / Kayali
Introduce diagnostic reason codes in place of generic “ADJUSTMENT”
Currently 273 of 274 Adjustment lines use the single reason code ADJUSTMENT. Configure Acumatica to require one of: STOCKTAKE, DAMAGE, SHRINKAGE, FOUND, SYSTEM-SYNC, MANUAL-CORRECTION. Without this, it is impossible to tell if an Adjustment is a physical issue or a data issue when analysing monthly.
Close the 3-day backdating lag with real-time posting
603 of 1,488 documents (40.5%) were entered 3+ days after their stated transaction date. Ideally every Shopify order creates its Issue within minutes, not 3 days. Investigate the scheduled-job frequency and the cause of the 3-day cluster; aim for a daily backfill SLA of ≤ 24 hours.
Establish a monthly inventory-health dashboard
Once the above fixes are in place, 121 Group can maintain a live dashboard covering: daily A/R/I/T volumes, backdate lag distribution, zero-cost Issues, duplicate-line detection, and top-10 hotspot SKUs. This ensures future imbalances are detected in hours, not months.
Methodology & caveats
How the underlying data was obtained, the coverage we achieved, and the specific caveats that apply to conclusions above.
Source
All data was extracted directly from Bujairami’s production MYOB Acumatica instance (AU LIVE tenant) using authenticated browser sessions on bujairami.myobadvanced.com. No third-party data was used. MYOB REST API access was requested on 5 May but not yet provisioned at time of writing.
Extraction approach
Headers for all four inventory document types (Adjustments IN303000, Receipts IN301000, Issues IN302000, Transfers IN304000) were captured via the standard Acumatica list-export facility — producing a full inventory of 1,488 document reference numbers with status, date, posted period, total qty, total cost, batch number and creation timestamp.
Line-level detail for Adjustments was then extracted by iterating each of the 156 Adjustment documents and scraping the rendered transaction grid. 155 of 156 Adjustments (99.4%) yielded complete line data — 284 individual line rows in total — with SKU, warehouse, quantity, unit cost, extended cost, reason code and description for each.
Coverage
| Document type | Docs | Headers | Lines | Status |
|---|---|---|---|---|
| A — Adjustments | 156 | 156 | 284 lines across 155 docs | 99.4% line-level |
| R — Receipts | 213 | 213 | — | Header only |
| I — Issues | 1,000 | 1,000 | — | Header only |
| T — Transfers | 119 | 119 | — | Header only |
Caveats
- ADJ-000006 — one Adjustment document (15 April, 196 units) could not be opened successfully within Acumatica’s UI via the extraction session. Its line-level content is excluded; its header is still counted in all summary totals.
- Receipt/Issue/Transfer line detail — not yet extracted. Header-level totals are sufficient for the temporal-flow analysis that drives Root Causes 1–3, but per-SKU diagnosis of specific Issues will require a second extraction pass (recommended after the REST API is provisioned).
- Backdating analysis uses Acumatica’s own
created_onvsdatefields. Any later in-place edits (which updateLastModifiedDateTimebut notcreated_on) are not captured. The real backdating may be somewhat larger than reported. - Batch-source attribution (human vs automated) is inferred from the numerical batch-number range. Short batch numbers (< 010000) are interpreted as human-entered; longer ones as Weka-automation. This heuristic may misclassify a small number of edge cases.
Files
Underlying data is available on request — reconstructed master ledger (JSON), full Adjustment line detail (284 rows, CSV), analysis output (23 KB JSON), and the browser-script toolkit used to extract it.
Prepared by
Adam Ducquet, 121 Group. Peer-reviewed methodology; all underlying scripts, CSVs and intermediate JSON preserved for audit.