# Crm Operations

> CRM setup, pipeline automation, lead routing/scoring, forecasting, data hygiene, and compliance for HubSpot, Salesforce, and Pipedrive — with platform-specific recipes. Use when configuring properties/objects, building workflows/Flows, calibrating lead scoring, designing assignment rules, or fixing CRM data governance.

- **Type:** Skill
- **Install:** `agentstack add skill-san-npm-skills-ws-crm-operations`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [san-npm](https://agentstack.voostack.com/s/san-npm)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [san-npm](https://github.com/san-npm)
- **Source:** https://github.com/san-npm/skills-ws/tree/main/skills/crm-operations
- **Website:** https://skills-ws.vercel.app

## Install

```sh
agentstack add skill-san-npm-skills-ws-crm-operations
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# CRM Operations

Operational playbook for configuring and maintaining a B2B CRM. The generic patterns below are followed by platform-specific recipes for **HubSpot**, **Salesforce**, and **Pipedrive**. For the revenue *metrics* layer (ARR/NRR, funnel conversion, pipeline coverage, board reporting) that sits on top of this data, see the sibling **`revenue-operations`** skill — this skill owns the CRM configuration; that one owns the analysis.

## Workflow

### 1. Property Architecture

**Core contact properties:**

| Property | Type | Purpose |
|----------|------|---------|
| lifecycle_stage | Dropdown | Subscriber → Lead → MQL → SQL → Opportunity → Customer |
| lead_source | Dropdown | How they found you (organic, paid, referral, outbound) |
| lead_score | Number | Calculated engagement + fit score |
| assigned_owner | User | Current owner for routing |
| last_engaged | Date | Last meaningful interaction |
| icp_fit | Dropdown | Strong, moderate, weak |

**Core company properties:**

| Property | Type | Purpose |
|----------|------|---------|
| industry | Dropdown | Vertical classification |
| employee_count | Number | Size segmentation |
| arr_potential | Currency | Estimated deal value |
| tech_stack | Multi-select | Integration opportunities |
| decision_stage | Dropdown | Awareness, consideration, decision |

**Naming convention (platform-aware — do NOT blindly apply `snake_case` everywhere):**

| Layer | HubSpot | Salesforce | Pipedrive |
|-------|---------|-----------|-----------|
| User-facing label | Title Case ("Lead Source") | Title Case ("Lead Source") | Title Case |
| Internal/API name | auto-generated `lead_source` (snake_case) — set deliberately, it is **immutable** after creation | API name `Lead_Source__c` (auto-suffixed `__c`, PascalCase-ish, **immutable**) | `key` is a hash, not human-readable |
| Custom prefix | prefix by category: `billing_`, `product_`, `marketing_` | use a **namespace** in managed packages; otherwise group via a category prefix in the label | tag fields with a label prefix |

Rules: pick the API/internal name once — it is permanent in HubSpot and Salesforce and renaming requires re-mapping every integration. Keep labels human-readable Title Case for reps; reserve `snake_case` for HubSpot internal names and integration payload keys only. Never put a unit or example value in a field name (`revenue_usd` is fine; `revenue_50k` is not).

### 2. Pipeline Design

**SaaS sales pipeline:**

| Stage | Definition | Exit criteria | Win probability |
|-------|-----------|---------------|----------------|
| New | Lead qualified, first meeting booked | Discovery call completed | 10% |
| Discovery | Pain and fit confirmed | Champion identified, budget discussed | 20% |
| Demo | Product demonstrated | Technical validation passed | 40% |
| Proposal | Pricing/terms shared | Verbal agreement on terms | 60% |
| Negotiation | Contract in legal review | Redlines resolved | 80% |
| Closed Won | Contract signed | Payment received or PO issued | 100% |
| Closed Lost | Deal dead | Loss reason documented | 0% |

**Required fields per stage transition:**
- New → Discovery: `pain_point`, `budget_range`, `timeline`
- Discovery → Demo: `champion_name`, `decision_maker`, `competitor`
- Demo → Proposal: `technical_validated = true`
- Proposal → Negotiation: `proposal_sent_date`, `contract_value`
- Any → Closed Lost: `loss_reason` (required, dropdown)

### 3. Lead Scoring

**Two-axis scoring: Fit (demographic) + Engagement (behavioral)**

**Fit scoring (0-50 points):**

| Signal | Points | Rationale |
|--------|--------|-----------|
| ICP industry match | +15 | Right vertical |
| Company size 50-500 | +10 | Sweet spot segment |
| Decision-maker title | +10 | VP+ or C-level |
| Target geography | +5 | In serviceable market |
| Uses complementary tools | +5 | Integration potential |
| Company size  Modern alternative: HubSpot **predictive (AI) scoring** and Salesforce **Einstein Lead Scoring** fit a model on your closed data instead of hand-tuned points. Use them when you have ≥ ~1,000 scored leads with enough won/lost outcomes; keep a transparent manual model as a fallback and for explainability. Validate any AI score against the same backtest before letting it auto-route.

### 4. Lead Routing

**Round-robin with rules** (`MQL_THRESHOLD` is your calibrated value from §3, not a literal 70):
```
IF lead_score >= MQL_THRESHOLD AND arr_potential >= ENT_CUTOFF:
  → Route to enterprise AE (named-account match first, else round-robin within ENT pod)
ELIF lead_score >= MQL_THRESHOLD AND arr_potential  lead_score >= NURTURE_FLOOR:
  → Route to SDR for qualification
ELSE:
  → Nurture automation (no human assignment)
```
Always **territory/named-account match before round-robin** so existing-account leads land with the owning AE. Honor rep capacity and OOO so the timer doesn't start against an absent rep.

**Speed-to-lead SLA:** inbound demo requests should be worked fast — industry studies (InsideSales/Harvard Business Review) show contact within ~5 minutes dramatically lifts qualification odds vs. 30+ minutes. Set the first-touch SLA per motion (e.g., 5 min for demo requests, same-business-day for content leads). If unclaimed within 15 minutes, re-route to the next rep and alert the manager. Measure SLA attainment as a dashboard metric (§6), not just an aspiration.

### 5. Deal Forecasting

**Weighted pipeline method:**
```
Forecast = Σ (Deal value × Stage probability × Rep confidence adjustment)
```

| Forecast category | Definition |
|-------------------|-----------|
| Committed | 90%+ probability, verbal/written commitment |
| Best case | 50-89% probability, active engagement |
| Pipeline | 10-49% probability, early stage |
| Upside | Identified but not yet in pipeline |

**Monthly forecast review:** Compare forecast vs actual for last 3 months to calibrate rep-level accuracy.

### 6. Data Hygiene

**Weekly automated cleanup:**
- **De-duplicate carefully** (see the dedup rules below — email-only matching is unsafe).
- Flag (don't delete) contacts with no activity > 90 days for a re-engagement or sunset review.
- Validate email addresses on send and audit quarterly (hard-bounce rate > 2–3% hurts deliverability; suppress hard bounces immediately).
- Standardize company names with a normalization rule (strip `Inc`/`LLC`/`Ltd`/`GmbH`/`S.à r.l.` suffixes for matching, keep the legal name in a separate field).

**Retention & lifecycle — never silently archive or delete revenue history.** Closed-Lost and Closed-Won deals are the training data for forecasting, win/loss analysis, cohort/attribution, sales-cycle benchmarks, and legal/audit trails. Deleting or hard-archiving them at 12 months destroys that. Instead:

| Action | What it means / when |
|--------|----------------------|
| **Keep, don't delete** | Closed deals stay queryable indefinitely; reporting depends on them. Use a `record_status` or list-membership flag (`active` / `dormant`) to hide stale records from working views without removing them. |
| **Archive = reversible & out of working views only** | In HubSpot, *deleting* a record sends it to a 90-day-recoverable Recycle Bin (then it's gone) — that is not archiving. Use **Active vs Static lists** and view filters to declutter instead. Salesforce has no native soft-archive; use a `Record_Status__c` field + list-view filters, or Big Objects for cold storage you can still report on. Pipedrive's **Archive/Delete** on deals hides them from the pipeline but keeps them in reports/exports — prefer Archive over Delete. |
| **Compliance deletion (the only legitimate hard-delete)** | GDPR/CCPA *erasure* requests. Run a documented deletion workflow (below), log who/when/why, and accept the reporting loss as legally required. |

**Compliance & privacy (2026 baseline — confirm requirements with counsel/DPO for your jurisdiction):**
- **Consent & lawful basis:** store opt-in source, timestamp, and lawful basis on the contact. HubSpot has native subscription types + GDPR consent fields; Salesforce uses the **Individual** object + Consent Management; Pipedrive has Marketing-status consent fields. Don't email contacts whose consent you can't evidence.
- **Right to erasure / deletion request:** capture request → verify identity → suppress (add email to a permanent **suppression/Do-Not-Contact** list so re-imports don't resurrect them) → delete personal data within the legal window (GDPR target ~30 days). Retain a minimal anonymized record for audit and to honor the suppression. HubSpot has a built-in **GDPR Delete** (permanent, blocks re-creation); Salesforce requires a manual/scripted delete plus an Individual-level opt-out; Pipedrive supports per-person delete via UI/API.
- **Enrichment & data sourcing:** only enrich with a lawful basis; record the data source/provider on the record. After Clearbit folded into HubSpot as **Breeze Intelligence**, enrichment is native there; for Salesforce/Pipedrive verify your enrichment vendor's lawful-basis terms.
- **Call recording & email tracking:** call recording consent is jurisdiction-specific (many US states + EU require all-party or notified consent) — disclose and store consent. Open/click tracking pixels are increasingly defeated by Apple Mail Privacy Protection (opens are unreliable since 2021) and may require consent in the EU; treat opens as a weak signal and lean on clicks/replies/meetings.

**Dedup rules (email-only matching is unsafe):** people have multiple/shared emails (`info@`, `sales@`), and the same email can span subsidiaries, partners, or job changes.
- **Contacts:** match on a normalized primary email **first**; if no email or shared/role-based inbox, fall back to fuzzy `(first+last name) + company/domain` and queue for **human review rather than auto-merge**. Never auto-merge on name alone.
- **Companies/Accounts:** match on normalized **web domain** (most reliable), not company name; account for subsidiaries and franchises that share a parent domain.
- **Relationships:** preserve the account↔contact link on merge — losing it orphans activity history. Keep the oldest record as the master (or the one with the most engagement), and confirm field-survivorship (which value wins per field) before merging.
- **Platform tools:** HubSpot surfaces duplicate suggestions (Contacts/Companies) and merges keep both timelines; Salesforce uses **Duplicate Rules + Matching Rules** (and Potential Duplicates) — review before merge; Pipedrive has Merge duplicates with a side-by-side picker. Always require review for fuzzy matches.

**Data quality dashboard:**
- % contacts with complete required fields (by owner)
- % open deals with a `next_step` and a future `next_step_date`
- Duplicate contact / duplicate account rate
- Hard-bounce rate on email sends; % contacts with unknown consent status
- % contacts with a valid lifecycle stage (no nulls / no skipped stages)
- Stage **aging**: deals exceeding the expected days-in-stage (see §8 formulas)
- Speed-to-lead SLA attainment % and breach count

### 7. Automation Workflows

**Essential automations:**

| Trigger | Action |
|---------|--------|
| Form submission | Create contact, set lifecycle stage, enroll in sequence |
| Lead score crosses MQL threshold | Notify owner, create task, update lifecycle |
| Deal stage change | Update contact lifecycle, trigger next email |
| No activity 14 days on open deal | Alert owner, create follow-up task |
| Closed Won | Trigger onboarding sequence, notify CS team |
| Closed Lost | Enroll in re-engagement nurture (90 day delay) |

The generic triggers above map to concrete builders on each platform — recipes follow.

### 8. Operational Dashboards (formulas & report definitions)

Build these as saved reports/dashboards; the formulas are platform-agnostic, with the report type noted per platform.

| Metric | Formula / definition | HubSpot | Salesforce | Pipedrive |
|--------|----------------------|---------|-----------|-----------|
| Stage aging | `days_in_current_stage = TODAY − date_entered_current_stage`; flag if `> expected_days[stage]` | Deal report grouped by stage; use "Time in stage" property | Report on Opportunity with `Age` + stage-duration formula field; or Opportunity History | Pipeline view "rotten" flag + Deal duration report |
| Stale next step | `open_deal AND (next_step_date IS NULL OR next_step_date  sla_minutes)` | Workflow + custom property `time_to_first_touch` | Flow-stamped `First_Touch__c` time vs assignment time | Automation-stamped field + filter |

---

## Platform recipe: HubSpot

**Objects/terms:** Contacts, Companies, Deals (with **Deal stages** inside **Pipelines**), Tickets. Lifecycle is the **`lifecyclestage`** contact+company property (Subscriber→Lead→MQL→SQL→Opportunity→Customer→Evangelist). Lead handoff also uses **`hs_lead_status`**.

**Properties & limits (verify current limits at ; they vary by tier):**
- Create custom properties under Settings → Properties. Internal name is auto-`snake_case` and **immutable**; label is editable.
- Property/field and automation limits scale with tier (Starter/Pro/Enterprise) — don't hardcode a number, check your portal's limits page.
- Use **calculated properties** for `lead_score` components and `days_in_stage`.

**Lead scoring:** Settings → Properties → **HubSpot Score** (manual, positive/negative criteria) on Marketing Pro+; or **predictive/AI scoring** (Likelihood to Close, Buyer Intent) on Enterprise — fit on your closed data (see §3 calibration).

**Workflow recipe — MQL routing with speed-to-lead SLA:**
```
Workflow: "MQL → Route + SLA"
Enrollment trigger: lead_score >= MQL_THRESHOLD AND lifecyclestage is any of (Lead, MQL)
Actions:
  1. Set property: lifecyclestage = "marketingqualifiedlead"
  2. Branch on ICP / arr_potential:
       - Enterprise → Rotate record to owner (Enterprise AE team)
       - SMB        → Rotate record to owner (SMB AE team)
  3. Set property: hs_lead_status = "NEW"; stamp mql_timestamp = now
  4. Create task "Call within 5 min" assigned to deal/contact owner (due in 5 min)
  5. Send internal Slack/email notification to owner
  6. Delay 15 min → IF hs_lead_status still "NEW" (unworked):
        Rotate to next owner + notify manager   // SLA re-route
```
Use **Active lists** for dynamic segments (auto-update) and **Static lists** for point-in-time snapshots. Hide stale records from sales views with list filters rather than deleting.

**Privacy/AI:** native GDPR delete + subscription types; **Breeze Intelligence** (formerly Clearbit) for native enrichment, **Breeze Copilot/Agents** for AI assist — record enrichment source and respect consent.

---

## Platform recipe: Salesforce

**Object model:** **Lead** (pre-conversion) → on qualification, **Convert** to **Account + Contact (+ Opportunity)**. Opportunities have **Stages** (with `Probability` and a `Forecast Category`). This Lead→Account/Contact/Opportunity split is the biggest difference from HubSpot/Pipedrive — design around conversion, not a single lifecycle field.

**Fields & naming:** custom fields get an auto `__c` suffix and an **immutable API name**; labels are editable. Use **Record Types** + **Page Layouts** (or Dynamic Forms) to show the right fields per process/segment.

**Automation — Flow-first (2026).** Salesforce has **retired Workflow Rules and Process Builder**; build new automation in **Flow** (record-triggered for create/update, scheduled for time-based, screen flows for guided UI). Use **Validation Rules** for required-field-at-stage enforcement, and **Assignment Rules** (native Lead Assignment Rules) or a Flow for routing.

**Validation rule — block stage advance without required fields** (Opportunity, runs on save):
```
AND(
  ISPICKVAL(StageName, "Proposal"),
  OR( ISBLANK(Proposal_Sent_Date__c), Amount == 0 )
)
// Error: "Set Proposal Sent Date and Amount before moving to Proposal."
```
**Record-triggered Flow — MQL routing + SLA** (on Lead create/update):
```
Trigger: Lead, A record is created or updated

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [san-npm](https://github.com/san-npm)
- **Source:** [san-npm/skills-ws](https://github.com/san-npm/skills-ws)
- **License:** MIT
- **Homepage:** https://skills-ws.vercel.app

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-san-npm-skills-ws-crm-operations
- Seller: https://agentstack.voostack.com/s/san-npm
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
