An evaluation of current risk exposure against fiscal-year 2026 financial performance, with recommended risk appetite levels calibrated to profitability, capital allocation, and enterprise value creation.
The enterprise is outperforming on every profitability metric — revenue +19.1% year over year, net income +66.6%, gross margin up 210 bps — while carrying a materially mispriced credit-risk position: 86% of open receivables are past due and half sit beyond 90 days. Simultaneously, the balance sheet is over-defended: a 3.2 quick ratio and an 8-day payables cycle idle roughly $1.8M of deployable capital. The correct move is not uniformly “less risk” — it is a rebalancing: tighten credit appetite sharply, raise capital-deployment appetite deliberately, and close the data-integrity gaps that currently blind dimensional reporting.
| Month | Revenue | COGS | Gross Profit | GP % | Opex | Net Income |
|---|---|---|---|---|---|---|
| Jan | 906,916 | 549,856 | 357,060 | 39.4% | 279,583 | 77,477 |
| Feb | 1,035,777 | 563,809 | 471,968 | 45.6% | 276,746 | 195,222 |
| Mar | 971,980 | 590,417 | 381,563 | 39.3% | 267,633 | 113,930 |
| Apr | 1,067,151 | 640,526 | 426,625 | 40.0% | 257,383 | 169,242 |
| May | 1,090,887 | 671,722 | 419,165 | 38.4% | 254,082 | 165,083 |
| Jun | 1,148,114 | 682,751 | 465,363 | 40.5% | 243,339 | 222,024 |
| Jul | 1,106,264 | 680,544 | 425,721 | 38.5% | 243,625 | 182,096 |
| Aug* | 1,061,505 | 722,338 | 339,167 | 32.0% | 290,001 | 49,166 |
| YTD | 8,388,594 | 5,101,962 | 3,286,632 | 39.2% | 2,112,392 | 1,174,240 |
| 2025 | 2026 | Δ | |
|---|---|---|---|
| Revenue | 7,042,817 | 8,388,594 | +19.1% |
| Gross profit | 2,614,790 | 3,286,632 | +25.7% |
| Operating expense | 1,909,913 | 2,112,392 | +10.6% |
| Net income | 704,877 | 1,174,240 | +66.6% |
Operating leverage is real: revenue grew 19% while opex grew 11%, expanding net margin from 10.0% to 14.0%. Annualized run-rate net income is approximately $1.84M. This earnings quality is the capital base against which risk appetite should be recalibrated — the enterprise can now afford to be selective about credit risk and ambitious about capital deployment.
Open customer receivables total $928,247 across 37 customers. Of this, $799,240 (86.1%) is past due and $472,913 (50.9%) is more than 90 days past due — including single exposures aged 460, 327, and 262 days. Against invoice-channel revenue, effective DSO is ~168 days. The 90+ bucket alone equals 40% of YTD net income; a full write-off would erase four months of earnings.
| Customer | Open AR | Overdue | Max Days Overdue |
|---|---|---|---|
| Global Information | 110,579 | 110,579 | 262 |
| Red Rivers Consulting | 102,906 | 102,906 | 155 |
| Magna Tech Limited | 97,942 | 97,942 | 32 |
| Falcon Systems | 86,007 | 86,007 | 82 |
| Mercury Co. | 80,079 | 80,079 | 460 |
| Gotter inc. | 68,119 | 68,119 | 256 |
| Blockster Inc. | 53,424 | 53,424 | 80 |
| Haskell Associates | 43,941 | 43,941 | 327 |
Note that two of the top-10 delinquent accounts — Red Rivers Consulting and Magna Tech Limited — are simultaneously top-5 revenue customers this year. Collections posture toward them is a commercial decision, not merely a finance one; the recommended appetite framework (Section 3) prices that trade-off explicitly rather than leaving it implicit.
Two governance observations: credit limits are set on all 37 customers with open balances and none currently exceeds its limit — the control exists but is not binding, because limits do not throttle aged exposure, only new orders. And the Renewal Risk classification field (CUSTENTITY_RENEWAL_RISK) is unpopulated on all 274 customers, so the firm currently has no forward-looking credit signal in its system of record.
A disruption at any of the top three suppliers (Generation N $431K, Bedline $309K, Broyhill $201K) would impair fulfillment across the inventory-led revenue base with limited near-term substitution. No dual-sourcing structure is visible in the purchasing data.
Cash stands at $2.60M (two operating checking accounts: $1.56M Sub 1, $1.04M Sub 2), the quick ratio at 3.2×, and open payables at just $180.9K — effectively all within terms. Days payable outstanding is ~8 days against a typical vendor-terms norm of 25–30. The liquidity risk here is not shortage; it is surplus: at a ~$264K monthly opex run rate, the firm holds nearly 10 months of opex in non-earning demand deposits and voluntarily finances its suppliers by paying three weeks early. Both are quiet, continuous transfers of enterprise value to counterparties.
On-hand inventory at cost is $1.12M across 189 items, turning at a healthy ~7.1× annualized. Two flags: 49 items ($40.7K, 3.6% of on-hand value) have stock on hand but zero sales in 2026 — candidates for markdown or liquidation; and the GL inventory balance ($2.13M) exceeds the costing-subledger value by roughly $1.0M, a reconciliation gap that must be resolved before inventory can be used as a reliable planning input (see 2.5).
Three structural findings limit the precision of every other analysis in this document, and constitute a risk domain in their own right:
• 84% of GL revenue posts via journal entries ($7.04M of $8.39M), not customer invoices. Journals carry no item, class, or customer lines, so dimensional analysis (by product category, subsidiary, customer) covers only the ~$1.35M transactional slice.
• 36% of transactional revenue is unclassified ($493K carries no product class), and class 5 (Electronics) shows zero sales lines all year.
• GL/subledger divergence: GL AR ($2.16M) vs. open invoices ($0.93M), and GL inventory ($2.13M) vs. costing value ($1.12M). Until reconciled, balance-sheet-derived ratios should be treated as ranges, not points.
| Domain | Current Effective Posture | Recommended Appetite | Quantified Limits (Board KPIs) |
|---|---|---|---|
| Credit / AR | Unbounded — passive tolerance of 86% overdue | LOW — tighten sharply | Overdue ≤ 25% of open AR · 90+ bucket ≤ 5% · blended DSO ≤ 55 days · single-name AR ≤ 10% of book · establish ~$264K reserve (50% of 90+, 20% of 61–90) |
| Supplier concentration | Unmonitored — top-5 at 72% | MODERATE — reduce over 12 months | Top-1 supplier ≤ 20% of spend · top-5 ≤ 55% · dual-source the top 3 purchase categories |
| Customer concentration | Naturally diversified (top-1 at 7.6%) | MODERATE — maintain | Top-1 customer ≤ 12% of revenue · top-10 ≤ 65% · growth may consume headroom |
| Liquidity / capital | Over-conservative — 10 months opex in idle cash, DPO 8 days | HIGHER — deploy deliberately | Minimum cash floor = 3 months opex (~$0.8M) + $0.4M buffer · excess (~$1.4–1.8M) into laddered T-bills / growth investment · DPO target 20–25 days (within terms, never late) |
| Inventory | Adequate turns, unmanaged tail | MODERATE — maintain, prune tail | Turns ≥ 6× · slow-moving (no sale 12 mo) ≤ 2% of on-hand value · liquidate the current $41K tail |
| Data integrity | Degraded — journals dominate, subledgers diverge | MINIMAL — zero tolerance | GL/subledger reconciliation gaps closed by Q4 close · unclassified revenue ≤ 5% · renewal-risk field populated for all active customers |
Every dollar of 90+ receivable is capital lent, involuntarily and at 0% interest, to the counterparties least likely to repay — risk with no compensation. Every idle dollar above the cash floor forgoes a riskless ~4.5% — safety with no benefit. Cutting the uncompensated risk and deploying the uncompensated safety are the same decision viewed from two sides, and together they are worth roughly $0.5M of annual pre-tax value against a $1.8M earnings base:
| Value Lever | One-Time Cash | Annual Recurring | Mechanism |
|---|---|---|---|
| Collect / resolve 90+ AR | up to 472,913 | — | Structured collections on 13 invoices; escalate or settle by day 120 |
| DSO 168 → 55 days (invoice channel) | ≈ 300,000 | ≈ 13,500 | Working capital released; earns yield thereafter |
| Extend DPO 8 → 25 days | ≈ 366,000 | ≈ 16,500 | Stop early-paying; hold cash within terms |
| Treasury yield on $1.8M excess cash | — | ≈ 81,000 | Laddered T-bills at ~4.5% |
| Liquidate slow-moving inventory | ≈ 20,000–40,000 | — | Markdown 49 dead items; recover storage capacity |
| Avoided write-off (reserve + discipline) | — | risk-adjusted ≈ 400,000 protected | Reserve absorbs; new-order credit gate prevents recurrence |
| Indicative total | ≈ $1.1–1.2M cash | ≈ $110K + protection |
SELECT ap.periodname, ap.startdate,
ROUND(SUM(CASE WHEN a.accttype IN ('Income','OthIncome') THEN -tal.amount ELSE 0 END),2) AS revenue,
ROUND(SUM(CASE WHEN a.accttype = 'COGS' THEN tal.amount ELSE 0 END),2) AS cogs,
ROUND(SUM(CASE WHEN a.accttype IN ('Expense','OthExpense') THEN tal.amount ELSE 0 END),2) AS opex
FROM transactionaccountingline tal
JOIN transaction t ON tal.transaction = t.id
JOIN account a ON tal.account = a.id
JOIN accountingperiod ap ON t.postingperiod = ap.id
WHERE t.posting = 'T'
AND ap.id IN (173,174,175,177,178,179,181,182)
AND a.accttype IN ('Income','OthIncome','COGS','Expense','OthExpense')
GROUP BY ap.periodname, ap.startdate
ORDER BY ap.startdate
SELECT
CASE WHEN t.duedate >= TRUNC(SYSDATE) OR t.duedate IS NULL THEN '0_current'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 1 AND 30 THEN '1_1-30'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 31 AND 60 THEN '2_31-60'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 61 AND 90 THEN '3_61-90'
ELSE '4_90plus' END AS bucket,
COUNT(*) AS invoices,
ROUND(SUM(t.foreignamountunpaid),2) AS open_amt
FROM transaction t
WHERE t.type = 'CustInvc' AND t.status = 'A' AND t.foreignamountunpaid > 0
GROUP BY CASE WHEN t.duedate >= TRUNC(SYSDATE) OR t.duedate IS NULL THEN '0_current'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 1 AND 30 THEN '1_1-30'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 31 AND 60 THEN '2_31-60'
WHEN TRUNC(SYSDATE)-TRUNC(t.duedate) BETWEEN 61 AND 90 THEN '3_61-90'
ELSE '4_90plus' END
ORDER BY 1
SELECT c.entityid AS customer, COUNT(t.id) AS open_invoices, ROUND(SUM(t.foreignamountunpaid),2) AS open_ar, ROUND(SUM(CASE WHEN t.duedate < TRUNC(SYSDATE) THEN t.foreignamountunpaid ELSE 0 END),2) AS overdue_ar, MAX(CASE WHEN t.duedate < TRUNC(SYSDATE) THEN TRUNC(SYSDATE)-TRUNC(t.duedate) ELSE 0 END) AS max_days_overdue FROM transaction t JOIN customer c ON t.entity = c.id WHERE t.type = 'CustInvc' AND t.status = 'A' AND t.foreignamountunpaid > 0 GROUP BY c.id, c.entityid ORDER BY SUM(t.foreignamountunpaid) DESC FETCH FIRST 10 ROWS ONLY
SELECT c.entityid AS customer,
ROUND(SUM(ABS(tl.netamount)),2) AS ytd_revenue
FROM transaction t
JOIN transactionline tl ON tl.transaction = t.id
JOIN customer c ON t.entity = c.id
WHERE t.type IN ('CustInvc','CashSale') AND t.posting = 'T'
AND t.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD')
AND tl.mainline = 'F' AND tl.taxline = 'F' AND tl.subsidiary <> 4
GROUP BY c.id, c.entityid
ORDER BY SUM(ABS(tl.netamount)) DESC
FETCH FIRST 10 ROWS ONLY
SELECT v.entityid AS vendor, COUNT(*) AS bills,
ROUND(SUM(ABS(t.foreigntotal)),2) AS ytd_purchases
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.id, v.entityid
ORDER BY SUM(ABS(t.foreigntotal)) DESC
FETCH FIRST 10 ROWS ONLY
SELECT a.accttype, ROUND(SUM(tal.amount),2) AS balance
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 IN ('Bank','AcctRec','AcctPay')
GROUP BY a.accttype
-- Cash detail: same body filtered to accttype = 'Bank', grouped by a.id, a.fullname.
-- Inventory GL: accttype = 'OthCurrAsset' restricted to inventory accounts (ids 10, 119, 149, 227, 237).
SELECT COUNT(*) AS slow_movers, ROUND(SUM(v),2) AS slow_value FROM (
SELECT ail.item, SUM(ail.onhandvaluemli) AS v
FROM aggregateitemlocation ail
WHERE ail.quantityonhand > 0
GROUP BY ail.item
HAVING NOT EXISTS (
SELECT 1 FROM transactionline tl
JOIN transaction t2 ON tl.transaction = t2.id
WHERE tl.item = ail.item
AND t2.type IN ('CustInvc','CashSale')
AND t2.trandate >= TO_DATE('2026-01-01','YYYY-MM-DD')))
SELECT SUM(CASE WHEN x.creditlimit IS NULL OR x.creditlimit = 0 THEN 1 ELSE 0 END) AS no_limit_customers, SUM(CASE WHEN x.creditlimit > 0 AND x.open_ar > x.creditlimit THEN 1 ELSE 0 END) AS over_limit_customers, COUNT(*) AS customers_with_open_ar, ROUND(SUM(x.open_ar),2) AS total_open_ar FROM ( SELECT c.id, c.creditlimit, SUM(t.foreignamountunpaid) AS open_ar FROM transaction t JOIN customer c ON t.entity = c.id WHERE t.type = 'CustInvc' AND t.status = 'A' AND t.foreignamountunpaid > 0 GROUP BY c.id, c.creditlimit ) x