---
name: account-research-hub
description: "Full account intelligence brief. Given a company name, pulls live data from SFDC (Account, Opportunity, Contact, Task/Email/Call activity, Crossbeam/Reveal partner fields, UserGems job change signals), LUCI (conversation intelligence, presales signals), ZoomInfo, Avoma, UserEvidence, Cube (ARR/NRR metrics), Snowflake (usage data), Clari (deal health), Graph Intelligence (account network, competitive intel, champion movers, influence maps), and web search, then builds a complete HTML panel and appends it to the multi-account hub with a sidebar button and working navigation. Say 'research [company]' to trigger."
metadata:
  version: 2.0
  argument-hint: "[Company Name]"
---

# Account Research Hub Skill v1.0

## Role

You are the rep's account intelligence engine. Given a company name, you pull every available data signal, classify the account type, and produce a complete, fully-populated HTML panel that gets appended to the live account hub file. The output is not a summary — it is a structured brief the rep can have open during discovery, re-engagement, or win-back calls.

No guessing. No placeholders. Every section must be populated from real data or explicitly noted as "not found — discovery question." The output is a working HTML file the rep opens in their browser.

---

## Step 1: Determine Account Type

Before pulling any data, classify the account. Account type determines framing, section titles, and call sheet tone throughout the entire brief.

Run this SFDC query first:

```sql
SELECT Id, Name, Type, Account_Status__c,
       Number_of_Won_Opportunities__c,
       Number_of_Lost_Opportunities__c,
       Number_of_Won_New_Business_Opportunities__c,
       Churn_Date__c, Customer_Start_Date__c,
       Most_Recent_Opp_Closed_Date__c
FROM Account
WHERE Name LIKE '%[COMPANY]%'
LIMIT 5
```

Then pull opportunity history:

```sql
SELECT Id, Name, StageName, Amount, CloseDate,
       LeadSource, Description, NextStep, CreatedDate
FROM Opportunity
WHERE Account.Name LIKE '%[COMPANY]%'
ORDER BY CloseDate DESC
LIMIT 20
```

| Signal | Account Type |
|--------|-------------|
| Has `Churn_Date__c` set OR has a Closed Won followed by a Closed Lost/Churned opp | **Churned Customer Win-Back** |
| Has 1+ Closed Lost opps, zero Closed Won, Account_Status__c ≠ Customer | **Closed Lost Re-engagement** |
| No prior opps, never a customer | **New Business** |

---

## Step 2: Pull All Data Sources

Execute ALL of the following in sequence. Document what you found AND what you didn't find — both matter for the brief.

### 2a. Salesforce — Full Account Pull

```sql
SELECT Id, Name, Type, OwnerId, Account_Status__c,
       Website, Industry, Sub_Industry__c,
       AnnualRevenue, NumberOfEmployees,
       BillingCity, BillingCountry,
       Technology_CRM_A__c, Technology_Marketing_Automation_A__c,
       is_a_customer_of__c,
       Crossbeam_All_Partner_Names__c,
       revealapps__Reveal_Is_a_customer_of__c,
       revealapps__Reveal_Is_an_open_opportunity_for__c,
       All_Pain_Points_from_Past_Opps__c,
       Bluebirds_Signal_Summary__c,
       Bluebirds_Signal_Score__c,
       Bluebirds_Size_of_Sales_Team__c,
       accountBuyingStage6sense__c,
       accountProfileFit6sense__c,
       accountIntentScore6sense__c,
       Last_G2_Buyer_Intent__c,
       Last_Activity_by_AE__c,
       Last_Activity_by_SDR__c,
       Number_of_Days_Since_Last_Activity__c,
       Sales_Territory__c, Market_Segment__c,
       Churn_Date__c, Customer_Start_Date__c,
       Contract_End_Date__c, Active_ARR__c,
       Owner_Full_Name__c, SDR_v2__c,
       ZI_Company_Id__c
FROM Account WHERE Name LIKE '%[COMPANY]%' LIMIT 5
```

```sql
SELECT Id, FirstName, LastName, Title, Email, Phone,
       MobilePhone, Department, HasOptedOutOfEmail,
       LastModifiedDate, CreatedDate
FROM Contact
WHERE AccountId = '[ACCOUNT_ID]'
ORDER BY CreatedDate DESC
```

```sql
SELECT Id, Subject, Description, ActivityDate,
       CreatedDate, Status, Type
FROM Task
WHERE WhatId = '[ACCOUNT_ID]'
ORDER BY CreatedDate DESC
LIMIT 30
```

**Crossbeam / Reveal Partner Intelligence — MANDATORY EXTRACTION:**

These three SFDC fields are critical competitive intelligence. Always query them separately if the full account query fails (some orgs have field-level security that causes batch queries to error):

```sql
SELECT Crossbeam_All_Partner_Names__c,
       revealapps__Reveal_Is_a_customer_of__c,
       revealapps__Reveal_Is_an_open_opportunity_for__c
FROM Account WHERE Id = '[ACCOUNT_ID]'
```

| Field | What It Tells You | How to Action It |
|-------|------------------|-----------------|
| `Crossbeam_All_Partner_Names__c` | Every partner with an account overlap (e.g., "6sense, Outreach, Drift, Demandbase, G2") | Surface in Tech Stack (as `.tech.signal` blue tags). If any partner is a known LeanData customer, add a Why Now trigger: "Their [tool] vendor uses LeanData." Search UserEvidence for that partner's testimonial. |
| `revealapps__Reveal_Is_a_customer_of__c` | Partners for whom this account IS a customer | Strongest signal — the account already pays for these tools. If any are LeanData integration partners, this is a confirmed tech stack entry (`.tech.confirmed` green tag). |
| `revealapps__Reveal_Is_an_open_opportunity_for__c` | Partners who have an OPEN opp at this account right now | Timing signal — if a partner is actively selling to this account, their champion may be receptive to a LeanData intro via that partner. Surface in Why Now as a yellow trigger. |

**LeanData integration partners to flag**: 6sense, Outreach, Salesloft, Marketo, HubSpot, Demandbase, G2, Drift, Clearbit, Gong, Clari, ZoomInfo, Qualified, Chili Piper

### 2b. ZoomInfo — Company + Contact Enrichment

```
zoominfo_search_companies(companyName: "[COMPANY]")
→ capture: employees, revenue, industry, HQ location, companyId

zoominfo_enrich_company(companyId: "[ZI_ID]")
→ capture: tech stack, IT budget, employee breakdown by department

zoominfo_search_contacts(companyName: "[COMPANY]", department: "Revenue Operations")
zoominfo_search_contacts(companyName: "[COMPANY]", department: "Sales Operations")
zoominfo_search_contacts(companyName: "[COMPANY]", managementLevel: "C-Level")
zoominfo_search_contacts(companyName: "[COMPANY]", managementLevel: "VP")

zoominfo_enrich_contacts(contactIds: [...], requiredFields: ["email"])
→ capture: direct email, direct phone, ZI validation date for each contact
```

Note the ZI validation date for each contact — it tells the rep how fresh the data is.

### 2c. SFDC Tasks — Call, Email & Meeting History (PRIMARY SOURCE)

This is the richest source of rep activity. Always pull this.

```sql
SELECT Id, Subject, Description, ActivityDate, CreatedDate, Status, Type
FROM Task
WHERE AccountId = '[ACCOUNT_ID]'
  AND Type IN ('Call','Meeting','Email')
ORDER BY CreatedDate DESC
LIMIT 40
```

Also pull Clearbit page views and general tasks (already captured in Step 2a Task query).

**What to extract from Task descriptions:**
- **Outreach emails**: Full email body, who sent, who received, messaging angle, case studies referenced
- **Calls via Nooks/Outreach**: Call disposition (No Answer, Connected, Left VM), which sequence step
- **Avoma-synced meetings**: Look for `-- Avoma Note Start --` in Description — contains participants, key takeaways, action items, technologies discussed
- **Key intel**: Prior company experience with LeanData (alumni), link clicks without replies (silent evaluation), sequence saturation (too many touches with no response)

### 2d. LUCI — Conversation Intelligence (IF AVAILABLE)

```
luci_get_account(account_id: "[SFDC_ACCOUNT_ID]")
→ check calls_count, emails_count, last_touch_at

luci_search_account(account_id: "[LUCI_UUID]", query: "routing leads pain")
luci_search_presales(account_id: "[LUCI_UUID]", query: "[COMPANY] objections")
luci_get_presales_stats(account_id: "[LUCI_UUID]")
```

LUCI provides semantic search across transcripts, presales signals (discovery questions, objections, competitive mentions), and customer voice. If LUCI has embedded content for the account, it surfaces specific quotes and conversation context that SFDC Task notes don't capture.

**Fallback**: If LUCI has no embedded content (empty results), rely on SFDC Task descriptions which contain Avoma-synced meeting notes.

### 2e. Avoma — Call History (BACKUP)

```
avoma_search(query: "[COMPANY]")
```

If Avoma API is available and meetings found: `avoma_get_meeting_notes(uuid)` for AI summary, `avoma_get_transcript(uuid)` for key quotes. If Avoma is down or returns nothing, SFDC Tasks (2c) will have Avoma-synced notes in the Description field.

### 2f. Gmail — Email Thread History

```
gmail_search_messages(q: "[company domain]", maxResults: 10)
```

If threads found: `gmail_read_thread(threadId)` for context. If nothing found, document: "No email threads found in Gmail." Note: SFDC Tasks (2c) already capture Outreach emails — Gmail adds direct/non-sequenced threads.

### 2g. Google Calendar — Meeting History

```
gcal_list_events(q: "[COMPANY]", timeMin: "90 days ago", timeMax: "today")
```

If nothing found, document: "No calendar events found."

### 2h. UserEvidence — Proof Points

Run 3 targeted searches based on the account's profile:

```
userevidence_search_assets(query: "[industry or vertical]")
userevidence_search_assets(query: "[primary pain point]")
userevidence_search_assets(query: "[GTM motion or use case]")
```

Select 4 proof points total. Prioritize: industry comps > specific metrics > named companies > anonymous quotes. Each must map to a specific pain point from the account.

### 2i. UserGems — Job Change Signals (CRITICAL WARM PATH INTELLIGENCE)

UserGems tracks job changes of people who had a relationship with LeanData at a prior company. These are NOT cold contacts — they already know the product. This is often the single highest-value signal in the entire brief.

**Query 1 — Arrivals: People who moved TO this account from LeanData customers/prospects**

```sql
SELECT UserGem__FirstName__c, UserGem__LastName__c,
       UserGem__CurrentTitle__c, UserGem__CurrentEmail__c,
       UserGem__CurrentPhone__c, UserGem__Linkedin__c,
       UserGem__PastCompany__c, UserGem__PastTitle__c,
       UserGem__PastContactRelationship__c,
       UserGem__UserGemsType__c, UserGem__DateAdded__c,
       UserGem__CurrentJobStartedDate__c,
       UserGem__IsPromotion__c, UserGem__IsAcquisition__c,
       UserGem__CurrentRoleIsPersonaMatching__c,
       UserGem__CurrentRolePersona__c,
       UserGem__NoLongerAtCompany__c,
       UserGem__NumberOfActivities__c, UserGem__LastActivity__c,
       UserGem__LinkedinBio__c, UserGem__Done__c,
       UserGem__CurrentContact__c, UserGem__CurrentLead__c
FROM UserGem__UserGems__c
WHERE UserGem__CurrentAccount__c = '[ACCOUNT_ID]'
ORDER BY UserGem__CurrentJobStartedDate__c DESC NULLS LAST
```

**Query 2 — Departures: People who LEFT this account (org instability / champion migration)**

```sql
SELECT UserGem__FirstName__c, UserGem__LastName__c,
       UserGem__PastTitle__c, UserGem__PastContactRelationship__c,
       UserGem__CurrentCompany__c, UserGem__CurrentTitle__c,
       UserGem__PastJobEndedDate__c, UserGem__UserGemsType__c,
       UserGem__CurrentRoleIsPersonaMatching__c
FROM UserGem__UserGems__c
WHERE UserGem__PastAccount__c = '[ACCOUNT_ID]'
ORDER BY UserGem__PastJobEndedDate__c DESC NULLS LAST
LIMIT 15
```

**How to classify and action UserGems signals:**

| Signal | Classification | Action |
|--------|---------------|--------|
| Arrival + `PastContactRelationship` = "Closed Won Opp Contact" or "Customer Contact" + `CurrentRoleIsPersonaMatching` = true | **CHAMPION ARRIVAL** (highest value) | Auto-promote to Tier A in ICP Contacts with `badge-green` "UG CHAMPION" badge. Add a red-circle Why Now trigger. Generate a dedicated Call Sheet. The hook: "You used us at [PastCompany] — we'd love to pick up where you left off." |
| Arrival + `PastContactRelationship` = "Customer Contact" + `CurrentRoleIsPersonaMatching` = false | **WARM CONTACT** | Add to ICP Contacts as Tier B with `badge-blue` "UG WARM" badge. They know LeanData but aren't the buyer now — use them for intel and internal referrals. |
| Arrival + `PastContactRelationship` = "Open Opp Contact" or "Closed Lost Opp Contact" | **PRIOR EVALUATOR** | Flag in ICP Contacts with `badge-yellow` "UG EVALUATOR" badge. They've seen the pitch before — find out what blocked the deal last time. Different angle needed. |
| Arrival + `IsPromotion` = true | **PROMOTION** | Add as a blue-circle Why Now trigger: "[Name] promoted to [Title] — expanded scope may mean expanded budget." |
| Departure + persona-matching title (VP RevOps, Dir Sales Ops, etc.) | **KEY DEPARTURE** | Flag as a yellow-circle Why Now trigger: "[Name] ([Title]) left [COMPANY] — check if their replacement is a fresh conversation or if the vacancy creates a gap." Add to Recent Activity timeline. |
| Departure + multiple persona-matching departures in < 6 months | **ORG INSTABILITY** | Flag as a red-circle Why Now trigger: "Multiple RevOps/SalesOps departures in [timeframe] — org may be restructuring. Opportunity to become the stabilizing vendor." |
| `NoLongerAtCompany` = true on an arrival | **STALE** | Mark as stale in ICP Contacts (class="stale"). Do not generate a Call Sheet. |
| `Done` = true | **ALREADY ACTIONED** | Note in the UserGems section but deprioritize. Check `NumberOfActivities` and `LastActivity` to see what happened. |

**Cross-references to other sections (MANDATORY):**

1. **Why Now Triggers:** Every champion arrival (persona-matching customer/opp contact) generates a red-circle trigger. Every promotion generates a blue-circle trigger. Key departures generate yellow-circle triggers.
2. **ICP Contacts:** UserGems arrivals are merged into the ICP table with their UG badge. If a UserGems person already appears in ZoomInfo contacts, add the UG badge to their existing row — do not duplicate.
3. **Call Sheets:** Every Tier A UserGems champion gets a dedicated Call Sheet. The angle MUST reference their prior LeanData experience: what they used it for, at which company, and what their relationship was. The hook should feel like a warm reconnection, not a cold pitch.
4. **Recent Activity Timeline:** If `NumberOfActivities` > 0 and `LastActivity` is within 90 days, add a timeline entry showing the most recent rep engagement with this UserGems contact.

### 2j. Web Search — Company Intelligence

```
"[COMPANY] news 2025"
"[COMPANY] acquisition 2024 2025"
"[COMPANY] funding raise leadership"
"[COMPANY] product launch"
"[COMPANY] CEO OR CRO OR RevOps"
```

Capture: acquisitions, product launches, leadership changes, funding rounds, headcount signals. These feed the Why Now triggers.

---

## Step 3: Build the HTML Panel

### File structure

The hub is a single HTML file. When the AE first runs this skill, no hub file exists — create the full file from the Hub Shell Template below. For each subsequent account, append a new panel and sidebar button to the existing file.

**First account:** Use the Hub Shell Template. Replace `[PANEL_CONTENT]` with the panel HTML and `[SIDEBAR_BUTTONS]` with the sidebar button.

**Subsequent accounts:** Find `<!-- ADD NEW PANELS ABOVE THIS LINE -->` and insert the new panel before it. Find `<!-- ADD NEW SIDEBAR BUTTONS ABOVE THIS LINE -->` and insert the new button before it.

---

## HUB SHELL TEMPLATE

Complete, self-contained HTML. No external dependencies except Google Fonts. Copy exactly for first use.

```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Account Research Hub — LeanData</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  --bg:        #0b0d10;
  --surface:   #12151b;
  --surface2:  #191d26;
  --surface3:  #1f2433;
  --border:    #252b3b;
  --border2:   #2e3548;
  --blue:      #4f8ef7;
  --blue-dim:  #162040;
  --green:     #27c97a;
  --green-dim: #0d2b1a;
  --yellow:    #f0b429;
  --yellow-dim:#2d2000;
  --red:       #f05252;
  --red-dim:   #2d0f0f;
  --text:      #dde3f0;
  --muted:     #5a647a;
  --dim:       #8a95a8;
  --mono:      'JetBrains Mono', monospace;
  --sans:      'DM Sans', sans-serif;
  --sidebar-w: 220px;
}

html, body { height: 100%; }
body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--sans);
  font-size: 13px;
  line-height: 1.55;
  display: flex;
  min-height: 100vh;
}

#sidebar {
  width: var(--sidebar-w);
  min-width: var(--sidebar-w);
  background: #0d0f14;
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  position: fixed;
  top: 0; left: 0;
  height: 100vh;
  overflow-y: auto;
  z-index: 100;
}
.sb-logo {
  padding: 18px 16px 14px;
  border-bottom: 1px solid var(--border);
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--blue);
}
.sb-logo span { color: var(--muted); font-weight: 400; }
.sb-section {
  font-family: var(--mono);
  font-size: 8.5px;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: var(--muted);
  padding: 14px 16px 6px;
}
.account-btn {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 9px 16px;
  cursor: pointer;
  border-left: 3px solid transparent;
  transition: background .12s, border-color .12s;
  border-top: none; border-right: none; border-bottom: none;
  background: none;
  width: 100%;
  text-align: left;
}
.account-btn:hover { background: var(--surface2); }
.account-btn.active { background: var(--surface2); border-left-color: var(--blue); }
.ab-name {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 700;
  color: var(--text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ab-meta { font-family: var(--mono); font-size: 9px; color: var(--muted); }
.ab-badge {
  display: inline-block;
  font-family: var(--mono);
  font-size: 8px;
  font-weight: 700;
  letter-spacing: .06em;
  padding: 1px 5px;
  border-radius: 2px;
  margin-top: 2px;
  white-space: nowrap;
}
.ab-badge.hot  { background: var(--green-dim); color: var(--green); border: 1px solid #16512f; }
.ab-badge.warm { background: var(--blue-dim);  color: var(--blue);  border: 1px solid #1e3a6a; }
.ab-badge.cold { background: var(--surface3);  color: var(--muted); border: 1px solid var(--border); }
.sb-footer {
  margin-top: auto;
  padding: 12px 16px;
  border-top: 1px solid var(--border);
  font-family: var(--mono);
  font-size: 8.5px;
  color: var(--muted);
  line-height: 1.7;
}

#main { margin-left: var(--sidebar-w); flex: 1; overflow-y: auto; }
.account-panel { display: none; padding: 28px 32px; max-width: 1060px; }
.account-panel.active { display: block; }

.badge {
  display: inline-block;
  font-family: var(--mono);
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
  padding: 3px 9px 2px;
  border-radius: 3px;
  white-space: nowrap;
}
.badge-blue   { background: var(--blue-dim);   color: var(--blue);   border: 1px solid #1e3a6a; }
.badge-green  { background: var(--green-dim);  color: var(--green);  border: 1px solid #16512f; }
.badge-yellow { background: var(--yellow-dim); color: var(--yellow); border: 1px solid #4a3200; }
.badge-red    { background: var(--red-dim);    color: var(--red);    border: 1px solid #5c1717; }

.cols-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }

.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 7px;
  padding: 16px;
}
.card-title {
  font-family: var(--mono);
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: .13em;
  text-transform: uppercase;
  color: var(--blue);
  margin-bottom: 12px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.card-title::after { content: ''; flex: 1; height: 1px; background: var(--border); }

.header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  padding-bottom: 18px;
  margin-bottom: 16px;
  border-bottom: 1px solid var(--border);
}
.header-eyebrow {
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: .15em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 5px;
}
.account-name {
  font-family: var(--mono);
  font-size: 24px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: -.02em;
  margin-bottom: 8px;
}
.header-badges { display: flex; gap: 6px; flex-wrap: wrap; }
.header-meta {
  text-align: right;
  font-family: var(--mono);
  font-size: 10.5px;
  color: var(--muted);
  line-height: 1.9;
}

.signals {
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  gap: 8px;
  margin-bottom: 12px;
}
.sig {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: 9px 10px;
}
.sig-label {
  font-family: var(--mono);
  font-size: 8.5px;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--muted);
  margin-bottom: 4px;
}
.sig-val { font-family: var(--mono); font-size: 12px; font-weight: 700; }
.sig-val.blue   { color: var(--blue);   }
.sig-val.green  { color: var(--green);  }
.sig-val.yellow { color: var(--yellow); }
.sig-val.red    { color: var(--red);    }

.trigger {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: 11px 13px;
  margin-bottom: 8px;
}
.trigger:last-child { margin-bottom: 0; }
.trigger-head { font-weight: 600; color: var(--text); font-size: 13px; margin-bottom: 3px; }
.trigger-body { color: var(--dim); font-size: 12px; line-height: 1.55; margin-bottom: 7px; }
.sources { display: flex; gap: 6px; flex-wrap: wrap; }
.src {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-family: var(--mono);
  font-size: 9.5px;
  padding: 2px 8px 2px 6px;
  border-radius: 3px;
  text-decoration: none;
  border: 1px solid;
  transition: opacity .15s;
}
.src:hover { opacity: .75; }
.src-web   { color: var(--blue);   background: var(--blue-dim);   border-color: #1e3a6a; }
.src-sfdc  { color: var(--yellow); background: var(--yellow-dim); border-color: #4a3200; }

.tech-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.tech {
  font-family: var(--mono);
  font-size: 10px;
  padding: 3px 9px;
  border-radius: 3px;
  border: 1px solid var(--border);
  background: var(--surface2);
  color: var(--dim);
}
.tech.confirmed { border-color: #16512f; color: var(--green); background: var(--green-dim); }
.tech.signal    { border-color: #1e3a6a; color: var(--blue);  background: var(--blue-dim); }

.tl { display: flex; flex-direction: column; }
.tl-row { display: grid; grid-template-columns: 84px 16px 1fr; gap: 0 10px; }
.tl-date {
  font-family: var(--mono);
  font-size: 9.5px;
  color: var(--muted);
  text-align: right;
  padding-top: 7px;
  white-space: nowrap;
}
.tl-track { display: flex; flex-direction: column; align-items: center; }
.tl-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--blue);
  margin-top: 8px;
  flex-shrink: 0;
  border: 2px solid var(--bg);
}
.tl-line { width: 1px; flex: 1; background: var(--border); }
.tl-row:last-child .tl-line { display: none; }
.tl-body { padding: 4px 0 12px; }
.tl-who { font-weight: 600; font-size: 12.5px; color: var(--text); }
.tl-what { font-family: var(--mono); font-size: 10px; color: var(--muted); }
.tl-note { font-size: 12px; color: var(--dim); margin-top: 2px; }

.sep { border: none; border-top: 1px solid var(--border); margin: 20px 0; }
.sec-label {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 6px;
}
.sec-sub { font-size: 11.5px; color: var(--muted); margin-bottom: 16px; }

.ctable { width: 100%; border-collapse: collapse; }
.ctable th {
  font-family: var(--mono);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: .11em;
  color: var(--muted);
  text-align: left;
  padding: 6px 10px;
  border-bottom: 1px solid var(--border);
  font-weight: 600;
}
.ctable td {
  font-size: 12px;
  color: var(--dim);
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
  vertical-align: top;
}
.ctable tr:last-child td { border-bottom: none; }
.ctable td:first-child { color: var(--text); font-weight: 600; }
.ctable tr.stale { opacity: .38; }
.ctable tr.stale td:first-child { text-decoration: line-through; color: var(--muted); }
.tier-a { color: var(--green);  font-family: var(--mono); font-size: 9.5px; font-weight: 700; }
.tier-b { color: var(--blue);   font-family: var(--mono); font-size: 9.5px; }
.tier-c { color: var(--muted);  font-family: var(--mono); font-size: 9.5px; }
.phone-g { font-family: var(--mono); font-size: 11.5px; color: var(--green); }
.warn-email { display: inline-flex; align-items: center; gap: 3px; font-family: var(--mono); font-size: 9.5px; color: var(--yellow); background: var(--yellow-dim); border: 1px solid #4a3200; padding: 2px 7px; border-radius: 3px; }
.warn-dnc   { display: inline-flex; align-items: center; gap: 3px; font-family: var(--mono); font-size: 9.5px; color: var(--red);    background: var(--red-dim);    border: 1px solid #5c1717; padding: 2px 7px; border-radius: 3px; }
.ok-email   { font-size: 11px; color: var(--green); }

.csheet {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 7px;
  padding: 16px;
  margin-bottom: 12px;
}
.csheet-header {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 14px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--border);
}
.csheet-num {
  font-family: var(--mono);
  font-size: 9.5px;
  font-weight: 700;
  color: var(--muted);
  background: var(--surface2);
  border: 1px solid var(--border);
  padding: 3px 8px;
  border-radius: 3px;
}
.csheet-name { font-size: 15.5px; font-weight: 700; color: var(--text); }
.csheet-title-text { font-size: 12px; color: var(--dim); }
.csheet-badges { margin-left: auto; display: flex; gap: 6px; flex-wrap: wrap; }
.csheet-body { display: grid; grid-template-columns: 200px 1fr; gap: 16px; }
.csheet-left { display: flex; flex-direction: column; gap: 10px; }
.field-label { font-family: var(--mono); font-size: 8.5px; text-transform: uppercase; letter-spacing: .1em; color: var(--muted); margin-bottom: 2px; }
.field-val { font-size: 12px; color: var(--dim); }
.field-phone { font-family: var(--mono); font-size: 13.5px; font-weight: 700; color: var(--green); }
.csheet-right { display: flex; flex-direction: column; gap: 12px; }
.angle-head { font-family: var(--mono); font-size: 8.5px; text-transform: uppercase; letter-spacing: .1em; color: var(--muted); margin-bottom: 4px; }
.angle-text { font-size: 12.5px; color: var(--dim); line-height: 1.6; }
.hook-box {
  background: var(--blue-dim);
  border: 1px solid #1e3a6a;
  border-radius: 5px;
  padding: 11px 13px;
  display: flex;
  gap: 9px;
}
.hook-icon { color: var(--blue); flex-shrink: 0; font-size: 13px; }
.hook-text { font-size: 12px; color: var(--dim); line-height: 1.55; }
.ug-card {
  background: var(--surface2);
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: 12px 14px;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 8px;
  align-items: start;
}
.ug-card.champion { border-left: 3px solid var(--green); }
.ug-card.warm     { border-left: 3px solid var(--blue); }
.ug-card.evaluator{ border-left: 3px solid var(--yellow); }
.ug-card.departure{ border-left: 3px solid var(--red); opacity: .75; }
.ug-card.stale    { opacity: .38; }
.ug-name { font-weight: 700; font-size: 13px; color: var(--text); }
.ug-title { font-size: 11.5px; color: var(--dim); }
.ug-past { font-family: var(--mono); font-size: 10px; color: var(--muted); margin-top: 4px; }
.ug-past strong { color: var(--dim); }
.ug-badge {
  display: inline-block;
  font-family: var(--mono);
  font-size: 8px;
  font-weight: 700;
  letter-spacing: .06em;
  padding: 2px 7px;
  border-radius: 2px;
  white-space: nowrap;
}
.ug-badge.champion  { background: var(--green-dim); color: var(--green); border: 1px solid #16512f; }
.ug-badge.warm      { background: var(--blue-dim);  color: var(--blue);  border: 1px solid #1e3a6a; }
.ug-badge.evaluator { background: var(--yellow-dim); color: var(--yellow); border: 1px solid #4a3200; }
.ug-badge.departure { background: var(--red-dim);   color: var(--red);   border: 1px solid #5c1717; }
.ug-meta { font-family: var(--mono); font-size: 9.5px; color: var(--muted); margin-top: 4px; }
.ug-meta a { color: var(--blue); text-decoration: none; }
.ug-meta a:hover { text-decoration: underline; }
.ug-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.ug-summary {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: 10px 14px;
  margin-bottom: 12px;
  display: flex;
  gap: 16px;
  align-items: center;
}
.ug-stat { text-align: center; }
.ug-stat-val { font-family: var(--mono); font-size: 16px; font-weight: 700; }
.ug-stat-label { font-family: var(--mono); font-size: 8.5px; text-transform: uppercase; letter-spacing: .1em; color: var(--muted); }

.warm-box {
  background: var(--green-dim);
  border: 1px solid #16512f;
  border-radius: 5px;
  padding: 10px 12px;
  font-size: 12px;
  color: var(--dim);
  line-height: 1.5;
}
.footer {
  border-top: 1px solid var(--border);
  margin-top: 16px;
  padding-top: 12px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.footer-text { font-family: var(--mono); font-size: 9.5px; color: var(--muted); }
.owner-tag {
  font-family: var(--mono);
  font-size: 9.5px;
  color: var(--muted);
  background: var(--surface2);
  border: 1px solid var(--border);
  padding: 3px 10px;
  border-radius: 3px;
}
</style>
</head>
<body>

<div id="sidebar">
  <div class="sb-logo">LeanData <span>// Account Hub</span></div>
  <div class="sb-section">Active Accounts</div>

  [SIDEBAR_BUTTONS]
  <!-- ADD NEW SIDEBAR BUTTONS ABOVE THIS LINE -->

  <div class="sb-footer" id="sb-footer">
    AE: [YOUR NAME]<br>
    Updated: [DATE]<br><br>
    Say "research [company]" to add a new account brief.
  </div>
</div>

<div id="main">

  [PANEL_CONTENT]
  <!-- ADD NEW PANELS ABOVE THIS LINE -->

</div>

<script>
function showAccount(id, btn) {
  document.querySelectorAll('.account-panel').forEach(p => p.classList.remove('active'));
  document.querySelectorAll('.account-btn').forEach(b => b.classList.remove('active'));
  document.getElementById('panel-' + id).classList.add('active');
  btn.classList.add('active');
}
</script>
</body>
</html>
```

---

## SIDEBAR BUTTON TEMPLATE

```html
<button class="account-btn [active]" onclick="showAccount('[company-id]', this)">
  <span class="ab-name">[Company Name]</span>
  <span class="ab-meta">[City, Country] · [Industry]</span>
  <span class="ab-badge [hot/warm/cold]">[Key status badge]</span>
</button>
```

Badge color: `hot` = green (active intent signals, 6QA, site visit) · `warm` = blue (closed lost, re-engagement) · `cold` = gray (new business, no signals)

---

## PANEL TEMPLATE

Every panel follows this structure. Section order is non-negotiable.

```html
<div id="panel-[company-id]" class="account-panel [active if first]">

<!-- HEADER -->
<div class="header">
  <div>
    <div class="header-eyebrow">Account Brief // [Account Type Label]</div>
    <div class="account-name">[COMPANY NAME]</div>
    <div class="header-badges">
      <span class="badge badge-[color]">[badge text]</span>
    </div>
  </div>
  <div class="header-meta">
    [City, Country] · [Industry]<br>
    [N] employees · ~$[X]M revenue<br>
    AE: [Owner Name]<br>
    Generated: [Date]
  </div>
</div>

<!-- SIGNALS BAR — always exactly 8 pills -->
<div class="signals" style="margin-bottom:12px;">
  <div class="sig"><div class="sig-label">[Label]</div><div class="sig-val [blue/green/yellow/red]">[Value]</div></div>
  <!-- × 8 total -->
</div>

<!-- 2-COL TOP: Left = Snapshot + Pain + Proof Points / Right = Why Now -->
<div class="cols-2" style="margin-bottom:12px;">

  <div class="card">
    <div class="card-title">Company Snapshot</div>
    <p style="font-size:12.5px;line-height:1.65;color:var(--dim);margin-bottom:14px;">
      [2-3 sentences: what they do, size, GTM motion — # reps, # products, # geographies — ownership/funding, why LeanData fits structurally]
    </p>

    <!-- Pain section title and border color vary by account type — see rules below -->
    <div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--red);margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border);">[PAIN SECTION TITLE]</div>
    <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;">
      <!-- 4 pain cards, 2x2 -->
      <div style="background:var(--surface2);border:1px solid var(--border);border-left:3px solid var(--red);border-radius:5px;padding:10px 12px;">
        <div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--red);margin-bottom:5px;">[PAIN LABEL — SHORT]</div>
        <div style="font-size:12px;color:var(--dim);line-height:1.6;">[2-3 sentences specific to this account]</div>
        <div style="margin-top:6px;font-family:var(--mono);font-size:9px;color:var(--muted);">[Source — SFDC / ZoomInfo / Web]</div>
      </div>
      <!-- repeat × 4 total -->
    </div>

    <!-- Proof Points -->
    <div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--green);margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border);">Proof Points to Weave In</div>
    <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;">
      <!-- 4 proof point cards, 2x2 -->
      <div style="background:var(--surface2);border:1px solid var(--border);border-left:3px solid var(--green);border-radius:5px;padding:10px 12px;">
        <div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--green);margin-bottom:5px;">[COMPANY — WHY RELEVANT]</div>
        <div style="font-size:12px;color:var(--dim);line-height:1.6;">[What they did, what result, why it maps to THIS account. End with a hook the rep can say on the call.]</div>
      </div>
      <!-- repeat × 4 total -->
    </div>
  </div>

  <div class="card">
    <div class="card-title">Why Now — Key Triggers</div>
    <div class="trigger">
      <div class="trigger-head">[EMOJI] [Specific trigger headline — names names, cites dates]</div>
      <div class="trigger-body">[2-4 sentences why this matters for LeanData. Reference dollar amounts, job titles, specific events.]</div>
      <div class="sources">
        <span class="src src-sfdc">[SFDC field name]</span>
        <a class="src src-web" href="[URL]" target="_blank">[Source · Date]</a>
      </div>
    </div>
    <!-- repeat triggers — min 4 for New Business, min 5 for Closed Lost / Win-Back -->
  </div>

</div>

<!-- 2-COL BOTTOM: Tech Stack + Opportunity History -->
<div class="cols-2" style="margin-bottom:12px;">

  <div class="card">
    <div class="card-title">Confirmed Tech Stack</div>
    <div class="tech-tags" style="margin-bottom:12px;">
      <span class="tech confirmed">[Confirmed tool — green]</span>
      <span class="tech signal">[Partner overlap / inferred — blue]</span>
      <span class="tech">[Unknown — gray]</span>
    </div>
    <p style="font-size:11.5px;color:var(--muted);line-height:1.6;">[Note on Crossbeam overlaps and what they mean for the call. Discovery questions for unknown tools.]</p>
  </div>

  <div class="card">
    <div class="card-title">Opportunity History</div>
    <p style="font-size:12px;color:var(--dim);line-height:1.65;">[See opp history rules below for each account type]</p>
  </div>

</div>

<!-- USERGEMS — JOB CHANGE SIGNALS (full width) -->
<hr class="sep">
<div class="sec-label">UserGems — Job Change Signals</div>
<div class="sec-sub">[X] arrivals from LeanData customers/prospects · [X] departures · [X] champions (persona match + customer contact)</div>

<!-- Summary bar -->
<div class="ug-summary">
  <div class="ug-stat"><div class="ug-stat-val green">[N]</div><div class="ug-stat-label">Champions</div></div>
  <div class="ug-stat"><div class="ug-stat-val blue">[N]</div><div class="ug-stat-label">Warm Contacts</div></div>
  <div class="ug-stat"><div class="ug-stat-val yellow">[N]</div><div class="ug-stat-label">Prior Evaluators</div></div>
  <div class="ug-stat"><div class="ug-stat-val red">[N]</div><div class="ug-stat-label">Departures</div></div>
  <div class="ug-stat"><div class="ug-stat-val" style="color:var(--muted);">[N]</div><div class="ug-stat-label">Stale / Actioned</div></div>
</div>

<!-- Arrivals — people who moved TO this account -->
<div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--green);margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border);">Arrivals — Warm Paths In</div>
<div class="ug-grid" style="margin-bottom:16px;">
  <!-- One card per arrival, sorted: champions first, then warm, then evaluators -->
  <div class="ug-card champion">
    <div>
      <div class="ug-name">[First Last]</div>
      <div class="ug-title">[Current Title] @ [Current Company]</div>
      <div class="ug-past">From <strong>[Past Company]</strong> · [Past Title] · [Past Relationship]</div>
      <div class="ug-meta">Started [Month Year] · <a href="[LinkedIn URL]" target="_blank">LinkedIn</a> · [N] activities</div>
    </div>
    <span class="ug-badge champion">UG CHAMPION</span>
  </div>
  <div class="ug-card warm">
    <div>
      <div class="ug-name">[First Last]</div>
      <div class="ug-title">[Current Title]</div>
      <div class="ug-past">From <strong>[Past Company]</strong> · [Past Title] · [Past Relationship]</div>
      <div class="ug-meta">Started [Month Year] · <a href="[LinkedIn URL]" target="_blank">LinkedIn</a></div>
    </div>
    <span class="ug-badge warm">UG WARM</span>
  </div>
  <div class="ug-card evaluator">
    <div>
      <div class="ug-name">[First Last]</div>
      <div class="ug-title">[Current Title]</div>
      <div class="ug-past">From <strong>[Past Company]</strong> · [Past Title] · [Past Relationship]</div>
      <div class="ug-meta"><a href="[LinkedIn URL]" target="_blank">LinkedIn</a></div>
    </div>
    <span class="ug-badge evaluator">UG EVALUATOR</span>
  </div>
  <!-- repeat for each arrival -->
</div>

<!-- Departures — people who LEFT this account (if any) -->
<div style="font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--red);margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--border);">Departures — Org Change Signals</div>
<div class="ug-grid" style="margin-bottom:16px;">
  <div class="ug-card departure">
    <div>
      <div class="ug-name">[First Last]</div>
      <div class="ug-title">Was: [Past Title] @ [COMPANY]</div>
      <div class="ug-past">Now at <strong>[Current Company]</strong> · [Current Title]</div>
      <div class="ug-meta">Left [Month Year]</div>
    </div>
    <span class="ug-badge departure">DEPARTED</span>
  </div>
  <!-- repeat for each departure — if none, show: -->
  <!-- <p style="font-size:12px;color:var(--muted);font-style:italic;">No UserGems departures tracked for this account.</p> -->
</div>

<!-- UserGems intel summary — plain text analysis -->
<div style="background:var(--surface);border:1px solid var(--border);border-radius:5px;padding:12px 14px;font-size:12px;color:var(--dim);line-height:1.65;">
  <strong style="color:var(--text);">UserGems Read:</strong> [2-4 sentences synthesizing what the job change signals mean for this account. E.g.: "3 former LeanData customer contacts have moved to [COMPANY] in the last 12 months, including [Name] who was the primary admin at [Past Company]. This is a warm account — lead with the alumni connection. [Name] should be the first call. One key departure: [Name] ([Title]) left in [Month] — their replacement [has/has not] been identified, which [creates an opening / means the champion seat is empty]."]
</div>

<!-- RECENT ACTIVITY — LAST 90 DAYS (full width) -->
<hr class="sep">
<div class="sec-label">Recent Activity — Last 90 Days</div>
<div class="sec-sub">Sources: SFDC Tasks · Avoma Calls · Gmail Threads · Google Calendar · Company Events</div>
<div class="tl">
  <div class="tl-row">
    <div class="tl-date">[Mon DD 'YY]</div>
    <div class="tl-track"><div class="tl-dot" style="background:var(--[color]);"></div><div class="tl-line"></div></div>
    <div class="tl-body">
      <div class="tl-who">[Who / what system]</div>
      <div class="tl-what">[What happened — specific]</div>
      <div class="tl-note">[Optional: quote or extra context]</div>
    </div>
  </div>
  <!-- repeat rows chronologically, most recent first -->
  <!-- ALWAYS end with null state if no rep engagement found: -->
  <div class="tl-row">
    <div class="tl-date">No activity</div>
    <div class="tl-track"><div class="tl-dot" style="background:var(--muted);"></div></div>
    <div class="tl-body">
      <div class="tl-who" style="color:var(--muted);">Gmail / GCal / Avoma</div>
      <div class="tl-what" style="color:var(--muted);">No email threads, calendar meetings, or recorded calls found. Zero rep engagement since [date of last SFDC activity].</div>
    </div>
  </div>
</div>

<!-- ICP CONTACTS (full width) -->
<hr class="sep">
<div class="sec-label">ICP Contacts — Verified &amp; Staged</div>
<div class="sec-sub">[X] Tier A · [X] Tier B · [X] Stale/Flag · Validated via ZoomInfo &amp; SFDC</div>
<table class="ctable">
  <thead>
    <tr><th>Name</th><th>Title</th><th>Tier</th><th>Email</th><th>Phone</th><th>Validated</th><th>Notes</th></tr>
  </thead>
  <tbody>
    <tr>
      <td>[Name]</td>
      <td>[Title]</td>
      <td><span class="tier-a">Tier A</span></td>
      <td>[email]<br><span class="ok-email">Clear to email</span></td>
      <td class="phone-g">[phone]</td>
      <td style="font-family:var(--mono);font-size:10px;">[ZI validation date]</td>
      <td>[Why this specific person matters for THIS account — not generic]</td>
    </tr>
    <!-- use class="stale" on tr for opted-out / no-email / departed contacts -->
    <!-- use warn-email span for opted-out warning, warn-dnc for hard DNC -->
  </tbody>
</table>

<!-- CALL SHEETS (full width, one per Tier A contact in priority order) -->
<hr class="sep">
<div class="sec-label">Call Sheets</div>
<div class="sec-sub">One sheet per Tier A contact, in priority order</div>

<div class="csheet">
  <div class="csheet-header">
    <span class="csheet-num">01 / [TITLE + CONTEXT IN CAPS, E.G. "VP REVOPS — FIRST CALL"]</span>
    <div>
      <div class="csheet-name">[Name]</div>
      <div class="csheet-title-text">[Title]</div>
    </div>
    <div class="csheet-badges">
      <span class="badge badge-[color]">[status badge]</span>
    </div>
  </div>
  <div class="csheet-body">
    <div class="csheet-left">
      <div>
        <div class="field-label">Email</div>
        <div class="field-val">[email]</div>
        <div class="ok-email">Clear to email</div>
      </div>
      <div>
        <div class="field-label">Phone</div>
        <div class="field-phone">[phone]</div>
      </div>
      <div>
        <div class="field-label">In SFDC Since</div>
        <div class="field-val">[date]</div>
      </div>
      <div>
        <div class="field-label">When to Call</div>
        <div class="field-val">[Specific sequencing note — first call, after context, before or after another contact]</div>
      </div>
    </div>
    <div class="csheet-right">
      <div>
        <div class="angle-head">Angle</div>
        <div class="angle-text">[3-5 sentences: what you know about this person's role, tenure, and current situation. What the goal of this first call is. Specific to THIS account and THIS contact — never generic.]</div>
      </div>
      <div class="hook-box">
        <span class="hook-icon">&#9889;</span>
        <div class="hook-text"><strong style="color:var(--blue);">Opening hook:</strong> "[Copy-paste voicemail or email opener, written in first person in the rep's voice. Must reference specific account intelligence — not a generic value prop.]"</div>
      </div>
    </div>
  </div>
</div>
<!-- repeat .csheet for each Tier A contact -->

<!-- FOOTER -->
<div class="footer">
  <div class="footer-text">LeanData Account Hub · [Company Name] · Researched [Date]</div>
  <div class="owner-tag">AE: [Owner Name]</div>
</div>

</div><!-- /panel-[company-id] -->
```

---

## Section Content Rules

### Account Type Labels (header-eyebrow)

| Type | Eyebrow Text |
|---|---|
| New Business | `Account Brief // Discovery Prep — New Business` |
| Closed Lost | `Account Brief // Discovery Prep — Closed Lost Re-engagement` |
| Churned Win-Back | `Account Brief // Win-Back Prep — Former Customer` |

### Pain Section — Title and Color by Account Type

| Account Type | Section Title | Use Color |
|---|---|---|
| New Business | `Documented Pain — Inferred from GTM Complexity` | `var(--blue)` for left border |
| Closed Lost | `Documented Pain — SFDC Opp Notes` | `var(--red)` for left border |
| Churned Win-Back | `Churn Context — Why They Left` | `var(--red)` for left border |

Pain card sources by type: **New Business** = infer from GTM complexity (# reps x # products x # geos), tech stack limitations, Crossbeam partners, job postings. **Closed Lost** = quote `All_Pain_Points_from_Past_Opps__c` verbatim, then source each card. **Churned Win-Back** = one card per: why they churned, what the product gap was (if any), what's changed, win-back framing.

### Why Now Triggers

Trigger emojis: Red circle = urgent/direct signal (active site visit, champion just hired). Blue circle = strong contextual signal (product launch, leadership change, headcount growth). Yellow circle = background/softer signal (historical pattern, partner overlap)

Minimum triggers: New Business = 4. Closed Lost = 5 (must include loss pattern analysis + what changed). Win-Back = 5 (must include why they churned + what changed + active signal if present)

**Crossbeam as a trigger:** If `Crossbeam_All_Partner_Names__c` contains a known LeanData integration partner (6sense, Outreach, Salesloft, Marketo, HubSpot, Demandbase, G2), always add a trigger: "Blue circle [Partner] is in their stack — [Partner] uses LeanData and achieved [result from UserEvidence]. Hook: 'Your [intent/engagement/sales] vendor uses us.'"

### Tech Stack Tags

- `.tech.confirmed` (green) = sourced from SFDC Technology fields or ZoomInfo enrichment
- `.tech.signal` (blue) = sourced from `revealapps__Reveal_Is_a_customer_of__c` or job posting inference
- `.tech` (gray) = category unknown — note as "Unknown — key discovery question"

Always include: CRM, MAP, Sales Engagement, Intent, LeanData status (No history / Closed Lost / Churned / Active)

Below tech tags, add a plain-text note on: Crossbeam overlaps and what they mean for the call; which tools are unknown and what question to ask.

### Opportunity History

**New Business:** "No prior opportunities. Account created [date] via [lead source]." Note what put them on the radar (6QA, 6sense signal, Bluebirds, etc.)

**Closed Lost:** List each opp: date, stage, amount, lead source, 1-sentence note from SFDC. End with a callout box (use `warn-email` styling): "Pattern across [X] losses: [summary]. What's different now: [why the timing argument works]."

**Churned Win-Back:** Show the full arc — Closed Won (date, amount) then any amendments/upgrades then Churn (date, amount, reason). End with a callout (use `warm-box` styling): "Cost churn vs fit churn: [assessment]. Win-back angle: [framing]." An upgrade before churn = cost churn, not fit churn — call this out explicitly, it changes the entire pitch.

### UserGems — Classification and Display Rules

**Card sort order:** Champions first (green), then Warm Contacts (blue), then Prior Evaluators (yellow). Within each tier, sort by `CurrentJobStartedDate` descending (most recent arrivals first).

**Arrivals subsection:**
- Show ALL arrivals where `NoLongerAtCompany` = false. Mark `NoLongerAtCompany` = true as stale (class="stale" on the card).
- If `Done` = true and `NumberOfActivities` > 0, add a muted note: "Already contacted — [N] activities, last on [date]." Do not suppress — the rep needs to know the contact exists and what's been tried.
- If a UserGems arrival also appears in the ZoomInfo contact enrichment (Step 2b), merge them: use ZoomInfo for email/phone validation and UserGems for the relationship context. Do not create duplicate rows in ICP Contacts.
- LinkedIn URL is critical for UserGems contacts — always include it. If `Linkedin__c` is null, note: "LinkedIn not tracked — search manually."

**Departures subsection:**
- Only show departures where the person held a persona-matching title (VP/Dir RevOps, VP/Dir Sales Ops, CRO, CMO, VP Marketing Ops, MOps Manager, GTM Analytics).
- If 2+ persona-matching departures occurred within 6 months of each other, add an "ORG INSTABILITY" callout (use `warn-email` styling): "Multiple RevOps/SalesOps departures — org may be restructuring."
- If zero relevant departures exist, show the italic null state: "No UserGems departures tracked for this account."

**UserGems Read (synthesis box):**
The plain-text summary below the cards must answer three questions:
1. **Who is the warmest path in?** Name the specific champion and why (relationship type + persona match).
2. **What's the play?** Reconnection vs cold outreach — if champions exist, it's a reconnection play, not a cold play.
3. **What's the risk?** Key departures, stale contacts, or already-actioned signals that didn't convert.

**Null state:** If no UserGems signals exist for this account, show the section with a single message: "No UserGems job change signals tracked for this account. All contacts are cold — standard discovery approach." This is still valuable intel — it tells the rep not to expect warm paths.

### Recent Activity Timeline

Sources to pull and what to log:

| Source | What to Log |
|--------|------------|
| SFDC Tasks (Type=Call) | Outreach/Nooks calls: who called, who was called, disposition (No Answer/Connected/VM), sequence name and step number |
| SFDC Tasks (Type=Email) | Outreach emails: full email body from Description, sender, recipient, messaging angle, case studies referenced, link click signals |
| SFDC Tasks (Type=Meeting) | Meetings: check Description for Avoma-synced notes (look for `-- Avoma Note Start --`), participants, key takeaways |
| SFDC Tasks (Clearbit) | Page view tasks: page path + date. Flag high-intent pages (pricing, FAQ, case studies) |
| LUCI | Presales signals: discovery questions, objections, competitive mentions from call transcripts |
| Avoma | Recorded meetings (backup if SFDC Task notes are thin): date, participants, AI summary |
| Gmail | Email threads (date, direction, subject) — adds non-Outreach threads |
| Google Calendar | Meetings (date, title, attendees) |
| SFDC Contact CreatedDate | New contacts added recently = team growth or restructuring signal |
| Web events | Product launches, acquisitions, funding from last 90 days |

**Critical signals to call out explicitly:**
- **LeanData alumni**: If any contact used LeanData at a prior company (found in email body or LUCI), flag prominently — they are not cold prospects
- **Link clicks without replies**: If Outreach tracks link clicks with no reply, the prospect is evaluating silently — note this and recommend channel switch
- **Outreach saturation**: If 10+ touches across calls and emails with zero response, add a WARNING row recommending a different channel (LinkedIn, event, warm intro, partner intro)
- **Sequence names**: Log the Outreach sequence name (e.g., "Customer Alumni", "Virality CALL ONLY", "Closed Lost Main Contact") — this tells you what angle has already been tried

Always close with null state if no rep engagement found. State it plainly: "Zero rep engagement in Gmail/GCal/Avoma since [date]. All signals are inbound."

Dot colors: green = positive/rep action, blue = inbound signal/site visit, yellow = new contact/company event, red = churn event/loss/saturation warning, muted = null/no data

### ICP Contacts — Tier Definitions

**Tier A** (primary buyers): VP/Dir RevOps, VP/Dir Sales Ops, CRO, CMO, VP Marketing Ops. These are the people who buy LeanData or kill the deal.

**Tier B** (intel + champion building): GTM Analytics, MOps Manager, SDR Manager, VP Sales.

**Stale** (class="stale" on tr): `HasOptedOutOfEmail = true`, departed/title changed, ZI validation > 12 months old.

Notes column = why THIS specific person matters for THIS account. Not generic title description.

### Call Sheets — Angle and Hook Rules

The `angle-text` must reference: role tenure (new = no baggage = fresh conversation; long-tenured = may have seen old LeanData pitch and have opinions), current company situation, and what the specific goal of this first call is.

The `hook-box` is a copy-paste opener in first person in the rep's voice. It must reference specific account intelligence. Not a generic value prop.

Hook framing by account type:
- **New Business:** Ask a specific question about their routing setup. Reference GTM complexity. Don't pitch — qualify.
- **Closed Lost:** Acknowledge the history. Reference the most recent opp by dollar amount or date. Ask what's different now, not what was wrong before.
- **Churned Win-Back:** Separate product from circumstances. Lead with acknowledgment. Ask what changed. Never ask why they left on the opening call.

---

## Step 4: Append to Hub File and Verify

1. Add sidebar button before `<!-- ADD NEW SIDEBAR BUTTONS ABOVE THIS LINE -->`
2. Add panel HTML before `<!-- ADD NEW PANELS ABOVE THIS LINE -->`
3. Update `sb-footer` date to today
4. First/only account: add `active` class to its panel and button. All others: no `active` class.
5. Confirm `showAccount()` JS function is present and intact at the bottom of the file
6. Confirm the button's `showAccount('[id]', this)` matches the panel's `id="panel-[id]"` exactly

---

## Quality Checklist

- [ ] Company Snapshot: employee count, revenue, GTM motion (# reps, products, geos), ownership/funding
- [ ] Pain section: 4 cards, each with a specific source citation
- [ ] Proof points: 4 cards, each tied to THIS account's pain with a usable hook
- [ ] Why Now: minimum required triggers, each sourced; Crossbeam overlap surfaced if applicable
- [ ] Tech Stack: includes Crossbeam overlap note, unknown tools flagged as discovery questions
- [ ] Opp History: all opps with date, amount, lead source, and key note; pattern read or win-back angle included
- [ ] UserGems: both arrivals and departures queried; champions flagged with green badge; departures checked for org instability; synthesis box answers who/play/risk; champions cross-referenced into Why Now triggers, ICP Contacts, and Call Sheets
- [ ] Recent Activity: all 5 sources checked; null state documented if no rep engagement
- [ ] ICP Contacts: Tier A + Tier B, ZI validation dates, opt-out/stale flagged
- [ ] Call Sheets: one per Tier A contact, specific angle + copy-paste hook
- [ ] Sidebar button added, ID matches panel exactly
- [ ] `showAccount()` JS present and intact
- [ ] No unclosed HTML tags
