Top-down vs bottom-up TAM

Why the bottom-up approach is the one you can act on.

Stone spiral staircase seen from below

Use bottom-up to build your TAM and top-down to check it. A top-down figure starts from a total and cuts it down with percentages, so you end with an amount and no names. A bottom-up figure counts real accounts and multiplies by what each would pay, so every euro in the total traces back to a company someone can call.

The vocabulary comes from the previous chapter, and so does the example: scheduling software for private nursery operators in France. Every figure here is invented for the illustration.

How each method works

Top-down Bottom-up
Starts from A published market size or sector spend A count of companies that fit your criteria
Calculation Total × share relevant to you × share accessible Accounts per segment × contract value per segment
Time needed An hour A few days for a first version
Output A range in euros A file with one row per account, plus a total
Weak point Each percentage is an assumption Coverage and quality of your source
Good for A sanity check Everything you do afterwards

Why a top-down figure moves so easily

Say a study puts French spending on childcare management software at €40M a year. Use a real study when you do this, and write down its year and perimeter. You estimate the share that concerns private operators and the share you can reach. Move those two guesses by a reasonable amount:

Case Total spend Private operators Accessible Result
Cautious €40M 20% 30% €2.4M
Middle €40M 30% 50% €6M
Generous €40M 40% 60% €9.6M

Two assumptions, each defensible in a meeting, and the answer varies by a factor of four. Nothing in the calculation tells you which case is right, and no extra hour at the desk will either, since the percentages have no source you can inspect.

There’s a second problem. A sector spend measures what companies pay today. Your market may be mostly companies that run scheduling on a spreadsheet and spend nothing, and those are often your best prospects. A bottom-up count sees them. A spend figure can’t.

Spiral staircase seen from above

Build the bottom-up count on the same example

Start from the registry. The SIRENE dataset is public, DuckDB reads it directly, and one query groups establishments by company:

SELECT
  CASE WHEN open_sites <= 2 THEN '1-2'
       WHEN open_sites <= 9 THEN '3-9'
       ELSE '10+' END AS site_band,
  COUNT(*) AS accounts
FROM (
  SELECT siren, COUNT(*) AS open_sites
  FROM read_parquet('StockEtablissement_utf8.parquet')
  WHERE activitePrincipaleEtablissement = '88.91A'
    AND etatAdministratifEtablissement = 'A'
  GROUP BY siren
) t
GROUP BY 1
ORDER BY 1;

Adjust the file name to the one you download. Say this returns 2,300 companies. That is a raw count, and some of those companies won’t fit. Associations share the code with commercial groups, and declared activities can be out of date. So you sample before you believe it. In Google Sheets, this pulls 50 random rows:

=SORTN(A2:H2301, 50, 0, RANDARRAY(2300, 1), TRUE)

Check each one by hand against your criteria. Say 41 of 50 are real targets, which is 82%. Apply it: 2,300 × 0.82 gives about 1,900 accounts. A sample of 50 is accurate to around 10 points either way, so read that as somewhere between 1,650 and 2,100. That precision is plenty at this stage, and it’s far tighter than the top-down range.

Then attach a value to each band, from your own billing. If you have no customers yet, use your planned price for a typical account of that size.

Sites Accounts Contract value per year Annual value
1 or 2 1,260 €3,600 €4,536,000
3 to 9 560 €8,000 €4,480,000
10 or more 80 €24,000 €1,920,000
Total 1,900 €10,936,000

The value of this table goes beyond the total. It shows that 80 accounts carry 18% of the market by value on 4% of the rows, which is a targeting decision you could never read off a top-down figure. The sizing chapter refines these values later, once the file is scored.

Where bottom-up misleads you too

Counting accounts doesn’t make the result true. Each of these biases has a direction and a fix.

Bias Effect on the total What to do
Activity code wrong or too broad Inflates Hand-check a random sample, add a second criterion
A group counted once per legal entity Inflates the account count Consolidate by group, covered in the deduplication chapter
Companies missing from your source Deflates Take 30 of your customers and see how many the file contains
Contract value based on your biggest logos Inflates Use the median by size band
Accounts that fit on paper and have no budget Inflates Tier them lower rather than removing them

The third check gets skipped most often, and it’s the easiest. If only 20 of your 30 customers appear in the file, your source misses about a third of the market, and your criteria or your source need work before any total means much.

Yellow spiral staircase with a black railing

When top-down still earns its place

I keep top-down for three uses: a quick estimate before deciding whether a market deserves a bottom-up build, a category so new that no list of buyers exists yet, and a cross-check at the end.

For the cross-check, compare like with like. The middle case above, €6M of accessible spend, sits close to the €6.4M SAM from the previous chapter. Given a range of €2.4M to €9.6M, that agreement is reassuring and proves very little. What I look for is a large gap. As a personal rule of thumb, when the two differ by more than three times, I go and find out why before showing either figure to anyone. Usually a perimeter differs, or the sector spend misses companies that aren’t buying yet.

Running the count on your own market

The steps stay the same with any tool. Here is how I do them with Derrick, which I co-founded, so factor that in. Import Companies by NAF Code replaces the query above when you don’t want to handle the raw file: give it 88.91A, optionally one département, and you get each company with its open establishments and headcount band, at 1 credit per company imported. The 2,300 companies in the example would cost 2,300 credits. Each output field arrives as a column, so the sample check works the same way.

Where no activity code fits, Find Similar Companies starts from the LinkedIn page of one good customer and returns lookalikes with a similarity score, optionally filtered by country, at 1 credit per company found. Treat that output as discovery. It shows you adjacent companies and the vocabulary they use, and it won’t give you an exhaustive count, so it can’t serve as a denominator on its own. The NAF import, for its part, stops at the French border and doesn’t sort associations from commercial groups for you.

Your next step: pick your segment, write the one criterion that would let a machine find it, and run a first raw count, even a crude one. Then sample 50 rows. The share that fails tells you what is missing from your definition, which is what turning the ICP into observable criteria will fix.