← Quantery Blog

How to test customer concentration risk

October 13, 2026 · 9 min readcustomer-concentrationthesis-buildingbacktesting

Customer concentration risk is the dependence of a company's revenue on a small number of buyers. Test it by recording each filing's disclosed major-customer shares, separating direct customers from end customers, and comparing concentrated companies with less concentrated peers after the filing became public. The question isn't whether concentration is automatically bad. It's whether the business has enough bargaining power and cash resilience to survive losing one large relationship.

A market-wide scan can find the finances around that risk. It can't recover an unnamed customer's revenue share from the statements. That figure usually lives in a note or risk factor written in prose. So the workable process has two layers: use the filing to label concentration, then use reproducible statement data to test which concentrated businesses were fragile.

What does customer concentration measure?

A direct customer buys from the company and appears in its revenue records. An indirect customer buys through a distributor or another channel partner. One large end customer may route purchases through several direct customers. One distributor may serve many unrelated end users.

Don't add direct and indirect percentages unless the filing says the groups are separate. They can describe overlapping paths for the same sale.

Concentration creates a particular kind of operating leverage. A major customer can negotiate harder on price, delay an order, change suppliers, or pull a product transition forward. Losing a buyer that supplies a large piece of revenue can leave costs behind. Payroll and inventory don't shrink on the same morning.

The reverse case is real too. A customer may concentrate purchases because the supplier owns scarce capacity or a hard-to-replace product. Revenue dependence and supplier power can coexist. A concentration label tells you the exposure. It doesn't settle who has the leverage.

Accounts receivable adds a second lens. Revenue concentration measures how much business came from a customer during a period. Receivable concentration measures how much was still unpaid at the reporting date. Accounts receivable are invoices awaiting collection, net of management's allowance for expected credit losses. A customer can be large in sales but small in ending receivables because it paid promptly. Another can dominate the unpaid balance after a late-quarter shipment.

Where do you find concentration in a filing?

Start with the annual filing and search for customer concentration, major customer, and accounts receivable. Read the note around every match. The risk factors explain what could go wrong; the financial-statement note carries the accounting disclosure; management's discussion may explain a change.

Then write down:

Keep the buyer label exactly as filed. Companies often use labels such as Customer A instead of a name. Guessing the identity adds a story the filing didn't give you.

NVIDIA's fiscal 2026 annual filing is a useful current example. The company reported that one direct customer represented 22% of total revenue and another represented 14%. It attributed those sales primarily to Compute & Networking. The same risk factor says many indirect customers buy through multiple channel partners and that some were individually estimated to represent at least 10% of revenue.

That wording prevents two easy mistakes. The direct shares describe the entities NVIDIA invoiced. The indirect threshold describes customers farther down the route. They may overlap, so summing them would invent exposure. And the filing doesn't identify those buyers, so attaching familiar company names would invent identities.

The scale is material beside the income statement. NVIDIA reported fiscal 2026 revenue of $215.938 billion, up from $130.497 billion in fiscal 2025. The concentration grew inside a rapidly expanding business. That can reflect a supplier winning more of a valuable market. It can also make the next order change matter more. The filing supports both readings, which is why the label belongs in a test instead of a verdict.

Why can't a ratio answer this by itself?

Revenue and receivables come from standardized statement lines, as do margins and cash flow. The identity and share of a major customer don't. Dividing receivables by revenue can show that unpaid invoices grew relative to sales. It can't tell you whether one buyer owns the balance.

A low receivables ratio doesn't prove diversification either. Advance payments can reduce receivables while customer dependence remains high. Sales through a distributor can make the distributor look concentrated even when end demand is broad. The same direct-customer share can therefore describe very different economics.

This is where structured data should stop. XBRL makes filing facts searchable but doesn't make every disclosure comparable. Labels change, indirect estimates use company-specific methods, and some exposures sit in narrative text. A screen that substitutes a convenient ratio for the disclosure hasn't automated the work. It has changed the question.

Build a small filing-derived dataset instead. Give each company-date observation fields such as largest_direct_customer_share and has_large_indirect_customer. Preserve missing as missing. Zero should mean the filing established no qualifying concentration under your definition, not that your search found nothing.

Historical testing requires the disclosure from each filing as it became public. Today's annual report can't be pasted backward across prior years. Customer relationships change. If you can't reconstruct the old labels, limit the analysis to the period you actually coded.

Which financial traits belong beside the label?

The filing label defines exposure. The statement data tests the company's ability to absorb it.

Gross margin can be a rough clue to bargaining power. A supplier with a differentiated product may retain a strong margin despite serving a few giant buyers. A falling margin while concentration rises may fit the opposite story. Compare each company with its own prior filing and with genuine peers, since margin levels are business-model fingerprints.

Free-cash-flow margin asks how much reported revenue became cash after capital spending. A concentrated business may need capacity, inventory, or specialized tooling before the buyer pays. Positive accounting profit won't fund those commitments if cash conversion is weak.

Net cash provides room for an order gap. Subtracting every dollar of cash from debt can still flatter the balance sheet because some cash may be restricted or needed to operate. Gross debt and net debt need the filing context.

Receivables growth versus revenue growth can flag a collection change after you verify comparable filing periods. It still doesn't identify the customer. Treat it as a prompt to reopen the note.

Keep the customer label separate from resilience. You want to know whether concentration mattered, whether resilience mattered, and whether the combination behaved differently.

How would you express the quantitative layer?

The shape below is illustrative. The bundled templates and Quantery's thesis documentation are the reference for exact fields. The thresholds are proposed research parameters. The customer label comes from your filing review and isn't a native statement field.

# Resilience around a concentrated customer base: illustrative
params:
  margin_floor: 0.10
  fcf_margin_floor: 0.05
  leverage_ceiling: 2.0

features:
  revenue_ttm: ttm(revenue)
  gross_profit_ttm: ttm(gross_profit)
  fcf_ttm: ttm(free_cash_flow)
  ebitda_ttm: ttm(ebitda)
  debt_now: newest(total_debt)
  cash_now: newest(cash)

  gross_margin: if(revenue_ttm > 0,
    gross_profit_ttm / revenue_ttm, null)
  fcf_margin: if(revenue_ttm > 0,
    fcf_ttm / revenue_ttm, null)
  net_debt: debt_now - cash_now
  leverage: if(ebitda_ttm > 0,
    net_debt / ebitda_ttm, null)

criteria:
  pricing_room:
    rules:
      - { when: "is_null(gross_margin)", score: 0, flag: no_gross_margin }
      - { when: "gross_margin >= $margin_floor", score: 2 }
      - { when: "gross_margin > 0", score: 1 }
      - { else: 0 }
  cash_room:
    rules:
      - { when: "is_null(fcf_margin) or fcf_ttm <= 0", score: 0 }
      - { when: "fcf_margin >= $fcf_margin_floor", score: 2 }
      - { else: 1 }
  balance_sheet:
    rules:
      - { when: "net_debt <= 0", score: 2 }
      - { when: "is_null(leverage)", score: 0, flag: no_positive_ebitda }
      - { when: "leverage <= $leverage_ceiling", score: 1 }
      - { else: 0 }

gate:
  mode: strict

Gross-profit coverage needs checking before a long historical run. Older local data can have gaps in that field. If coverage differs systematically between large and small companies, a strict gross-margin rule changes the research universe. Drop the criterion or backfill the data before you interpret returns.

The code keeps negative EBITDA from producing a flattering leverage ratio, and missing values earn no points. Those details matter more than another decimal place on the thresholds.

After the scan, join each result to the concentration labels that were public on that date. Don't hand-label only the companies that survived. That conditions the sample on today's quantitative outcome and leaves you unable to compare concentrated failures with concentrated successes.

What should the backtest compare?

Start with one predeclared definition of concentration, drawn from the filed disclosure. Build four groups by crossing concentrated versus less concentrated with resilient versus strained. Run the same universe, benchmark, filing lag, rebalance schedule, and holding rule for every group.

The key comparison is concentrated-resilient against concentrated-strained. If those groups differ, financial room may separate outcomes inside the risk you care about. Comparing concentrated companies only with the whole market can confuse customer exposure with sector, size, or growth characteristics.

Then test the label itself. Compare less concentrated companies with similar margins and leverage inside the same size range. A result that vanishes after matching may have been a quality or industry effect all along. Semiconductors and defense contractors naturally have different customer structures from retailers.

Use point-in-time labels and enter only after the filing became public. Every result is hypothetical and excludes trading costs. A disclosure can remain unchanged for a year even while orders move during the year, so test more than one holding window. Don't interpret the filing date as the date customer dependence began.

Finally, remove one industry at a time and preserve null labels as their own group. A missing disclosure can mean no reportable major customer, a different presentation, or incomplete hand-coding. If you silently call every null diversified, the clean-looking control group may be a data-quality bucket.

What would a result establish?

A positive result would show that your filed concentration labels and financial-resilience rules separated hypothetical outcomes in the tested sample. It wouldn't prove that a major customer caused the difference. Product cycles, supplier scarcity, sector exposure, and valuation can move alongside concentration.

A null result is useful too. Customer concentration may be too blunt without contract duration, switching costs, or the buyer's own financial health. The resilience rules may already capture everything the label adds. Or the hand-coded history may be too short to support the claim.

Keep the filing disclosure attached to the run. Change the concentration definition, margin test, or leverage ceiling one at a time, then record what changed. The filing gives you the exposure. The rules decide which version of that exposure you're actually testing.

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

← All articles