Full-instance operational, financial, and compliance assessment — conducted live against the NetSuite production ledger. Every figure in this report was extracted from system data on the dates noted; nothing is estimated unless explicitly flagged.
Confidential — Management Use OnlyMulti-channel retail / wholesale distributor — apparel (matrix color/size items), beauty, home & decor, electronics. Light assembly/kitting (24 work orders, 9 assemblies). Full order-to-cash and procure-to-pay cycles active.
Channels: 2 retail stores (San Francisco, New York), 2 distribution centers (Los Angeles, Chicago), Miami operation, 3PL and FBA (Amazon) fulfillment nodes.
Structure: NetSuite OneWorld — Parent + 2 operating subsidiaries + elimination entity. Single currency (USD). Calendar fiscal year.
| Employees | ~50 | Customers | 273 |
| Vendors | 94 | Items | 374 |
| All-time transactions | ~7,900 | 2026 invoices | 280 |
| 2026 cash sales | 363 | 2026 sales orders | 312 |
Primary operational challenge identified: financial-data integrity & compliance risk, followed by working-capital discipline and fulfillment throughput.
| Line | Amount | % Rev |
|---|---|---|
| Revenue — Products (4210) | $7,810,158 | 93.1% |
| Revenue — Services (4310) | $562,907 | 6.7% |
| Freight + returns/allowances | $15,752 | 0.2% |
| Total revenue | $8,388,817 | 100% |
| Cost of sales | $5,101,962 | 60.8% |
| Gross profit | $3,286,855 | 39.2% |
| Operating expenses | $2,095,318 | 25.0% |
| Net other income/(expense) | ($17,297) | — |
| Net income | $1,174,240 | 14.0% |
| Line | Amount |
|---|---|
| Cash | $2,600,906 |
| Accounts receivable | $2,163,312 |
| Inventory (GL) | $2,128,262 |
| Prepaids & other current | $122,287 |
| Total current assets | $7,014,767 |
| Fixed assets, net | $11,258 |
| Accounts payable | $1,229,000 |
| Sales tax payable (12 states) | $228,116 |
| Other accrued | $33,584 |
| Total equity | $5,535,324 |
createdby (import/system-created).closed='F') — five fiscal years of GL are mutable by anyone with entry permission.createdfrom lineage.Miami's negative average = systematically backdated shipment records (a Finding-3 symptom, not physics).
Excludes the $1.23M "No Customer" journal balance (Finding 1), which is unageable and uncollectible through workflow.
| Channel | Txns | Revenue | AOV | Share | Read |
|---|---|---|---|---|---|
| No location assigned ⚠ | 33 | $478,740 | $14,507 | 35.3% | Large wholesale invoices, dimension missing |
| LA Distribution Center | 83 | $459,020 | $5,530 | 33.9% | Core wholesale — and the fulfillment bottleneck |
| Miami | 31 | $312,769 | $10,089 | 23.1% | Wholesale |
| SF Store | 312 | $66,144 | $212 | 4.9% | High volume, tiny tickets |
| NY Store | 220 | $38,551 | $175 | 2.8% | High volume, tiny tickets |
| Total | 679 | $1,355,224 | — | 100% | Wholesale ≈ 92% of revenue |
The two retail stores generate 78% of transaction volume for 8% of revenue. Once the GL is trustworthy, store-level labor/rent allocation deserves a hard look (see Strategic roadmap).
Top-1 = 24% of spend; top-7 = 82.5% (cumulative). High concentration = negotiating leverage and supply risk — Generation N also carries a $342K aged payable.
Simply paying vendors to terms (Net 30) instead of within 3 days frees ~$135K of cash permanently at the current ~$1.8M annualized spend — zero negotiation required, one AP policy memo.
| Open POs (pending receipt / partial / pending bill) | 2 / 14 / 19 |
| Vendor bills pending approval (status D) | 4 |
| Sales orders pending approval (status A) | 13 |
| Received-not-billed accrual (acct 2220) | $30,704 |
custentity_ps_password stores plain-text credentials on vendor records. Previously flagged; still open. Purge and replace with a secrets-appropriate integration pattern.aggregateitemlocation; GL from Balance Sheet.Clean: zero value stranded in Quarantine, Return-to-Vendor, or In-Transit locations.
Chicago DC holds just $42.5K of stock while presumably carrying DC-class overhead — consolidate into LA/3PL or give it a mission (validate lease terms first).
| Control | Verdict | Evidence |
|---|---|---|
| Period close discipline | Fail | Nothing closed since Nov 2021; Dec 2021–Dec 2029 all open |
| Sub-ledger integrity (A/R, A/P, Inventory) | Fail | 51 / 52 / 51 journals posted directly to each control account |
| Sales tax remittance | Fail | $228K accrued across 12 states; <$90 of debits in ~2.5 years |
| Transaction date integrity | Fail | 19 pre-dated invoices (to −365d); shipment before SO; backdated Miami ships |
| Bad-debt reserving | Fail | $150 YTD expense vs ~$473K doubtful accounts |
| Credential hygiene | Fail | Plain-text passwords in custentity_ps_password on vendor records |
| JE documentation | Weak | 11/88 memo-less (incl. $85K JE160); 79/88 unattributed |
| Approval workflow throughput | Partial | Queues exist; 13 SOs + 4 bills parked without SLA |
| Duplicate entity prevention | Pass | 0 exact-name duplicates across customers and vendors |
| Payment application | Pass | 0 unapplied customer payments or credits; 746 payments fully applied |
| Customer credit balances | Pass | 0 customers with net credit A/R from open documents |
| # | Action | Owner | Impact | Effort |
|---|---|---|---|---|
| 1 | Sales-tax triage — engage SALT advisor; VDAs starting with CA, NY, MA, KY | CFO | $40–90K penalties avoided; caps growth | Low-Med |
| 2 | Collections blitz on top-5 overdue ($478K); credit-hold everything >60d | Controller | $200–350K cash | Low |
| 3 | JE forensics — classify 16 revenue + ~154 sub-ledger JEs; reverse/reclass through proper transactions | Controller + NS admin | Restores statement reliability | Med |
| 4 | Close periods Dec 2021 → Jun 2026 post-cleanup; monthly close calendar + checklist | CFO | Locks GL; ends backdating | Low |
| 5 | LA DC root-cause — one-week floor study: staffing / wave scheduling / availability | Ops | Protects #1 channel; ~$14K/mo WIP | Low |
| 6 | Pay vendors to terms — stop the 3-day payment habit | AP | ~$135K permanent cash release | Low |
| 7 | Make location + terms mandatory on invoices; assign terms to 219 no-terms customers | NS admin | Restores channel P&L visibility | Low |
| 8 | Purge plain-text credentials (custentity_ps_password) | NS admin | Closes security hole | Low |
| Initiative | Impact |
|---|---|
| Dunning automation (native NS Dunning SuiteApp) + enforced credit limits; aging-based reserve policy; DSO target <40 | Prevents regeneration of the $473K problem |
| Vendor consolidation & renegotiation — Net 30–45 terms and volume pricing across the top 7 (82% of spend) | $35–70K/yr |
| Retail inventory right-sizing — stores from ~2.9 yrs to <6 months of supply; liquidate 48 dead items | $300–400K one-time + $15–25K |
| Chicago DC decision — consolidate into LA/3PL or repurpose (validate lease) | $50–150K/yr |
| Approval SLA dashboards — saved searches + scheduled alerts for items parked >5 days | Queue hygiene |
| Close automation — bank-feed reconciliation, JE approval workflow with mandatory memo + attachment | Sustains Finding-3 fix |
| Opportunity | 90-day | 12-month | Type | Confidence |
|---|---|---|---|---|
| Collections recovery (top-5 + blitz) | $200–350K | +$100K | Cash, one-time | High |
| Vendor payment terms (DPO 3→30) | $135K | permanent | Cash, structural | High |
| Sales-tax penalty avoidance via VDA | $40–90K | stops accrual | Avoidance | High |
| Dead-stock liquidation (48 items) | $15–25K | — | Cash, one-time | High |
| Retail inventory right-sizing | — | $300–400K | Cash, one-time | Medium |
| Vendor renegotiation (top 7) | — | $35–70K/yr | P&L, recurring | Medium |
| Chicago DC rationalization | — | $50–150K/yr | P&L, recurring | Low-Med |
| Total identified | ~$390–600K | ~$500–750K additional | vs ~$30K external advisory + internal time → >10× 90-day return | |
Payback on every Phase-1 item is under 90 days. The largest unquantified upside — reliable financial statements — is a precondition for any credit facility, audit, or exit and is treated here as priceless rather than priced.
| Source | Used for |
|---|---|
| NS Income Statement (report -200), consolidated, TFYTP preset | P&L — period verified via rendered header "From Jan 2026 to Aug 2026" |
| NS Balance Sheet (report -202), consolidated | Balance sheet as of Aug 2026 period-end |
| NS A/R Aging Summary (274) / A/P Aging Summary (286) | Agings as rendered "As of July 31, 2026" (report default; noted as an assumption) |
SuiteQL — transaction, transactionline, transactionaccountingline, account, accountingperiod, customer, vendor, item, aggregateitemlocation, location, term | All cycle-time, aging, concentration, hygiene, and forensic analysis |
nexttransactionlink table is unpopulated for SO→fulfillment, so lineage was derived from shipment-line createdfrom references (266 pairs — robust sample).SELECT t.type, COUNT(DISTINCT t.id) AS txns, ROUND(SUM(-tal.amount),0) AS revenue FROM transactionaccountingline tal JOIN transaction t ON tal.transaction = t.id JOIN account a ON tal.account = a.id WHERE t.posting = 'T' AND a.accttype = 'Income' AND t.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD') AND t.trandate < TO_DATE('2026-09-01','YYYY-MM-DD') GROUP BY t.type ORDER BY SUM(-tal.amount) DESC -- Result: Journal 16 txns $7,036,333 · CustInvc 280 $1,290,378 · CashSale 363 $62,867 · minor others
SELECT COUNT(DISTINCT t.id) AS je_count, ROUND(SUM(tal.amount),0) AS net_amount FROM transactionaccountingline tal JOIN transaction t ON tal.transaction = t.id JOIN account a ON tal.account = a.id WHERE t.type = 'Journal' AND a.accttype = 'AcctRec' -- A/R: 51 JEs net +$1.239M · A/P (accttype='AcctPay'): 52 JEs net −$1.082M -- Inventory (fullname LIKE '%Inventory in Stock%'): 51 JEs net +$1,007,015
SELECT a.fullname, TO_CHAR(t.trandate,'YYYY') AS yr, ROUND(SUM(tal.credit),0) AS accrued, ROUND(SUM(tal.debit),0) AS remitted FROM transactionaccountingline tal JOIN transaction t ON tal.transaction = t.id JOIN account a ON tal.account = a.id WHERE a.fullname LIKE '%Sales Tax%' AND t.posting = 'T' GROUP BY a.fullname, TO_CHAR(t.trandate,'YYYY') ORDER BY a.fullname, yr -- CA: $78,411 accrued vs $8.50 remitted · NY: $57,221 vs $70.83 · MA: $33,349 vs $9.09 · KY+8 states: $0 remitted
SELECT id, periodname, startdate, closed FROM accountingperiod WHERE isquarter = 'F' AND isyear = 'F' ORDER BY startdate -- Last closed='T': Nov 2021 (id 101). Dec 2021 (102) → Dec 2029: all closed='F'.
SELECT CASE WHEN t.duedate >= TRUNC(SYSDATE) THEN 'Current' WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) <= 30 THEN '1-30' WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) <= 60 THEN '31-60' WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) <= 90 THEN '61-90' ELSE '>90' END AS bucket, COUNT(*) AS invoices, ROUND(SUM(t.foreignamountunpaid),2) AS unpaid FROM transaction t WHERE t.type = 'CustInvc' AND t.status = 'A' AND t.foreignamountunpaid > 0 GROUP BY /* bucket expression repeated */ -- Current $133,364 · 1-30 $123,385 · 31-60 $59,153 · 61-90 $139,431 · >90 $472,913 (13 invoices, max 499 days)
-- nexttransactionlink is unpopulated for SO→ItemShip in this account; -- lineage derived via the shipment header line's createdfrom reference: SELECT shipline.location, COUNT(*) AS ships, ROUND(AVG(TRUNC(ship.trandate)-TRUNC(so.trandate)),2) AS avg_days, MAX(TRUNC(ship.trandate)-TRUNC(so.trandate)) AS max_days FROM transaction ship JOIN transactionline shipline ON shipline.transaction = ship.id AND shipline.mainline = 'T' JOIN transaction so ON shipline.createdfrom = so.id AND so.type = 'SalesOrd' WHERE ship.type = 'ItemShip' AND so.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD') GROUP BY shipline.location -- Loc 1 (SF): 92 ships avg 0.01d · Loc 3 (NY): 69 avg 0.0d · Loc 5 (LA DC): 73 avg 11.34d max 49 · Loc 12 (Miami): 32 avg −0.75d
SELECT tl.location, COUNT(DISTINCT t.id) AS txns, ROUND(SUM(ABS(tl.netamount)),2) AS revenue FROM transaction t JOIN transactionline tl ON tl.transaction = t.id AND tl.mainline = 'F' AND tl.taxline = 'F' AND tl.subsidiary <> 4 WHERE t.type IN ('CustInvc','CashSale') AND t.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD') GROUP BY tl.location ORDER BY SUM(ABS(tl.netamount)) DESC
SELECT v.entityid AS vendor, COUNT(DISTINCT t.id) AS bills, ROUND(SUM(ABS(t.foreigntotal)),0) AS spend FROM transaction t JOIN vendor v ON t.entity = v.id WHERE t.type = 'VendBill' AND t.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD') GROUP BY v.entityid ORDER BY SUM(ABS(t.foreigntotal)) DESC -- $1,794,815 total · 31 billed vendors · top 7 = 82.5% of spend
SELECT COUNT(*) AS paid_bills, ROUND(AVG(TRUNC(t.closedate)-TRUNC(t.trandate)),1) AS avg_dpo, MAX(TRUNC(t.closedate)-TRUNC(t.trandate)) AS max_days FROM transaction t WHERE t.type = 'VendBill' AND t.status = 'B' AND t.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD') AND t.closedate IS NOT NULL -- 394 bills · avg 3.2 days · max 165
-- By location: SELECT l.id, l.name, SUM(ail.quantityonhand) AS qty, ROUND(SUM(ail.onhandvaluemli),0) AS value_on_hand FROM aggregateitemlocation ail JOIN location l ON ail.location = l.id WHERE ail.quantityonhand <> 0 GROUP BY l.id, l.name ORDER BY SUM(ail.onhandvaluemli) DESC -- Dead stock: SELECT COUNT(DISTINCT i.id) AS slow_items, ROUND(SUM(ail.onhandvaluemli),0) AS slow_value FROM item i JOIN aggregateitemlocation ail ON ail.item = i.id AND ail.quantityonhand > 0 WHERE i.itemtype = 'InvtPart' AND NOT EXISTS ( SELECT 1 FROM transactionline tl JOIN transaction t ON tl.transaction = t.id WHERE tl.item = i.id AND t.type IN ('CustInvc','CashSale') AND t.trandate >= TO_DATE('2026-02-15','YYYY-MM-DD')) -- 48 items · $40,855
-- Terms coverage: 219 of 274 customers have terms IS NULL; 55 = Net 30. -- 100% of overdue open A/R traces to Net-30 customers. SELECT COUNT(*) FROM customer WHERE terms IS NULL -- Duplicates (0 found on both entities): SELECT companyname, COUNT(*) FROM customer GROUP BY companyname HAVING COUNT(*) > 1 -- Unapplied payments/credits (0 found): SELECT COUNT(*) FROM transaction WHERE type IN ('CustPymt','CustCred') AND foreignamountunpaid > 0
transaction.status filters take single-letter codes only ('A', 'B'…); prefixed forms silently return zero rows.transaction.location, .salesrep, .subsidiary are not exposed — use transactionline columns.netamount is negative (GL convention) — wrap in ABS().foreigntotal / foreignamountunpaid; base-currency variants are unexposed.REGEXP_LIKE rejected — use LIKE chains. LIMIT rejected — use FETCH FIRST n ROWS ONLY.account.acctname not exposed in this account — use fullname.nexttransactionlink is essentially unpopulated for O2C lineage (18 payment links only) — cycle times require createdfrom-based joins.foreigntotal is negative on headers — ABS() applied.createdby (import/system-created) — per-user accountability cannot be established from the GL alone.