Performance measurement · NetSuite TD3016323
Financial, operational, customer, and efficiency KPIs for the trailing twelve months, with definitions, thresholds, and the one metric in the concern band.
Scope: Standard Review, multi-category KPIs, trailing twelve months to September 23, 2026, consolidated across the three operating subsidiaries with the elimination entity excluded. September is a partial month and is shown but not used in any trailing figure that would be distorted by it.
Three things stand out. Profitability is healthy and improving: operating margin ran between 8% and 9% through the autumn of 2025 and has run between 15% and 19% since May 2026, on revenue that is up 24% year on year for August. Liquidity is strong to the point of being idle, with a current ratio of 4.6 and $2.6M in the bank. And receivables are the problem: DSO is 175 days against 30-day terms, which is the one KPI on the dashboard in the concern band, and the cash conversion cycle it produces is 251 days.
| KPI | Value | Threshold (from the prompt) | Status |
|---|---|---|---|
| Revenue growth, Aug 2026 vs Aug 2025 | +24.4% | > 15% strong, 5 to 15 acceptable | Strong |
| Gross margin, trailing twelve months | 39.5% | > 40% strong, 25 to 40 acceptable | Acceptable |
| Operating margin, trailing twelve months | 13.4% | no prompt threshold; shown for context | Context |
| DSO | 175 days | < 30 strong, 30 to 45 acceptable | Concern |
| DPO | 29 days | no prompt threshold | Context |
| Inventory turns | 3.5x | 105 days of inventory | Context |
| Current ratio | 4.56 | > 2.0 strong, 1.5 to 2.0 acceptable | Strong |
| Quick ratio | 3.10 | no prompt threshold | Context |
| Active customers, trailing twelve months | 107 | of 273 customer records | Context |
| Revenue per active customer | $18,080 | invoiced revenue basis | Context |
Calculated using: revenue, cost of goods sold, and operating expense are posted GL amounts by posting period; gross margin = (revenue less COGS) / revenue; operating margin = (gross profit less operating expense less other expense) / revenue; DSO = open invoice balances / (trailing twelve-month invoicing / 365); DPO = open vendor bills / (trailing twelve-month bills / 365); inventory turns = trailing twelve-month COGS / inventory asset balance; current ratio = (bank + receivables + other current assets) / (payables + other current liabilities); quick ratio excludes other current assets. Revenue growth compares August 2026 with August 2025 because the extract begins in August 2025.
| Month | Revenue | Gross margin | Operating expense | Operating income | Operating margin |
|---|---|---|---|---|---|
| Aug 2025 | $889,061 | 35.2% | $232,122 | $79,144 | 8.9% |
| Sep 2025 | $953,186 | 36.8% | $221,945 | $126,905 | 13.3% |
| Oct 2025 | $955,921 | 35.6% | $258,874 | $79,106 | 8.3% |
| Nov 2025 | $940,874 | 36.4% | $262,069 | $78,394 | 8.3% |
| Dec 2025 | $1,047,373 | 49.6% | $282,197 | $234,625 | 22.4% |
| Jan 2026 | $911,041 | 37.9% | $271,492 | $71,712 | 7.9% |
| Feb 2026 | $906,916 | 39.4% | $277,202 | $77,477 | 8.5% |
| Mar 2026 | $1,035,777 | 45.6% | $274,210 | $195,222 | 18.8% |
| Apr 2026 | $971,980 | 39.3% | $265,462 | $113,930 | 11.7% |
| May 2026 | $1,067,151 | 40.0% | $255,321 | $169,242 | 15.9% |
| Jun 2026 | $1,090,887 | 38.4% | $252,090 | $165,083 | 15.1% |
| Jul 2026 | $1,148,114 | 40.5% | $241,609 | $222,024 | 19.3% |
| Aug 2026 | $1,106,339 | 38.5% | $241,828 | $182,096 | 16.5% |
| Sep 2026 | $1,061,653 | 32.0% | $287,596 | $49,166 | 4.6% |
September 2026 is a partial month. Cost of goods sold has posted ahead of the month's revenue, which is why its margins are the lowest on the table; they will recover as the month closes.
Gross margin is stable in a 35% to 40% band, with two months above 45% (December 2025 and March 2026) where cost of goods sold dipped without a matching dip in revenue. Operating expense has been flat at roughly $240,000 to $280,000 a month for the whole period. Every point of operating margin improvement since the spring is therefore revenue growth against a fixed cost base, which is the healthiest kind.
The figures below use billing documents only, invoices and cash sales, and so exclude the journal-posted income noted above. They describe the transactional business.
| Month | Invoices | Billed revenue | Billed customers | Sales orders | Average order value |
|---|---|---|---|---|---|
| 2025-10 | 29 | $91,513 | 58 | 29 | $2,973 |
| 2025-11 | 31 | $84,933 | 59 | 30 | $2,550 |
| 2025-12 | 32 | $265,270 | 59 | 29 | $2,738 |
| 2026-01 | 32 | $81,038 | 60 | 32 | $2,270 |
| 2026-02 | 31 | $95,075 | 59 | 31 | $2,867 |
| 2026-03 | 34 | $226,231 | 60 | 32 | $2,744 |
| 2026-04 | 34 | $127,182 | 61 | 31 | $2,799 |
| 2026-05 | 25 | $203,880 | 52 | 24 | $4,566 |
| 2026-06 | 36 | $218,676 | 62 | 34 | $4,708 |
| 2026-07 | 47 | $254,122 | 68 | 45 | $2,758 |
| 2026-08 | 45 | $195,598 | 66 | 43 | $2,800 |
| 2026-09 | 28 | $143,094 | 60 | 58 | $3,650 |
Billed revenue has roughly doubled over the year, from about $85,000 a month in the autumn of 2025 to $190,000 to $250,000 a month in the summer of 2026, with the customer count per month rising from around 30 to the mid-40s. Average order value moved from the $2,300 to $2,900 range to above $4,500 in May and June before settling near $2,800, which points to a few large orders rather than a price change.
Customer base. 273 active customer records, of which 107 were billed in the trailing twelve months and 166 (61%) were not. Revenue per active customer is $18,080 on an invoiced basis. The prompt's "new customers in twelve months" metric returns all 273 records, because every customer record in the account was created within the year; the metric is not informative here and is reported rather than interpreted.
| Balance sheet line | Balance |
|---|---|
| Bank | $2,642,083 |
| Accounts receivable (GL) | $2,170,035 |
| Other current assets, mostly inventory | $2,263,004 |
| Current assets | $7,075,122 |
| Accounts payable | $1,278,301 |
| Other current liabilities | $272,361 |
| Current liabilities | $1,550,662 |
Working capital is $5,524,460. The current ratio of 4.56 is more than twice the prompt's "strong" threshold; a business holding two years of operating expense in current assets is safe, but it is also not putting its balance sheet to work. The cash conversion cycle, 175 days of receivables plus 105 days of inventory less 29 days of payables, is 251 days, and receivables are two-thirds of it.
No budget data exists in the account, so target-versus-actual is not available and the prompt's thresholds serve as targets instead. Against those: gross margin sits just below the 40% "strong" line and has for a year, with no trend; operating margin has stepped up and held; DSO is far outside the acceptable band and the driver is a small number of accounts that have never paid, not a general slowing of collections; liquidity is well above target.
| ID | Type | Name | Handle | Scope | Used for | Complete |
|---|---|---|---|---|---|---|
| DL-001 | SuiteQL | Monthly P&L by account type | transactionaccountingline join account, accountingperiod | Aug 2025 to Sep 2026, subsidiaries 1 to 3 | Revenue, margins | Yes |
| DL-002 | SuiteQL | Billing activity | transaction (CustInvc, CashSale, SalesOrd) by month | Trailing 12 months | Operational KPIs | Yes |
| DL-003 | SuiteQL | Balance sheet by account type | transactionaccountingline join account | Cumulative to date | Liquidity ratios | Yes |
| DL-004 | SuiteQL | Open balances and customer counts | transaction, customer | Current | DSO, DPO, customer KPIs | Yes |
| DL-005 | SuiteQL | Inventory and COGS | transactionaccountingline join account | Current and trailing 12 months | Inventory turns | Yes |
Adaptations from the prompt's templates: the profitability query uses transactionaccountingline and the posting period rather than transactionline.amount and the transaction date, so that months match the ledger; the efficiency query's customer.balance and vendor.balance were replaced by open invoice and bill balances from foreignamountunpaid, and its accountingperiod.currentbalance join, which does not exist, by cumulative posting sums; transaction.subsidiary is not exposed, so the elimination entity is excluded through the line; the account has no budget table.
SELECT ap.periodname, ap.startdate, a.accttype, SUM(-tal.amount)
FROM transactionaccountingline tal JOIN transaction t ON t.id = tal.transaction
JOIN transactionline tl ON tl.transaction = tal.transaction AND tl.id = tal.transactionline
JOIN account a ON a.id = tal.account JOIN accountingperiod ap ON ap.id = t.postingperiod
WHERE tal.posting = 'T' AND a.accttype IN ('Income','COGS','Expense','OthIncome','OthExpense') AND tl.subsidiary <> 4 AND ap.startdate >= ADD_MONTHS(SYSDATE, -14)
GROUP BY ap.periodname, ap.startdate, a.accttype
SELECT TO_CHAR(t.trandate, 'YYYY-MM'), t.type, COUNT(*), SUM(t.foreigntotal), COUNT(DISTINCT t.entity)
FROM transaction t WHERE t.type IN ('CustInvc','CashSale','SalesOrd') AND t.trandate >= ADD_MONTHS(SYSDATE, -12) AND t.trandate <= SYSDATE
GROUP BY TO_CHAR(t.trandate, 'YYYY-MM'), t.type
SELECT a.accttype, SUM(tal.amount) FROM transactionaccountingline tal JOIN transaction t ON t.id = tal.transaction
JOIN transactionline tl ON tl.transaction = tal.transaction AND tl.id = tal.transactionline JOIN account a ON a.id = tal.account
WHERE tal.posting = 'T' AND t.trandate <= SYSDATE AND tl.subsidiary <> 4 AND a.accttype IN (balance sheet types) GROUP BY a.accttype
SELECT (SELECT SUM(foreignamountunpaid) FROM transaction WHERE type = 'CustInvc' AND posting = 'T' AND foreignamountunpaid > 0),
(SELECT SUM(foreignamountunpaid) FROM transaction WHERE type = 'VendBill' AND posting = 'T' AND foreignamountunpaid <> 0),
(SELECT SUM(foreigntotal) FROM transaction WHERE type = 'VendBill' AND posting = 'T' AND trandate >= ADD_MONTHS(SYSDATE, -12)),
(SELECT SUM(foreigntotal) FROM transaction WHERE type = 'CustInvc' AND posting = 'T' AND trandate >= ADD_MONTHS(SYSDATE, -12)),
(SELECT COUNT(*) FROM customer WHERE isinactive = 'F'), (SELECT COUNT(*) FROM customer WHERE isinactive = 'F' AND datecreated >= ADD_MONTHS(SYSDATE, -12)),
(SELECT COUNT(DISTINCT entity) FROM transaction WHERE type IN ('CustInvc','CashSale') AND posting = 'T' AND trandate >= ADD_MONTHS(SYSDATE, -12))
FROM dual| Assumption | Category | Rationale | Sensitivity | Impact if wrong |
|---|---|---|---|---|
| 365-day year for DSO and DPO | Method | Standard | Low | Days figures |
| Posted transactions only | Data | Accuracy | Medium | All KPIs |
| Ledger amounts as posted, including journal-posted income | Business logic | The P&L is what the books say | High | Revenue and margin levels; billing-document view provided |
| Inventory = other current asset accounts named inventory | Method | Chart of accounts naming | Medium | Inventory turns |
| Elimination entity excluded | Method | Consolidation | Low | Totals |
| Test | Objective | Result |
|---|---|---|
| G1-001 | Revenue matches P&L | Pass monthly income sums equal the income statement by period |
| G1-002 | Customer count valid | Qualified 273 records, all created within twelve months; the new-customer metric is uninformative |
| G1-003 | Balance data current | Pass balances cumulative to 2026-09-23 |
| G2-001 | KPI formulas | Pass computed in code; formulas stated above |
| G2-002 | Trend arithmetic | Pass month-over-month values foot to the period table |
Confidence: 95% in the ledger-based KPIs as posted; 90% in the operational KPIs; 80% in the efficiency KPIs, because the GL receivables balance does not reconcile to open invoices and inventory is identified by account name.