← Quantery Blog

Operating cash flow vs net income: the accruals gap

September 9, 2026 · 10 min readfundamentalseducation

Net income and operating cash flow describe the same three months and they almost never agree. Net income is what the business earned under accrual accounting. Operating cash flow is the cash it actually collected and paid out. The difference between them has a name, and you measure it by subtraction: accruals equal net income minus operating cash flow.

That gap isn't a defect in either number. Every business has one, and in a capital-heavy business it's enormous by design. What carries information is the gap's direction, its size against the company's own history, and whether it keeps widening the same way year after year. Reported profits that never turn into collected cash is the pattern behind some of the market's more spectacular failures, and it costs nothing to check across every filer at once.

This series has been walking the statements one at a time. If you want the map first, start with how the three statements fit together; this piece takes the two bottom lines that are supposed to describe the same reality and asks why they don't.

Where each number comes from

Net income sits at the bottom of the income statement, after every cost the accountants could find, including several that never moved a dollar. Depreciation is the obvious one. So are write-downs, stock compensation, and deferred taxes.

Operating cash flow is the total of the first section of the cash flow statement, and here's the useful part: almost every US filer builds that section by the indirect method, which means the statement prints the bridge for you. It starts at net income. It adds back the non-cash charges. Then it adjusts for changes in working capital: receivables billed and not collected, inventory bought and not sold, payables incurred and not paid.

So the gap between the two numbers is itemized on the page. You don't have to infer what caused it. Open the cash flow statement, read down from net income to the operating subtotal, and every line you pass is one accrual doing its work.

Accruals, defined by subtraction

Total accruals for a period are net income minus operating cash flow. Two directions, two meanings.

Positive accruals mean the company reported more profit than cash it collected. Revenue booked before the customer paid. Inventory purchased ahead of the sale. Costs deferred into a future period.

Negative accruals mean cash came in ahead of the reported profit. Large depreciation charges are the usual reason, along with cash collected in advance, like an annual subscription billed in January and earned across twelve months.

Neither direction is a verdict. A fiber network or an airline carries so much depreciation that operating cash flow runs far above net income every single quarter for decades, and that says nothing about earnings quality. It says the company owns a lot of equipment. Meanwhile a fast-growing distributor funding inventory and receivables can post positive accruals for years while doing nothing wrong.

The innocent explanations and the ugly ones produce the same arithmetic. Receivables growing faster than revenue looks identical whether the company won a big customer with generous terms or shipped goods to a distributor who will never pay. What separates them is duration, scale, and whether the gap ever closes.

One quarter where the two numbers pointed opposite ways

Verizon's second quarter of 2026 is a clean illustration, because the two numbers moved in opposite directions and the company explained why.

Reported net income was $3.9 billion, down 22.9 percent year over year, with EPS of $0.92 against $1.18 a year earlier. Over the same three months, cash from operations was $10.4 billion, up 16.3 percent. For the first half, $18.4 billion against $16.8 billion, a 9.9 percent increase.

The release attributes the income-statement decline to $1.8 billion of pre-tax special items, including a $746 million loss on disposition of business tied to international wireline assets held for sale and $397 million of severance charges. Adjusted EPS, excluding those items, was $1.30 against $1.22.

A loss on assets held for sale is a mark down to a lower carrying value. Net income absorbs it. Cash never leaves the building. Severance is real cash, but it's paid on its own schedule, which is rarely the quarter the charge is booked.

A rule reading only net income sees a business that got 22.9 percent worse. A rule reading only operating cash flow sees one that got 16.3 percent better. Both are arithmetically correct and both are incomplete. Read together, they say the operating business collected more cash while the accounting absorbed the cost of exiting something. That's a different story from either number alone, and it's the story you want your rules to be able to tell apart.

There's a trap hiding in it. Big non-cash charges make the cash-versus-earnings comparison look terrific in exactly the quarter the reported business deteriorated. Any test built on that comparison inherits the trap.

W.T. Grant reported profits for a decade and generated no cash

The canonical case is older and much worse. W.T. Grant was a general merchandise chain, one of the largest retailers in the country. It filed a Chapter XI petition on 2 October 1975 and was adjudged bankrupt on 13 April 1976, with recorded liabilities well over a billion dollars. It ran 1,069 stores at the time of filing, had opened 376 outlets between 1969 and 1973, and went in with a negative net worth. It was the second largest US bankruptcy to that point, after Penn Central.

James Largay and Clyde Stickney went back through the filings and published what they found in the Financial Analysts Journal in 1980. Their conclusion: conventional ratio analysis of profitability, turnover and liquidity would not have surfaced Grant's problems until 1970 or 1971, but analysis of the company's cash flows would have revealed impending doom as much as a decade before the collapse. Through 1973, they note, Grant's operations were a net user, rather than a provider, of cash. As recently as 1973 the stock was trading at nearly 20 times earnings.

Ten years of reported earnings. Ten years of operations consuming cash. The two numbers disagreed for a decade, in one direction, and the disagreement was the whole story. It was sitting in the filings the entire time.

Why a single quarter's gap tells you nothing

Grant's signal took years to read, and that's the general case. Three disciplines make the comparison usable.

Use trailing twelve months instead of the latest quarter. A retailer builds inventory in autumn and collects in January, so any single quarter is measuring the calendar as much as the business. The same reasoning applies to year-over-year comparisons: match the same fiscal quarter a year earlier, which is why our theses lag by four periods before comparing anything.

Scale the gap. Net income minus operating cash flow is a dollar amount, and a billion dollars means something different for a railroad than for a software company. Dividing by total assets or by revenue turns it into a number you can compare across the market.

Watch the trend more than the level. A company that has run positive accruals of two percent of assets for a decade is telling you about its business model. One that went from zero to six percent in two years is telling you something else.

Putting the gap in a rule

Piotroski's F-score already contains this test, compressed to a single binary point. In the bundled Piotroski F-Score template, the two inputs sit at the top of the feature list:

The Piotroski F-Score template's first two features in Quantery's visual thesis builder: ni_ttm as ttm(net_income) and cfo_ttm as ttm(operating_cash_flow), the two trailing twelve month numbers this article compares.
The Piotroski F-Score template's first two features in Quantery's visual thesis builder: ni_ttm as ttm(net_income) and cfo_ttm as ttm(operating_cash_flow), the two trailing twelve month numbers this article compares.

The signal itself is one line, f_accrual: cfo_ttm > ni_ttm, and the template pairs it with the improving-returns signal so that neither one can carry a company on its own:

The earnings_quality criterion in the same template: both f_droa and f_accrual true scores 2, either one alone scores 1, neither scores 0.
The earnings_quality criterion in the same template: both f_droa and f_accrual true scores 2, either one alone scores 1, neither scores 0.

Full marks need improving return on assets and cash-backed earnings together. One of the two scores a single point. That pairing exists because each signal is weak by itself, and the accrual one is the weaker of the pair. Remember the fiber network: cfo_ttm > ni_ttm is close to free for anything with heavy depreciation and genuinely hard for a growing company funding its own working capital. Used alone, it's closer to an industry classifier than a quality test. It earns its keep as one of eight binary points on a value universe, which is how the paper used it.

If you want the scaled version, the shape is short. This one is illustrative and the bundled templates are the reference for exact field names:

# "Cash-backed earnings, measured against the company's own history"
params:
  accrual_ceiling: 0.05      # accruals above 5% of assets is a lot
  drift_tolerance: 0.02

features:
  ni_ttm:       ttm(net_income)
  cfo_ttm:      ttm(operating_cash_flow)
  assets:       newest(total_liabilities) + newest(total_equity)
  assets_prior: lag(total_liabilities, 4) + lag(total_equity, 4)
  accruals:     if(assets > 0, (ni_ttm - cfo_ttm) / assets, null)
  acc_q:        if(assets > 0, (newest(net_income) - newest(operating_cash_flow)) / assets, null)
  acc_q_prior:  if(assets_prior > 0, (lag(net_income, 4) - lag(operating_cash_flow, 4)) / assets_prior, null)

criteria:
  cash_backing:
    rules:
      - { when: "is_null(accruals)", score: 0, flag: no_balance_sheet }
      - { when: "accruals <= 0", score: 2 }
      - { when: "accruals <= $accrual_ceiling", score: 1 }
      - { else: 0 }
  accrual_drift:
    rules:
      - { when: "is_null(acc_q_prior)", score: 0, flag: no_year_ago_filing }
      - { when: "acc_q <= acc_q_prior + $drift_tolerance", score: 2 }
      - { else: 0 }

gate:
  - cfo_ttm > 0

Both criteria open on the null case, because a missing filing should cost a company its score instead of inheriting a default. Total assets gets reconstructed from the same filing's liabilities plus equity, since mixing periods would fabricate a balance sheet that never existed. The drift_tolerance param is where the argument lives: set it tight and you flag every growing company funding inventory, set it loose and you miss the slow build that took ten years to kill W.T. Grant. Write both, run both, and read the two survivor lists side by side. The DSL reference has the full field vocabulary.

What the gap can't tell you

It can't tell you why. A receivables build is a new distribution channel or a favor extended to a customer who is running out of money, and the arithmetic is identical. The management discussion section of the filing is where the explanation lives, when there is one, and going and reading three of them is the part no rule does for you.

It also can't survive management deciding to close it. Selling receivables pulls future collections into today's operating cash flow. Stretching payables does the same by holding onto cash that's owed. Both compress the gap without changing the business, and both leave tracks on the balance sheet.

What the comparison buys you is a cheap, market-wide reading of whether reported profit turned into money, computed from two lines that every filer publishes, with the reconciliation between them printed on the same page. It's the same instinct behind free cash flow, applied one level up the statement. Build the rule, look at what it catches, then go read the filings and find out whether the gap was pointing at anything.

Next in the series: capex and depreciation, and reading the capital cycle.

Want to try this on your own rules? Quantery is free for 14 days: the full app, no card required.

← All articles