Gross-margin contribution by customer across 24 posted periods (Oct 2024 – Sep 2026), reconciled to the general ledger, with concentration, trend, product-mix, collections and data-integrity analysis.
The business earned $1.72M of gross profit on $2.89M of customer revenue over the review window. The headline 59.5% margin is not the operating reality: one quarter of revenue is a zero-cost service item on thirty one-off invoices, almost all of it still unpaid. Product margin is 44.9%, stable, and concentrated in a small B2B core.
SVC_Delivery Service (item 284) generated $763,724 across 30 invoices — one per customer, no cost of sales, posted to Sales : Revenue – Products with no class. It accounts for every 100%-margin customer in the book. Excluding it, gross margin is 44.9% on $2.13M.Revenue decomposes into three streams with very different cost structures. Product sales carry cost of goods at roughly 55% of price; freight recovery is a small pass-through; the service item carries no cost at all.
| Revenue stream | Revenue | Share | Cost of sales | Gross profit | Margin |
|---|---|---|---|---|---|
| Product sales (net of returns) | $2,104,850 | 72.8% | $1,171,583 | $933,267 | 44.3% |
| Freight revenue | $23,118 | 0.8% | — | $23,118 | n/a |
| SVC_Delivery Service review | $763,724 | 26.4% | $0 | $763,724 | 100.0% |
| Total | $2,891,692 | 100% | $1,171,583 | $1,720,109 | 59.5% |
Product sales figure includes −$911 of credit memos and refunds. "Product + freight" margin = 44.9% ($956K on $2.13M) and is the operating margin used elsewhere in this report. Freight cost is expensed, not in COGS, and is not customer-attributable (see A6).
Eighty customers bought product with positive revenue. Their gross margins cluster tightly around 49%; the distribution has almost no left tail, which is consistent with list-price selling and standard-cost inventory rather than negotiated discounting.
Distribution of gross margin, 80 product customers (service-only customers excluded). Red band = customers below 42% — the bottom of the interquartile range. Median 49.3% · P25 45.9% · P75 51.8% · min 38.4% (Blockster Inc.) · max 65.2% (Cherry Hines, $2.4K).
Gross profit is highly concentrated. The curve below orders customers by contribution and plots cumulative share. The knee sits at roughly 25 customers; beyond it, each additional customer adds well under half a percent.
Cumulative gross-profit share by customer rank (114 customers). Red marker = top 20% boundary (23 customers, 87.1%). Dashed line = top 10 (56.4%).
| # | Customer | GP | Margin |
|---|
| Largest customer share of revenue | 11.0% |
| Top 5 share of gross profit | |
| Top 10 share of gross profit | 56.4% |
| Top 20% (23) share of gross profit | 87.1% |
| Customers needed for 50% of GP | |
| Customers needed for 90% of GP | |
| Median customer revenue | $4,423 |
| Customers with negative GP | 4 · −$1,442 |
Concentration is structural, not incidental: the eight Subsidiary 2 accounts and roughly fifteen Subsidiary 1 B2B accounts are the profit engine. B2C is a long, thin, low-risk tail.
Each cut below is exhaustive — the rows sum to the $2.89M / $1.72M totals. Margins shown are blended (including the service item where present); the Product margin column strips it out.
| Subsidiary | Customers | Revenue | Gross profit | Margin | Open A/R | Overdue |
|---|
Subsidiary 2 is eight accounts, all managed by Matt Fisher, producing 29% of revenue. Its four product accounts (Panaderia, Pineapple Republic, Realpoint, Recreational Outfitters) run at 44.8% product margin — in line with Subsidiary 1. One unattributed customer (#1129) carries $19 of COGS.
| Sales rep | Customers | Revenue | Gross profit | Margin | Product margin | Overdue A/R |
|---|
Joel Williams' 80.8% margin is an artefact: six of his nine customers are service-only. His product book (Marshall Industries, Meetz Industries) runs at 42.5%. Unassigned = 66 B2C individuals plus two walk-in/unknown records.
| Category | Customers | Revenue | Gross profit | Margin | Avg revenue / customer |
|---|
Information Technology, Consulting, Others, Construction and Services categories are 100% margin because they bought only the service item. Manufacturing (10 accounts, $1.18M) and Retail (8 accounts, $694K) are the product business.
| Class | Customers buying | Revenue | Gross profit | Margin |
|---|
Home & Decor (mattresses, headboards, box springs) is the volume and profit leader. Apparel is 4 points weaker than the other two main categories and is the primary driver of the below-median margins at Realpoint, Design Excellence and Emily Horner. "Unclassified" is the −$556 of return lines with no class.
| Customer type | Customers | Revenue | GP | Margin | Avg revenue | Avg documents | GP per document |
|---|
GP per document is the report's cost-to-serve proxy: every sales document (invoice or cash sale) implies order entry, picking, shipping and settlement effort. A B2B document yields roughly 40× the gross profit of a B2C one. B2C is entirely cash-sale — zero receivables, zero collection effort — which offsets part of that gap.
Each customer is placed by revenue (log scale) against gross margin. The horizontal line is the product-business margin of 44.9%; the vertical line is the median customer revenue of $4,423. Service-only customers cluster at 100% and are shown in gray because their margin is not a pricing outcome.
Revenue vs gross margin, 110 customers with positive revenue. Red = product customers with margin below 44.9% and revenue above median ("Volume" — large but thin); navy = product customers above both thresholds ("Strategic"); gray = service-only. Hover a point for the name.
| Quadrant | Definition | Customers | Revenue | Gross profit | Margin |
|---|
Thresholds: revenue ≥ $4,423 (median) and product margin ≥ 44.9%. Service-only customers are reported separately because they have no cost base.
Monthly revenue is shown as stacked bars — product and freight in navy, the service item in red — with cost of sales as a line. The service item arrives in irregular, large lumps; the product base is steadier and has stepped up through 2026.
Monthly posted revenue by posting period, Oct 2024 – Sep 2026. Sep 2026 is a partial month (transactions dated up to 22 Sep are posted). Line = cost of sales. Data labels in $K.
| Measure | Oct 24 – Sep 25 | Oct 25 – Sep 26 | Change |
|---|
| Customer | Prior 12 | Last 12 | Δ |
|---|
Largest absolute changes among customers with product revenue in either window.
Ranked by gross profit. The sparkline is monthly revenue for the last twelve periods (final bar, Sep 2026, is a partial month). "Days to pay" is the median days from invoice to the linked customer payment; "—" means no invoice has been paid (cash-sale customers have no receivable to pay).
| # | Customer | Sub · Rep | Category | Revenue | COGS | GP | Margin | YoY | Docs | SKUs | Lead class | Open A/R | Days to pay | Last 12 months |
|---|
YoY = product+service revenue, last twelve months vs prior twelve; "new" = no revenue in the prior window. Open A/R includes tax and therefore can exceed recognised revenue.
Receivables are the single largest value-at-risk item in this review. The aging is not a portfolio problem; it is the tail of the service invoices.
Open invoice balances by days past due at 13 Sep 2026. $928,247 across 39 invoices; 25 invoices are overdue.
| Invoices paid (linked to a customer payment) | 736 |
| Median days invoice → payment | 0 |
| P90 days invoice → payment | 3 |
| Maximum days | 273 |
| Paid after due date | 44 (6.0%) |
| Terms in use | Net 30 (46 B2B) · none (68 B2C) |
The product B2B accounts are exemplary payers: every one of the top-13 product customers has a median of 0 days and zero late payments. The near-zero figures reflect the demo-data generation pattern (payment recorded on invoice date) and should not be read as real DSO.
| Customer | Overdue | Days | Type |
|---|
Ordered by financial exposure. Severity reflects the combination of dollars and the confidence that action is required.
SVC_Delivery Service (item 284) to a service-revenue account and assign a class; then run a targeted collection programme on the overdue balance, oldest first (Kasson Ltd 498 days, Mercury Co. 451, Schmidt & Sons 404). Until this is done, present margin to management on a product-only basis (44.9%).OrdBill link — to the month-end close.All 114 customers with gross-profit activity. Click any column header to sort; type to filter. Amounts in USD, rounded to the dollar.
| GP # | Customer | Sub | Category | Rep | Revenue | Service | COGS | GP | Margin | Cum GP | Last 12 | Prior 12 | Active mo. | Docs | SKUs | Lead class | Open A/R | Overdue | Max days | First sale | Last sale | Trend |
|---|
Service = revenue from item 284 (included in Revenue). Cum GP = cumulative share of total gross profit at this rank. Active months = posting periods with non-zero revenue (of 24). Docs = invoices + cash sales. SKUs = distinct non-freight items purchased.
Every figure derives from posting general-ledger lines (transactionaccountingline) joined to their transaction header, transaction line and account, aggregated in SuiteQL and reduced in a sandboxed JavaScript worker. No saved searches, reports or spreadsheets were used as intermediates. Four queries feed the analysis:
| # | Query | Rows | Purpose |
|---|---|---|---|
| Q1 | Customer P&L cube | 4,618 | Revenue and COGS by customer × posting month × transaction type × account type × class × subsidiary × stream (product / freight / service) |
| Q2 | Customer master | 274 | Name, individual flag, subsidiary, category, sales rep, terms |
| Q3 | Sales documents with settlement | 1,834 | Every posted invoice and cash sale with total, unpaid balance, due date, and the date of the linked customer payment |
| Q4 | SKU breadth | 110 | Distinct non-freight items per customer |
| Q0 | Reconciliation probe | 25 | Income / COGS by transaction type, entity presence and journal source — used to define scope and tie out |
| Component | Income | COGS | Treatment |
|---|---|---|---|
| Invoices, cash sales, credit memos, cash refunds, item fulfillments — with entity | $2,891,691.74 | $1,171,583.02 | In scope — 100% attributed |
| Income on item receipts ($149.95) and other income on fulfillments without entity (−$223.00) | −$73.05 | — | Excluded — not customer sales |
| Inventory adjustments, revaluations, worksheets, vendor credits | — | $9,047.73 | Excluded — no customer |
| "Beg Balance Entries" journals JE102–JE149 (synthetic demo load) | $19,827,291.79 | $12,839,559.94 | Excluded — no customer, not transactional |
| Other journals | — | $100.00 | Excluded |
| GL Income / COGS, Subsidiaries 1–3, all posting | $22,718,910.48 | $14,020,290.69 |
Attributed revenue equals the sum of the in-scope transaction types in Q0 to the cent ($2,730,599.60 + $162,003.31 − $253.18 − $657.99 = $2,891,691.74). Attributed COGS equals ItemShip $1,087,837.78 + CashSale $83,745.24 = $1,171,583.02 exactly.
transaction.entity of its own document. Item fulfillments carry the sales-order customer, so COGS lands on the same customer as the invoice it relates to.SVC_Delivery Service); "Freight" = lines whose item type is ShipItem; everything else is "Product". Product class comes from the line-level class.nexttransactionlinelink (linktype Payment). Invoices settled by deposit application (1 case) or unlinked are excluded from the timing statistics but not from balances.duedate; balances use foreignamountunpaid. Account is single-currency USD, so foreign and base amounts are identical.datecreated values (e.g. 1 Oct 2026) post-date their first sale and are not used. Payments recorded on invoice date compress days-to-pay toward zero. Customer 3901 (privacy canary, inactive) has no activity.SELECT t.type, a.accttype,
CASE WHEN t.entity IS NULL THEN 'no-entity' ELSE 'has-entity' END AS ent,
CASE WHEN t.memo LIKE 'Beg Balance%' THEN 'begbal' ELSE 'real' END AS src,
COUNT(DISTINCT t.id) AS txns,
ROUND(SUM(-tal.amount), 2) AS net_credit
FROM transactionaccountingline tal
JOIN transaction t ON tal.transaction = t.id
JOIN transactionline tl ON tl.transaction = t.id AND tl.id = tal.transactionline
JOIN account a ON tal.account = a.id
WHERE t.posting = 'T' AND tal.posting = 'T'
AND tl.subsidiary IN (1, 2, 3)
AND a.accttype IN ('Income', 'OthIncome', 'COGS', 'Expense', 'OthExpense')
GROUP BY t.type, a.accttype,
CASE WHEN t.entity IS NULL THEN 'no-entity' ELSE 'has-entity' END,
CASE WHEN t.memo LIKE 'Beg Balance%' THEN 'begbal' ELSE 'real' END
ORDER BY t.type, a.accttype
SELECT t.entity AS cust,
TO_CHAR(ap.startdate, 'YYYY-MM') AS ym,
t.type AS ttype,
a.accttype,
tl.class AS cls,
tl.subsidiary AS sub,
CASE WHEN tl.item = 284 THEN 'SVC'
WHEN tl.itemtype = 'ShipItem' THEN 'FRT'
ELSE 'PRD' END AS kind,
ROUND(SUM(-tal.amount), 2) AS amt,
COUNT(DISTINCT t.id) AS txns
FROM transactionaccountingline tal
JOIN transaction t ON tal.transaction = t.id
JOIN transactionline tl ON tl.transaction = t.id AND tl.id = tal.transactionline
JOIN account a ON tal.account = a.id
JOIN accountingperiod ap ON ap.id = t.postingperiod
WHERE t.posting = 'T' AND tal.posting = 'T'
AND tl.subsidiary IN (1, 2, 3)
AND t.entity IS NOT NULL
AND t.type IN ('CustInvc', 'CashSale', 'ItemShip', 'CustCred', 'CashRfnd')
AND a.accttype IN ('Income', 'OthIncome', 'COGS')
GROUP BY t.entity, TO_CHAR(ap.startdate, 'YYYY-MM'), t.type, a.accttype,
tl.class, tl.subsidiary,
CASE WHEN tl.item = 284 THEN 'SVC' WHEN tl.itemtype = 'ShipItem' THEN 'FRT' ELSE 'PRD' END
SELECT c.id, c.entityid, c.companyname, c.altname, c.isperson, c.isinactive,
c.creditlimit, c.subsidiary AS sub,
cc.name AS category,
e.entityid AS salesrep,
tm.name AS terms,
TO_CHAR(c.datecreated, 'YYYY-MM-DD') AS created
FROM customer c
LEFT JOIN customercategory cc ON cc.id = c.category
LEFT JOIN employee e ON e.id = c.salesrep
LEFT JOIN term tm ON tm.id = c.terms
SELECT t.id, t.entity AS cust, t.type AS ttype, t.status,
TO_CHAR(t.trandate, 'YYYY-MM-DD') AS trandate,
TO_CHAR(t.duedate, 'YYYY-MM-DD') AS duedate,
t.foreigntotal AS total,
t.foreignamountunpaid AS unpaid,
( SELECT MAX(TO_CHAR(p.trandate, 'YYYY-MM-DD'))
FROM nexttransactionlinelink l
JOIN transaction p ON p.id = l.nextdoc
WHERE l.previousdoc = t.id AND l.linktype = 'Payment' AND p.type = 'CustPymt' ) AS paid_on
FROM transaction t
WHERE t.type IN ('CustInvc', 'CashSale')
AND t.posting = 'T'
AND t.entity IS NOT NULL
SELECT t.entity AS cust, COUNT(DISTINCT tl.item) AS skus
FROM transactionaccountingline tal
JOIN transaction t ON tal.transaction = t.id
JOIN transactionline tl ON tl.transaction = t.id AND tl.id = tal.transactionline
JOIN account a ON tal.account = a.id
WHERE t.posting = 'T' AND tal.posting = 'T'
AND tl.subsidiary IN (1, 2, 3)
AND t.entity IS NOT NULL
AND t.type IN ('CustInvc', 'CashSale')
AND a.accttype IN ('Income', 'OthIncome')
AND tl.itemtype <> 'ShipItem'
GROUP BY t.entity
Q1 rows are folded per customer: Income/OthIncome lines add to revenue (split by stream and class); COGS lines add to cost. Gross profit = revenue − COGS; margin = GP ÷ revenue where revenue > 0. Customers are ranked by GP and the cumulative share computed. "Last 12" = posting months 2025-10 … 2026-09; "Prior 12" = 2024-10 … 2025-09. Q3 supplies document counts, open and overdue balances (due date < 13 Sep 2026), maximum days past due, and days-to-pay statistics from paid_on − trandate. Q4 supplies SKU counts. Segment tables are simple group-bys over the customer set. The customer table embedded in this document is the reducer's output; every chart and derived figure on this page is computed from it in the browser, so the document is internally consistent by construction.