Systems Lab

Agent skill

tam-builder

Build and maintain a scored Total Addressable Market (TAM) using Apollo Company Search.

dormantNeeds a keyActs undeclared978 words

Filed under Positioning and messaging.

From edupegoretti/fluidz-skills · 116 skills · 0 · pushed 2026-03-11

What it does when it runs

Build and maintain a scored Total Addressable Market (TAM) using Apollo Company Search. Upserts companies to Supabase, scores ICP fit, assigns tiers, and auto-builds a persona watchlist for Tier 1-2 companies using Apollo People Search (free). Supports build, refresh, and status modes. Designed for CLI now, automation-ready for trigger.dev later.

Read from the skill and the 6 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
  • APOLLO_API_KEY
  • SIXTYFOUR_API_KEY
  • SUPABASE_SERVICE_ROLE_KEY
Hosts it reaches
  • linkedin.com
  • xxx.supabase.co
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shell

Ask about tam-builder

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/edupegoretti/fluidz-skills.git /tmp/fluidz-skills
git -C /tmp/fluidz-skills sparse-checkout set "skills/capabilities/tam-builder"
mkdir -p ~/.claude/skills/tam-builder
cp -R "/tmp/fluidz-skills/skills/capabilities/tam-builder/." ~/.claude/skills/tam-builder/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Before you install: this skill will not complete its job on a bare agent. It needs APOLLO_API_KEY, SIXTYFOUR_API_KEY, SUPABASE_SERVICE_ROLE_KEY, which you have to obtain separately.

Reproduced in full from edupegoretti/fluidz-skills/blob/a2cf697e2e8ec2ea517d85496e2d5c7f5dc44cd3/skills/capabilities/tam-builder/SKILL.md, which is licensed MIT (repository). 978 words, 19 headings.

TAM Builder

Build and maintain a scored Total Addressable Market. Uses Apollo Company Search to discover companies, upserts them to Supabase, scores ICP fit (0-100), assigns tiers (1/2/3), and auto-builds a persona watchlist for Tier 1-2 companies using Apollo People Search (free).

Three modes:

  • build — First-time TAM construction from Apollo search
  • refresh — Update existing TAM: re-score, detect tier changes, deprecate stale companies
  • status — Read-only report of current TAM state

Prerequisites

1. Apollo API Key

Add to .env:

APOLLO_API_KEY=your-api-key-here

2. Supabase Project

Same project used by other skills. Schema in tools/supabase/schema.sql. This skill writes to companies and people tables.

3. Verify Environment

Ensure .env has:

APOLLO_API_KEY=...
SUPABASE_URL=https://xxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=eyJ...

Config Format

Create a JSON config per client/segment:

{
  "client_name": "happy-robot",
  "tam_config_name": "voice-ai-midmarket",

  "company_filters": {
    "organization_num_employees_ranges": ["51,200", "201,500", "501,1000"],
    "q_organization_keyword_tags": ["call center", "contact center"],
    "organization_locations": ["United States"]
  },

  "scoring": {
    "weights": {
      "employee_count_fit": 30,
      "industry_fit": 25,
      "funding_stage_fit": 20,
      "geo_fit": 15,
      "keyword_match": 10
    },
    "tier_thresholds": { "tier_1_min_score": 75, "tier_2_min_score": 50 },
    "target_industries": ["Telecommunications", "Customer Service"],
    "target_employee_ranges": [[51, 200], [201, 500], [501, 1000]],
    "target_funding_stages": ["Series A", "Series B", "Series C"],
    "target_geos": ["United States"]
  },

  "watchlist": {
    "enabled": true,
    "personas_per_company": 3,
    "person_filters": {
      "person_titles": ["VP of Operations", "Head of Customer Service"],
      "person_seniority": ["vp", "director", "c_suite"]
    },
    "tiers_to_watch": [1, 2]
  },

  "mode": "standard",
  "max_pages": 50
}

Save to: skills/capabilities/tam-builder/configs/{client-name}.json

Database Write Policy

CRITICAL: Never write to Supabase without explicit user approval.

The TAM builder touches the companies and people tables. Unwanted writes are hard to clean up — they pollute the database, create duplicates on re-runs, and contaminate existing good data.

Required flow before any database write:

  1. Run --preview to show the total TAM universe count and cost implications
  2. Run --sample (with --test for 1 page) to show scored results in-memory — NO database writes
  3. Present sample results to user: tier distribution, example Tier 1/2 companies, scoring sanity check
  4. Get explicit user approval before proceeding to a build that writes to Supabase
  5. Only then run without --sample to execute the actual build

Why this matters:

  • If sample results look wrong, the user adjusts filters and re-runs — no cleanup needed
  • Multiple test iterations don't create orphaned rows in the database
  • Existing good data from prior builds is never accidentally overwritten
  • The user stays in control of what enters the database

The agent must NEVER pass --yes on a first run. The --yes flag is only for automated/scheduled refreshes where the user has pre-approved the operation.

Usage

Sample (review before committing — ALWAYS DO THIS FIRST)

python3 skills/capabilities/tam-builder/scripts/tam_builder.py \
  --config skills/capabilities/tam-builder/configs/{client}.json \
  --mode build --sample --test

This searches Apollo (1 page, ~100 companies), scores them in-memory, and prints tier distribution + top companies. No database writes. Review output with user before proceeding.

Build (first-time — only after user approves sample)

python3 skills/capabilities/tam-builder/scripts/tam_builder.py \
  --config skills/capabilities/tam-builder/configs/{client}.json \
  --mode build [--test] [--yes] [--dry-run] [--skip-watchlist]

Refresh (update existing)

python3 skills/capabilities/tam-builder/scripts/tam_builder.py \
  --config skills/capabilities/tam-builder/configs/{client}.json \
  --mode refresh [--test] [--yes]

Status (read-only report)

python3 skills/capabilities/tam-builder/scripts/tam_builder.py \
  --config skills/capabilities/tam-builder/configs/{client}.json \
  --mode status

Pipeline: Build Mode

Step 0: --preview → total count + cost estimate (no DB writes)
Step 1: --sample --test → search 1 page, score in-memory, show results (no DB writes)
Step 2: User reviews sample → approves, adjusts filters, or caps scope
Step 3: Full build → Apollo Company Search → Upsert to Supabase → Score → Tier → Watchlist

Phase details (Step 3 only — after user approval):

Phase 1: Apollo Company Search → Upsert raw companies → Score ICP fit → Assign tiers
Phase 2: (skipped in build mode — no prior data to deprecate)
Phase 3: Persona Watchlist — pull 2-3 personas per Tier 1-2 company (free)

Pipeline: Refresh Mode

Phase 1: Apollo Company Search → Upsert/update companies → Re-score → Detect tier changes
Phase 2: Deprecation — companies missing 2+ consecutive refreshes get deprecated
Phase 3: Persona Watchlist — pull personas for new/promoted Tier 1-2 companies,
         disqualify personas at deprecated companies

ICP Scoring (0-100)

Pure function, no API calls. Weighted scoring across 5 dimensions from config:

  • employee_count_fit — headcount in target ranges?
  • industry_fit — industry matches targets?
  • funding_stage_fit — funding stage in targets?
  • geo_fit — HQ location in target geos?
  • keyword_match — org keywords overlap config keywords?

Score thresholds (configurable): >=75 = Tier 1, >=50 = Tier 2, else Tier 3.

Deprecation Rules (refresh only)

  • First miss (not returned by search): metadata.refresh_miss_count = 1, keep active
  • Second consecutive miss: tam_status = 'deprecated'
  • Employee count drops to 0: immediate deprecation
  • Companies with tam_status = 'converted' are always exempt

Watchlist — Persona Sync

ScenarioBehavior
New Tier 1-2 companyPull 2-3 personas immediately
Company promoted Tier 3→2Pull personas during refresh
Company deprecatedDisqualify monitoring personas
Company demoted Tier 1→3Keep existing personas, stop refreshing

Mode Caps

ParameterTestStandardFull
Max pages150200
Max companies1005,00020,000

Flags

FlagEffect
--testLimit to 1 page / 100 companies
--sampleSearch + score in-memory, NO database writes. Shows tier distribution and top companies for user review. Combine with --test for a quick 1-page sample.
--yesSkip confirmation prompts. Only use for pre-approved automated refreshes, never on first runs.
--dry-runNo API calls, show what would happen
--previewShow total count only (build mode)
--skip-watchlistSkip persona watchlist phase

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what tam-builder does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.