Sample output from the Period Comparison Analyzer prompt in the NetSuite AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library

Comparative financial analysis · NetSuite TD3016323

Period Comparison: Q2 2026 vs Q2 2025

Revenue, expense, and profitability comparison for the quarter ended June 2026 against the same quarter of 2025, with drivers traced to accounts, products, and customers.

Prepared 2026-09-23 · Consolidated, subsidiaries 1-3, elimination excluded · Source: NetSuite general ledger via SuiteQL · Prompt: Period Comparison Analyzer, NetSuite AI Prompt Library v1 · Standard Review depth

Executive Summary

Comparing: the quarter April to June 2026 with the same quarter of 2025, consolidated across the three operating subsidiaries, elimination entity excluded. Revenue rose +20.5% to $3,130,018. Gross margin held at 39.2%, down 0.4 points. Operating expenses rose only +4.5%, so operating income increased +57.8% to $454,480 and operating margin expanded 3.4 points to 14.5%. The story of the quarter is operating leverage: the cost base barely moved while revenue grew a fifth.

One qualification governs how the revenue figure should be read. 84% of recognized income in the current quarter, and 88% in the prior, was posted by journal entry rather than by invoices or cash sales. The revenue traceable to billing documents was $508,809 against $317,443, a +60.3% increase, which is stronger growth than the headline but on a much smaller base. Both views are shown below. The driver analysis is built on billing documents, because journal-posted revenue carries no item, customer, or quantity to analyze.

Revenue
$3,130,018
+20.5% vs Q2 2025
Gross margin
39.2%
-0.4 pts
Operating income
$454,480
+57.8%
Operating margin
14.5%
+3.4 pts
MetricQ2 2026Q2 2025ChangeChange %Driver
Revenue$3,130,018$2,597,443$532,575+20.5%Product revenue account (+$503K); 84% of income is journal-posted, see integrity check
Cost of goods sold$1,902,665$1,569,759$332,906+21.2%Purchases (+$253K) and cost of sales (+$51K), in line with revenue
Gross profit$1,227,353$1,027,684$199,669+19.4%Gross margin 39.2% vs 39.6%, -0.4 pt
Operating expenses$772,873$739,636$33,236+4.5%Salaries (+$25.7K, +10.8%), advertising (+$8.2K, +15.0%); all else flat or lower
Operating income$454,480$288,048$166,432+57.8%Operating margin 14.5% vs 11.1%, +3.4 pts
Net income$448,254$281,625$166,630+59.2%Other expense flat at $6K

Revenue Comparison

Integrity check: where recognized revenue comes from

Income postings by source transaction type. The journal series moved from $2.28M to $2.62M, a +15.0% step that accounts for 64% of the total revenue increase. Whether that series represents real activity is a question for the controller, and it is flagged for human review; this analysis takes the ledger as posted.

297K486KInvoices21K23KCash sales2,280K2,621KJournal entriesQ2 2025Q2 2026
Revenue walkAmount
Q2 2025 revenue$2,597,443
+ Journal-posted income$341,208
+ Invoice revenue$189,101
+ Cash sale revenue$2,265
= Q2 2026 revenue$3,130,018

Revenue by product class, billing documents only

The growth in billed revenue came from two places. Home and Decor nearly doubled on volume: 436 units against 267, led by the Contour Rhapsody Breeze mattress line, where every size sold 23 or 24 units against 10 a year earlier. Delivery service revenue more than doubled, 29 engagements against 8, which follows the furniture volume. Apparel revenue grew 9% on flat units, so that gain is price or mix. Beauty was flat in both revenue and units.

108K201KHome & Decor74K158KDelivery Svc94K102KApparel0K5KMiscellaneou40K39KBeautyQ2 2025Q2 2026
ClassQ2 2025Q2 2026ChangeChange %Units, priorUnits, currentUnits %
Home & Decor$108,372$200,520$92,149+85.0%267436+63.3%
Delivery Service (no class)$74,217$158,214$83,997+113.2%829+262.5%
Apparel$93,809$102,102$8,293+8.8%862864+0.2%
Miscellaneous$0$5,125$5,125n/a037new
Beauty$39,596$39,436-$160-0.4%1,4881,453-2.4%

Volume and price effects

Based on: volume effect = change in units x prior average unit revenue; price effect = change in average unit revenue x current units. Mix within a class is included in the price effect.

ClassRevenue changeVolume effectPrice and mix effect
Home & Decor$92,149$68,595$23,554
Delivery Service$83,997$194,820-$110,823
Apparel$8,293$218$8,076
Beauty-$160-$931$771

Customer movement

Ten customers invoiced in the current quarter had no invoices in the prior quarter, and four prior-quarter customers had none in the current. Existing customers grew 23%. The largest lost account, Mercury Co. at $80,079, also carries an $80,079 open receivable that is 460 days past due, so the loss and the collection problem are the same account. The largest new account, Falcon Systems at $86,007, has not yet paid any of it. Both are flagged for human review.

GroupCustomersQ2 2025Q2 2026Change
New customers10$0$230,044$230,044
Lost customers4$80,660$0-$80,660
Existing customers39$239,608$294,847$55,239
CustomerQ2 2025Q2 2026ChangeStatus
Falcon$0$86,007$86,007New
Mercury Co.$80,079$0-$80,079Lost
Blockster$0$54,336$54,336New
John G. Roche Opticians$0$31,810$31,810New
Greenwood Consulting$0$26,275$26,275New
Heidelberg Haus$0$22,474$22,474New
Pineapple Republic$25,128$44,698$19,570Existing
Design$33,201$43,467$10,266Existing

Expense Comparison

Cost of goods sold rose +21.2%, a point faster than revenue, which is the whole of the 0.4-point gross margin decline. Operating expenses rose $33,236 on a base of $739,636. Two accounts explain the increase and everything else was flat or slightly lower: salaries and wages, up $25,744 or 10.8%, and advertising, up $8,189 or 15.0%. Twenty-two general and administrative accounts each declined by roughly 2%, a pattern regular enough to suggest a uniform adjustment rather than twenty-two separate decisions.

AccountNameTypeQ2 2025Q2 2026ChangeChange %
4210Revenue - ProductsIncome$2,413,594$2,916,909$503,315+20.9%
5310PurchasesCOGS$1,285,521$1,538,634$253,113+19.7%
5340Cost of SalesCOGS$141,894$193,036$51,141+36.0%
53603rd Party ContractingCOGS$142,344$170,996$28,651+20.1%
4310Revenue - ServicesIncome$182,400$209,697$27,297+15.0%
6210Salaries & WagesExpense$237,500$263,244$25,744+10.8%
6060AdvertisingExpense$54,720$62,909$8,189+15.0%
6610Rent ExpenseExpense$36,300$39,930$3,630+10.0%
6230Payroll ExpensesExpense$25,093$27,644$2,551+10.2%
4450Freight RevenueIncome$1,449$3,412$1,963+135.5%

Profitability Analysis

Gross margin: 39.6% to 39.2%, immaterial under the 1-point threshold. Operating margin: 11.1% to 14.5%, material at 3.4 points. The expansion is arithmetic: gross profit grew $199,669 and operating expenses grew $33,236, so 83% of the incremental gross profit reached operating income. On the billing-document view alone, the same conclusion holds with more force: billed revenue grew 60% and operating expenses grew 4.5%.

Key Drivers

DriverDirectionEvidenceRecurring or one-timeControllable
Journal-posted income series+$341KJournal entries to revenue accounts in both quartersRecurring by pattern; nature requires reviewAccounting policy
Furniture volume (Home and Decor)+$92KUnits +63%, Contour Rhapsody Breeze line 23 vs 10 per sizeRecurring if demand holdsSales and inventory
Delivery service engagements+$84K29 vs 8 engagementsFollows furniture volumeOperations
New customers+$230K10 accounts with no prior-quarter invoicing; largest is unpaidUnknown until collectedCredit
Lost customers-$81K4 accounts; Mercury Co. is 460 days past dueOne-timeCollections
Salaries and advertising-$34KOnly two operating accounts that roseRecurringManagement

30 / 60 / 90 day framing

Appendix: Data Lineage

IDTypeNameHandleScopeUsed forComplete
DL-001SuiteQLP&L by accounttransactionaccountingline join account, accountingperiodPosting periods Apr-Jun 2026 and Apr-Jun 2025, subsidiaries 1-3Comparison summary, expense variancesYes
DL-002SuiteQLIncome by source typesame, grouped by transaction typeSameIntegrity check, revenue walkYes
DL-003SuiteQLRevenue by itemtransaction (CustInvc, CashSale) join transactionline, itemTransaction dates in both quartersClass, unit, price and volume analysisYes
DL-004SuiteQLRevenue by customertransaction (CustInvc)SameCustomer movementYes

Adaptations from the prompt's templates: amounts come from transactionaccountingline rather than transactionline.amount, so that they match the posted ledger; periods are selected by posting period for the P&L and by transaction date for the item and customer detail; the elimination subsidiary is excluded through the line-level subsidiary, because transaction.subsidiary is not exposed to SuiteQL; item class comes from the transaction line rather than the item record, which is unclassified for most items in this account.

Queries
SELECT a.acctnumber, a.fullname, a.accttype,
       SUM(CASE WHEN ap.startdate >= DATE '2026-04-01' AND ap.enddate <= DATE '2026-06-30' THEN -tal.amount ELSE 0 END) AS cur_amt,
       SUM(CASE WHEN ap.startdate >= DATE '2025-04-01' AND ap.enddate <= DATE '2025-06-30' THEN -tal.amount ELSE 0 END) AS prior_amt
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 (both period windows)
GROUP BY a.acctnumber, a.fullname, a.accttype

-- same query grouped by t.type, restricted to accttype = 'Income'  (DL-002)

SELECT tl.item, BUILTIN.DF(tl.item), i.itemtype, BUILTIN.DF(tl.class),
       SUM(CASE WHEN current quarter THEN -tl.quantity END), SUM(CASE WHEN prior quarter THEN -tl.quantity END),
       SUM(CASE WHEN current quarter THEN -tl.netamount END), SUM(CASE WHEN prior quarter THEN -tl.netamount END)
FROM transaction t JOIN transactionline tl ON tl.transaction = t.id JOIN item i ON i.id = tl.item
WHERE t.type IN ('CustInvc','CashSale') AND t.posting = 'T' AND tl.mainline = 'F' AND tl.taxline = 'F' AND tl.subsidiary <> 4
GROUP BY tl.item, BUILTIN.DF(tl.item), i.itemtype, BUILTIN.DF(tl.class)

SELECT t.entity, BUILTIN.DF(t.entity), SUM(current quarter foreigntotal), SUM(prior quarter foreigntotal)
FROM transaction t WHERE t.type = 'CustInvc' AND t.posting = 'T' GROUP BY t.entity, BUILTIN.DF(t.entity)

Appendix: Period Definitions, Assumptions, and Verification

AssumptionCategoryRationaleSensitivityImpact if wrong
Both quarters are 91 days and fully postedDataApr-Jun in both years; no periods are locked in this accountHighAll comparisons
Ledger amounts as posted are the basis, including journalsBusiness logicThe P&L is what the books sayHighHeadline growth rate; billing-document view provided as the alternative
Elimination subsidiary excludedMethodIntercompany eliminations distort operating comparisonLowTotals
Materiality: revenue >10%, expenses >15% or $50K, margin >3 ptsMethodPrompt thresholdsLowWhich variances are called material
TestObjectiveResult
G1-001Period totals reconcilePass income by account ({money(inc[0])}) equals income by source type ({money(sum(s['cur_income'] for s in src.values()))})
G1-002Periods comparablePass 91 days each
G1-003Data completePass 57 accounts with activity; no unposted transactions in either window
G2-001Variance arithmeticPass computed in code; summary rows foot
G2-002Percentage calculationPass change / prior

Confidence: 95% in the period figures as posted; 80% in the driver attribution for billed revenue (price and volume effects are computed per class and include mix); the journal series is reported, not explained, and its characterization requires human review.

Analysis is read-only and derived from live SuiteQL. Customer- and vendor-specific actions require human review before any account change.SuiteStep, LLC