Install
$ agentstack add skill-san-npm-skills-ws-crm-operations ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →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 | |----------|------|---------| | lifecyclestage | Dropdown | Subscriber → Lead → MQL → SQL → Opportunity → Customer | | leadsource | Dropdown | How they found you (organic, paid, referral, outbound) | | leadscore | Number | Calculated engagement + fit score | | assignedowner | User | Current owner for routing | | lastengaged | Date | Last meaningful interaction | | icpfit | Dropdown | Strong, moderate, weak |
Core company properties:
| Property | Type | Purpose | |----------|------|---------| | industry | Dropdown | Vertical classification | | employeecount | Number | Size segmentation | | arrpotential | Currency | Estimated deal value | | techstack | Multi-select | Integration opportunities | | decisionstage | 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/domainand 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_stepand a futurenext_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_caseand 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_scorecomponents anddays_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.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.