An ideal customer profile is a definition of the companies you should sell to, precise enough to apply to a list. This guide shows how to derive one from the customers you have already won: enrich them with company data, measure which attributes separate them from the wider market and do not merely describe them, test the result on customers held back, and recognise a profile that has been fitted to noise.
Start from outcomes and a comparison group
Decide what counts as a good customer before you look at any attributes: closed-won and still active after twelve months, say, or the top third by retained revenue. Then choose the comparison group, which is the step that is often skipped. It is the set of companies you could have sold to: your target market, not every company in the data.
Prevalence among customers means nothing without the base rate. If 90% of your customers run a tag manager and 82% of the market does, the attribute says almost nothing about who buys. What counts is lift, the share of customers with an attribute divided by the share of the market with it.
Define the market from criteria you would hold even if you had no customers, such as the countries you can serve and the size band you support, using the columns in the next section. A market defined by what your customers already look like makes every lift circular, and one drawn too wide inflates all of them.
A second comparison is worth running if you have the history: retained customers against churned ones. Run the lift query twice, once with customers set to each group, and put the results side by side. An attribute that lifts retained customers and not churned ones predicts keeping a customer, and one that lifts both predicts only winning.
Enrich the customer list
Match your customers to company records once, on the company website: normalise each domain, join it to domain in Technology Stack (company_technologies), and keep the company ID, company_id. The glossary entry on domain matching explains the technique.
Report the share matched: it is the share of your customers the profile is built on, and a higher share gives a firmer profile. The attributes then come from the datasets below: the marketing stack and hiring datasets hold the first three families, and every column is defined in the data dictionary.
| Family | Dataset and columns | Example attribute |
|---|---|---|
| Technology | Technology Stack (company_technologies): technology, technology_category | Runs a category, or a specific tool |
| Go-to-market | Website Profile (company_site_facts): key_pages, markets, languages, currencies, apps | Has demo and contact_sales pages; prices in several currencies |
| Hiring | Hiring Activity (company_hiring_daily): by_function, open_postings; Sales Team Metrics (company_sales_weekly): by_segment | Has open customer success roles; sells to enterprise |
| Scale | Employee Headcount (company_headcounts): employees; Web Traffic (traffic_ranks): rank_bucket | A size band; a traffic tier |
| Funding and listing | Company Funding (company_funding); the listing identifiers | Raised an exempt offering; is listed |
| Website labels | The dashboard and the data browser | Industry, business model, target customer size, growth stage |
Measure lift with support
For each attribute compute three numbers: the share of customers that have it, the share of the market that has it, and the lift between them. Report a fourth, support, the number of customers behind the share, because a lift from six customers is a different thing from one from sixty. The query does it for technologies. customers is your own table of matched company_id values, and target_market is your own table of the company_id values of the companies you could have sold to, drawn from the data itself so that every row can be counted. The other families take the same shape: key_pages ? 'demo' for a page, a join to company_hiring_daily for open roles.
with n as (
select
(select count(*) from customers) as customers,
(select count(*) from target_market) as total
),
mine as (
select t.technology, count(distinct t.company_id) as with_it
from company_technologies t
join customers c on c.company_id = t.company_id
where t.missing_since is null
group by t.technology
),
everyone as (
select t.technology, count(distinct t.company_id) as with_it
from company_technologies t
join target_market m on m.company_id = t.company_id
where t.missing_since is null
group by t.technology
)
select
e.technology,
coalesce(m.with_it, 0) as customers_with,
round(coalesce(m.with_it, 0)::numeric / n.customers, 3) as share_customers,
round(e.with_it::numeric / n.total, 3) as share_all,
round((coalesce(m.with_it, 0)::numeric / n.customers)
/ (e.with_it::numeric / n.total), 2) as lift
from everyone e
left join mine m using (technology)
cross join n
where coalesce(m.with_it, 0) >= 10
or e.with_it::numeric / n.total >= 0.1
order by lift desc;The example is illustrative: Acme Robotics is an invented seller with 120 matched customers in a target market of 4,000 companies, and the shares are invented to show how to read the output.
| Attribute | Customers with it | Share of customers | Share of market | Lift |
|---|---|---|---|---|
| Runs a tag manager | 108 | 90% | 82% | 1.10 |
| Has demo and contact-sales pages | 78 | 65% | 27% | 2.41 |
| Has an open customer success posting | 54 | 45% | 28% | 1.61 |
| Prices in more than one currency | 36 | 30% | 12% | 2.50 |
| Runs one named tool | 6 | 5% | 1% | 5.00 |
Read it from the bottom up. The tool with the highest lift is carried by six customers, below a floor of ten, so leave it out until more customers confirm it. The tag manager has the largest share among customers and a lift of 1.10: it is common everywhere and carries no information. The sales-led pages, the pricing in several currencies and the open customer success roles are candidates, and they describe different things: how the company sells, where it sells and how it supports customers.
Read the low end of the lift column as well. An attribute that is common in the market and rare among your customers names companies you rarely win, and a condition that excludes them belongs in the profile as much as one that includes the others. The where clause keeps such attributes when at least 10% of the market has them. Check the support behind a low lift before you exclude on it, because a small count can mislead.
Guarding against overfitting
- A floor on support. Ignore any attribute carried by fewer than a set number of customers, such as 10.
- The arithmetic of many tests. Fokals recognises 6,283 technologies, and with site, hiring and funding attributes you test thousands of candidates. At a 5% threshold about 314 of the 6,283 technologies would pass even if none had any effect on who buys.
- A split. Build the profile on part of the customers and test it on the rest, by random split or by close date. Keep an attribute only if its lift holds in both parts.
- Few conditions, each explainable. Three to five conditions a salesperson can apply to a list. A profile of eight conditions describes five customers perfectly and fits no one else, and if you cannot say why a condition should matter, drop it.
- Nothing your product causes. Leave out your own tag and any tool that arrives with your product, since those are consequences of the sale and not reasons for it.
What the data knew when they bought
Company data describes a company as it was observed, and a customer observed today may differ from the company that signed. A tool adopted after the purchase looks like a reason for the purchase if you count it. Every observation is dated and point-in-time, so first_seen_at is the safeguard: keep a technology only where first_seen_at is earlier than the close date. Where a technology was already in place at the close, it is a fair trait of the customer at the time of the sale. Traits that change slowly, such as the pages a site has, the markets it serves and its size band, hold at any date, and technologies adopted after the close are a description of today's customers.
Turning the lifted attributes into a profile
Pick the three to five attributes that survive the floor and the split, write them as conditions, and apply them to the target market. The illustrative profile, sales-led pages and either pricing in more than one currency or an open customer success role, matches 700 of the 4,000 companies and 84 of the 120 customers. It holds 17.5% of the market and 70% of the customers, a lift for the profile as a whole of 4.0.
Check the same figures on customers that were not used to build it, and on closed-lost deals if you have them. A profile that works only on its own customers is a description of the past. Once it holds, it drives two things: the count of accounts in your market, as in sizing a total addressable market with technographic counts, and the fit rule of your segments, as in account-based marketing segments from company signals.
How to read the result
- What a company does in public. The data describes what a company is and does in public: its stack, its pages, its hiring and its announcements. Win and loss reasons stay in your CRM and your interviews, beside it.
- Size. Size comes from stated headcount, a monthly traffic tier and hiring scale, three measures you can read side by side to place a company in a size band.
- Your own targeting. Your customers are shaped by whom your sales team approached. If it called only mid-sized firms, the profile will say mid-sized firms. Compare against the market, as above, and not only against the pipeline.
- What a detection shows. A technology detection shows presence on the website, detected from page content, scripts, network requests, response headers and DNS records.
- Companies. A profile describes companies. Personas and buying roles come from your own research, and the profile tells you which companies to research them in.
Frequently asked questions
What is an ideal customer profile?
An ideal customer profile is a definition of the companies most likely to buy, keep and benefit from your product, stated as conditions you can apply to a list: for example size band, how the company sells, what it runs and where it operates. It describes companies, not people, which is the difference from a buyer persona. Its use is to decide which accounts to pursue and which to ignore.
How do I create an ideal customer profile from existing customers?
Define a good customer, match your customers to company records, and compare each attribute's share among customers with its share in the market you could sell to. Keep attributes with a high lift and enough customers behind them, test them on customers you held back, and write the result as three to five conditions. Then apply the profile to your market and check that it captures many customers from a small share of companies.
What is the difference between an ICP and a buyer persona?
An ideal customer profile describes the company: its size, what it runs, how it sells and where. A buyer persona describes the person inside it who evaluates or signs: their role, goals and objections. Company data supports the first, at company level, and personas come from your own interviews and CRM. The profile tells you which companies to look for them in.
How many customers do I need to build an ICP?
There is no fixed number, but the arithmetic is clear. With fewer than about 30 customers, an attribute carried by 10 of them can still be chance, so keep the conditions to two or three and treat the profile as a hypothesis to test on the next 20 deals. With a few hundred you can split the customers, require a floor on support and hold a test set back.
How often should I update my ideal customer profile?
Review it when your product, pricing or target market changes, and otherwise on a schedule such as every two quarters, when enough new deals have closed to test it again. Recompute lift on the new customers only and compare it with the old result: attributes whose lift persists are the core, and ones that fade were noise. Keep dated versions of the profile so that results can be traced to the version in use.
What company data is useful for defining an ICP?
Start with what changes slowly: the technologies a company runs, the pages and markets its website shows, its size from stated headcount or traffic tier, and whether it is listed or has raised a private round. Add hiring signals such as open customer success roles or the segment a company sells to. Each is a Fokals dataset with the time it was observed, and each should be tested for lift against your market before it enters the profile.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.