{"name":"hubspot-admin-skills","description":"Open-source Claude Code skills for auditing, cleaning, enriching, segmenting, and automating HubSpot CRM.","repository":"https://github.com/TomGranot/hubspot-admin-skills","license":"MIT","install":{"marketplace_add":"/plugin marketplace add tomgranot/hubspot-admin-skills","plugin_install":"/plugin install hubspot-admin@hubspot-admin-skills"},"requirements":{"hubspot":"Private app token (HUBSPOT_ACCESS_TOKEN in .env) with CRM scopes; Marketing Professional+ for workflow skills","python":"Python 3.10+ with uv, for scripted skills"},"endpoints":{"llms_txt":"https://hubspot.granot.io/llms.txt","llms_full_txt":"https://hubspot.granot.io/llms-full.txt","skill_markdown":"https://hubspot.granot.io/skills/%7Bslug%7D.md","skill_script":"https://hubspot.granot.io/skills/%7Bslug%7D/scripts/%7Bstage%7D.py"},"count":37,"skills":[{"slug":"audit-api-usage","name":"Audit API Usage Before the 2027 Version Cutoff","command":"/audit-api-usage","description":"Inventory the integrations, private apps, and internal tooling that call HubSpot APIs, and flag anything on legacy v1-v4 endpoints ahead of HubSpot's March 30, 2027 end of support. Produces a migration checklist to date-based API versions.","category":"audit-planning","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/audit-api-usage","markdown":"https://hubspot.granot.io/skills/audit-api-usage.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/audit-api-usage"},"solves":[{"title":"HubSpot is retiring v1–v4 APIs — is our stack ready for March 2027?","url":"https://hubspot.granot.io/problems/hubspot-api-versions-2027-deadline"}]},{"slug":"connect-hubspot-mcp","name":"Connect Claude Code to HubSpot via MCP","command":"/connect-hubspot-mcp","description":"Connect Claude Code to HubSpot's official remote MCP server for natural-language CRM reads and writes. Covers OAuth setup, scope selection, verification, and when to use MCP versus this repo's API scripts.","category":"audit-planning","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/connect-hubspot-mcp","markdown":"https://hubspot.granot.io/skills/connect-hubspot-mcp.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/connect-hubspot-mcp"},"solves":[]},{"slug":"hubspot-audit","name":"HubSpot CRM Database Audit","command":"/hubspot-audit","description":"Run a comprehensive HubSpot CRM database audit. Analyzes contacts, companies, deals, engagement, data quality, and deliverability. Use when starting a CRM cleanup, onboarding a new client, or performing quarterly health checks.","category":"audit-planning","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"audit_portal.py","url":"https://hubspot.granot.io/skills/hubspot-audit/scripts/audit_portal.py"}],"urls":{"html":"https://hubspot.granot.io/skills/hubspot-audit","markdown":"https://hubspot.granot.io/skills/hubspot-audit.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/hubspot-audit"},"solves":[{"title":"Our HubSpot portal is a mess and we do not know where to start","url":"https://hubspot.granot.io/problems/hubspot-audit-where-to-start"}]},{"slug":"hubspot-implementation-plan","name":"HubSpot Implementation Plan Generator","command":"/hubspot-implementation-plan","description":"Generate a phased implementation plan from a HubSpot audit report. Creates prioritized, sequenced cleanup processes with effort estimates, dependencies, and automation feasibility. Use after running /hubspot-audit.","category":"audit-planning","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/hubspot-implementation-plan","markdown":"https://hubspot.granot.io/skills/hubspot-implementation-plan.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/hubspot-implementation-plan"},"solves":[]},{"slug":"sandbox-self-test","name":"Sandbox Self-Test","command":"/sandbox-self-test","description":"Verify the entire toolkit against a disposable HubSpot developer test account or sandbox that you bring: seed synthetic fixtures, run every scripted skill's read path, exercise end-to-end and API round-trip cases, produce a graded report, and tear everything down. Hard-refuses to run against production.","category":"audit-planning","version":"1.0","license":"MIT","scripted":true,"scripts":[{"path":"preflight.py","url":"https://hubspot.granot.io/skills/sandbox-self-test/scripts/preflight.py"},{"path":"run_suite.py","url":"https://hubspot.granot.io/skills/sandbox-self-test/scripts/run_suite.py"},{"path":"seed.py","url":"https://hubspot.granot.io/skills/sandbox-self-test/scripts/seed.py"},{"path":"teardown.py","url":"https://hubspot.granot.io/skills/sandbox-self-test/scripts/teardown.py"}],"urls":{"html":"https://hubspot.granot.io/skills/sandbox-self-test","markdown":"https://hubspot.granot.io/skills/sandbox-self-test.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/sandbox-self-test"},"solves":[{"title":"How do we test CRM automation without risking production data?","url":"https://hubspot.granot.io/problems/hubspot-test-changes-without-production-risk"}]},{"slug":"delete-no-email-contacts","name":"Delete Contacts With No Email Address","command":"/delete-no-email-contacts","description":"Delete contacts with no email address from a HubSpot CRM instance. These contacts cannot receive any communication and inflate billing. Fully automated via the HubSpot CRM Search and Batch Archive APIs.","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/delete-no-email-contacts/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/delete-no-email-contacts/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/delete-no-email-contacts/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/delete-no-email-contacts","markdown":"https://hubspot.granot.io/skills/delete-no-email-contacts.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/delete-no-email-contacts"},"solves":[{"title":"HubSpot is full of contacts with no email address","url":"https://hubspot.granot.io/problems/hubspot-contacts-without-email"}]},{"slug":"merge-duplicate-companies","name":"Merge Duplicate Companies","command":"/merge-duplicate-companies","description":"Identify duplicate company records by domain and name, export audit CSVs for review, and guide merging. API for discovery, third-party tools or manual UI for merging (HubSpot has no bulk merge API).","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"before.py","url":"https://hubspot.granot.io/skills/merge-duplicate-companies/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/merge-duplicate-companies","markdown":"https://hubspot.granot.io/skills/merge-duplicate-companies.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/merge-duplicate-companies"},"solves":[{"title":"Duplicate company records are splitting our account data","url":"https://hubspot.granot.io/problems/hubspot-duplicate-companies"}]},{"slug":"reassign-deactivated-owners","name":"Reassign Contacts From Deactivated Owners","command":"/reassign-deactivated-owners","description":"Reassign contacts and companies from deactivated team members to active owners. Fully automated via the HubSpot Owners API and Batch Update API. Includes territory analysis for informed reassignment decisions.","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/reassign-deactivated-owners/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/reassign-deactivated-owners/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/reassign-deactivated-owners/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/reassign-deactivated-owners","markdown":"https://hubspot.granot.io/skills/reassign-deactivated-owners.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/reassign-deactivated-owners"},"solves":[{"title":"Contacts and deals are owned by people who left the company","url":"https://hubspot.granot.io/problems/hubspot-contacts-owned-by-deactivated-users"}]},{"slug":"suppress-ghost-contacts","name":"Suppress Ghost Contacts (Delivered, Never Opened)","command":"/suppress-ghost-contacts","description":"Identify and suppress ghost contacts who received marketing emails but never opened any. These contacts destroy sender reputation and deliverability. Hybrid approach: API for discovery, manual UI for suppression.","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/suppress-ghost-contacts/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/suppress-ghost-contacts/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/suppress-ghost-contacts","markdown":"https://hubspot.granot.io/skills/suppress-ghost-contacts.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/suppress-ghost-contacts"},"solves":[{"title":"Thousands of contacts have never opened, clicked, or visited","url":"https://hubspot.granot.io/problems/hubspot-ghost-contacts-never-engaged"}]},{"slug":"suppress-global-unsubscribes","name":"Suppress Globally Unsubscribed Contacts","command":"/suppress-global-unsubscribes","description":"Identify and suppress globally unsubscribed contacts to ensure legal compliance and reduce billing. Hybrid approach: API for discovery and audit, manual UI for suppression (hs_marketable_status is read-only).","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/suppress-global-unsubscribes/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/suppress-global-unsubscribes/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/suppress-global-unsubscribes","markdown":"https://hubspot.granot.io/skills/suppress-global-unsubscribes.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/suppress-global-unsubscribes"},"solves":[{"title":"Globally unsubscribed contacts still count as marketing contacts","url":"https://hubspot.granot.io/problems/hubspot-still-emailing-unsubscribed-contacts"}]},{"slug":"suppress-hard-bounced","name":"Suppress Hard-Bounced Contacts","command":"/suppress-hard-bounced","description":"Identify and suppress hard-bounced contacts to protect email sender reputation. Hybrid approach: API for discovery and audit, manual UI for suppression (hs_marketable_status is read-only via API).","category":"database-hygiene","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/suppress-hard-bounced/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/suppress-hard-bounced/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/suppress-hard-bounced","markdown":"https://hubspot.granot.io/skills/suppress-hard-bounced.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/suppress-hard-bounced"},"solves":[{"title":"Hard-bounced contacts are wrecking our email deliverability","url":"https://hubspot.granot.io/problems/hubspot-hard-bounces-hurting-deliverability"}]},{"slug":"assign-unowned-contacts","name":"Assign Unowned Marketing Contacts","command":"/assign-unowned-contacts","description":"Assign an owner to marketing contacts that have no owner. Ensures every marketable contact has accountability for follow-up, proper lead routing, and accurate owner-based reporting.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/assign-unowned-contacts/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/assign-unowned-contacts/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/assign-unowned-contacts/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/assign-unowned-contacts","markdown":"https://hubspot.granot.io/skills/assign-unowned-contacts.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/assign-unowned-contacts"},"solves":[]},{"slug":"enrich-company-name","name":"Enrich Contact Company Name from Associated Company","command":"/enrich-company-name","description":"Populate missing contact company name fields from associated company records using a HubSpot workflow with optional API backfill. Ensures contacts inherit their company name for segmentation, personalization, and ICP classification.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/enrich-company-name/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/enrich-company-name/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/enrich-company-name","markdown":"https://hubspot.granot.io/skills/enrich-company-name.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/enrich-company-name"},"solves":[{"title":"Contacts are missing company names their company records already have","url":"https://hubspot.granot.io/problems/hubspot-contacts-missing-company-name"}]},{"slug":"enrich-industry","name":"Enrich Contact Industry from Associated Company","command":"/enrich-industry","description":"Backfill contact-level industry from associated company records using a HubSpot workflow. Enables industry-based segmentation for targeted campaigns aligned with ICP verticals.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/enrich-industry/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/enrich-industry/scripts/before.py"}],"urls":{"html":"https://hubspot.granot.io/skills/enrich-industry","markdown":"https://hubspot.granot.io/skills/enrich-industry.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/enrich-industry"},"solves":[]},{"slug":"fix-lifecycle-stages","name":"Fix Lifecycle Stages","command":"/fix-lifecycle-stages","description":"Ensure all contacts and companies have appropriate lifecycle stages. Backfills missing stages via API, fixes records stuck at disallowed stages, and creates prevention workflows to stop future gaps.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/fix-lifecycle-stages/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/fix-lifecycle-stages/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/fix-lifecycle-stages/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/fix-lifecycle-stages","markdown":"https://hubspot.granot.io/skills/fix-lifecycle-stages.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/fix-lifecycle-stages"},"solves":[{"title":"Lifecycle stages are missing, stuck, or plain wrong","url":"https://hubspot.granot.io/problems/hubspot-lifecycle-stages-wrong-or-missing"}]},{"slug":"standardize-geo-values","name":"Standardize Country and State/Region Values","command":"/standardize-geo-values","description":"Convert inconsistent country and state/region formats to standardized values across contacts and companies. Ensures geographic segmentation works reliably.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/standardize-geo-values/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/standardize-geo-values/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/standardize-geo-values/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/standardize-geo-values","markdown":"https://hubspot.granot.io/skills/standardize-geo-values.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/standardize-geo-values"},"solves":[{"title":"“USA”, “U.S.” and “united states” are three different countries in our reports","url":"https://hubspot.granot.io/problems/hubspot-country-state-values-inconsistent"}]},{"slug":"waterfall-enrich-contacts","name":"Waterfall-Enrich Contacts with External Providers","command":"/waterfall-enrich-contacts","description":"Enrich HubSpot contacts (email, phone, job title) through an external enrichment provider and write results back safely. Pluggable provider adapters with FullEnrich waterfall enrichment as the default; Apollo, Hunter, and Dropcontact included; bring your own via a template.","category":"data-enrichment","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/execute.py"},{"path":"providers/__init__.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/__init__.py"},{"path":"providers/_template.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/_template.py"},{"path":"providers/apollo.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/apollo.py"},{"path":"providers/dropcontact.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/dropcontact.py"},{"path":"providers/fullenrich.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/fullenrich.py"},{"path":"providers/hunter.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/hunter.py"},{"path":"providers/mock.py","url":"https://hubspot.granot.io/skills/waterfall-enrich-contacts/scripts/providers/mock.py"}],"urls":{"html":"https://hubspot.granot.io/skills/waterfall-enrich-contacts","markdown":"https://hubspot.granot.io/skills/waterfall-enrich-contacts.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/waterfall-enrich-contacts"},"solves":[{"title":"We need phones, emails, and titles our CRM just does not have","url":"https://hubspot.granot.io/problems/hubspot-contact-data-incomplete-enrichment"}]},{"slug":"build-lead-scoring","name":"Build Lead Scoring Model","command":"/build-lead-scoring","description":"Create a comprehensive lead scoring model with separate Fit and Engagement scores using HubSpot's new Lead Scoring tool. Replaces the deprecated HubSpot Score property.","category":"segmentation-scoring","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/build-lead-scoring","markdown":"https://hubspot.granot.io/skills/build-lead-scoring.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/build-lead-scoring"},"solves":[{"title":"Our lead scoring broke when HubSpot retired the old score properties","url":"https://hubspot.granot.io/problems/hubspot-lead-scoring-after-2025-changes"}]},{"slug":"build-smart-lists","name":"Build Smart Lists for Segmentation","command":"/build-smart-lists","description":"Create foundational segmented lists for marketing and sales operations via the Lists API, plus advanced UI-built segments: a master sendable list, ICP-based lists, persona lists, and engagement lists. All active (dynamic) lists.","category":"segmentation-scoring","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"execute.py","url":"https://hubspot.granot.io/skills/build-smart-lists/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/build-smart-lists","markdown":"https://hubspot.granot.io/skills/build-smart-lists.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/build-smart-lists"},"solves":[{"title":"Every campaign starts with rebuilding the same lists from scratch","url":"https://hubspot.granot.io/problems/hubspot-segments-lists-missing"}]},{"slug":"create-icp-tiers","name":"Create ICP Tier Property and Classification Workflows","command":"/create-icp-tiers","description":"Classify companies into Ideal Customer Profile (ICP) tiers based on firmographic data (industry + employee count). Creates a custom property via API and 4 classification workflows in HubSpot UI.","category":"segmentation-scoring","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/create-icp-tiers/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/create-icp-tiers/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/create-icp-tiers/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/create-icp-tiers","markdown":"https://hubspot.granot.io/skills/create-icp-tiers.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/create-icp-tiers"},"solves":[{"title":"We cannot report on our best-fit accounts because ICP is not in the CRM","url":"https://hubspot.granot.io/problems/hubspot-no-icp-tiers"}]},{"slug":"bounce-monitoring-workflow","name":"Bounce Monitoring Workflow","command":"/bounce-monitoring-workflow","description":"Build a workflow to protect sender reputation through automated bounce monitoring. Auto-suppresses contacts above a configurable bounce threshold, alerts on hard bounces, and flags high-bounce contacts for weekly manual review.","category":"automation-workflows","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/bounce-monitoring-workflow/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/bounce-monitoring-workflow/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/bounce-monitoring-workflow/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/bounce-monitoring-workflow","markdown":"https://hubspot.granot.io/skills/bounce-monitoring-workflow.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/bounce-monitoring-workflow"},"solves":[]},{"slug":"engagement-suppression-workflow","name":"Engagement-Based Suppression Workflow","command":"/engagement-suppression-workflow","description":"Build a two-tier sunset workflow that re-engages dormant contacts before suppressing them. Tier 1 triggers a re-engagement campaign after a configurable inactivity window. Tier 2 suppresses contacts that fail to re-engage within a configurable re-engagement window.","category":"automation-workflows","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/engagement-suppression-workflow/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/engagement-suppression-workflow/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/engagement-suppression-workflow/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/engagement-suppression-workflow","markdown":"https://hubspot.granot.io/skills/engagement-suppression-workflow.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/engagement-suppression-workflow"},"solves":[{"title":"We keep emailing people who stopped engaging a year ago","url":"https://hubspot.granot.io/problems/hubspot-contacts-disengaged-sunset-policy"}]},{"slug":"lifecycle-progression-workflow","name":"Lifecycle Stage Progression Workflow","command":"/lifecycle-progression-workflow","description":"Build workflows to automate contact progression through the sales funnel: Lead to MQL to SQL to Opportunity to Customer. Each transition is triggered by a specific event (score threshold, meeting booked, deal created, deal won).","category":"automation-workflows","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/lifecycle-progression-workflow/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/lifecycle-progression-workflow/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/lifecycle-progression-workflow/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/lifecycle-progression-workflow","markdown":"https://hubspot.granot.io/skills/lifecycle-progression-workflow.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/lifecycle-progression-workflow"},"solves":[]},{"slug":"new-contact-hygiene-workflow","name":"New Contact Hygiene Workflow","command":"/new-contact-hygiene-workflow","description":"Build a HubSpot workflow that auto-enriches and stages new contacts upon creation. Sets lifecycle stage via the v4 Automation API, copies company name and industry from the associated company (UI step), and branches on completeness.","category":"automation-workflows","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"after.py","url":"https://hubspot.granot.io/skills/new-contact-hygiene-workflow/scripts/after.py"},{"path":"before.py","url":"https://hubspot.granot.io/skills/new-contact-hygiene-workflow/scripts/before.py"},{"path":"execute.py","url":"https://hubspot.granot.io/skills/new-contact-hygiene-workflow/scripts/execute.py"}],"urls":{"html":"https://hubspot.granot.io/skills/new-contact-hygiene-workflow","markdown":"https://hubspot.granot.io/skills/new-contact-hygiene-workflow.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/new-contact-hygiene-workflow"},"solves":[{"title":"New contacts arrive with missing owners, stages, and bad data","url":"https://hubspot.granot.io/problems/hubspot-new-contacts-arrive-dirty"}]},{"slug":"workflows-as-code","name":"Workflows as Code","command":"/workflows-as-code","description":"Export all HubSpot workflows to versioned JSON files via the v4 Automation API, diff exports over time, and restore or recreate workflows from JSON. Treats workflow definitions like code: backed up, reviewable, and recoverable.","category":"automation-workflows","version":"1.1","license":"MIT","scripted":true,"scripts":[{"path":"export.py","url":"https://hubspot.granot.io/skills/workflows-as-code/scripts/export.py"},{"path":"restore.py","url":"https://hubspot.granot.io/skills/workflows-as-code/scripts/restore.py"}],"urls":{"html":"https://hubspot.granot.io/skills/workflows-as-code","markdown":"https://hubspot.granot.io/skills/workflows-as-code.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/workflows-as-code"},"solves":[{"title":"Someone edited a workflow and nobody knows what changed","url":"https://hubspot.granot.io/problems/hubspot-workflows-no-version-control"}]},{"slug":"backfill-geo-data","name":"Backfill Geographic Data","command":"/backfill-geo-data","description":"Enrich missing geographic data (country, state, city) on contacts and companies using HubSpot workflows, external data providers, or IP-based geolocation.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/backfill-geo-data","markdown":"https://hubspot.granot.io/skills/backfill-geo-data.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/backfill-geo-data"},"solves":[]},{"slug":"cleanup-dashboards","name":"Cleanup Dashboards","command":"/cleanup-dashboards","description":"Audit and consolidate HubSpot reporting dashboards. Identifies unused, duplicate, or outdated dashboards. Must be performed manually — no dashboard API is available.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-dashboards","markdown":"https://hubspot.granot.io/skills/cleanup-dashboards.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-dashboards"},"solves":[]},{"slug":"cleanup-deals","name":"Cleanup Deals","command":"/cleanup-deals","description":"Standardize deal pipelines, remove test deals, and address deals with missing amounts or close dates. Coordinates with Salesforce sync if applicable.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-deals","markdown":"https://hubspot.granot.io/skills/cleanup-deals.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-deals"},"solves":[]},{"slug":"cleanup-forms","name":"Cleanup Forms","command":"/cleanup-forms","description":"Audit and remove unused, test, or deprecated forms from HubSpot. Identifies forms with zero submissions, forms not embedded on any page, and test forms left over from development.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-forms","markdown":"https://hubspot.granot.io/skills/cleanup-forms.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-forms"},"solves":[]},{"slug":"cleanup-lead-owners","name":"Cleanup Lead Owners","command":"/cleanup-lead-owners","description":"Remove non-employee users from HubSpot and reassign their orphaned contacts, companies, and deals. Pairs with the assign-unowned-contacts skill for comprehensive ownership cleanup.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-lead-owners","markdown":"https://hubspot.granot.io/skills/cleanup-lead-owners.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-lead-owners"},"solves":[]},{"slug":"cleanup-lists","name":"Cleanup Lists","command":"/cleanup-lists","description":"Audit and remove unused, empty, or duplicate list definitions from HubSpot. Identifies lists with zero members, lists not used by any workflow or email, and overlapping list criteria.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-lists","markdown":"https://hubspot.granot.io/skills/cleanup-lists.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-lists"},"solves":[]},{"slug":"cleanup-properties","name":"Cleanup Properties","command":"/cleanup-properties","description":"Archive or delete unused custom properties across all HubSpot object types (contacts, companies, deals). Identifies Salesforce sync properties, test/temp properties, and obsolete form fields.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-properties","markdown":"https://hubspot.granot.io/skills/cleanup-properties.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-properties"},"solves":[]},{"slug":"cleanup-workflows","name":"Cleanup Workflows","command":"/cleanup-workflows","description":"Audit and remove inactive, test, or deprecated workflows from HubSpot. Identifies workflows that have never enrolled contacts, workflows turned off for 90+ days, and test workflows.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/cleanup-workflows","markdown":"https://hubspot.granot.io/skills/cleanup-workflows.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/cleanup-workflows"},"solves":[]},{"slug":"create-segment-lists","name":"Create Segment Lists","command":"/create-segment-lists","description":"Create business segment lists in HubSpot for customers, partners, competitors, employees, ICP tiers, and industries. Enables segment-based targeting, suppression, and analytics.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/create-segment-lists","markdown":"https://hubspot.granot.io/skills/create-segment-lists.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/create-segment-lists"},"solves":[]},{"slug":"quarterly-database-cleanup","name":"Quarterly Database Cleanup","command":"/quarterly-database-cleanup","description":"Run a comprehensive quarterly CRM audit covering list health, bounce monitoring, data quality, scoring calibration, engagement metrics, and property cleanup. Produces a health report with quarter-over-quarter trend comparison.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/quarterly-database-cleanup","markdown":"https://hubspot.granot.io/skills/quarterly-database-cleanup.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/quarterly-database-cleanup"},"solves":[]},{"slug":"review-bounced-contacts","name":"Review Bounced Contacts","command":"/review-bounced-contacts","description":"Weekly manual review of contacts with 3+ bounce events. Decide whether to delete or attempt recovery for each flagged contact. Prevents over-suppression while removing truly bad data.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/review-bounced-contacts","markdown":"https://hubspot.granot.io/skills/review-bounced-contacts.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/review-bounced-contacts"},"solves":[]},{"slug":"weekly-cleanup-routine","name":"Weekly Cleanup Routine","command":"/weekly-cleanup-routine","description":"A lightweight 5-minute weekly health check covering bounce monitoring, new contact quality, workflow health, list growth trends, and data quality sampling. Quick early warning system, not a comprehensive audit.","category":"ongoing-maintenance","version":"1.1","license":"MIT","scripted":false,"scripts":[],"urls":{"html":"https://hubspot.granot.io/skills/weekly-cleanup-routine","markdown":"https://hubspot.granot.io/skills/weekly-cleanup-routine.md","github":"https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/weekly-cleanup-routine"},"solves":[{"title":"The portal gets messy again a month after every cleanup","url":"https://hubspot.granot.io/problems/hubspot-weekly-maintenance-routine"}]}]}