Sample output from the Operating Leverage Analysis prompt in the Sonar AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library
Financial Analysis · Account TD3016323 · Sonar AI

Operating leverage: how violently profit swings when sales move 1%

A regression of monthly operating costs against revenue over 23 closed periods (Sep 2024 – Jul 2026), decomposing the cost base into its fixed and variable parts — and translating that split into the profit-amplification factor the current margin never shows you.

Prepared 2026-08-24 Source NetSuite GL (posting transactions) Scope All subsidiaries excl. xElim Currency USD
2.9×
Profit swing per
1% revenue move
01

The one-page verdict

$368K
Fixed cost / month
(regression intercept)
48.8¢
Variable cost per
revenue dollar (slope)
51.2%
Contribution margin
(1 − slope)
$719K
Monthly breakeven
revenue
2.86×
DOL at current
run-rate
35%
Margin of safety
above breakeven

Every 1% move in sales moves operating profit ≈ 2.9% — in both directions.

The cost base is roughly half variable, half fixed at current volume: each incremental revenue dollar carries ~48.8¢ of cost, while ~$368K/month is spent before the first sale. That structure amplifies revenue changes into profit changes by a factor of 2.86 at the July 2026 run-rate ($1.11M/mo): a −10% revenue month cuts operating profit ~29%; a +10% month adds ~29%.

The more interesting story is the trend: a year ago, at ~$870K/mo revenue, the same cost structure produced a DOL of roughly 4.2× and a margin of safety of only ~19%. Revenue growth since then hasn't just added profit — it has structurally de-risked the P&L, because every dollar above the fixed-cost hurdle dilutes the leverage. The inverse is equally true: the first ~$390K of any revenue decline is absorbed at a punishing 51¢ of profit per dollar lost, and the business breaks even at ~$719K/mo — a level it last saw two years ago.

Nearly all of the variability lives in COGS (slope 0.44, R² 0.62). Operating expenses are almost pure fixed cost (slope 0.05, R² 0.06) — opex simply does not flex with sales. That is where the leverage comes from, and where any deliberate re-shaping of the risk profile would have to happen.

The Mechanism

A fixed-cost fulcrum turns small revenue moves into large profit moves

Fixed costs act as the pivot point of a lever. The further the fulcrum sits from the profit end (i.e., the bigger the fixed block relative to contribution), the more each revenue wiggle is amplified.

FIXED COSTS · $368K/mo ±1% REVENUE ±2.86% OPERATING PROFIT DOL = Contribution ÷ Operating profit = (0.5125 × R) ÷ (0.5125 × R − 368,417)
02

The regression

Ordinary least squares on 23 monthly observations. y = total operating cost (COGS + operating expense, GL account types COGS + Expense); x = revenue (Income + OthIncome). Financing items (OthExpense, ~$2K/mo interest) excluded.

Operating Cost = $368,417 + 0.4875 × Revenue R² = 0.775  ·  n = 23 months  ·  slope t-stat 8.51  ·  residual SE = 3.1% of mean cost
Slope 95% CI [0.368 – 0.607] Intercept 95% CI [$256K – $481K] Durbin–Watson 2.35 (no autocorrelation) Intercept t-stat 6.80 Bottom-up cross-check slope 0.490 · fixed $366K

Monthly operating cost vs. revenue — 23 closed periods

Each point is one accounting period. The line is the fitted cost function; the shaded band is the ±1 residual-SE envelope.
The intercept ($368K) is an extrapolation to zero revenue — read it as the short-run committed cost floor implied by the observed range ($814K–$1.15M/mo), not a literal shutdown budget. Its 95% confidence interval ($256K–$481K) is honest about that uncertainty. An independent bottom-up build (regressing all 51 active cost accounts individually and summing) lands within 0.7% of the top-down fit — the split is robust to aggregation choice.
03

Where the leverage lives

Splitting the regression by cost layer shows the two P&Ls hiding inside the P&L: COGS flexes, opex does not.

COGS — the variable engine

COGS = $163.5K + 0.441 × Revenue  ·  R² = 0.62
~44¢ of every revenue dollar is product cost. The $164K "fixed COGS" is mostly baseline 3rd-party contracting and cost-of-sales floors that don't scale 1:1 in-month.

Opex — the fixed block

Opex = $204.9K + 0.047 × Revenue  ·  R² = 0.06
An R² of 0.06 means opex is statistically indifferent to sales volume. Salaries, rent, insurance, IT, and marketing spend march to their own calendar. This block is the fulcrum.

Anatomy of a revenue dollar — then vs. now

How each $1.00 of monthly revenue was consumed, at the trailing-average vs. the July 2026 run-rate.
Variable cost takes the same 48.8¢ regardless of scale — but growth shrinks the fixed-cost slice from 39¢ to 33¢, and every one of those pennies falls straight to profit. This is operating leverage working for you. In reverse, it works against you at exactly the same rate.
04

The leverage curve

DOL is not a constant — it is a hyperbola that explodes as revenue approaches breakeven. This chart is the risk map: where you sit on the curve matters more than the current margin.

Degree of operating leverage vs. monthly revenue

DOL(R) = Contribution ÷ Operating profit = 0.5125·R ÷ (0.5125·R − 368,417)
A year of growth moved the business from 4.2× (fiscal-window average, ~$942K/mo) down the curve to 2.9× (July 2026, $1.11M/mo). The vertical asymptote at $719K is the breakeven wall: within ~$100K/mo of it, DOL exceeds 8× and small demand shocks produce violent profit swings. Distance from that wall — the 35% margin of safety — is the single most important number in this report.
05

Profit swings, quantified

Applying the fitted cost function to the July 2026 run-rate ($1,106K revenue, $198.5K model operating profit). Revenue moves on the left, amplified profit response on the right.

EBIT response to revenue shocks — the 2.86× amplifier

Revenue scenarioMonthly revenueOperating profit Δ ProfitAmplification
A sustained −15% demand shock (back to ~$940K/mo — roughly the late-2025 level) would cut operating profit nearly in half. A recession-grade −35% would put revenue ($719K) at breakeven exactly. Conversely, the next +$100K of monthly revenue is worth ~$51K/mo of profit at the 51% contribution margin.
06

Account-level anatomy

Each active cost account regressed individually against revenue, then classified: Variable tracks revenue tightly, Mixed partially, Fixed not at all. Six accounts carry essentially all of the variability.

Acct #AccountClass Avg $/moSlope (¢/rev $)Corr. r% Variable
Caveat: dozens of small expense accounts in this account move in perfect lockstep with one another (identical correlation of −0.036 against revenue) — a telltale of allocation-style postings. Their individual classifications are indicative; their collective behavior (fixed) is what matters, and it is unambiguous. All 43 fixed-class accounts sum to ~$208K/mo of the fixed block; salaries & wages (6210) alone is $83K/mo.
07

Fit quality & residuals

The model's misses are small (SE = 3.1% of mean cost) and patternless (DW = 2.35) — but the misses themselves carry information.

Actual vs. fitted operating cost by month

Residuals — where reality beat (or missed) the model

Bars below zero = cost came in lower than the revenue level predicted (good months).
The single largest residual is Nov 2025 (−$69K): the biggest revenue month of that year ($1.05M) with costs $69K under model — costs lagged the demand spike, exactly what a fixed-heavy opex base predicts. The mirror image, Sep–Oct 2025 (+$40K/+$33K), looks like cost catching up. No residual exceeds 2.4 SE; nothing suggests a structural break in the cost function over the window.
08

Method, queries & assumptions

Everything below is reproducible against the live GL. Queries follow this account's house SuiteQL conventions (elimination subsidiary excluded via transactionline.subsidiary, posting transactions only).

Assumptions & scope decisions

  1. Window: Sep 2024 – Jul 2026 (23 months). The GL contains no material activity before Sep 2024. Aug 2026 is the current, still-open period and was excluded to avoid a partial-month observation biasing the slope down.
  2. Operating cost = account types COGS + Expense. OthExpense (interest, ~$1.9K/mo — a financing cost, invariant to sales) and income tax are excluded; including them changes the slope by <0.002.
  3. Revenue = Income + OthIncome, sign-flipped from GL credit convention (SUM(−tal.amount)). OthIncome is negligible (<$150 total in the window).
  4. Subsidiary 4 (xElim) excluded per house rule — it is an elimination entity. Filter applied on transactionline.subsidiary because transaction.subsidiary is not exposed to SuiteQL in this account.
  5. Linearity within the observed range. Revenue only varied between $814K and $1.15M/mo; the fixed/variable split is reliable inside (and near) that band. The intercept is an extrapolation — treat the breakeven point ($719K, just below the observed floor) as well-supported, and any projection below ~$700K as increasingly speculative.
  6. Static cost structure assumed. A 23-month window blends any step-changes (headcount adds, new leases) into the average. The Durbin–Watson of 2.35 and patternless residuals support stability over this particular window.
  7. Account classification thresholds: Variable = r ≥ 0.75 and >60% of spend slope-explained; Mixed = r ≥ 0.5 (or moderate slope share with r ≥ 0.4); Fixed = the rest. Aggregate results are insensitive to reasonable threshold changes because the six Mixed accounts dominate all variability.
  8. Single currency (USD) — no FX effects. All figures are monthly unless stated.

Formulas

OLS: Cost = a + b·Revenue Contribution margin = 1 − b = 0.5125 Breakeven = a ÷ (1−b) = $718,888 DOL(R) = (1−b)·R ÷ ((1−b)·R − a) Margin of safety = (R − BE) ÷ R

Source queries (SuiteQL)

Query 1 — Monthly revenue & cost by account type (primary regression input)
SELECT
    ap.id           AS period_id,
    ap.periodname   AS period_name,
    TO_CHAR(ap.startdate, 'YYYY-MM-DD') AS start_date,
    a.accttype      AS acct_type,
    ROUND(SUM(-tal.amount), 2) AS signed_amount
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 t.postingperiod = ap.id
WHERE t.posting = 'T'
  AND ap.isquarter = 'F' AND ap.isyear = 'F'
  AND tl.subsidiary <> 4                     -- exclude xElim (house rule)
  AND a.accttype IN ('Income','OthIncome','COGS','Expense','OthExpense')
GROUP BY ap.id, ap.periodname, TO_CHAR(ap.startdate,'YYYY-MM-DD'), a.accttype
ORDER BY TO_CHAR(ap.startdate,'YYYY-MM-DD'), a.accttype
Query 2 — Per-account monthly cost series (classification input)
SELECT
    TO_CHAR(ap.startdate, 'YYYY-MM') AS month,
    a.id AS account_id, a.acctnumber, a.fullname, a.accttype,
    ROUND(SUM(tal.amount), 2) AS cost_amount
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 t.postingperiod = ap.id
WHERE t.posting = 'T'
  AND ap.isquarter = 'F' AND ap.isyear = 'F'
  AND ap.startdate >= TO_DATE('2024-09-01','YYYY-MM-DD')
  AND ap.startdate <  TO_DATE('2026-08-01','YYYY-MM-DD')
  AND tl.subsidiary <> 4
  AND a.accttype IN ('COGS','Expense','OthExpense')
GROUP BY TO_CHAR(ap.startdate,'YYYY-MM'), a.id, a.acctnumber, a.fullname, a.accttype
ORDER BY a.accttype, a.acctnumber, TO_CHAR(ap.startdate,'YYYY-MM')
Query 3 — Per-account regression sum terms (server-side Σx, Σy, Σxy, Σx², Σy²)
WITH rev AS (
  SELECT t.postingperiod AS pid, SUM(-tal.amount) AS x
  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 t.postingperiod = ap.id
  WHERE t.posting = 'T' AND ap.isquarter = 'F' AND ap.isyear = 'F'
    AND ap.startdate >= TO_DATE('2024-09-01','YYYY-MM-DD')
    AND ap.startdate <  TO_DATE('2026-08-01','YYYY-MM-DD')
    AND tl.subsidiary <> 4
    AND a.accttype IN ('Income','OthIncome')
  GROUP BY t.postingperiod
),
cost AS (
  SELECT t.postingperiod AS pid, tal.account AS aid, SUM(tal.amount) AS y
  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 t.postingperiod = ap.id
  WHERE t.posting = 'T' AND ap.isquarter = 'F' AND ap.isyear = 'F'
    AND ap.startdate >= TO_DATE('2024-09-01','YYYY-MM-DD')
    AND ap.startdate <  TO_DATE('2026-08-01','YYYY-MM-DD')
    AND tl.subsidiary <> 4
    AND a.accttype IN ('COGS','Expense','OthExpense')
  GROUP BY t.postingperiod, tal.account
)
SELECT c.aid, COUNT(*) AS n,
       ROUND(SUM(r.x),2) AS sx,  ROUND(SUM(c.y),2) AS sy,
       ROUND(SUM(r.x*c.y),2) AS sxy,
       ROUND(SUM(r.x*r.x),2) AS sxx, ROUND(SUM(c.y*c.y),2) AS syy
FROM cost c JOIN rev r ON r.pid = c.pid
GROUP BY c.aid
ORDER BY SUM(c.y) DESC
-- Note: Oracle's REGR_SLOPE / CORR are rejected by this account's SuiteQL
-- ("Invalid or unsupported search"), so sum terms are computed server-side
-- and the OLS algebra finished client-side. acctname is NOT_EXPOSED here; use fullname.
Regression mathematics (as computed)
b  = Σ(x−x̄)(y−ȳ) / Σ(x−x̄)²          # slope = variable cost ratio = 0.48748
a  = ȳ − b·x̄                          # intercept = fixed cost/month = 368,417
R² = 1 − SSE/SST                       # 0.7752
SE(b) = s/√Σ(x−x̄)²  where s²=SSE/(n−2) # 0.0573 → t = 8.51, p < 0.0001
95% CIs use t(0.975, df=21) = 2.080
Durbin–Watson = Σ(eᵗ−eᵗ⁻¹)²/Σe²        # 2.35 → no serial correlation

Validation: independent OLS per cost account, summed across 51 accounts:
  Σ slopes = 0.4903 (vs 0.4875 top-down, Δ 0.6%)
  Σ intercepts = $365,938 (vs $368,417 top-down, Δ 0.7%)  ✓