
Harbor Coffee, our fictional coffee business, disappears from a value screen, narrowly misses a growth screen, and survives a dividend screen. Its business has not changed between searches. Neither has its $66 share price. Only the questions have changed.
“Find a good company” gives you nowhere to start. “Find a company growing sales at least 5% while generating cash” gives you a test. Following Harbor through three searches shows what those tests can find and what they leave unanswered.
Choose the question and the universe
A stock screen narrows a list of securities to those meeting your chosen conditions. Your investable universe is the list you start with. A screening criterion is one condition, such as a P/E range. A screen chooses what to research next.
Our universe has three fictional companies: Harbor, Tessel Software and Dalton Media. We use each company's FY3 financials and year-end price, in USD. FY3 means that company's latest fiscal year, not a shared calendar date.
The inputs are reported in the case; ratios are calculated below. The cutoffs are choices for this exercise, not fair-value or safety boundaries.
Run each screen separately, clearing the previous filters. Within a screen, both conditions must pass. Include the endpoints: “at least 0%” includes zero. Missing or nonmeaningful values fail the test; they are not zeros.
Harbor's cash margin clears all three tests. The other condition decides which list it joins.
Screen one: a lower earnings price
To start the value investigation, set trailing P/E from 5 through 20 and free-cash-flow margin at least 0%. That pairs a lower earnings price with zero or positive free cash flow.
Harbor's familiar trailing P/E of 22 misses the ceiling of 20.
Its reported $120 million of free cash flow on $1,100 million of revenue gives a margin of 120 ÷ 1,100 × 100 = 10.91%. That condition passes. But one pass and one fail still means excluded. Harbor has failed a price filter without becoming a worse business.
Dalton alone passes: $20 ÷ $2.50 gives a P/E of 8, and $40 million of FCF on $883.6 million of revenue gives a 4.53% margin. Tessel's P/E of 306.67 is far outside the range.
Dalton's falling cash flow and profit, seen in the value case, are exactly what this screen misses. The next question is whether that decline can stop. Clearing zero tells you neither whether cash will last nor how much owners can withdraw.
Screen two: growth with cash
To turn the growth and quality questions into filters, clear the value screen. Require revenue growth of at least 5% year over year and an FCF margin of at least 10%. These are screening proxies: numbers that stand in for the qualities you want to investigate.
Harbor's revenue rises from $1,050 million in FY2 to $1,100 million in FY3. That $50 million increase gives 50 ÷ 1,050 × 100 = 4.76% growth. Its 10.91% cash margin passes, but growth fails. Rounding a near miss into a pass changes the rule.
Tessel alone passes: revenue rises from $1,300 million to $1,586 million, or 22%, and $395 million of FCF gives a 24.91% margin. Dalton's revenue falls 6%, from $940 million to $883.6 million; its 4.53% margin also misses.
Tessel still has only $45 million of GAAP profit. Its operating cash flow adds back $250 million of stock-based compensation and includes $120 million released from working capital, chiefly advance customer payments. A high cash margin earns it a closer look, not a quality verdict.
Returns on capital, competitive advantages, earnings stability and share-count history still need research. Two passing numbers cannot do that work.
Screen three: income worth checking
Clear the growth filters. Set annual dividend yield from 1% through 5% and FCF margin at least 5%. The ceiling keeps the highest yield from becoming the goal.
Harbor paid $1.20 per share during FY3. At its $66 year-end price, that is $1.20 ÷ $66 × 100 = 1.82%. Its 10.91% FCF margin passes too. Harbor becomes an income candidate.
Tessel paid no dividend, so its yield is zero. Dalton's $1.80 dividend at a $20 price gives 9%, above the ceiling; its 4.53% cash margin also falls short. Those exclusions follow the question you chose.
Harbor's next stop is payout coverage and dividend history. A yield range can find income; it cannot promise the next payment.
Each result leaves a different question open.
| Screen and rules | Harbor | Next check |
|---|---|---|
| Value: P/E 5–20; FCF margin ≥0% | Fail: 22 | Justify price |
| Growth: sales growth ≥5%; FCF margin ≥10% | Fail: 4.76% | Sales drivers |
| Income: yield 1–5%; FCF margin ≥5% | Pass: 1.82% | Cash coverage |
Open the result and test the business
Start with the quote date, financial period and metric definition. Prices can change before a company reports again.
Then inspect the trend behind the number and read the business and risk disclosures in its annual filing. US public companies prepare those reports; the SEC does not certify their accuracy.
The filters leave the business's durability, accounting choices, future prospects and the reason it looks cheap unresolved. More filters can exclude useful candidates too. An empty result is information; changing a cutoff solely to rescue a favorite defeats the test.
Screening only stocks still listed cannot establish a strategy's past returns. Delisted stocks belong in that history too.
For practice, StockPolly's screener offers US, S&P 500 and signed-in watchlist universes, plus the four filters used here. Its Revenue YoY field compares the latest quarter with the same quarter a year earlier; this case uses full fiscal years. The fictional companies are not searchable there.
Harbor ends as a dividend-screen candidate. The open question is whether its cash can keep covering dividends while maintaining the business. That is the starting point for building a watchlist. A good screen leaves you with a shorter list and a sharper question.
In short
- A screen chooses what to research next, not what to buy.
- Two conditions require two passes; missing data never count as zero.
- A cutoff separates result lists, not good businesses from bad ones.
- Every passing row needs a question its numbers cannot answer.
