> ## Documentation Index
> Fetch the complete documentation index at: https://docs.emanate.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# ICP Scoring

> AI Score, heat tiers, five-insight reasoning, and score-to-grade mapping

The **AI Score** (also called Fit Score or ICP Score internally) is a 1–100 number rating how well a lead or account matches your Ideal Customer Profile. It powers the **AI Score** column on the Leads and Accounts tables, which renders a **grade badge** (A / B / C / D) and a **heat icon + label** (Burning / Hot / Warm / Cold), the sort order on **Intelligence**, and the priority queue in [Win-Back](/accounts/winback).

It is **AI-generated**, not a hand-tuned weighted formula. Every score comes from an LLM synthesis pass that reviews the enriched record and emits one composite number plus five sub-scores with reasoning.

## How the Score Is Calculated

After enrichment populates company, contact, and research data, a single LLM call evaluates the record against five insight categories. Each insight gets its own 1–100 sub-score and a 2–3 sentence reasoning paragraph. The synthesis output is the **headline `fitScore`** plus the five `insights`.

| Insight                   | What it measures                                                           |
| ------------------------- | -------------------------------------------------------------------------- |
| **Firmographic Fit**      | Industry, employee count, revenue, growth stage vs your ICP                |
| **Recent Activity**       | Funding, hiring, product launches, news in the trailing window             |
| **Pain Points / Needs**   | Likely challenges inferred from industry, size, and tech stack             |
| **Decision-Maker Access** | Who to contact, typical buying process for the account size, accessibility |
| **Competitive Landscape** | Market position, competitors, differentiation opportunities                |

The model is free to weight insights differently per record: a recently-funded mid-market manufacturer that fits firmographically will score high even with weaker competitive signals; a perfect firmographic match in a saturated market won't.

### Where the Inputs Come From

The synthesis call uses whatever enrichment has already landed on the row:

* **Company data:** industry, employees, location, description, funding stage, total raised, founded year, tech stack
* **Research findings:** summary plus insights and source URLs collected during the research stage
* **Contact data:** primary contact title and department (for the decision-maker insight)

Records with thin inputs get a fallback score of **50** and a `neutral` verdict so the row still sorts predictably. Re-running enrichment (or refilling firmographic fields via [per-column Fill](/accounts/enrichment#per-column-fill)) recomputes the score on the next pipeline pass.

## Score-to-Grade-to-Heat Mapping

The 1–100 score maps to a **grade** (A / B / C / D) and a **heat tier** (Burning / Hot / Warm / Cold) on the same thresholds. The AI Score cell renders both side by side.

| Score      | Grade | Heat           | Recommended action                                                                |
| ---------- | ----- | -------------- | --------------------------------------------------------------------------------- |
| **80–100** | **A** | **🔥 Burning** | Fast-track to sales: fits firmographically, has timing signal, accessible contact |
| **60–79**  | **B** | **📈 Hot**     | Standard follow-up: solid match, worth the cycle                                  |
| **40–59**  | **C** | **🌡 Warm**    | More discovery needed: likely partial fit                                         |
| **1–39**   | **D** | **❄️ Cold**    | Low priority: disqualifying gaps in fit or access                                 |

Grade and heat tier are stored as separate fields (`grade` and `heat`) but always agree because they come from the same thresholds. Sorting by **AI Score** descending matches "highest grade / hottest first."

## What You See in the AI Score Cell

Each row in the Leads / Accounts table shows a compact cell with three visible elements:

1. **Grade badge:** a small filled box with the grade letter (A / B / C / D).
2. **Heat icon:** a Lucide icon that reflects the tier:
   * 🔥 **Flame** for Burning (score ≥ 80)
   * 📈 **TrendingUp** for Hot (score ≥ 60)
   * 🌡 **Thermometer** for Warm (score ≥ 40)
   * ❄️ **Snowflake** for Cold (score \< 40)
3. **Heat label:** the word *Burning / Hot / Warm / Cold* next to the icon (hidden on compact density).

Empty rows (score = 0 and no `whyThisAccount`) render as a single `--` placeholder.

### Clicking the Cell

Clicking the AI Score cell opens a popover with:

* **Header:** the heat icon + label, with "Score: N/100" as the description.
* **Score Breakdown:** the five sub-scores rendered as labeled progress bars (Firmographic, Recent Activity, Pain Points, Decision-Maker Access, Competitive Landscape).
* **Why this account:** the LLM's narrative on fit drivers.
* **Why now:** the timing signal narrative.

To refresh the explanations without re-running the full pipeline, use [per-column Fill](/accounts/enrichment#per-column-fill) on `whyThisAccount`, `whyNow`, or `priorityAction`.

## Where the Score Surfaces

| Surface                                     | What it shows                                                                                                                         |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| **Leads table: AI Score column**            | Grade badge + heat icon + heat label, opens the breakdown popover                                                                     |
| **Accounts table: AI Score column**         | Same widget, account-side                                                                                                             |
| **Account / Lead drawer: Intelligence tab** | Headline AI Score, all five sub-scores with reasoning, recommended actions                                                            |
| **Filter builder: `aiScore` field**         | Numeric filter on the raw 1–100 value (used by saved views like *Burning leads* = `aiScore > 79`)                                     |
| **Win-Back Type A digest**                  | Accounts are ordered by lifetime revenue first, but the AI Score is shown alongside so reps can see relationship value vs current fit |

## Re-Computing the Score

Three ways to refresh:

1. **Re-enrich the row:** runs the full pipeline; the synthesis pass is the final stage and recomputes everything
2. **Per-column Fill** on any firmographic field (`industry`, `revenue`, `employees`, `segment`, `funding`, `founded`): the next intelligence recompute picks up the new inputs
3. **Per-column Fill** on `whyThisAccount` / `whyNow` / `priorityAction`: refreshes the three intelligence explanations without rerunning the full synthesis. Use this when only the narrative needs updating.

<Note>
  Enrichment never overwrites existing values. If a firmographic field is already set, you need to clear it (or use per-column Fill, which intentionally re-asks the provider) before the synthesis pass sees the new value.
</Note>

## Customizing What "Fit" Means

The synthesis prompt is generic. It interprets "fit" against the enriched data and the natural-language description in your **org profile**. Two practical levers:

1. **Keep your org profile current.** The "what we sell" and "who we sell to" fields anchor the firmographic insight. Vague profiles → noisy scores.
2. **Use audience segments** (filter on `Grade = A`, `Heat = Burning`, or `aiScore > 79` + your custom criteria) to define operational ICPs. The AI Score is the universal baseline; segments are how you slice it per campaign.

There is **no per-criterion weight UI** today. Scoring is driven by the LLM, not a configurable rubric. If you need a hard-coded business rule (e.g., "always exclude personal email domains"), enforce it with an audience segment filter, not by trying to express it in the score.

## Troubleshooting

<AccordionGroup>
  <Accordion title="Score is 50 and verdict is neutral with no reasoning">
    Synthesis fell back because inputs were too thin or the LLM call errored. Re-run enrichment after company/contact data lands.
  </Accordion>

  <Accordion title="Score didn't update after I changed a firmographic field">
    Enrichment never overwrites existing values, but per-column Fill does. Use **Fill industry** / **Fill revenue** etc. for that row, then let the pipeline recompute the intelligence pass. Or run **Enrich** again with the field cleared.
  </Accordion>

  <Accordion title="Two similar accounts have very different scores">
    The five sub-scores explain the gap. Open the drawer's Intelligence tab. The most common cause is the **Recent Activity** insight (one had recent funding/hiring signals, the other didn't).
  </Accordion>
</AccordionGroup>

## Next Steps

<CardGroup cols={2}>
  <Card title="Lead Enrichment" icon="sparkles" href="/leads/enrichment">
    What the pipeline populates before the score runs
  </Card>

  <Card title="Account Enrichment" icon="sparkles" href="/accounts/enrichment">
    Account-side enrichment + AI Score how-it-works
  </Card>

  <Card title="CRM Sync" icon="refresh-ccw" href="/leads/crm-sync">
    Push AI Score to your CRM as a custom field
  </Card>

  <Card title="Intelligence" icon="brain" href="/intelligence/overview">
    The Intelligence tab where the five sub-scores live
  </Card>
</CardGroup>
