+ Book
GTM Engineering

How to Build a Multi-Source TAM Mapping and Account Tiering Engine in Clay

A step-by-step architecture for building a TAM mapping and account tiering engine in Clay: multi-source deduplication across Apollo, Ocean.io, and LinkedIn, and programmatic tiering from intent signals.

How to Build a Multi-Source TAM Mapping and Account Tiering Engine in Clay
On this page

I covered the concepts behind ABM as a connected system and the tools worth knowing for TAM mapping in separate pieces.

This one is different, it's the actual build: a step-by-step architecture for constructing a multi-source TAM mapping and account tiering engine inside Clay.

The specific technical decisions that make deduplication across disparate data sources actually work, and the tiering logic that turns a static account list into something that re-sorts itself as intent signals change.

This is the kind of workflow that comes up constantly in practitioner-level GTM engineering discussion, and for good reason: an enterprise ABM platform will do a version of this for you at a five- or six-figure annual price.

Building it in Clay costs a fraction of that, and you own every piece of the logic rather than renting a black box.

Why build this in clay instead of buying an enterprise platform?

An enterprise ABM platform bundles TAM identification, deduplication, and tiering into one managed product, and for a team with the budget and a genuinely complex, multi-motion GTM structure, that bundling is worth the cost.

For a team that wants full control over the specific matching logic, the specific tiering thresholds, and the specific data sources feeding the whole system, without being locked into one vendor's proprietary scoring model, building it directly in Clay is the stronger architectural choice, the same tradeoff covered in more depth in Clay-based outbound.

You're trading a managed product for full ownership of the logic, which matters most when your actual tiering criteria don't map cleanly onto whatever a vendor's platform assumed a typical TAM looks like.

The three-layer architecture

Before touching Clay, it's worth understanding the three distinct layers this engine needs, since building them in the wrong order is the single most common reason a first attempt at this produces a messy, unreliable result.

The source layer.

Multiple raw data sources, each with its own company identifiers, its own coverage gaps, and its own way of representing the same underlying company.

The resolution layer.

The deduplication and identity resolution logic that takes records from several sources referring to the same real company and merges them into one canonical account record, rather than three or four fragmented, partially-overlapping entries.

The scoring and tiering layer.

The logic that takes each resolved, canonical account and assigns it a combined fit-and-signal score, translating that score into a tier assignment that updates as the underlying signals change.

Building resolution before scoring, and scoring before tiering, in that specific order, is what prevents the most common failure mode in a homegrown version of this system: tiering logic built against duplicated, unresolved records.

Which produces a tiered list with the same company appearing multiple times at different tiers depending on which source-specific record happened to feed which part of the pipeline.

Step one: set up the multi-source table structure

Start with a base Clay table representing your raw TAM candidates, populated from your primary source, commonly Apollo for broad firmographic coverage. Rather than treating this as your finished dataset, treat it as the first of several source tables that will eventually get resolved together.

Build a second table pulling from Ocean.io, whose particular strength is lookalike company discovery, finding companies structurally similar to a set of seed accounts you already know convert well, which is a genuinely different discovery mechanism than Apollo's filter-based search and tends to surface accounts a pure firmographic filter would miss entirely.

Build a third source, commonly a LinkedIn Sales Navigator export or API-based pull, specifically for the org-chart and role-level precision neither Apollo nor Ocean.io natively provides as their primary strength.

Each of these three tables should be treated as raw, unresolved input at this stage, not merged yet.

Merging too early, before the deduplication logic in step two is built, is what produces a resolution layer that has to untangle an already-blended mess rather than cleanly resolving three separate, well-understood sources.

Step two: build the deduplication and resolution logic

This is the step most homegrown TAM engines get wrong, and it's worth spending real time on rather than treating it as a quick, incidental cleanup pass.

Normalize domain as the primary matching key, not company name.

Company names vary enormously across sources, legal suffixes included or dropped, abbreviations, regional naming differences, while a company's primary domain is considerably more stable across data sources.

Build a Clay formula step that strips protocol, www prefix, and any trailing path from every source's domain field, producing one normalized domain string per record that becomes your primary join key across the three source tables.

Add fuzzy company-name matching as a fallback, not a primary key.

For records where a domain is missing or inconsistent, a normalized, lowercased company name with common legal suffixes stripped, Inc, LLC, Ltd, Corp, and punctuation removed, provides a reasonable secondary match.

Clay's formula and Claygent capabilities can handle this normalization directly, and a fuzzy-match confidence score, rather than a strict equality check, catches near-matches a rigid string comparison would miss.

Explicitly handle parent-subsidiary relationships rather than ignoring them.

A genuinely thorny edge case: is a specific subsidiary the same account as its parent company, or a distinct one, for your TAM's purposes.

This needs an explicit rule, not an accidental default, since your enrichment sources will sometimes return the parent's data for a subsidiary's domain and sometimes return the subsidiary's own distinct record, and without a defined rule, your resolved dataset will treat this inconsistently across different accounts depending on which source happened to have which version.

Merge resolved duplicates into one canonical record, preserving source lineage.

Once records across the three source tables are matched via domain or fuzzy name matching, merge them into a single canonical account record, but keep a field noting which source or sources contributed to that record.

This lineage matters later, both for debugging a bad match and for weighting a signal more heavily if it was independently confirmed by more than one source.

Want a read on whether your current TAM dedup logic is actually catching cross-source duplicates? Get a free AI infrastructure audit and I'll help you check it.

Step three: layer the firmographic enrichment waterfall

With a resolved, canonical account list in place, run a waterfall enrichment pass to fill any remaining firmographic gaps, employee count, industry classification, headquarters location, that weren't fully populated by any single source alone.

Sequence the waterfall by cost and reliability, cheaper, more likely-to-succeed sources first, more expensive or narrower sources only queried when the cheaper ones return nothing usable, the same cost discipline covered in more depth in Clay-based outbound.

At this stage, also run your negative ICP screen against the resolved, enriched dataset, removing or flagging accounts matching known poor-fit patterns before they ever reach the scoring layer.

Filtering here, rather than after scoring, keeps the scoring formula from wasting effort computing a precise score for an account that should never have been in the tiering pool in the first place.

Step four: build the signal overlay

Layer in the specific signals that will drive both scoring and, later, dynamic tier promotion.

Common inputs worth building as separate, clearly-labeled columns rather than blending them prematurely: recent, relevant job postings scraped or pulled via an API source, funding events from a source like Crunchbase, technographic signals from a tool like BuiltWith confirming a relevant complementary or competitive technology, and where available, first-party intent data if your stack includes a source like 6sense or Bombora.

Timestamp every signal explicitly, not just its presence. A funding event from fourteen months ago and one from two weeks ago are structurally different inputs, and the scoring formula in the next step needs that timestamp to weight recency correctly rather than treating every signal as equally fresh regardless of when it actually occurred, the same decay-aware logic covered in more depth in buying signal timing windows.

Step five: build the combined scoring formula

Construct a single Clay formula column combining fit and signal strength into one numeric score per account.

A reasonable structure: a base fit score derived from how closely the account matches your defined ICP criteria, company size, industry, and other firmographic fit factors, each weighted based on how strongly they've historically correlated with a closed deal, multiplied or added to a signal score reflecting the strength and recency of any detected buying signals, with older signals decayed toward zero based on the specific signal type's known decay rate.

Keep the two components visible as separate fields alongside the combined score, not just the final blended number.

When a specific account's tier placement gets questioned later, whether by a rep or during a periodic review, being able to see the fit component and the signal component separately makes the score explainable rather than an opaque number nobody can reconstruct the reasoning behind.

Step six: build the tiering assignment logic

With a combined score in place, build a formula column that translates score into a tier label, Tier 1, Tier 2, or Tier 3, based on defined thresholds.

Set the initial thresholds based on a reasonable estimate of what volume each tier can actually support, working backward from your team's real capacity to handle Tier 1's custom, high-touch investment, rather than picking arbitrary score cutoffs first and discovering afterward that they've produced a Tier 1 list three times larger than your team can realistically serve.

Build the promotion and demotion logic as a genuine state comparison, not just a fresh calculation each time.

Add a field capturing an account's previous tier alongside its current, freshly-computed tier, and flag any account where the two differ, so a promotion or demotion is visible and actionable, triggering a notification to the account owner, rather than silently changing in the background where nobody notices the shift actually happened.

Step seven: set up the recompute schedule

Schedule the full workflow, from signal refresh through score recalculation through tier reassignment, to re-run on a defined cadence rather than once at initial setup.

A weekly recompute is a reasonable default for most TAM sizes, balancing genuine signal freshness against the credit and API cost of re-querying every source on every run. For a smaller, higher-priority Tier 1 and Tier 2 pool specifically, a more frequent, even daily, signal refresh is often worth the additional cost, since these are the accounts where a fresh signal has the most immediate, actionable value.

Step eight: push tiered output to downstream systems

The finished, tiered account list needs to actually reach the systems where work happens, not sit inside Clay as an internal reference.

Push Tier 1 accounts into whatever system manages your highest-touch, coordinated multi-channel plays, the kind of deliberately sequenced orchestration covered in multi-channel sequencing, with a clear, visible flag when an account is newly promoted so the account owner knows to treat it differently than an account that's been sitting in that tier for months.

Push Tier 2 and Tier 3 accounts into your broader cluster and programmatic engagement workflows respectively, with the tier label itself available as a field the downstream systems can branch logic on.

A worked example

A GTM engineer builds this engine for a mid-market B2B company, starting with an Apollo pull against their core ICP criteria as the base source table, layering in an Ocean.io lookalike search seeded from their twenty best existing customers, and adding a LinkedIn Sales Navigator export specifically for org-chart precision on their target Tier 1 candidates.

The resolution layer, built around normalized domain matching with a fuzzy name-match fallback, merges roughly three thousand raw records across the three sources down to about eighteen hundred genuinely distinct, canonical accounts, after removing duplicates the three sources had independently surfaced.

Running the negative ICP screen against this resolved list removes another two hundred accounts matching a known poor-fit pattern from the company's historical churn data, leaving sixteen hundred accounts entering the scoring layer.

The combined fit-and-signal formula, weighted based on which firmographic factors had historically correlated most strongly with closed deals, produces a score distribution the team uses to set thresholds calibrated specifically to their real capacity: the top thirty accounts by score become Tier 1, the next two hundred fifty become Tier 2, and the remainder populate Tier 3.

Three weeks after launch, the weekly recompute catches a Tier 3 account that posted two senior, directly relevant job openings in the same week, a strong signal the scoring formula weights heavily given its recency.

The account's combined score crosses the Tier 2 threshold, the system flags the promotion visibly, and the account owner receives a notification the same day, engaging the account with a cluster-level play within the week rather than the account sitting unnoticed in Tier 3 until whatever the next scheduled manual review might have caught, potentially months later.

How I build tam mapping and tiering engines?

I build exactly this kind of multi-source, dynamically-tiered system for clients who want full ownership of their TAM and tiering logic rather than a managed platform's proprietary black box.

This connects directly to my broader work on ABM as a connected system and composable data architecture, with the specific deduplication, scoring, and tiering logic documented clearly enough that your own team can adjust the thresholds and add new source data as your TAM and your business evolve.

Every engine I build ships with visible tier-change flagging and source lineage tracking from day one, so a tier assignment is always explainable, not an opaque score nobody can reconstruct the reasoning behind months later.

Not sure whether your current TAM data has genuine cross-source duplicates skewing your tiering? See how my process works before your next account review.

Conclusion

A multi-source TAM mapping and tiering engine built in Clay gives a GTM engineer the same core capability an enterprise ABM platform sells, precise account resolution across disparate sources and dynamic, signal-driven tiering, at a fraction of the cost and with full ownership of the underlying logic.

The build itself isn't complicated in concept, source tables, domain-based resolution, a scoring formula, threshold-based tiering, a recompute schedule, but getting the sequencing right, resolution before scoring, negative ICP filtering before the scoring layer, visible tier-change flagging rather than a silent background recompute, is what separates a genuinely reliable engine from a fragile one that quietly produces duplicated, misleading tier assignments nobody notices until the results stop making sense.

Ready to build a TAM and tiering engine you actually own end to end? Book a call, no decks, no demos, just a working session on your data sources.

Frequently Asked Questions

Why use domain matching instead of company name for deduplication?

Domains are considerably more stable and consistent across data sources than company names, which vary in legal suffixes, abbreviations, and regional naming conventions. Domain-based matching as the primary key, with fuzzy name matching as a fallback for records missing a clean domain, catches the large majority of genuine cross-source duplicates with a low false-positive rate.

How many data sources do I actually need for this to work well?

Three is a reasonable, common starting point, one broad firmographic source like Apollo, one lookalike or discovery-oriented source like Ocean.io, and one role-level precision source like LinkedIn Sales Navigator, each contributing a genuinely different discovery mechanism rather than three sources that largely overlap in what they'd find independently.

How often should tier thresholds be recalibrated, separate from the weekly signal recompute?

Quarterly is a reasonable default, checking whether the score distribution across your account pool has shifted enough that the original thresholds no longer reflect what actually constitutes a genuinely top-tier account, particularly as your TAM grows or your ICP criteria evolve.

What happens if an account appears in only one of the three source tables?

It still enters the resolution layer as a single-source record and gets a canonical account entry, just without the cross-source confirmation that a multi-source match provides. This is worth tracking via the source lineage field, since an account confirmed by multiple independent sources is generally a more reliable data point than one from a single source alone.

Can this same architecture work with only two data sources instead of three?

Yes, the core deduplication and tiering logic works the same way regardless of source count, though more sources generally mean fewer coverage gaps and stronger cross-validation on shared signals. Two well-chosen, genuinely complementary sources, one broad and one more specialized, still meaningfully outperform relying on a single source alone.

About Dima Bilous

Founder of Anfloy, an embedded AI engineering team. Designs, builds, and operates AI for agencies, tech companies, info businesses, and service teams, from simple automation to agentic systems to complex AI products, all shipped into your repo and owned by you forever. Forward-deployed AI engineering, not an agency.

[ 099 ]The next move

Let's build
what your
company needs.

Drop your email. We'll send The Custom Agent Blueprint on what we'd build first for a company like yours, before you ever take a meeting.

↳ Or skip ahead · book a call