Thirteen months of GL revenue, August 2025 through August 2026, decomposed by the customer's segment. The base business is steady and growing; the volatility in the top line is almost entirely project-style revenue from a small number of IT and Consulting customers.
Manufacturing, Retail and B2C posted revenue in all 13 months and together average $96K/month (coefficient of variation 0.22). Information Technology and Consulting appear in only 5 and 4 months respectively, but supplied $607K — 31.5% of the total — and every one of the five peak months.
Comparing Aug 2025–Jan 2026 with Mar 2026–Aug 2026, Manufacturing grew +42%, Retail +28%, B2C +23%, IT +41% and Consulting +297%. The three most recent months average $206K against $101K for the first three.
In every B2B segment the top three customers account for 65–78% of segment revenue. Jones Manufacturing alone is $192K — 10% of company revenue. B2C is the mirror image: 60 customers, none above 4% of the segment.
"Others" jumped from ≤$4K to $50.7K on three invoices to Macgruber Incorporated for an identical $16,884 each (INV762, INV763, INV764). Construction became material for the first time ($12.8K). See §6.
Each bar is one posting period. Base segments sit at the bottom in a navy scale so the project-style layers are visually separated above them. Select a segment in the legend to highlight it in red; switch to the share view to see mix independent of scale.
Peak months — Dec 2025 ($246K), Jul 2026 ($234K), Mar 2026 ($208K), Jun 2026 ($203K), May 2026 ($188K) — each coincide with an IT or Consulting posting. Remove those two segments and the monthly range narrows from $75K–$246K to $75K–$154K.
Three lenses per segment: how big it is, how steady it is month to month (coefficient of variation — standard deviation divided by mean; below 0.3 is steady, above 1.0 is episodic), and how dependent it is on its largest customers.
Active customers = customers with at least one Income posting in the window. Top-1 / Top-3 share = that customer group's portion of the segment's 13-month revenue. Segment-level Herfindahl index across the eight segments is 2,351 — moderately concentrated; a single-segment monopoly would be 10,000, eight equal segments 1,250.
Grouping the three every-month segments as Base (Manufacturing, Retail, B2C) and the remainder as Project (IT, Consulting, Others, Construction, Services) separates the recurring engine from the episodic layer.
Base revenue has grown in each successive quarter of the window when normalised per month: Q3 2025 $89K, Q4 2025 $80K, Q1 2026 $84K, Q2 2026 $117K, Q3 2026 (2 months) $114K. The Q2 2026 step is driven by Retail ($85K in June — Design Excellence Ltd. and Davis Supplies) and Manufacturing.
Aug 2025–Jan 2026 compared with Mar 2026–Aug 2026. February 2026 sits between the two windows and is excluded from both so the halves are equal length.
All three base segments grew by double digits, which rules out a mix-only explanation for the top-line increase. Consulting's growth is one account: Red Rivers Consulting posted $94K, 46% of the segment, in the second half.
August 2026 was the first month with six segments active. Two of them — Others and Construction — had been immaterial or absent, and together they contributed $63.5K, a third of the month.
| Segment | Customer | Document | Type | Revenue |
|---|---|---|---|---|
| Others | Macgruber Incorporated | INV762 | Invoice | $16,884.00 |
| Others | Macgruber Incorporated | INV763 | Invoice | $16,884.00 |
| Others | Macgruber Incorporated | INV764 | Invoice | $16,884.00 |
| Construction | McCarthy Supplies | INV766 | Invoice | $8,972.00 |
| Construction | Gramz LLP | INV768 | Invoice | $3,870.00 |
| Information Technology | Schubert Software | INV770 | Invoice | $2,982.00 |
| Information Technology | Finch Computing | INV765 | Invoice | $2,145.00 |
Three consecutive invoices to the same customer for an identical $16,884.00 in one posting period is consistent with legitimate milestone or recurring billing — and equally consistent with duplicate entry. $33,768 (two of the three) is 18% of August revenue. Confirm against the underlying sales order(s) before this month is used in a forecast or a commission calculation.
Separately, Macgruber's segment assignment of "Others" — a residual category — means a $50.7K account is invisible to any segment-based reporting. Recategorising it (or creating the appropriate category) would improve every downstream view.
Every B2B segment is invoiced. B2C is the only segment with a meaningful cash-sale channel — the store point-of-sale pattern — and it is also the highest-volume, lowest-ticket segment by a wide margin.
| Segment | Transaction type | Transactions | Revenue | Avg / transaction |
|---|---|---|---|---|
| Manufacturing | Invoice | 75 | $690,659.45 | $9,209 |
| Retail | Invoice | 71 | $409,912.78 | $5,773 |
| Retail | Credit memo | 1 | ($145.47) | — |
| Retail | Item receipt GL anomaly | 2 | $149.95 | — |
| Information Technology | Invoice | 12 | $399,917.00 | $33,326 |
| Consulting | Invoice | 6 | $207,147.00 | $34,525 |
| B2C | Cash sale | 575 | $84,182.19 | $146 |
| B2C | Invoice | 267 | $64,304.82 | $241 |
| Others | Invoice | 4 | $54,771.00 | $13,693 |
| Construction | Invoice | 3 | $15,419.00 | $5,140 |
| Services | Invoice | 1 | $718.00 | $718 |
IT and Consulting average $33–35K per invoice on 18 invoices combined — 31% of revenue on 1.8% of transactions. B2C's 842 transactions average under $200. Two item receipts posting $149.95 to an Income account is unusual (receipts normally hit inventory and accrued purchases); the same $149.95 appears on the Income Statement under 4320 Sales Returns & Allowances and 6690 Bad Debt Expense, suggesting a returns/write-off entry routed through a receipt. Immaterial, but worth a look by whoever owns the returns process.
customer.category). It is the only populated segmentation in the account. The custom segment cseg_client_tag is set on every customer but is not resolvable to a label via SuiteQL in this account, so it was not used.Income (the 4000 Sales family: 4210 Products, 4310 Services, 4320 Returns & Allowances, 4450 Freight). OthIncome (7000 series) is excluded — it is –$75 in the window and not customer revenue.transaction.entity) and that customer's current category. If a customer's category was changed during the window, all of their history moves with it.Beg Balance…, 1st of each month) that post ~$0.75–0.93M/month of Income with no customer. They are 83% of GL Income in August 2026 ($923K of $1,106K). Including them would swamp every segment view under an "Uncategorized" bar; the filter t.memo NOT LIKE 'Beg Balance%' removes them and only them.Roughly a third of revenue depends on IT and Consulting engagements that post in 4–5 months of the year from a dozen accounts. A planning model built on the $1.93M total without separating the $678K project layer will overstate the reliable run-rate by about 50%.
Revenue was read directly from the general ledger (transactionaccountingline) rather than from transaction headers, so the figures reflect what posted, including credits and returns. Each GL line is joined to its transaction line to obtain the posting subsidiary, to the account to filter on type, to the posting period for the month, and to the customer for the segment.
The standard Income Statement (report −200, Parent Company consolidated, period Aug 2026) was run and compared with the query for the same period.
| Line | Income Statement | SuiteQL | Difference |
|---|---|---|---|
| Total Income, Aug 2026, all postings | $1,106,339.23 | $1,106,339.23 | $0.00 |
| of which "Beg Balance" demo journals | — | $923,083.34 | — |
| Total Income excluding demo journals (= Aug 2026 bar) | — | $183,255.89 | — |
The query and the report agree to the cent on the unfiltered total, which validates the join path, the posting filters and the sign convention. The demo-journal exclusion is then a deliberate, documented departure from the report, not a discrepancy. The report's Net Income for the month was $182,096.23.
−SUM(tal.amount): NetSuite stores credits (revenue) as negative on the GL line.All queries are SuiteQL, run 2026-09-18 against account TD3016323 as Administrator. They follow the account's house style and are safe to paste into the SuiteQL Query Tool.
SELECT
BUILTIN.DF(c.category) AS category,
COUNT(*) AS customers,
SUM(CASE WHEN c.cseg_client_tag IS NOT NULL THEN 1 ELSE 0 END) AS with_client_tag
FROM customer c
GROUP BY BUILTIN.DF(c.category)
ORDER BY COUNT(*) DESC
SELECT
ap.periodname AS period,
TO_CHAR(ap.startdate, 'YYYY-MM') AS ym,
COALESCE(BUILTIN.DF(c.category), 'Uncategorized') AS segment,
ROUND(-SUM(tal.amount), 2) AS revenue
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
LEFT JOIN customer c ON c.id = t.entity
WHERE t.posting = 'T'
AND tal.posting = 'T'
AND a.accttype = 'Income'
AND tl.subsidiary IN (1, 2, 3)
AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%')
AND ap.startdate >= TO_DATE('2025-08-01', 'YYYY-MM-DD')
AND ap.startdate < TO_DATE('2026-09-01', 'YYYY-MM-DD')
GROUP BY ap.periodname, TO_CHAR(ap.startdate, 'YYYY-MM'),
COALESCE(BUILTIN.DF(c.category), 'Uncategorized')
ORDER BY TO_CHAR(ap.startdate, 'YYYY-MM'), ROUND(-SUM(tal.amount), 2) DESC
SELECT segment, customer, revenue, active_customers, seg_total
FROM (
SELECT
x.segment, x.customer, x.revenue,
COUNT(*) OVER (PARTITION BY x.segment) AS active_customers,
SUM(x.revenue) OVER (PARTITION BY x.segment) AS seg_total,
ROW_NUMBER() OVER (PARTITION BY x.segment ORDER BY x.revenue DESC) AS rn
FROM (
SELECT
COALESCE(BUILTIN.DF(c.category), 'Uncategorized') AS segment,
c.entityid AS customer,
ROUND(-SUM(tal.amount), 2) AS revenue
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
LEFT JOIN customer c ON c.id = t.entity
WHERE t.posting = 'T' AND tal.posting = 'T'
AND a.accttype = 'Income'
AND tl.subsidiary IN (1, 2, 3)
AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%')
AND ap.startdate >= TO_DATE('2025-08-01', 'YYYY-MM-DD')
AND ap.startdate < TO_DATE('2026-09-01', 'YYYY-MM-DD')
GROUP BY COALESCE(BUILTIN.DF(c.category), 'Uncategorized'), c.entityid
) x
) y
WHERE rn <= 3
ORDER BY seg_total DESC, revenue DESC
SELECT
COALESCE(BUILTIN.DF(c.category), 'Uncategorized') AS segment,
t.type AS tran_type,
COUNT(DISTINCT t.id) AS transactions,
ROUND(-SUM(tal.amount), 2) AS revenue
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
LEFT JOIN customer c ON c.id = t.entity
WHERE t.posting = 'T' AND tal.posting = 'T'
AND a.accttype = 'Income'
AND tl.subsidiary IN (1, 2, 3)
AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%')
AND ap.startdate >= TO_DATE('2025-08-01', 'YYYY-MM-DD')
AND ap.startdate < TO_DATE('2026-09-01', 'YYYY-MM-DD')
GROUP BY COALESCE(BUILTIN.DF(c.category), 'Uncategorized'), t.type
ORDER BY ROUND(-SUM(tal.amount), 2) DESC
SELECT
COALESCE(BUILTIN.DF(c.category), 'Uncategorized') AS segment,
c.entityid AS customer,
t.type AS tran_type,
t.tranid AS document,
ROUND(-SUM(tal.amount), 2) AS revenue
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
LEFT JOIN customer c ON c.id = t.entity
WHERE t.posting = 'T' AND tal.posting = 'T'
AND a.accttype = 'Income'
AND tl.subsidiary IN (1, 2, 3)
AND (t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%')
AND t.postingperiod = 182
AND BUILTIN.DF(c.category) IN ('Others', 'Construction', 'Information Technology')
GROUP BY COALESCE(BUILTIN.DF(c.category), 'Uncategorized'), c.entityid, t.type, t.tranid
ORDER BY ROUND(-SUM(tal.amount), 2) DESC
SELECT
ROUND(-SUM(tal.amount), 2) AS income_all,
ROUND(-SUM(CASE WHEN t.memo IS NULL OR t.memo NOT LIKE 'Beg Balance%'
THEN tal.amount ELSE 0 END), 2) AS income_excl_begbal,
ROUND(-SUM(CASE WHEN t.memo LIKE 'Beg Balance%'
THEN tal.amount ELSE 0 END), 2) AS income_begbal_only
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 t.posting = 'T' AND tal.posting = 'T'
AND a.accttype = 'Income'
AND tl.subsidiary IN (1, 2, 3)
AND t.postingperiod = 182
| Source | Detail | Used for |
|---|---|---|
| NetSuite Income Statement | Standard report −200 · Parent Company (Consolidated) · Aug 2026 (period id 182) · run 2026-09-18 | Tie-out (§9); account names in §7/§8 |
| GL tables | transactionaccountingline, transaction, transactionline, account, accountingperiod, customer | Q2–Q6 |
| Customer master | customer.category (standard Customer Category list); 273 customers, 255 categorised | Segment dimension |
| Branding guidelines | "Boardroom Red" — palette, typography and chart rules applied throughout | Document design |
| Account field notes | Known demo-ledger caveat (Beg Balance journals), elimination subsidiary, exposed-column quirks | Assumptions (§8) |
| Base segments | Manufacturing, Retail, B2C — the three segments with Income postings in every one of the 13 months. |
| Project segments | Information Technology, Consulting, Others, Construction, Services — episodic, invoice-driven revenue. |
| CV | Coefficient of variation; standard deviation ÷ mean of the 13 monthly values. Lower is steadier. |
| HHI | Herfindahl–Hirschman index; sum of squared percentage shares. 10,000 = one segment; 1,250 = eight equal segments. |
| Posting period | The accounting period a transaction posts to; may differ from its transaction date. |