Size the market
From a number of accounts to potential revenue.

Multiply the accounts you counted by what each one would really pay, segment by segment, then cap the result by what your team can sell in a given period. You end up with three figures, TAM, SAM and SOM, and each one traces back to rows in a table and assumptions you wrote down.
This is why the bottom-up approach is worth the extra work: when an investor or a board member challenges the number, you open the sheet and show the line.
Throughout this chapter, say you sell payroll software to French SMEs with 20 to 249 employees, priced per employee per month. Every figure below is illustrative. Replace them with your own counts and your own CRM data.
Count accounts from your table
Start with the deduplicated list and count by segment. If you are sizing before building the full list, count from a free official source first, because you only need totals at this point.
For France, INSEE publishes the Sirene stock files on data.gouv.fr. Load the legal units file into any SQL tool and filter on status, headcount band and NAF code. Check the column names against the current documentation before you run it:
SELECT trancheEffectifsUniteLegale AS band, COUNT(*) AS companies
FROM stock_unite_legale
WHERE etatAdministratifUniteLegale = 'A'
AND trancheEffectifsUniteLegale IN ('12', '21', '22', '31')
AND activitePrincipaleUniteLegale IN ('62.01Z', '62.02A', '70.22Z')
GROUP BY 1
ORDER BY 1;
Band 12 is 20 to 49 employees, 21 is 50 to 99, 22 is 100 to 199 and 31 is 200 to 249. Three traps sit in this query:
- Count SIREN (the company) rather than SIRET (the establishment) when one person buys for the whole company, otherwise a chain with 80 sites counts 80 times.
- The headcount band can be a few years old, and it is sometimes blank. Blank rows are unknowns, so report them on their own line.
- A NAF code is the main activity as declared, which may not match what the company really does.
When you want the actual rows, Import Companies by NAF Code in Derrick does that from a column of NAF codes (I co-founded Derrick, so keep that in mind). It returns the SIRENE record for each company, including siren, tranche_effectif_salarie, adresse and dirigeant, at 1 credit per company imported. Paying per row to get a count makes no sense, so use the free stock file for totals and an import for the segments you will work. It only covers France. Elsewhere, start from the national registry or a company search, and expect a weaker count.
Correct the count with a sample
Filters lie in a measurable way. Draw 100 random rows per segment, open each company’s website, and mark whether it really fits your ICP. The share that passes is your precision, and you apply it to the count.
| Segment | Rows counted | Fit in a sample of 100 | Fitting accounts |
|---|---|---|---|
| 20 to 49 employees | 10,000 | 60 | 6,000 |
| 50 to 99 employees | 3,400 | 65 | 2,210 |
| 100 to 249 employees | 1,900 | 68 | 1,292 |
Round those to 6,000, 2,200 and 1,300. Those are the accounts that have the problem you solve, which gives you the base for the TAM.
Price each account from what customers pay
List prices flatter the result, so use the median of what your customers in that segment actually pay per year. If you have no customers yet, use your price with the discount you expect to give, and label it an assumption.
Here, take €6 per employee per month, and the typical headcount of each segment:
| Segment | Typical employees | Annual value per account |
|---|---|---|
| 20 to 49 | 30 | €2,160 |
| 50 to 99 | 70 | €5,040 |
| 100 to 249 | 150 | €10,800 |
Use the typical headcount found in your table (the median of the real rows). The middle of the band is a guess that often runs too high in a skewed market.
Compute TAM and SAM by segment
TAM counts every account with the problem. SAM keeps the accounts you can serve today, given your language, your integrations and your product’s limits. Each exclusion must be a filter on data you hold. In this example, the product doesn’t yet handle some collective agreements, so companies in those sectors drop out.
| Segment | TAM accounts | TAM revenue | SAM accounts | SAM revenue |
|---|---|---|---|---|
| 20 to 49 | 6,000 | €12,960,000 | 4,200 | €9,072,000 |
| 50 to 99 | 2,200 | €11,088,000 | 1,500 | €7,560,000 |
| 100 to 249 | 1,300 | €14,040,000 | 700 | €7,560,000 |
| Total | 9,500 | €38,088,000 | 6,400 | €24,192,000 |
In a sheet, with TAM accounts in B, SAM accounts in D and annual value in F:
TAM revenue: =SUMPRODUCT(B2:B4, F2:F4)
SAM revenue: =SUMPRODUCT(D2:D4, F2:F4)
Average value per SAM account: =SUMPRODUCT(D2:D4, F2:F4) / SUM(D2:D4)
Look at the distribution before you look at the total. The 100 to 249 segment holds 14% of TAM accounts and 37% of TAM revenue, and that decides where a small team should start. It feeds directly into your tiers.
Cap the SOM with your sales capacity
SOM is what you can win over a defined period. A share of the market picked from the air (“we’ll get 5%”) tells you nothing. Compute it from capacity and win rate:
Accounts worked = reps × accounts per rep per month × months
New customers = accounts worked × win rate
SOM revenue = new customers × average value per SAM account
With 3 reps, 60 accounts each per month over 24 months, that makes 4,320 accounts worked out of 6,400. The average SAM value is €3,780. Win rates come from your CRM.
| Scenario | Win rate | New customers | Annual revenue after 24 months |
|---|---|---|---|
| Low | 2% | 86 | €325,080 |
| Expected | 3% | 130 | €491,400 |
| High | 4% | 173 | €653,940 |
Read the low line first, and check coverage as well. Here the team works through two thirds of the SAM in two years, so the market won’t run dry within the plan, but it will in about three years at this pace. A team in a smaller niche could hit that wall in months, and at that point the SOM is capped by the number of accounts. These figures ignore churn. If yours is material, subtract it before you share the number.
Show your assumptions next to the number
Each figure gets a line stating where it comes from and how much you trust it. Change one input and watch how far the result moves, then spend your checking time on the inputs that move it most.
| Assumption | Value | Source | Confidence | Effect if wrong |
|---|---|---|---|---|
| Fit rate, 20 to 49 | 60% | Sample of 100 rows | Medium | Accounts and revenue scale with it |
| Price per employee | €6 | Customer median | High | Revenue scales with it |
| Excluded sectors | A third of accounts | Filter on NAF codes | Medium | Changes SAM, TAM stays put |
| Accounts per rep per month | 60 | Last two quarters | Medium | Changes coverage and SOM |
| Win rate | 3% | CRM, 12 months | Low if the base is small | SOM scales with it |
As a cross-check, compare your result with any published market figure you can source. A wide gap often comes from a different scope, so explain it and keep your own number.
Your next step: run the count on your segments, draw one sample of 100 rows, and fill the TAM and SAM table this week. Save it as a tab next to the account list, then decide where that list should live.