---
name: HubSpot CRM Expert
description: HubSpot CRM, investor relations, Breeze AI, lead scoring, deal pipeline, HubSpot API, workflow, sequence, playbook, sales analytics, MEDDPICC, conversation intelligence, call recording, meeting notetaker, Windfall, ASPR, investor CRM.
---

# HubSpot CRM Expert

## Sunrise-Specific Context

### Account & Tier
- **Portal ID:** 23126809
- **Tier:** Sales Enterprise + Commerce Enterprise + Service Enterprise
- **Price:** $150/seat/month (Sales Enterprise), $75/seat/month (Core seats)
- **Auth:** Private App token stored in `/Investor Relations/IR_Intelligence_Layer/.env`
- **Base URL:** `https://api.hubapi.com/crm/v3/`

### Key Stats (as of Feb 2026)
- **100,148 contacts** (883 properties across 22 custom groups)
- **23,013 deals** (798 properties)
- **184,536 calls** total (89,883 with transcripts, 109,703 with recordings)
- **10,723 substantive calls** (>2min with transcript) -- enough for trend analysis
- **10,967 meetings** logged (Google Calendar, no recordings)
- **10 deal pipelines** with full stage definitions
- **15,612 contacts** enriched with Windfall net worth data (16% coverage)
- **58 Windfall properties** in dedicated `windfall` group (prefixed `wf_`)

### Active Pipelines
| Pipeline | ID | Active Deals | Purpose |
|---|---|---|---|
| Main Sales Pipeline | 134921120 | 2,918 | Current active fundraising |
| Fund 5 Main Sales Pipeline | 854375554 | 1 | Just starting |
| Setter Pipeline | (varies) | 12,887 | Feeds into Closer pipelines |

### IR Team & Owners
| Name | Role | Owner ID |
|---|---|---|
| Kayla Daughtrey | Setter | 1750115047 |
| Cierra Milao | Setter | 80677823 |
| Kelvin Evans | Closer | 266072428 |
| Bronson Picket | Closer | 424254278 |
| Jonathan Cattani | Closer | 601355604 |
| James Balansag | IR/CS | 2048343577 |
| Daniel Ackerman | - | 85544039 |
| Brian Spear | Face of fund | 244257302 |

### Active Projects
1. **IR Intelligence Layer** -- Smart glue between HubSpot + Windfall + call recordings. Staged Pipeline Research Model: auto-enrichment at every deal stage transition. Architecture: HubSpot workflow triggers -> webhook -> CF Worker -> research -> write back to HubSpot.
2. **ASPR Evaluation** -- 30-day trial of $36K/year AI sales tool. Uses MEDDPICC framework. Key question: what does ASPR add beyond HubSpot native + our custom build?
3. **Meeting Notetaker Activation** -- Breeze AI Meeting Notetaker not yet enabled despite Sales Enterprise seat. Settings tab not visible; may need HubSpot CSM activation.

### Integrations Active in Portal
- **Windfall** -- wealth intelligence (net worth, giving, accreditation), one-way sync TO HubSpot
- **Salesmsg** -- dialer (168,666 calls logged as INTEGRATIONS_PLATFORM source)
- **Sales Momentum** -- sales engagement
- **ScaleIR** -- investor relations tools
- **InvestNext** -- investment management platform
- **Zoom** -- 0 calls currently flowing (not configured for CI)
- **Google Calendar** -- 10,967 meetings logged

### Windfall Property Reference (Verified Feb 2026)
```
wf_net_worth           # Raw dollar amount (e.g., "14300000" = $14.3M)
wf_high_confidence_net_worth  # Upper bound estimate
wf_low_confidence_net_worth   # Lower bound estimate
wf_match_confidence    # 0.0-1.0 confidence score
wf_accredited_investor # booleancheckbox ("true"/"false")
wf_multi_property_owner
wf_rental_property_owner
wf_philanthropic_giver
wf_top_donor
wf_money_in_motion     # Basically broken (6 of 15,612 enriched contacts)
wf_liquidity_trigger   # 125 contacts flagged
wf_boat_owner
wf_plane_owner
wf_trust
wf_foundation_officer
```

**CRITICAL:** `wf_net_worth` is a RAW DOLLAR AMOUNT string (e.g., "14300000"), NOT a range like "$2.5M-$5M". Parse numerically.

**Fields that DO NOT EXIST (commonly assumed):**
`wf_net_worth_score`, `wf_household_income`, `wf_total_giving`, `wf_real_estate_value`, `wf_total_real_estate_count`, `wf_lifestyle_interests`

---

## CRM Object Model

### Standard Objects
| Object | Description | Endpoint |
|---|---|---|
| **Contacts** | People -- investors, prospects, leads | `/crm/v3/objects/contacts` |
| **Companies** | Organizations associated with contacts | `/crm/v3/objects/companies` |
| **Deals** | Pipeline opportunities (investments) | `/crm/v3/objects/deals` |
| **Tickets** | Support/service requests | `/crm/v3/objects/tickets` |
| **Calls** | Phone call records with recordings/transcripts | `/crm/v3/objects/calls` |
| **Emails** | Email engagement records | `/crm/v3/objects/emails` |
| **Meetings** | Meeting records from calendar | `/crm/v3/objects/meetings` |
| **Notes** | Text notes attached to records | `/crm/v3/objects/notes` |
| **Tasks** | Action items assigned to owners | `/crm/v3/objects/tasks` |
| **Products** | Line items / fund products | `/crm/v3/objects/products` |
| **Line Items** | Products within deals | `/crm/v3/objects/line_items` |

### Custom Objects (Enterprise feature)
- Custom objects behave like standard objects: support properties, views, pipelines, automations, reports, and associations
- Create via API: `POST /crm/v3/schemas`
- Useful for: fund structures, subscription commitments, LP entities, property-specific tracking
- Limit varies by tier (Enterprise: up to 10 custom objects)

### Associations
Associations link records across objects. Always bidirectional (if A -> B, then B -> A).

**Common Association Types:**
| From | To | Type ID | Description |
|---|---|---|---|
| Contact | Company | 1 | Primary company |
| Contact | Deal | 3 | Contact to deal |
| Company | Deal | 341 | Company to deal |
| Deal | Line Item | 19 | Deal to line item |
| Contact | Call | - | Engagement association |

**Association Labels (v4 API):**
Labels categorize relationships: "Decision Maker", "Champion", "Employee", "Point of Contact"

```typescript
// Create association with label
const response = await fetch(
  `https://api.hubapi.com/crm/v4/objects/contacts/${contactId}/associations/companies/${companyId}`,
  {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify([{
      associationCategory: 'HUBSPOT_DEFINED',
      associationTypeId: 1  // Contact to Company (primary)
    }])
  }
);
```

### Properties
Each object has properties (fields). Types include:
- **string** -- single-line text (65,536 char limit via CRM, unlimited via forms)
- **textarea** -- multi-line text (65,536 char limit via CRM)
- **number** -- numeric (max 20 digits before exponential notation)
- **date** -- date value (UTC midnight timestamp)
- **datetime** -- date + time (millisecond timestamp)
- **enumeration** -- dropdown/radio/checkbox (max 5,000 options, 3,000 chars per option)
- **bool** -- boolean checkbox
- **phone_number** -- phone format
- **calculation_equation** -- calculated from other properties (Enterprise)

**Property Groups:** Organize properties into logical sections (e.g., "windfall" group for all Windfall-enriched fields).

### Views and Lists
- **Views:** Saved filter configurations for any object. Configurable columns, sort, filter criteria.
- **Active Lists:** Auto-update based on criteria (e.g., "all contacts with wf_net_worth > 5000000")
- **Static Lists:** Manual, snapshot-in-time lists (e.g., "Q1 2026 outreach batch")
- Lists can contain up to 100,000 contacts (active) or 10,000,000 (static)

---

## HubSpot API Reference

### Authentication

**Private Apps (Sunrise uses this):**
```typescript
const headers = {
  'Authorization': `Bearer ${process.env.HUBSPOT_TOKEN}`,
  'Content-Type': 'application/json'
};
```
- Rate limit: **190 requests per 10 seconds** (Enterprise), up to 250 with capacity pack
- Daily limit: Professional/Enterprise get higher limits than free tier (250,000/day for free)
- Token stored in: `/Investor Relations/IR_Intelligence_Layer/.env`

**OAuth (for marketplace apps connecting to multiple portals):**
- Rate limit: **110 requests per 10 seconds** per installed account
- Requires: App ID, Client Secret, redirect URI
- Token refresh: access tokens expire (check `expires_in`), refresh via `POST /oauth/v2/token`
- v1 OAuth endpoints deprecated; v3 is current standard

**When to use which:**
| Use Case | Method |
|---|---|
| Internal integrations (Sunrise -> HubSpot) | Private App |
| Multi-tenant apps for marketplace | OAuth |
| Quick testing/scripts | Private App |

### Key Endpoints

#### Contacts
```typescript
// Get a contact by ID
GET /crm/v3/objects/contacts/{contactId}?properties=email,firstname,lastname,wf_net_worth

// Get a contact by email
GET /crm/v3/objects/contacts/{email}?idProperty=email

// Create a contact
POST /crm/v3/objects/contacts
{
  "properties": {
    "email": "investor@example.com",
    "firstname": "John",
    "lastname": "Doe",
    "phone": "(555) 123-4567"
  }
}

// Update a contact
PATCH /crm/v3/objects/contacts/{contactId}
{
  "properties": {
    "hs_lead_status": "OPEN"
  }
}
```

#### Deals
```typescript
// Get a deal with associations
GET /crm/v3/objects/deals/{dealId}?properties=dealname,amount,dealstage,pipeline&associations=contacts,companies

// Create a deal
POST /crm/v3/objects/deals
{
  "properties": {
    "dealname": "Smith Family - Fund 5 Investment",
    "dealstage": "appointmentscheduled",
    "pipeline": "134921120",
    "amount": "250000",
    "hubspot_owner_id": "266072428"
  }
}

// Move a deal to a new stage
PATCH /crm/v3/objects/deals/{dealId}
{
  "properties": {
    "dealstage": "qualifiedtobuy"
  }
}
```

#### Calls (Engagement)
```typescript
// Get a call with transcript and associations
GET /crm/v3/objects/calls/{callId}?properties=hs_call_title,hs_call_body,hs_call_summary,hs_call_duration,hs_call_recording_url,hs_call_transcription_state&associations=contacts,deals

// Key call properties:
// hs_call_summary         -- AI-generated summary (Breeze CI)
// hs_call_body            -- Call notes / description
// hs_call_recording_url   -- Link to recording
// hs_call_duration        -- Duration in milliseconds
// hs_call_direction       -- INBOUND or OUTBOUND
// hs_call_status          -- COMPLETED, BUSY, NO_ANSWER, etc.
// hs_call_transcription_state -- PROCESSED, PENDING, etc.
// hs_call_source          -- INTEGRATIONS_PLATFORM, VOIP, ZOOM, etc.
// hs_call_video_meeting_type -- zoom, google_meet, teams (when Meeting Notetaker enabled)

// Create a call record
POST /crm/v3/objects/calls
{
  "properties": {
    "hs_call_title": "Follow-up with investor",
    "hs_call_body": "Discussed Fund 5 allocation",
    "hs_call_direction": "OUTBOUND",
    "hs_call_status": "COMPLETED",
    "hs_call_duration": "1800000",
    "hs_timestamp": "2026-03-01T15:00:00.000Z",
    "hubspot_owner_id": "266072428"
  },
  "associations": [{
    "to": { "id": "12345" },
    "types": [{
      "associationCategory": "HUBSPOT_DEFINED",
      "associationTypeId": 194  // Call to Contact
    }]
  }]
}
```

#### Notes
```typescript
// Create a note and associate to a contact
POST /crm/v3/objects/notes
{
  "properties": {
    "hs_note_body": "Pre-call brief: $14.3M NW, accredited, multi-property owner",
    "hs_timestamp": "2026-03-01T10:00:00.000Z",
    "hubspot_owner_id": "266072428"
  },
  "associations": [{
    "to": { "id": "12345" },
    "types": [{
      "associationCategory": "HUBSPOT_DEFINED",
      "associationTypeId": 202  // Note to Contact
    }]
  }]
}
```

#### Tasks
```typescript
// Create a task
POST /crm/v3/objects/tasks
{
  "properties": {
    "hs_task_body": "Review Windfall data before call",
    "hs_task_subject": "Pre-call prep: John Smith",
    "hs_task_status": "NOT_STARTED",
    "hs_task_priority": "HIGH",
    "hs_timestamp": "2026-03-05T09:00:00.000Z",
    "hubspot_owner_id": "266072428"
  },
  "associations": [{
    "to": { "id": "12345" },
    "types": [{
      "associationCategory": "HUBSPOT_DEFINED",
      "associationTypeId": 204  // Task to Contact
    }]
  }]
}
```

### Search API

The CRM Search API is one of the most powerful endpoints. Use it to find records by complex criteria.

```typescript
// Search contacts by Windfall net worth > $5M and accredited
POST /crm/v3/objects/contacts/search
{
  "filterGroups": [{
    "filters": [
      {
        "propertyName": "wf_net_worth",
        "operator": "GT",
        "value": "5000000"
      },
      {
        "propertyName": "wf_accredited_investor",
        "operator": "EQ",
        "value": "true"
      }
    ]
  }],
  "properties": [
    "email", "firstname", "lastname",
    "wf_net_worth", "wf_accredited_investor", "wf_match_confidence"
  ],
  "sorts": [{
    "propertyName": "wf_net_worth",
    "direction": "DESCENDING"
  }],
  "limit": 100,
  "after": 0
}
```

**Search API Constraints:**
- Max **5 filterGroups** with up to **6 filters each**, **18 filters total**
- Filter groups are OR'd together; filters within a group are AND'd
- Results limited to **10,000 total** (hard limit, no workaround)
- Page size max **100** per request
- Available operators: `EQ`, `NEQ`, `LT`, `LTE`, `GT`, `GTE`, `HAS_PROPERTY`, `NOT_HAS_PROPERTY`, `CONTAINS_TOKEN`, `NOT_CONTAINS_TOKEN`, `BETWEEN`
- **Gotcha:** `CONTAINS_TOKEN` works on tokenized text fields, NOT substring matching. For partial string matching, consider using the list filter approach instead.
- **Gotcha:** Search results beyond 10,000 are inaccessible. Use date-range windowing to partition large result sets.

**Available Search Operators:**
| Operator | Description | Example |
|---|---|---|
| `EQ` | Equals | `"value": "true"` |
| `NEQ` | Not equals | `"value": "false"` |
| `LT` | Less than | `"value": "1000000"` |
| `LTE` | Less than or equal | `"value": "5000000"` |
| `GT` | Greater than | `"value": "10000000"` |
| `GTE` | Greater than or equal | `"value": "25000000"` |
| `BETWEEN` | Between two values | `"value": "1000000", "highValue": "5000000"` |
| `HAS_PROPERTY` | Property exists | (no value needed) |
| `NOT_HAS_PROPERTY` | Property is empty | (no value needed) |
| `CONTAINS_TOKEN` | Token match | `"value": "*smith*"` |
| `NOT_CONTAINS_TOKEN` | Token does not match | `"value": "*competitor*"` |

### Batch Operations

Batch endpoints operate on up to **100 records** per request (some endpoints limited to 10 for high-volume ops).

```typescript
// Batch read contacts
POST /crm/v3/objects/contacts/batch/read
{
  "properties": ["email", "firstname", "lastname", "wf_net_worth"],
  "inputs": [
    { "id": "12345" },
    { "id": "67890" },
    { "id": "11111" }
  ]
}

// Batch update deals
POST /crm/v3/objects/deals/batch/update
{
  "inputs": [
    {
      "id": "555001",
      "properties": {
        "dealstage": "qualifiedtobuy"
      }
    },
    {
      "id": "555002",
      "properties": {
        "dealstage": "closedwon",
        "amount": "500000"
      }
    }
  ]
}

// Batch create contacts (upsert)
POST /crm/v3/objects/contacts/batch/upsert
{
  "inputs": [
    {
      "id": "investor@example.com",
      "idProperty": "email",
      "properties": {
        "firstname": "Jane",
        "lastname": "Doe",
        "phone": "(555) 987-6543"
      }
    }
  ]
}
```

**Batch response codes:**
- `200` -- all operations succeeded
- `207` -- partial success (Multi-Status); check individual results

### Associations API (v4)

```typescript
// Read all deal associations for a contact
GET /crm/v4/objects/contacts/{contactId}/associations/deals

// Batch read associations (up to 1,000 IDs)
POST /crm/v4/associations/contacts/companies/batch/read
{
  "inputs": [
    { "id": "12345" },
    { "id": "67890" }
  ]
}

// Get association type labels
GET /crm/v4/associations/contacts/deals/labels

// Create association with label
PUT /crm/v4/objects/contacts/{contactId}/associations/deals/{dealId}
[{
  "associationCategory": "HUBSPOT_DEFINED",
  "associationTypeId": 3
}]
```

### Rate Limits & Best Practices

| Auth Method | Rate Limit | Daily Limit |
|---|---|---|
| Private App (Enterprise) | 190 req/10 sec | Higher than free |
| Private App + Capacity Pack | 250 req/10 sec | Higher |
| OAuth App | 110 req/10 sec per account | Varies |
| Free Account | 100 req/10 sec | 250,000/day |

**Rate limit response:** HTTP 429 with `Retry-After` header.

**Best practices:**
1. Implement exponential backoff with jitter on 429s
2. Use batch endpoints to reduce request count (100 records per batch)
3. Request only needed properties (`?properties=email,firstname,wf_net_worth`)
4. Cache frequently-accessed data (pipeline definitions, owner lists)
5. Use Search API instead of listing + filtering client-side
6. For large exports (>10K records), use date-range windowing
7. Monitor `X-HubSpot-RateLimit-Daily-Remaining` header

```typescript
// Rate-limit-aware fetch utility
async function hubspotFetch(url: string, options: RequestInit, retries = 3): Promise<Response> {
  for (let attempt = 0; attempt < retries; attempt++) {
    const response = await fetch(url, options);

    if (response.status === 429) {
      const retryAfter = parseInt(response.headers.get('Retry-After') || '10', 10);
      console.warn(`Rate limited. Retrying in ${retryAfter}s (attempt ${attempt + 1}/${retries})`);
      await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
      continue;
    }

    if (!response.ok) {
      const error = await response.text();
      throw new Error(`HubSpot API error ${response.status}: ${error}`);
    }

    return response;
  }
  throw new Error(`HubSpot API: max retries (${retries}) exceeded`);
}
```

### Webhooks

**Two approaches:**
1. **Webhooks API** (Developer Apps) -- subscribe to CRM object events
2. **Workflow webhooks** (Operations Hub Pro/Enterprise) -- trigger webhooks from workflow actions

**Webhook API setup:**
- Requires a public/developer app (not a private app)
- Subscribe to: contact.creation, contact.propertyChange, deal.creation, deal.propertyChange, deal.deletion, etc.
- Events delivered as batches (up to 100 events per POST)
- Security: validate `X-HubSpot-Signature` (HMAC SHA-256)

**Signature validation (CRITICAL for production):**
```typescript
import { createHmac } from 'crypto';

function verifyHubSpotSignature(
  body: string,
  signature: string,
  clientSecret: string,
  requestUrl: string,
  method: string
): boolean {
  // v3 signature: SHA-256(clientSecret + method + url + body)
  const sourceString = clientSecret + method + requestUrl + body;
  const hash = createHmac('sha256', clientSecret)
    .update(sourceString)
    .digest('hex');
  return hash === signature;
}
```

**Supported subscription types:**
- `contact.creation`, `contact.deletion`, `contact.propertyChange`, `contact.merge`
- `deal.creation`, `deal.deletion`, `deal.propertyChange`, `deal.merge`
- `company.creation`, `company.deletion`, `company.propertyChange`, `company.merge`
- Association change events (newer)
- Custom object events (newer)

### Pagination

**Cursor-based pagination** is the standard pattern:

```typescript
// Paginate through all contacts
async function getAllContacts(token: string): Promise<any[]> {
  const BASE = 'https://api.hubapi.com/crm/v3/objects/contacts';
  const allContacts: any[] = [];
  let after: string | undefined = undefined;

  do {
    const params = new URLSearchParams({
      limit: '100',
      properties: 'email,firstname,lastname,wf_net_worth'
    });
    if (after) params.set('after', after);

    const response = await hubspotFetch(`${BASE}?${params}`, {
      headers: { 'Authorization': `Bearer ${token}` }
    });
    const data = await response.json();

    allContacts.push(...data.results);
    after = data.paging?.next?.after;
  } while (after);

  return allContacts;
}
```

**CRITICAL LIMITATION:** The Search API has a hard **10,000 result cap**. If your search returns more than 10,000 results, you cannot paginate further. Workaround: use date-range windowing to split queries.

```typescript
// Date-range windowing for large result sets
async function searchLargeDataset(token: string, baseFilters: any[]): Promise<any[]> {
  const allResults: any[] = [];
  const startDate = new Date('2020-01-01');
  const endDate = new Date();

  // Chunk by month
  let current = new Date(startDate);
  while (current < endDate) {
    const nextMonth = new Date(current);
    nextMonth.setMonth(nextMonth.getMonth() + 1);

    const filters = [
      ...baseFilters,
      {
        propertyName: 'createdate',
        operator: 'GTE',
        value: current.getTime().toString()
      },
      {
        propertyName: 'createdate',
        operator: 'LT',
        value: nextMonth.getTime().toString()
      }
    ];

    // Paginate within this date window (max 10K)
    let after: number = 0;
    let hasMore = true;
    while (hasMore) {
      const response = await hubspotFetch(
        'https://api.hubapi.com/crm/v3/objects/contacts/search',
        {
          method: 'POST',
          headers: {
            'Authorization': `Bearer ${token}`,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({
            filterGroups: [{ filters }],
            properties: ['email', 'firstname', 'lastname'],
            limit: 100,
            after
          })
        }
      );
      const data = await response.json();
      allResults.push(...data.results);
      after = data.paging?.next?.after;
      hasMore = !!after;
    }

    current = nextMonth;
  }
  return allResults;
}
```

### Properties API

```typescript
// List all properties for an object
GET /crm/v3/properties/contacts
GET /crm/v3/properties/deals
GET /crm/v3/properties/calls

// Get a specific property
GET /crm/v3/properties/contacts/{propertyName}

// Create a custom property
POST /crm/v3/properties/contacts
{
  "name": "ir_research_brief",
  "label": "IR Research Brief",
  "type": "string",
  "fieldType": "textarea",
  "groupName": "ir_intelligence",
  "description": "Auto-generated pre-call intelligence brief"
}

// Create a property group
POST /crm/v3/properties/contacts/groups
{
  "name": "ir_intelligence",
  "label": "IR Intelligence",
  "displayOrder": 1
}
```

### Custom Events API

```typescript
// Define a custom event (e.g., "research brief generated")
POST /events/v3/event-definitions
{
  "name": "pe_ir_research_brief_generated",
  "label": "IR Research Brief Generated",
  "primaryObject": "CONTACT",
  "propertyDefinitions": [
    {
      "name": "pe_ir_research_brief_generated-brief_stage",
      "label": "Brief Stage",
      "type": "enumeration",
      "options": [
        { "value": "new_lead", "label": "New Lead" },
        { "value": "handoff", "label": "Handoff" },
        { "value": "active_deal", "label": "Active Deal" },
        { "value": "close", "label": "Close" }
      ]
    }
  ]
}

// Send a custom event
POST /events/v3/send
{
  "eventName": "pe_ir_research_brief_generated",
  "objectId": "12345",
  "properties": {
    "pe_ir_research_brief_generated-brief_stage": "handoff"
  },
  "occurredAt": "2026-03-01T15:00:00.000Z"
}
```

---

## Breeze AI Features

### Overview

Breeze is HubSpot's AI layer, comprising three main products:
1. **Breeze Copilot** (formerly ChatSpot) -- AI assistant embedded in HubSpot UI
2. **Breeze Intelligence** -- Data enrichment + buyer intent signals
3. **Breeze Agents** -- Autonomous AI agents for specific workflows

### Breeze Copilot

**What it does:**
- Summarize CRM records (contact history, deal status, engagement timeline)
- Draft emails, notes, and content from context
- Answer questions about your CRM data
- Identify key decision-makers across an account
- Prepare sales reps for calls by summarizing past interactions
- Research companies and contacts
- Generate follow-up suggestions

**Where it appears:**
- CRM sidebar on contact/deal/company records
- Inbox and email composition
- Workflow builder (suggest actions)
- Report builder (explain data)

**Included in:** All Professional and Enterprise tiers (no extra cost for basic Copilot)

**Renamed:** As of 2025, "Breeze Copilot" has been renamed to "Breeze Assistant" in HubSpot's UI. Functionally identical.

**Limitations:**
- Works best with well-maintained CRM data
- Cannot access external data sources directly (only what's in HubSpot)
- Quality depends on data completeness

### Call Transcription & Conversation Intelligence

**Status in Sunrise portal:** ACTIVE on phone calls (168,666 via Salesmsg), NOT active on video meetings

**What Conversation Intelligence (CI) provides:**
- Automatic transcription of phone calls
- AI-generated call summaries (`hs_call_summary` property)
- Speaker identification and talk ratio analysis
- Tracked terms reporting (set up keywords to monitor across all calls)
- Automatic association of calls to contacts, companies, deals
- Searchable transcript library

**Setup requirements:**
1. Sales Hub or Service Hub Professional or Enterprise (Sunrise has Enterprise)
2. Enable call recording in Settings -> Calling -> Call Setup
3. Enable "Transcription and analysis" toggle
4. Super Admin permission required for account-level settings

**Key properties populated by CI:**
```
hs_call_summary              -- AI-generated summary
hs_call_recording_url        -- Link to recording
hs_call_transcription_state  -- PROCESSED, PENDING, FAILED
hs_call_duration             -- Duration in milliseconds
hs_call_direction            -- INBOUND, OUTBOUND
hs_call_status               -- COMPLETED, BUSY, NO_ANSWER, etc.
hs_call_source               -- INTEGRATIONS_PLATFORM, VOIP, ZOOM, etc.
```

**Sunrise-specific data:**
- 89,883 calls have transcripts (via Salesmsg + CI)
- 109,703 have recordings
- 10,723 substantive calls (>2min with transcript) -- useful for MEDDPICC scoring

### Meeting Notetaker

**Status in Sunrise portal:** NOT ENABLED. Infrastructure ready (properties exist, CI engine active).

**What it does:**
- Joins Zoom, Google Meet, or Microsoft Teams meetings as a bot participant
- Records the meeting
- Transcribes in real time
- Generates AI-powered summary with action items
- Creates a Call record in HubSpot (same object type as phone calls)
- Auto-associates to contacts, deals, companies

**Requirements:**
- Sales Hub Professional or Enterprise seat assigned to user
- User must have connected their calendar in HubSpot
- Call Recording AND "Transcription and analysis" must be enabled at account level
- Meeting must have at least one external CRM contact as attendee
- Meeting location must be Zoom, Google Meet, or Microsoft Teams

**How to enable:**
1. Navigate to Settings -> Tools -> Calling -> Call Setup -> Call Configuration
2. Ensure "Call recording" is ON
3. Ensure "Transcription and analysis" is ON
4. Navigate to Settings -> Tools -> Meetings -> Meeting Notetaker (or try direct URL: `/settings/{portalId}/meetings/notetaker`)
5. Toggle Meeting Notetaker ON

**SUNRISE BLOCKER:** The Meeting Notetaker settings tab is not visible in the Sunrise portal despite having Sales Enterprise seats. Possible causes:
- Feature may require activation by HubSpot CSM (Customer Success Manager)
- Feature may be in phased rollout
- **Action required:** Contact HubSpot support or CSM to request activation

**Platform-specific notes:**
- **Zoom:** Host must enable "Record to computer files" + allow internal/external participant recording in Zoom settings
- **Google Meet:** Currently only supports English transcripts
- **Teams:** Standard Teams recording permissions apply

**User opt-out:** Individual reps can disable at Settings -> General -> Calendar -> Meeting Notetaker toggle

**In-Person Meeting Notetaker (iOS):**
- Separate feature for in-person meetings using iOS app
- Requires Sales Hub Professional or Enterprise seat
- Uses device microphone to record and transcribe

### Breeze Intelligence (Data Enrichment)

**What it provides:**
- Company and contact data enrichment (firmographics, technographics)
- Buyer intent signals (which companies are researching topics relevant to you)
- Form shortening (auto-fill known fields on forms)

**Credit system (updated 2025):**
- **Data enrichment:** FREE for all Starter, Professional, and Enterprise accounts (no longer consumes credits)
- **Buyer Intent:** Costs 10 HubSpot Credits per company created/monitored
- Monthly credit allowance included with subscription (varies by tier)
- Previous "Breeze Intelligence Credits" migrated to "HubSpot Credits" (June 2025)

**Enrichment data points:** Company revenue, employee count, industry, technology stack, social profiles, location, founding date

**Relevance to Sunrise:** Limited -- Windfall provides better wealth/HNW data than Breeze Intelligence for investor relations. Breeze Intelligence is designed for B2B SaaS, not PE/RE fundraising. Buyer Intent could be useful to detect when HNW individuals are researching passive income investments or real estate syndications, but this is speculative.

### Breeze Agents

HubSpot expanded from 4 to 20+ Breeze Agents between Jan 2025 and Feb 2026.

**Key agents for IR use cases:**

| Agent | What It Does | Tier Required | IR Relevance |
|---|---|---|---|
| **Prospecting Agent** | Researches target accounts, personalizes outreach, engages prospects | Sales Pro/Enterprise | HIGH -- could draft personalized investor outreach |
| **Customer Agent** | Resolves support inquiries from knowledge base | Service Pro/Enterprise | LOW -- not investor-facing |
| **Knowledge Base Agent** | Creates KB articles from tickets/conversations | Service Pro/Enterprise | LOW |
| **Content Agent** | AI-powered content creation | Marketing Pro/Enterprise | MEDIUM -- investor communications |

**Prospecting Agent details:**
- Uses "selling profiles" to customize approach per product/persona/market
- Researches target accounts (company websites, news, blog posts, past interactions)
- Drafts personalized emails based on CRM context
- Enrolls contacts in sequences
- Available globally (not beta)

**Included vs. Extra Cost:**
| Feature | Included in Sales Enterprise? |
|---|---|
| Breeze Copilot / Assistant | Yes |
| Call Transcription & CI | Yes |
| Meeting Notetaker | Yes (needs activation) |
| Breeze Intelligence (enrichment) | Yes (no credits consumed) |
| Breeze Intelligence (buyer intent) | Credits required |
| Prospecting Agent | Yes (Sales Pro+) |
| Customer Agent | Service Pro+ |
| Knowledge Base Agent | Service Pro+ (beta) |
| Content Agent | Marketing Pro+ |

---

## Deal Pipeline Management

### Pipeline Architecture

Sunrise has **10 pipelines** with distinct purposes:

**Primary active pipeline:** Main Sales Pipeline (ID: 134921120, 2,918 deals)
**Newest pipeline:** Fund 5 Main Sales Pipeline (ID: 854375554, 1 deal)
**Feeder pipeline:** Setter Pipeline (12,887 deals) -- feeds qualified leads into Closer pipelines

### Pipeline Configuration
- **Enterprise limit:** Up to 25 pipelines (verify in HubSpot docs for current limit)
- Each pipeline has its own stages, probabilities, and properties
- Deals can only be in one pipeline at a time (moving pipelines resets the stage)

### Deal Stage Properties
Each stage has:
- **Stage name** (display label)
- **Internal ID** (used in API)
- **Probability** (0-100%, used in forecasting)
- **Forecast category** (Pipeline, Best Case, Commit, Closed Won, Not Forecasted)

### Required Properties by Stage
A best practice (especially with MEDDPICC): require certain properties before a deal can advance.

Example for IR pipeline:
| Stage | Required Properties |
|---|---|
| New Lead | Contact email, owner |
| Qualifying | Accreditation status, investment interest |
| Meeting Scheduled | Meeting date, call recording |
| Proposal Sent | Investment amount, fund type |
| Contract/Sub Doc | Subscription documents, compliance check |
| Closed Won | Wire confirmation, amount |

### Forecasting

**Setup requirements:**
- Super Admin to configure
- Choose forecast amount property (typically `amount`)
- Map deal stages to forecast categories

**Forecast categories:**
| Category | Description | Typical Stages |
|---|---|---|
| Not Forecasted | Excluded from forecast | New Lead, Disqualified |
| Pipeline | Low likelihood | Qualifying, Meeting Scheduled |
| Best Case | Moderate likelihood | Proposal Sent |
| Commit | High likelihood | Contract/Sub Doc |
| Closed Won | Completed | Funded |

**API access to forecast data:**
- Forecasts are primarily a UI/reporting feature
- Use deal search with `dealstage` + `amount` filters to build custom forecast views
- Custom calculated properties can create rolling forecast amounts

### Multiple Pipelines Strategy (Sunrise-Specific)

Current pattern: **Setter -> Closer handoff model**
1. Setters work leads in Setter Pipeline (high volume, 12,887 deals)
2. Qualified leads handed off to Closer Pipeline (Main Sales Pipeline)
3. Fund-specific pipelines for different fund vehicles (Fund 5 has its own)

**Recommendation:** Keep this separation. The IR Intelligence Layer respects pipeline boundaries by triggering different research stages at each transition.

---

## Call Tracking & Recording

### Architecture

Sunrise's call flow:
```
Salesmsg (dialer) -> HubSpot Integration -> Call Record Created
                                         -> CI Engine processes recording
                                         -> Transcript generated
                                         -> AI Summary generated (hs_call_summary)
                                         -> Auto-associated to contact/deal
```

### Call Source Breakdown (Live Data)
| Source | Count | Has Transcripts? |
|---|---|---|
| INTEGRATIONS_PLATFORM (Salesmsg) | 168,666 | Yes (89,883) |
| VOIP | 31 | Some |
| ZOOM | 0 | N/A (not configured) |
| HUBSPOT_MEETINGS | 0 | N/A (notetaker off) |
| IN_PERSON_MEETINGS | 0 | N/A |

### Call Analytics & Reporting

**Tracked Terms:**
- Configure keywords/phrases to monitor across all transcripts
- Report on frequency, trends, sentiment around specific terms
- Example: track "accredited", "minimum investment", "returns", "risk", "timeline"
- Available in custom report builder after setup

**Call outcome tracking:**
- `hs_call_status`: COMPLETED, BUSY, NO_ANSWER, FAILED, CONNECTING, etc.
- `hs_call_disposition`: Custom dispositions (configure in Settings -> Calling)
- Duration analytics available out-of-box

### Integration with External Phone Systems

**Salesmsg (current):**
- Already integrated, 168K+ calls flowing
- Source shows as `INTEGRATIONS_PLATFORM`
- Transcripts processed by HubSpot CI engine

**Zoom (not yet configured for calling):**
- Integration installed but no calls flowing through CI
- To enable: connect Zoom integration, enable "Sync meeting recordings and transcripts"
- Once enabled, Zoom call recordings sync to HubSpot and get CI processing

**RingCentral / Other VoIP:**
- HubSpot has marketplace integrations for most major providers
- Key requirement: the integration must support passing audio to HubSpot CI for transcription

### AI Call Summaries

HubSpot's CI generates summaries automatically in `hs_call_summary`. These summaries:
- Identify key topics discussed
- Extract action items
- Note participants
- Highlight sentiment indicators
- Are searchable via the API

**API access pattern for bulk summary analysis:**
```typescript
// Get recent calls with summaries for a specific owner
POST /crm/v3/objects/calls/search
{
  "filterGroups": [{
    "filters": [
      {
        "propertyName": "hubspot_owner_id",
        "operator": "EQ",
        "value": "266072428"  // Kelvin Evans
      },
      {
        "propertyName": "hs_call_duration",
        "operator": "GT",
        "value": "120000"  // > 2 minutes
      },
      {
        "propertyName": "hs_call_transcription_state",
        "operator": "EQ",
        "value": "PROCESSED"
      }
    ]
  }],
  "properties": [
    "hs_call_title", "hs_call_summary", "hs_call_duration",
    "hs_call_direction", "hs_timestamp"
  ],
  "sorts": [{ "propertyName": "hs_timestamp", "direction": "DESCENDING" }],
  "limit": 50
}
```

---

## Lead Scoring

### Predictive Lead Scoring (AI-Based, Enterprise Feature)

**What it does:**
- Uses ML to analyze historical conversion patterns
- Assigns `hs_predictive_scoring_tier` (likelihood to close within 90 days)
- Score = percentage probability (e.g., 22 = 22% chance of closing)
- Model retrains automatically as new data accumulates

**Requirements:**
- Sales Hub or Marketing Hub Professional or Enterprise
- Minimum data: **100 closed-won customers** + **1,000 non-customers** in HubSpot
- Properties analyzed: demographics, engagement history, company data, behavioral signals

**Key properties:**
- `hs_predictive_scoring_tier` -- tier classification
- `hs_predictive_contact_score_v2` -- numeric probability score

**Enterprise features (2025+):**
- Multiple predictive models for different segments (e.g., accredited vs. non-accredited)
- Explainability features showing which signals drove the score
- Can be used in workflow enrollment triggers

### Manual Lead Scoring (Property-Based)

**Setup in HubSpot:**
1. Navigate to Settings -> Properties -> Contact properties
2. Find or create `hubspot_score` (or custom score property)
3. Define scoring criteria (positive and negative attributes)

**Scoring criteria categories:**
| Category | Examples for IR | Points |
|---|---|---|
| **Demographic** | Accredited investor (wf_accredited_investor=true) | +20 |
| **Wealth** | NW > $10M | +15 |
| **Wealth** | NW > $25M | +25 |
| **Engagement** | Opened email in last 30 days | +5 |
| **Engagement** | Attended webinar | +10 |
| **Engagement** | Called and spoke >5 min | +15 |
| **Behavioral** | Visited fund page on website | +10 |
| **Behavioral** | Downloaded investment materials | +15 |
| **Negative** | Email bounced | -10 |
| **Negative** | No engagement in 90 days | -15 |
| **Negative** | Unsubscribed from emails | -20 |

### IR-Specific Scoring Model Design

**IMPORTANT:** For investor relations, standard B2B SaaS scoring models are inappropriate. Key differences:

| B2B SaaS Scoring | IR/Investor Scoring |
|---|---|
| Company size, industry | Net worth, accreditation status |
| Website visits, content downloads | Webinar attendance, call engagement |
| Job title (VP, Director) | Self-directed vs. advisor-represented |
| Product page views | Fund-specific document downloads |
| Free trial activity | Investment amount history |

**Recommended IR scoring model:**
```
TIER A (80-100): Accredited + NW > $10M + Active engagement + Prior investor
TIER B (60-79):  Accredited + NW > $5M + Some engagement
TIER C (40-59):  Accredited + NW > $1M (or missing NW data)
TIER D (20-39):  Not accredited (or unknown) + Some engagement
TIER F (0-19):   No engagement + No data + Bounced/unsubscribed
```

**SEC Compliance Note:** Do NOT create a property called "Accredited Investor Score" or similar that could be interpreted as a formal accreditation determination. Use "Lead Quality Score" or "Engagement Score" instead. Formal accreditation determination requires legal process (SEC Reg D). The Windfall `wf_accredited_investor` field is a data signal, not a legal determination.

---

## Workflows & Automation

### Workflow Builder

**What it is:** Visual automation builder for multi-step processes.

**Enrollment triggers:**
- Contact/deal/company property changes
- Form submissions
- Page views
- Email interactions
- List membership
- Date-based (e.g., "7 days after last contact")
- Manual enrollment
- Integration events
- Custom event triggers

**Available actions:**
| Category | Actions |
|---|---|
| **Communication** | Send email, send SMS, send Slack notification |
| **CRM** | Create/update record, create task, create deal, set property, copy property |
| **Logic** | If/then branch, delay, go-to action |
| **Integration** | Send webhook, trigger Zapier/Make, custom coded action |
| **Internal** | Send internal notification, assign owner, rotate leads |
| **Lists** | Add to / remove from list |
| **Enrollment** | Enroll in sequence, enroll in another workflow |

**Branching logic:**
- If/then branches based on property values, list membership, or time
- Can nest branches for complex decision trees
- Supports "all" and "any" conditions within a branch

**Enterprise-specific workflow features:**
- Custom coded actions (JavaScript or Python) -- Operations Hub Pro/Enterprise
- Webhook actions with custom payloads
- Advanced delay options (business days only, as of Jan 2026)
- Workflow health monitoring

**IR Intelligence Layer integration point:**
Workflows trigger webhooks -> CF Worker processes -> writes back to HubSpot via API. Key workflow triggers:
1. Deal stage change -> trigger research for that stage
2. New contact created with Windfall data -> trigger auto-enrichment
3. Meeting scheduled -> trigger pre-call brief generation
4. Deal assigned to Closer -> trigger handoff research package

### Sequences (1-to-1 Automated Outreach)

**What they are:** Personalized, automated email + task cadences sent from a rep's inbox (not marketing email). Designed for individual sales outreach.

**Key characteristics:**
- Emails sent from rep's connected email (Gmail/Outlook), NOT marketing email
- One contact per sequence at a time (cannot be in multiple active sequences)
- Enrollment: manual or via workflow
- Unenrollment: automatic on reply, meeting booked, or manual

**Limits:**
| Feature | Professional | Enterprise |
|---|---|---|
| Daily sequence emails per user | 500 | 1,000 |
| Bulk enrollment cap | 50 contacts at once | 50 contacts at once |
| Email templates per sequence | 10 max | 10 max |
| Task reminders per sequence | Unlimited | Unlimited |
| Send rate (bulk enrollment) | 3 emails/minute | 3 emails/minute |

**Sequences vs. Workflows:**
| Feature | Sequences | Workflows |
|---|---|---|
| Sent from | Rep's personal email | Marketing email or internal |
| Enrollment | 1-to-1, manual or workflow-triggered | 1-to-many, criteria-based |
| Personalization | High (per-contact tokens) | Medium (tokens) |
| Tracking | Opens, clicks, replies | Opens, clicks |
| Unenrollment | On reply or meeting booked | On criteria match |
| Use case | Sales follow-up cadences | Marketing nurture, internal ops |

### Playbooks (Guided Selling)

**What they are:** Interactive scripts, checklists, and question guides available on contact/deal/company records. Reps follow them during calls or meetings.

**Features:**
- Question-and-answer format with input fields
- Answers saved to CRM properties (including custom properties)
- Notes field for freeform input
- Can include conditional questions (show question B only if answer A = X)
- Pre-built templates: Discovery Call, Qualification
- Custom playbooks for any use case

**IR-relevant playbook examples:**
1. **Discovery Call Playbook** -- qualifying investor interest, risk tolerance, timeline
2. **MEDDPICC Qualification Playbook** -- structured MEDDPICC question flow (see MEDDPICC section)
3. **Subscription Document Walkthrough** -- guided checklist for closing process
4. **Investor Update Call** -- structured agenda for existing investor check-ins

**Tier requirement:** Sales Enterprise (included)

### Task Queues

**What they are:** Prioritized task lists that reps work through sequentially.

**Features:**
- Queue tasks by type (calls, emails, to-dos)
- Auto-advance to next task on completion
- Filter by due date, priority, owner
- Pair with workflows that auto-create tasks

**IR use case:** Create task queue "Morning Call Prep" that includes pre-call brief review tasks generated by the IR Intelligence Layer.

### Data Hygiene Automations

Common automated cleanup workflows:
1. **Merge duplicates** -- Workflow to flag contacts with matching email/phone
2. **Property standardization** -- Normalize phone formats, state abbreviations
3. **Lifecycle stage updates** -- Auto-advance based on deal creation/stage
4. **Owner reassignment** -- Redistribute inactive owner's contacts
5. **Stale deal cleanup** -- Flag deals with no activity in X days

---

## Reporting & Analytics

### Standard Sales Reports

HubSpot provides pre-built dashboards:
- **Sales Performance** -- Deals created, won, lost over time
- **Deal Forecast** -- Revenue projection based on pipeline stages + probabilities
- **Sales Productivity** -- Calls, meetings, emails, tasks per rep
- **Call Analytics** -- Volume, duration, outcomes, talk ratio

### Custom Report Builder

**Capabilities:**
- Single-object reports (e.g., all deals by stage)
- Cross-object reports (e.g., contact properties + deal amounts)
- Funnel reports (conversion through pipeline stages)
- Attribution reports (which touchpoints led to closed-won)
- Custom calculations (sum, average, count, min, max)
- Visualization types: bar, line, area, pie, table, pivot table, KPI/single-value

**Data sources for custom reports:**
- All standard + custom objects
- Engagement data (calls, emails, meetings)
- Website analytics (if Marketing Hub)
- Custom events

**Enterprise-only reporting features:**
- Multi-touch revenue attribution
- Custom calculated properties
- Advanced filtering and segmentation

### Dashboard Management

- Up to **300 dashboards** per account (Enterprise)
- Up to **30 reports per dashboard**
- Real-time updates (no manual refresh needed)
- Permission controls: owner, team, everyone
- Email scheduling: auto-send dashboard snapshots

### IR-Relevant Report Ideas

1. **Pipeline Velocity** -- Average days per stage by owner (identify bottlenecks)
2. **Windfall Coverage** -- % of active deals with Windfall enrichment
3. **Call Activity vs. Close Rate** -- Correlation between call volume and conversion
4. **Investor AUM by Fund** -- Total committed capital by fund pipeline
5. **Setter-to-Closer Conversion** -- Handoff success rate
6. **Engagement Decay** -- Time since last touch for open deals
7. **MEDDPICC Health** -- Average MEDDPICC score by stage (once implemented)

### Data Export Options

| Method | Use Case | Limitations |
|---|---|---|
| UI Export (CSV/XLSX) | Ad hoc reports | Manual, limited to view/report contents |
| API List/Search | Programmatic pulls | 10K search limit, 100/page |
| API Batch Read | Known record IDs | 100 per batch |
| HubSpot Data Sync | Ongoing sync to data warehouse | Operations Hub required |
| Custom Report Export | Scheduled dashboard emails | PDF/image format |
| Third-party ETL | Full data warehouse sync | Fivetran, Airbyte, etc. |

---

## Integrations

### Windfall (Wealth Data Enrichment)

**Current status:** Active, one-way sync (Windfall -> HubSpot)

**How it works:**
- Windfall enriches HubSpot contacts with wealth intelligence data
- Data flows INTO HubSpot only (no writeback to Windfall)
- All reads of Windfall data come from HubSpot API
- 58 custom properties in `windfall` group (prefixed `wf_`)
- 15,612 contacts enriched (16% of total 100K)

**Integration type:** Marketplace app (native HubSpot integration)

**Key data points available:**
- Net worth (raw dollar amount, high/low confidence bounds)
- Accredited investor flag
- Property ownership (multi-property, rental)
- Philanthropic signals (giver, top donor, foundation officer)
- Wealth indicators (boat owner, plane owner, trust)
- Liquidity signals (money_in_motion -- mostly broken, liquidity_trigger -- 125 contacts)

**Cost:** ~$75K/year (Sunrise contract)

**ROI considerations:**
- 5,108 confirmed accredited investors identified
- Median NW of enriched contacts: $4.3M
- 39 of 125 liquidity trigger contacts have NEVER been contacted
- Value depends on surfacing data in workflow (IR Intelligence Layer's purpose)

### Zoom

**Current status:** Integration installed, meetings syncing, call recordings NOT syncing to CI

**Setup for full functionality:**
1. In HubSpot: Settings -> Integrations -> Connected Apps -> Zoom
2. Check "Sync this user's meeting recordings and transcripts" per user
3. In Zoom: Enable "Record to computer files", allow internal/external participant recording
4. Once configured: Zoom recordings sync to HubSpot, CI processes them

**Features when fully configured:**
- Zoom meeting links auto-generated for HubSpot scheduling pages
- Meeting recordings + transcripts sync to HubSpot Call records
- CI generates AI summaries for Zoom calls
- Participant data syncs to contact records
- Webinar registration + attendance tracking

**GOTCHA (Jan 2025+):** Zoom contact-based properties can no longer be used to segment contacts. Use marketing event filters instead.

### Google Workspace

**Features:**
- **Gmail:** Log emails to CRM, track opens/clicks, view CRM data in Gmail sidebar, create contacts from inbox
- **Calendar:** Two-way sync (HubSpot meetings <-> Google Calendar), auto-log meetings on contact timelines
- **Contacts:** Create CRM contacts directly from Gmail
- **Drive:** Native file attachment to HubSpot records (Oct 2025+), files stay in Drive with links in HubSpot

**Setup:**
1. Settings -> Integrations -> Email -> Connect personal email (Gmail)
2. Settings -> Integrations -> Calendar -> Connect Google Calendar
3. Each user connects individually (per-user auth)

### Slack

**Features:**
- Receive HubSpot notifications in Slack (leads, deal changes, reminders, form submissions)
- Search/create CRM records from Slack
- Associate deals with Slack channels for team collaboration
- Custom Slack notifications from workflows (with action buttons)
- Create tasks, tickets, notes from Slack messages
- Slash commands: `/hubspot [search query]`

**Workflow integration:**
```
Workflow action: "Send Slack notification"
  -> Channel: #ir-team
  -> Message: "Deal {{deal.dealname}} moved to {{deal.dealstage}}"
  -> Action buttons: [Create Task] [View in HubSpot]
```

**IR use case:** Notify #ir-team channel when high-value deals ($250K+) advance stages, when MEDDPICC scores drop, or when research briefs are generated.

### Custom API Integrations (IR Intelligence Layer Architecture)

```
HubSpot Workflow Trigger
    -> POST webhook to CF Worker (ir-intelligence.suncom.work)
    -> Worker authenticates via CF Access JWT
    -> Worker reads contact/deal data from HubSpot API
    -> Worker enriches with Windfall data (already in HubSpot)
    -> Worker calls Claude API for research synthesis
    -> Worker writes research brief back to HubSpot custom property
    -> Worker logs custom event for tracking
    -> Worker sends Slack notification to owner
```

### Operations Hub / Data Hub

**Tier:** Separate from Sales Hub. Starter/Professional/Enterprise.

**Key features:**
- **Data Sync:** Two-way sync with 100+ apps (Salesforce, Zendesk, Mailchimp, etc.)
- **Data Quality Automation:** Fix formatting, standardize properties, deduplicate
- **Custom Coded Actions:** JavaScript or Python within workflows (Pro/Enterprise)
- **Programmable Automation:** Extend workflows with code
- **Datasets:** Pre-built data collections for reporting

**2025 Evolution:** Operations Hub renamed to "Data Hub" at INBOUND 2025. Same features, repositioned for AI era.

**Relevance to Sunrise:** Custom coded actions could be an alternative to external CF Worker for lightweight HubSpot-to-HubSpot automations. However, for the IR Intelligence Layer (which calls external APIs like Claude, SEC EDGAR), a CF Worker is more appropriate due to execution time limits and external network access.

---

## MEDDPICC in HubSpot

### Overview

MEDDPICC is a deal qualification framework with 8 dimensions. Sunrise is adopting it through the ASPR trial and may build native scoring into the IR Intelligence Layer.

### MEDDPICC Dimensions

| Dimension | Full Name | What It Measures | IR Translation |
|---|---|---|---|
| **M** | Metrics | ROI/investment goals discussed | Investor's return expectations, timeline |
| **E** | Economic Buyer | Decision-maker identified | Who controls the capital? Self-directed vs. advisor? |
| **D** | Decision Criteria | Evaluation factors | What matters? Cash flow, tax benefits, diversification? |
| **D** | Decision Process | Steps/timeline/committee | Solo decision? Family office? Trust committee? |
| **P** | Paper Process | Legal/compliance steps | Sub docs, accreditation verification, wire process |
| **I** | Identify Pain | Core investment motivation | Why now? Portfolio rebalancing? Liquidity event? |
| **C** | Champion | Internal advocate | Who's championing this within the family/firm? |
| **C** | Competition | Other investments considered | Other syndications, REITs, direct RE, stock market? |

### Custom Properties Setup

Create these deal properties for MEDDPICC tracking:

```typescript
// Property creation script
const meddpiccProperties = [
  // Individual dimension scores (0-4 scale)
  { name: 'meddpicc_metrics', label: 'MEDDPICC: Metrics', type: 'enumeration', fieldType: 'select',
    options: [
      { value: '0', label: '0 - Not Addressed' },
      { value: '1', label: '1 - Partially Discussed' },
      { value: '2', label: '2 - Generally Understood' },
      { value: '3', label: '3 - Well Documented' },
      { value: '4', label: '4 - Thoroughly Validated' }
    ]
  },
  { name: 'meddpicc_economic_buyer', label: 'MEDDPICC: Economic Buyer', /* same enum structure */ },
  { name: 'meddpicc_decision_criteria', label: 'MEDDPICC: Decision Criteria', /* same */ },
  { name: 'meddpicc_decision_process', label: 'MEDDPICC: Decision Process', /* same */ },
  { name: 'meddpicc_paper_process', label: 'MEDDPICC: Paper Process', /* same */ },
  { name: 'meddpicc_identify_pain', label: 'MEDDPICC: Identify Pain', /* same */ },
  { name: 'meddpicc_champion', label: 'MEDDPICC: Champion', /* same */ },
  { name: 'meddpicc_competition', label: 'MEDDPICC: Competition', /* same */ },

  // Narrative fields for AI-generated insights
  { name: 'meddpicc_metrics_notes', label: 'MEDDPICC: Metrics Notes', type: 'string', fieldType: 'textarea' },
  { name: 'meddpicc_economic_buyer_notes', label: 'MEDDPICC: Economic Buyer Notes', type: 'string', fieldType: 'textarea' },
  // ... (one for each dimension)

  // Calculated overall score
  { name: 'meddpicc_total_score', label: 'MEDDPICC Total Score', type: 'number', fieldType: 'number',
    description: '0-32 scale (8 dimensions x 0-4 each). Calculate via workflow or API.' },

  // Health percentage (for reporting)
  { name: 'meddpicc_health_pct', label: 'MEDDPICC Health %', type: 'calculation_equation',
    calculationFormula: 'meddpicc_total_score / 32 * 100' },

  // Last scored timestamp
  { name: 'meddpicc_last_scored', label: 'MEDDPICC Last Scored', type: 'datetime' },

  // Scoring source
  { name: 'meddpicc_score_source', label: 'MEDDPICC Score Source', type: 'enumeration', fieldType: 'select',
    options: [
      { value: 'manual', label: 'Manual (Rep)' },
      { value: 'aspr', label: 'ASPR Auto-Score' },
      { value: 'ir_intelligence', label: 'IR Intelligence Layer' }
    ]
  }
];
```

### MEDDPICC Playbook

Create a HubSpot playbook for MEDDPICC qualification calls:

**Questions to include:**
1. (M) "What investment returns are you targeting? What metrics matter most -- cash flow, appreciation, tax benefits?"
2. (E) "Who ultimately makes the investment decision in your household/firm? Is there an advisor involved?"
3. (D-Criteria) "What factors are most important when evaluating an investment like this? What would make you say yes vs. no?"
4. (D-Process) "Walk me through your decision process. Do you have a timeline? Are there other stakeholders?"
5. (P) "Are you familiar with the subscription document process? Do you have legal/tax counsel who will review?"
6. (I) "What's driving your interest in this type of investment right now? What problem are you trying to solve?"
7. (C) "Is there anyone else in your network who has invested in similar opportunities and encouraged you?"
8. (C-Competition) "What other investment opportunities are you currently evaluating?"

### AI-Powered MEDDPICC Scoring from Call Transcripts

The IR Intelligence Layer can auto-score MEDDPICC from call transcripts using this pattern:

```typescript
// Prompt template for Claude API (adapted from momentum.io proven template)
const MEDDPICC_SCORING_PROMPT = `
You are a sales deal qualification analyst using the MEDDPICC framework.
Analyze the following call transcript between a Sunrise Capital Investors
representative and a potential investor.

For each MEDDPICC dimension, provide:
1. A score from 0-4:
   0 = Not addressed at all
   1 = Briefly mentioned but not explored
   2 = Discussed at a general level
   3 = Well-discussed with specific details
   4 = Thoroughly validated with evidence/commitment

2. A 1-2 sentence summary of what was discussed (or "Not addressed" if score is 0)

3. A suggested follow-up question for the next call

Context:
- This is for a passive real estate investment (manufactured housing communities)
- Typical minimum investment: $50,000-$100,000
- Key investor concerns: returns, tax benefits, liquidity, track record
- "Paper Process" in this context = subscription documents, accreditation verification, wire transfer

TRANSCRIPT:
{transcript}

Respond in this exact JSON format:
{
  "metrics": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "economic_buyer": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "decision_criteria": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "decision_process": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "paper_process": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "identify_pain": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "champion": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "competition": { "score": 0-4, "summary": "...", "follow_up": "..." },
  "total_score": 0-32,
  "overall_assessment": "One paragraph deal health summary",
  "top_gaps": ["Dimension with lowest score", "Second lowest"]
}
`;
```

### Required Deal Properties by Pipeline Stage (MEDDPICC-Enforced)

| Stage | Must Have Score >= 1 | Blocks Progression If Missing |
|---|---|---|
| New Lead | None | None |
| Qualifying | I (Identify Pain) | Pain must be articulated |
| Meeting Scheduled | M (Metrics), E (Economic Buyer) | Must know goals and decision-maker |
| Proposal Sent | D (Decision Criteria), D (Decision Process) | Must understand evaluation framework |
| Contract/Sub Doc | P (Paper Process) | Must have clear path to close |
| Closed Won | All dimensions scored | Full qualification record |

---

## Decision Trees

### 1. ASPR Replacement Analysis

```
Q: Does ASPR provide value beyond native HubSpot + IR Intelligence Layer?

HubSpot Native (free with Sales Enterprise):
  [x] Phone call transcription (90K+ calls)
  [x] AI call summaries (hs_call_summary)
  [x] Conversation Intelligence analytics
  [ ] Video meeting transcription -> NEED: Enable Meeting Notetaker

IR Intelligence Layer (custom build, ~$10-12K year 1):
  [x] Pre-call research briefs
  [x] Pipeline-stage intelligence
  [x] Windfall data surfacing
  [ ] MEDDPICC scoring from transcripts -> CAN BUILD (~$20-50/mo Claude API)
  [ ] Deal recaps/narratives -> CAN BUILD

ASPR ($36K/year) unique value:
  [?] MEDDPICC coaching methodology (Sandler overlay?)
  [?] "Resident Knowledge" repo
  [?] Meeting recording bot -> REPLICATED by Meeting Notetaker
  [?] 11-category coaching scoring -> EVALUATE during trial

DECISION:
  IF Meeting Notetaker can be activated
    AND MEDDPICC scoring built into IR Intelligence Layer
    AND coaching value is minimal during trial
  THEN cancel ASPR, save $36K/year
  ELSE keep ASPR for coaching value only
```

### 2. New Integration: API vs. Marketplace App vs. Operations Hub

```
Q: How should we integrate a new data source with HubSpot?

Is there a marketplace app?
  YES -> Does it do what you need?
    YES -> Use marketplace app (lowest effort)
    NO  -> Continue to API
  NO  -> Continue to API

Is it a two-way sync of standard properties?
  YES -> Operations Hub Data Sync (if available for that app)
  NO  -> Continue to API

Does the integration need to:
  - Process data externally? (AI, enrichment, transformation) -> Custom API (CF Worker)
  - Simply read/write HubSpot data? -> Custom API (direct HubSpot API)
  - Run logic within HubSpot? -> Operations Hub Custom Coded Action
  - React to HubSpot events? -> Webhook subscription + external handler
```

### 3. Automation: Workflow vs. Sequence vs. Playbook

```
Q: Which automation tool for this use case?

Is it 1-to-1 sales outreach cadence?
  YES -> Sequence (emails from rep's inbox, auto-unenroll on reply)

Is it a guided conversation script / checklist?
  YES -> Playbook (interactive questions, answers saved to CRM)

Is it triggered by a CRM event and runs in background?
  YES -> Workflow
    Does it need external API calls?
      YES -> Workflow webhook action -> CF Worker
      NO  -> Does it need custom logic?
        YES -> Operations Hub custom coded action
        NO  -> Standard workflow actions
```

### 4. Reporting: Standard vs. Custom vs. API

```
Q: How to get this data?

Is it a standard sales metric (pipeline, forecast, activity)?
  YES -> Standard report / pre-built dashboard

Does it combine data from multiple objects?
  YES -> Custom report builder (cross-object report)

Does it need calculations not available in UI?
  YES -> Custom calculated property + report on it
        OR API export -> external analysis

Does it need to power an external dashboard?
  YES -> API export -> Cloudflare Pages dashboard
        OR scheduled custom report email

Does it need real-time updates?
  YES -> Webhook subscriptions -> push to external dashboard
  NO  -> Scheduled API pull (cron job)
```

---

## Common Gotchas

### API Gotchas

1. **10,000 search result limit:** Hard cap on Search API. No workaround from HubSpot side. Use date-range windowing to partition queries.

2. **Property name confusion:** API property names are internal names (e.g., `hs_call_summary`), not display labels. Always verify via Properties API.

3. **Text field limits:** Single-line and multi-line text both cap at 65,536 characters via CRM (unlimited via forms). Guard your output when writing AI-generated content.
   ```typescript
   function guardOutput(text: string, maxLength = 65000): string {
     if (text.length <= maxLength) return text;
     return text.substring(0, maxLength - 50) + '\n\n[TRUNCATED - Full content in linked note]';
   }
   ```

4. **Timestamp format:** HubSpot uses millisecond Unix timestamps for most datetime properties. But `hs_timestamp` on engagements accepts ISO 8601 strings.

5. **Enumeration values:** When setting dropdown/checkbox properties via API, use the internal `value`, not the display `label`. Verify via Properties API.

6. **Batch update by email:** Batch update endpoints require HubSpot internal `id`, not `email`. Use batch upsert with `idProperty: "email"` if you only have emails.

7. **Association type IDs:** Must use numeric type IDs (not string names) in v4 API. Retrieve them via `GET /crm/v4/associations/{from}/{to}/labels`.

8. **Rate limiting on batch:** Some batch endpoints are limited to 10 records per request during high-volume operations. Start with 100, reduce if you get 429s.

9. **Deal stage internal IDs:** Pipeline stage names are NOT the API values. Use the Pipelines API to get internal stage IDs: `GET /crm/v3/pipelines/deals/{pipelineId}/stages`.

10. **Webhook signature validation:** Use v3 signature format: `SHA-256(clientSecret + method + URL + body)`. Missing this = unauthenticated webhook = security vulnerability.

### Configuration Gotchas

1. **Meeting Notetaker visibility:** May not appear in Settings even with Enterprise seat. Contact HubSpot CSM if the settings tab is missing.

2. **Zoom recording sync:** Must be enabled PER USER, not account-wide. Each user must check "Sync recordings and transcripts" in their integration settings.

3. **Sequence daily limits:** Based on rolling 24-hour window, NOT calendar day. Hitting limits at 4pm means they don't reset until 4pm next day.

4. **Predictive scoring data requirements:** Needs 100+ closed-won + 1,000+ non-customers. If your portal is new or deal volume is low, predictive scoring won't activate.

5. **Custom object limits:** Enterprise allows up to 10 custom objects. Plan your data model carefully -- don't create objects that could be properties or associations.

6. **Workflow enrollment caps:** Contacts can only be enrolled in a workflow once (unless re-enrollment is explicitly enabled). For recurring processes, enable re-enrollment with appropriate conditions.

7. **Pipeline changes reset stage:** Moving a deal from one pipeline to another resets its stage to the first stage of the target pipeline. Data in stage-specific properties is preserved but stage history is not.

### Data Quality Gotchas (Sunrise-Specific)

1. **Windfall `wf_net_worth` is a string:** Even though it contains numbers, it's stored as a string property ("14300000"). Parse numerically for comparisons.

2. **`wf_money_in_motion` is broken:** Only 6 of 15,612 enriched contacts have this flag. Do not rely on it as a signal.

3. **`wf_accredited_investor` is NOT a legal determination:** It's a Windfall data signal based on public records and modeling. Do not treat as formal SEC accreditation verification.

4. **39 liquidity trigger contacts never contacted:** High-value gap identified in Feb 2026 analysis. These are Tier A/B prospects being missed.

5. **ASPR property names unknown until Phase 2:** ASPR creates its own HubSpot properties (MEDDPICC scores, deal recaps, etc.) but the exact property names won't be known until the CRM sync completes (~Mar 6, 2026). Re-query Properties API after ASPR Phase 2.

---

## Procedures

### 1. Enable Meeting Notetaker

**Prerequisites:** Sales Enterprise seat, Super Admin access

**Steps:**
1. Verify call recording is enabled:
   Settings -> Tools -> Calling -> Call Setup -> Enable "Call recording" and "Transcription and analysis"

2. Navigate to Meeting Notetaker settings:
   - Try: Settings -> Tools -> Meetings -> Meeting Notetaker
   - Direct URL: `https://app.hubspot.com/settings/{portalId}/meetings/notetaker`
   - Alternative: Settings -> Tools -> Calling -> Transcription

3. If Meeting Notetaker tab is NOT visible:
   - Contact HubSpot CSM or support
   - Request: "Please enable Breeze AI Meeting Notetaker for portal {portalId}"
   - Reference: Sales Hub Enterprise tier, feature should be included

4. Once visible, toggle ON for account

5. Each user must:
   - Have connected calendar (Settings -> General -> Calendar)
   - Optionally opt out individually if desired

6. Test with one Zoom meeting:
   - Schedule meeting with external contact (must have different email domain)
   - Meeting Notetaker bot should auto-join
   - After meeting: verify Call record created with transcript + summary

7. Verify via API:
   ```bash
   curl -H "Authorization: Bearer $TOKEN" \
     "https://api.hubapi.com/crm/v3/objects/calls/search" \
     -d '{"filterGroups":[{"filters":[{"propertyName":"hs_call_source","operator":"EQ","value":"ZOOM"}]}],"limit":5}'
   ```

### 2. Set Up Lead Scoring for Investors

**Prerequisites:** Decide between manual vs. predictive (or hybrid)

**Manual scoring setup:**
1. Settings -> Properties -> Contact properties
2. Search for `hubspot_score` (or create custom `ir_lead_score`)
3. Click "Add criteria"
4. Add positive attributes:
   - `wf_accredited_investor` = true -> +20 points
   - `wf_net_worth` > 10000000 -> +15 points
   - `wf_net_worth` > 25000000 -> +25 points (additional)
   - `wf_multi_property_owner` = true -> +5 points
   - `wf_trust` = true -> +5 points
   - Last engagement < 30 days -> +10 points
   - Has associated deal -> +10 points
5. Add negative attributes:
   - Email hard bounced -> -20 points
   - No engagement in 90 days -> -15 points
   - Unsubscribed -> -25 points
6. Save and verify scores update on sample contacts

**Predictive scoring activation:**
1. Requires 100+ closed-won deals + 1,000+ non-customer contacts
2. Settings -> Properties -> `hs_predictive_scoring_tier`
3. HubSpot auto-trains the model (no manual configuration needed)
4. Results appear on contact records within 24-48 hours of activation

### 3. Create Custom Deal Pipeline

```typescript
// API approach for creating a new pipeline
const response = await fetch('https://api.hubapi.com/crm/v3/pipelines/deals', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    label: 'Fund 5 Investor Pipeline',
    displayOrder: 3,
    stages: [
      { label: 'New Lead', displayOrder: 0, metadata: { probability: '0.1' } },
      { label: 'Qualifying', displayOrder: 1, metadata: { probability: '0.2' } },
      { label: 'Meeting Scheduled', displayOrder: 2, metadata: { probability: '0.3' } },
      { label: 'Proposal Sent', displayOrder: 3, metadata: { probability: '0.5' } },
      { label: 'Subscription Documents', displayOrder: 4, metadata: { probability: '0.8' } },
      { label: 'Funded', displayOrder: 5, metadata: { probability: '1.0' } },
      { label: 'Closed Lost', displayOrder: 6, metadata: { probability: '0.0' } }
    ]
  })
});
```

### 4. Build Pre-Call Brief Workflow

**Architecture:**
```
Trigger: Meeting scheduled with CRM contact
  -> Delay: 1 hour before meeting
  -> Webhook: POST to ir-intelligence.suncom.work/api/research
     Body: { contactId, dealId, stage: "active_deal" }
  -> Worker: Pull Windfall + deal + last 5 call summaries
  -> Worker: Generate brief via Claude API
  -> Worker: Write brief to contact's ir_research_brief property
  -> Worker: Create task for owner: "Review pre-call brief"
  -> Worker: Send Slack DM to owner with brief summary
```

**HubSpot workflow configuration:**
1. Create workflow: Contact-based, enrollment trigger = "Meeting activity: Meeting is upcoming"
2. Add delay: "Delay for set amount of time" = 1 hour (or configure based on prep time)
3. Add action: "Send webhook" with POST to worker endpoint
4. No further HubSpot actions needed (worker handles the rest via API)

### 5. Configure Windfall Integration

**Note:** Windfall integration is already active in the Sunrise portal. This procedure is for reference/troubleshooting.

1. HubSpot Marketplace -> Search "Windfall"
2. Install Windfall app
3. Authenticate with Windfall credentials
4. Configure field mapping:
   - Windfall fields auto-create in `windfall` property group
   - All properties prefixed with `wf_`
5. Set sync frequency (typically daily)
6. Verify: Check a known contact for `wf_net_worth` population

**Monitoring:**
```bash
# Count enriched contacts
curl -H "Authorization: Bearer $TOKEN" \
  "https://api.hubapi.com/crm/v3/objects/contacts/search" \
  -d '{"filterGroups":[{"filters":[{"propertyName":"wf_net_worth","operator":"HAS_PROPERTY"}]}],"limit":1}' \
  | jq '.total'
```

### 6. API Authentication Setup (Private App)

1. Settings -> Integrations -> Private Apps
2. Click "Create a private app"
3. Name: "IR Intelligence Layer" (or descriptive name)
4. Scopes (minimum for IR Intelligence Layer):
   - `crm.objects.contacts.read`
   - `crm.objects.contacts.write`
   - `crm.objects.deals.read`
   - `crm.objects.deals.write`
   - `crm.objects.owners.read`
   - `crm.schemas.contacts.read`
   - `crm.schemas.deals.read`
   - `sales-email-read`
   - `e-commerce` (if needed for pipeline access)
5. Click "Create app"
6. Copy the access token (shown only once -- save securely)
7. Store in `.env` file:
   ```
   HUBSPOT_TOKEN=pat-na1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
   ```
8. Test:
   ```bash
   curl -H "Authorization: Bearer $HUBSPOT_TOKEN" \
     "https://api.hubapi.com/crm/v3/objects/contacts?limit=1"
   ```

### 7. Bulk Data Export

**For datasets under 10,000 records:**
```typescript
// Use Search API with pagination
const allDeals = await searchAllRecords('deals', {
  filterGroups: [{
    filters: [{
      propertyName: 'pipeline',
      operator: 'EQ',
      value: '134921120'  // Main Sales Pipeline
    }]
  }],
  properties: ['dealname', 'amount', 'dealstage', 'hubspot_owner_id', 'createdate']
});
```

**For datasets over 10,000 records:**
```typescript
// Use date-range windowing (see Pagination section above)
// Or use the CRM export API:
POST /crm/v3/exports/export/async
{
  "exportType": "VIEW",
  "format": "CSV",
  "exportName": "All Contacts Export",
  "objectType": "CONTACT",
  "objectProperties": ["email", "firstname", "lastname", "wf_net_worth"],
  "language": "EN"
}
// Poll for completion, then download the file
```

**Alternative:** Use HubSpot's UI export (CRM -> Contacts -> Export) for one-time pulls. Supports CSV and XLSX.

---

## References

### Official Documentation
- **HubSpot API Reference:** https://developers.hubspot.com/docs/api-reference/overview
- **CRM Search API Guide:** https://developers.hubspot.com/docs/api-reference/search/guide
- **Associations v4 API:** https://developers.hubspot.com/docs/api-reference/crm-associations-v4/guide
- **Webhooks API:** https://developers.hubspot.com/docs/api-reference/webhooks-webhooks-v3/guide
- **Custom Events API:** https://developers.hubspot.com/docs/api-reference/events-manage-event-definitions-v3/guide
- **Properties Documentation:** https://knowledge.hubspot.com/properties/property-field-types-in-hubspot
- **Custom Objects Guide:** https://developers.hubspot.com/docs/api-reference/crm-custom-objects-v3/guide
- **API Usage & Rate Limits:** https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines

### Breeze AI & Features
- **Breeze Overview:** https://www.hubspot.com/products/artificial-intelligence
- **Breeze Copilot/Assistant:** https://knowledge.hubspot.com/ai/use-breeze-assistant
- **Meeting Notetaker Setup:** https://knowledge.hubspot.com/meetings-tool/record-and-take-notes-in-meetings-with-meeting-notetaker
- **Breeze Intelligence:** https://knowledge.hubspot.com/ai-tools/get-started-using-breeze-intelligence
- **Breeze Agents:** https://www.hubspot.com/products/artificial-intelligence/breeze-ai-agents
- **Prospecting Agent:** https://knowledge.hubspot.com/prospecting/use-the-prospecting-agent

### Sales Hub
- **Sales Hub Pricing:** https://www.hubspot.com/pricing/sales?tier=enterprise
- **Playbooks:** https://knowledge.hubspot.com/playbooks/use-playbooks
- **Sequences:** https://knowledge.hubspot.com/sequences/create-and-edit-sequences
- **Workflows:** https://knowledge.hubspot.com/workflows/create-workflows
- **Forecasting:** https://knowledge.hubspot.com/forecast/set-up-the-forecast-tool
- **Lead Scoring:** https://knowledge.hubspot.com/properties/determine-likelihood-to-close-with-predictive-lead-scoring
- **Call Recording & Transcripts:** https://knowledge.hubspot.com/calling/review-call-recordings-and-transcripts

### Integrations
- **Zoom Integration:** https://knowledge.hubspot.com/integrations/use-hubspots-integration-with-zoom
- **Slack Integration:** https://knowledge.hubspot.com/integrations/how-do-i-use-the-slack-integration
- **Google Calendar Sync:** https://knowledge.hubspot.com/integrations/use-hubspots-integration-with-google-calendar-or-outlook-calendar
- **Google Contacts:** https://knowledge.hubspot.com/integrations/connect-hubspot-and-google-contacts
- **Custom Coded Actions:** https://developers.hubspot.com/docs/api-reference/automation-actions-v4-v4/custom-code-actions

### MEDDPICC Resources
- **MEDDPICC Call Review Prompt Template:** https://www.momentum.io/prompts/meddpicc-call-review-prompt
- **HubSpot Blog on MEDDPICC:** https://blog.hubspot.com/sales/meddpicc-methodology
- **MEDDPICC Score App (Marketplace):** https://ecosystem.hubspot.com/marketplace/apps/meddicc-score
- **Community: Implementing MEDDPICC in HubSpot:** https://community.hubspot.com/t5/CRM/Implementing-MEDDICC-in-Deal-Process/m-p/869520

### Node.js SDK
- **GitHub:** https://github.com/HubSpot/hubspot-api-nodejs
- **npm:** `@hubspot/api-client`
- **Usage:**
  ```typescript
  import { Client } from '@hubspot/api-client';
  const hubspotClient = new Client({ accessToken: process.env.HUBSPOT_TOKEN });

  // Get a contact
  const contact = await hubspotClient.crm.contacts.basicApi.getById(
    '12345',
    ['email', 'firstname', 'wf_net_worth']
  );

  // Search deals
  const searchResult = await hubspotClient.crm.deals.searchApi.doSearch({
    filterGroups: [{
      filters: [{
        propertyName: 'pipeline',
        operator: 'EQ',
        value: '134921120'
      }]
    }],
    properties: ['dealname', 'amount', 'dealstage'],
    limit: 100
  });
  ```

### Sunrise-Specific Files
- **IR Intelligence Layer MEMORY:** `/Investor Relations/IR_Intelligence_Layer/MEMORY.md`
- **HubSpot API Baseline Report:** `/Investor Relations/IR_Intelligence_Layer/docs/hubspot-baseline-2026-02-24.md`
- **IR Intelligence Design Doc:** `/Investor Relations/IR_Intelligence_Layer/docs/plans/2026-02-24-hubspot-ir-intelligence-design.md`
- **Implementation Plan:** `/Investor Relations/IR_Intelligence_Layer/docs/plans/2026-02-25-ir-intelligence-implementation.md`
- **Auditor Findings:** `/Investor Relations/IR_Intelligence_Layer/docs/AUDITOR_FINDINGS_CONSOLIDATED.md`
- **Risk Assessment:** `/Investor Relations/IR_Intelligence_Layer/docs/IR_INTELLIGENCE_RISK_ASSESSMENT.md`
- **ASPR Recon Checklist:** `/Investor Relations/IR_Intelligence_Layer/ASPR_RECON_CHECKLIST.md`
- **Liquidity Trigger Hit List:** `/Investor Relations/Investor Intelligence Briefs/LIQUIDITY_TRIGGER_HIT_LIST.md`
- **Worker Scaffold:** `/Investor Relations/IR_Intelligence_Layer/worker/`
