salesascode
← All feature docs
Feature docs · /tam

TAM Builder

Define your target market with a deterministic filter and materialize a named target-account list the enrichment waterfall and awareness scorer work automatically.

Included with gtmcron . A seat without it sees an upsell here instead of the page.

Overview

This page filters a list you supply. Market sizing, with its method and sources, happens in the first launch at /onboarding/dossier.

TAM Builder turns candidate accounts and a filter into a named target-account list. Candidates arrive two ways: the discovery pass finds companies matching the ICP in your confirmed dossier, or you paste your own. Either way you set the filter (industry, region, headcount band) and build the list; each match is materialized as a target account that the enrichment waterfall and the awareness scorer then work on their own schedule. It is the front door to the gtmcron demand engine: define the market once, and the rest of the machine runs against it.

What it is for, on the page. Under the headline, this page says what it produces, what makes it run, and where the output lands. Every Work page reads that line from one registry, so the three answers cannot drift from the page.

Who buys, from your deals

The first section on the page reads your own won and lost deals from the last 24 months and writes down two lists: who buys and who to leave out. It compares the two groups on industry, company size, region, tech stack and the persona of the person who signed. Each trait shows its evidence: how many deals it won and lost, and how often it wins against your overall win rate. No model is involved; it is counting, so you can check every number.

The thresholds, as the page prints them. Nothing is offered until you have at least 3 won and 3 lost deals; below that the page says how many of each you have and your ICP keeps coming from your business brief. A trait counts as who buys when it has at least 3 wins and wins at least 1.25 times as often as your average. It counts as leave out when it has at least 3 losses and wins at most half as often (no wins at all qualifies). Each side shows at most six traits.

Coverage. A deal missing a field is left out of that field only, never counted as a miss. The coverage line says how many decided deals carried each field, for example "Region: 14 of 23 deals". When industry, size or region is known on fewer than half, a link to Enrichment offers to fill the gaps. The signer persona is shown with its own coverage and is never used to score accounts.

Use as filter fills the Build a list form from the who-buys traits: their industries, their regions and the headcount band that covers their sizes. You still paste the candidates and build the list.

Review and accept opens what accepting would change about your saved ICP, one checkbox per change: an industry to add, a headcount band, a leave-out trait. A saved industry with no won deal behind it is listed as "no deals yet" and kept as you saved it, because a market you are entering on purpose is not a mistake. Accept the ones you tick, or all of them. Your saved ICP changes only when you accept, and the /studio ICP summary then marks those fields as coming from your deals.

It runs again every week. The weekly run re-reads your deals and stores a new proposal only when a trait moves on or off a list, so two more deals that change no trait do not ask you anything. If a newer proposal replaced the one on your screen, accepting tells you so and shows the latest.

Accepting changes how accounts are tiered. Once you have accepted an ICP, the weekly tier pass gives each account one point for each of industry, company size, region and tech stack that matches it. All four is Tier 1, three is Tier 2, two or fewer is Tier 3. A field the account has no data for is left out of the count rather than counted as a miss, so an account matching 3 of 3 known fields is Tier 1, and its tier drivers say which field was unknown. With fewer than two fields known, the tier keeps the size, engagement and pattern blend it used before, and so does every account until you accept an ICP. Fresh signals still lift a tier one step only with two of them, or one from the buyer directly.

Readiness

The Readiness strip at the top of the page asks one question: which part of your outbound is holding the rest back? It reads five layers in order, because each one only works with what the one below it hands over.

  1. Who exists. Target accounts your exclusion rules do not hold. Empty with none, broken when every account is held, weak under 25, OK at 25 or more.
  2. How to reach them. The share of those accounts with a contact you can send to: an address a verifier called valid, an unchecked one while you have not required verified addresses, or a catch-all you approved. Weak under 50%.
  3. Who to talk to first. The share of reachable accounts with an awareness band. An account gets a band once enough signal sources (intent, site visits, engagement, job changes, funding) report on it, so the fix is to connect one. Weak under 60%.
  4. How the message lands. Sends in the last 14 days. Broken when bounces reach your bounce line (2% unless you changed it on Send gate) or a mailbox or campaign is paused; weak when sending health shows a warning.
  5. After they reply. Replies in the last 30 days that reached your CRM. Broken when you have replies and no CRM connected, weak under 90%. Today a reply counts as in the CRM when the email it answered was logged there; the reply text itself is not written to the CRM yet.

The lowest layer first. The first layer that is empty, broken or weak is named at the top with one fix. Every layer above it reads "waiting on layer N", with its own number still shown, because it cannot do much until the one below works.

Not measured and could not read. A layer with nothing to measure yet (no replies, no mailbox checked) says not measured. A layer whose read failed says it could not be read. Neither is ever shown as zero, and neither is chosen as the lowest layer.

Handoffs. Four counts under the layers name the records stuck between them: accounts older than 7 days never enriched, reachable accounts with no score band, top-band accounts with no draft or send in 14 days, and replies with no CRM record. Each links to the page that moves them.

On Home. When the lowest layer is empty or broken, Home shows one setup item in Waiting on you that links back to this strip. A weak layer does not, so Home does not nag about a list of 24 accounts.

The thresholds are opinions, taken from two agency write-ups, so the strip always prints the number and what it is out of. You can disagree with the label and still read the fact.

How the filter works

The membership is a deterministic filter, so the same candidates and the same filter always produce the same list, which is what makes a TAM defensible. An account must clear every filter you set: any-of industry, any-of region, and a headcount band. A dimension you leave blank is not applied. Headcount only excludes an account that actually has a numeric employee count, so an account with unknown headcount is never silently dropped by a band it cannot be evaluated against. Duplicate accounts (same domain) are collapsed, so a rebuild upserts rather than duplicates.

After a build, the status line also says why the rest were left out, counted by reason: industry outside the filter, no industry recorded, below the headcount floor, above the ceiling, listed twice. A filter set one band too tight shows up there, rather than as a list that looks small.

Pain segments

Industry says who an account is, not what hurts. The Pain segments section groups your target accounts by the problem they share, and gives each group one opening line. Group by pain runs the grouping, at most once a week.

The method, as the page states it:

  1. For each target account, read what is already stored about it: its industry, the account research summaries on the record, and the newest signal from the weekly tiering pass. Industry alone does not count. An account with nothing else stored is not sent to the model; it is listed as dropped for having no stored evidence of a pain.
  2. One AI call reads those lines against the pains in your confirmed dossier (your ICP triggers and each product's value line). It names at most eight pains the accounts share, writes one opening line of at most 120 characters per pain, puts each account in one group or in none, and says for each account whether the line is true of it.
  3. A check in code then holds the line to every account in its group. An account the line does not fit moves into a split group with no line until the next weekly pass writes one, so one message never goes to an account it does not describe. A line that names one of its own accounts is account copy rather than a shared message, and is discarded.

One pass reads up to 200 accounts that have something stored. Any beyond that wait for the next week, and the page says how many. If a pass fails or comes back unreadable, nothing is saved and the button waits an hour before it can try again, so a retry cannot pay twice in a row.

When a pass cannot run, Group by pain is greyed out and hovering it says why: there are no target accounts yet, none of them has research or a signal stored, the week since the last pass is not up (with the date it is), or a failed try is still inside its hour. If a pass is refused anyway, the reason shows beside the button.

A path per segment: blast first or enrich first

Each segment card says how much to spend finding people before the first email. Blast first looks for the decision maker only, one per account, and full research waits for the accounts that reply. Enrich first looks for three people per account (decision maker, champion and influencer). With an accepted ICP, only accounts with 3 or 4 fit points get all three; the rest get the decision maker.

The rules, in order. The first that applies decides, and its reason is printed on the card:

  1. A third or more of the segment's accounts are Tier 1: enrich first.
  2. 500 accounts or fewer and an average won deal of 25,000 or more: enrich first.
  3. More than 1,500 accounts, or an average won deal under 10,000: blast first.
  4. Your enrichment credit left this month cannot cover three people per account: blast first.
  5. Otherwise: enrich first.

The average won deal reads the amounts on your won deals of the last 24 months, and the section header shows it with how many deals it came from. When no won deal carries an amount, the rules read account count and Tier 1 share alone, and the reason says the deal value was unknown. The path is recomputed after every weekly grouping and whenever you open the page, so a tier change reaches it without waiting a week.

Override. The menu on each card sets the other path. The card then says who set it, when, and what the rule would have said. Your choice stays until the weekly grouping moves accounts into or out of that segment; a tier change alone does not end it. Choose "Back to the rule" to clear it.

Market cells. Under the path, each card lists its accounts by region and industry, for example "UK Fintech 41" and "DACH Fintech 18". An account with no region or industry recorded counts under unknown, so the cells always add up to the segment. The cells describe a segment; they are never a second grouping, and the opening line stays one per pain.

Moved up this month

The weekly tier pass re-scores every account on Sunday and keeps each result. This section lists the accounts whose tier rose at least one step in the last 30 days, comparing each account's first result in that window with its latest. Each row says what moved it: the fit rising (with the ICP fit points when you have an accepted ICP), new fresh signals by kind, or both, and which pain segment the account is in. A fall is not listed. When nothing rose, the section says so and when the next re-score runs.

Interested rate, not reply rate

Each segment shows, for the last 30 days, how many sends it had and how many replies were read as interested, split by the persona of the person written to (from the title on their prospect record). A polite no and an out-of-office are both replies, so a reply rate can look healthy while every answer is a refusal. The interested count uses the same reading the reply alerts use, and only that word counts. Sends to accounts in no segment are shown on their own line, so the totals still cover every send.

The numbers come from the send ledger, the record every dispatched send writes. A morning-queue email you send from your own Gmail counts toward a segment's rest (below) but carries no reply reading yet, so it is not in the interested rate.

Dropped and held

Every account left out of a send, in one list, counted by reason with a few names as examples: accounts held by your exclusion rules (each with the rule and who set it), accounts with nothing stored, accounts whose stored evidence shows none of your pains, accounts split out of a group because its line did not fit, and accounts in a resting segment. A boundary in the wrong place shows here before anything goes out.

Held by who to leave out. Once you accept a leave-out trait, every account that matches it is held at research, contact selection, drafting and sending, including one you kept before the trait existed. Each appears in its own row with the trait and the deals behind it, for example "Matches who to leave out: under 10 employees, 0 of 7 deals won". The scheduled discovery pass also stops adding companies that match, so no enrichment credit is spent on them.

Restoring one account. Restore this one keeps that single account eligible and leaves the trait in place for every other match. It lifts only the trait: if the account is also a customer, has an open deal, or you excluded it yourself, it stays held and the row says why.

Rest and rotation

Once a segment is contacted, its round starts. It stays open for 14 days so a group can be worked over a fortnight of mornings, then rests until 90 days after the round started, and then it comes round again. The per-person contact caps still apply on top: this is a rotation at the level of the group, so the same pain is not pitched to the same market every week.

Under a landgrab motion, the morning queue uses all of this. A draft for an account in a segment opens on that segment's line, and an account in a resting segment is left for its next round. Under lighthouse, signal-led or no motion, drafts are unchanged; segments and the interested rate still show here as a report.

What "materialize" means

Each matching account is written as a target account keyed on its domain (or its name when there is no domain), tagged with the list name. That is the same record type the enrichment waterfall fills and the awareness scorer ranks, so building a TAM here immediately feeds the rest of gtmcron with nothing else to wire. Rebuilding the same list updates the existing records in place. An account with neither a domain nor a name cannot be keyed and is skipped rather than duplicated; the panel tells you how many were skipped.

Where candidates come from

The discovery pass. Once you confirm a dossier, a scheduled job reads the ICP you wrote there, searches for people who match it, and adds each distinct new company as a target account tagged discovered. The page opens on what it found and says how many are still waiting on you. Nothing it adds overwrites an account you already have, and it never re-adds a domain already in your book.

It refuses more often than it runs, and always says why. It needs a dossier you have confirmed rather than a draft, and an ICP specific enough to be worth reading: titles plus an industry or a trigger, or two industries plus a trigger. One industry alone is a market rather than a profile, and twenty-five companies drawn from "software" teach you nothing. It also stops when you already have a queue of companies nobody has looked at, when your book is large enough not to be waiting on more accounts, and when your enrichment budget is spent, because the search spends a vendor credit against the same budget contact enrichment does.

People, not only logos. The pass stores the people it found as prospects alongside their companies, then fills in as many as your enrichment budget allows through the same cascade the Enrichment panel uses. A person it has not reached yet is marked unenriched rather than given a blank email, and a later pass picks them up. Contact reveal is billed per person where the search is billed per page, so it is capped separately and low: five a run by default.

Ruling on what it found. Anything the pass adds is marked as waiting until you say otherwise, and the page shows how many, with up to 25 of the newest listed by name, how each was found and a Keep button for each. Keep drops them into your list as ordinary target accounts. Discard removes them, rather than remembering them as rejected: a company you turned down once should still be findable after you change the ICP that surfaced it, and rejecting the same name twice is a smaller annoyance than never seeing it again. Nothing acts on a waiting row in the meantime.

Lookalikes of your won accounts. Once you have at least five won accounts with company details (industry, size, region or tech stack on the account record), the daily discovery pass searches from them instead of from your dossier: their two most common industries, their most common size band and their most common region, with the titles from your dossier or, if it names none, decision makers. It is still one search a day, from the same budget and behind the same limits, and it stops when the budget is spent. Each company found is scored against every won account by how many of those details they share, and only companies that resemble at least one are kept. Won accounts, customers and anything already in your book are never returned. Each lookalike waits on you like any discovered row, marked Lookalike, with its reason, for example "Like 4 of your won accounts: Fintech, 50 to 249 employees, UK". Below five won accounts the pass searches from your dossier as before, and its run summary records why no lookalike search ran.

How deep enrichment goes. A newly found company is in no segment and has no tier yet, so the pass looks up its most senior person only, and asks for no phone number. Phone numbers are looked up for Tier 1 accounts only, here and in the weekly re-enrichment, because a call task is routed for Tier 1 alone.

Pasting your own. Comma-separated rows (domain, name, industry, employee count, region), which is enough to define a TAM from a list export. The panel shows the target accounts already materialized, so you can review the current list before adding to it.

Coverage across channels

The Coverage section shows which channels reached each account on this list in the last 30 days (or 14, with the window control). It counts four channels, and each counts only what the product can show happened:

Three counts sit on top. One channel only is the accounts a single channel reached, which is where a competitor working several channels at once gets in. Three or more, no meeting is the accounts several channels reached with no meeting and no new opportunity in the window, so the effort is not turning into a conversation. Nothing touched is the accounts on the list no channel reached yet. The table lists the accounts behind each count, with a dot per channel, and the filter narrows it to one gap.

Not matched to an account counts touches with no company domain, such as an email to a personal address or an engager nobody saved. They are counted and shown rather than dropped.

Before anything has run, the section says what fills it instead of showing zeros. If one source cannot be read, the section names it and labels the counts as missing that channel, because "one channel only" without content engagement may include accounts that also engaged with a post.

The Status column on the target account list shows when an account is held from contact selection and why, for example because someone there replied on LinkedIn in the last 14 days. The same rule keeps those accounts out of the audiences you export.

What is not shown

The design mockup sketched a richer builder: technographic and funding-stage filters, a per-account ICP-fit score, a tech-stack column, and a net-new-versus-CRM status. Those are omitted here because the shipped filter is firmographic (industry, region, headcount) and the page does not show a per-account fit score, read a tech stack into the filter, or diff against your CRM. Who buys does read the tech stack your account records carry, but only to describe your deals. Adding any of them would mean inventing a number, so the panel shows only what the deterministic filter actually produces: the matched accounts and an honest industry and region distribution.