Hubspot Sales Audit logo

Hubspot Sales Audit

Community
TomGranot
hubspot-sales-audit

Audit the sales side of a HubSpot portal: pipeline configuration, deal data quality, stale and past-due deals, ownership and handoff gaps, and overdue follow-up. Read-only. Use when the forecast is not trusted, before a pipeline redesign or a new sales leader's first review, or when reps and reports disagree about what is in the pipeline.

Overview

PublisherTomGranot
Repositoryhubspot-admin-skills
Skill namehubspot-sales-audit
Stars
79
Forks
18
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by TomGranot on GitHub. Read the source before you install it.

Installation

Install the Hubspot Sales Audit AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/hubspot-sales-audit
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/TomGranot/hubspot-admin-skills.git /tmp/hubspot-admin-skills
mkdir -p .claude/skills
cp -r /tmp/hubspot-admin-skills/skills/hubspot-sales-audit .claude/skills/hubspot-sales-audit
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Hubspot Sales Audit in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Hubspot Sales Audit on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Hubspot Sales Audit is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

HubSpot Sales Audit

A read-only audit of everything sales operations owns in a HubSpot portal. It answers one question from several angles: can anyone trust what the pipeline says?

Why This Matters

A forecast is a sum over deal records. If a fifth of open deals have no amount, a quarter have close dates in the past, and some belong to reps who left months ago, the forecast is wrong before anyone applies judgment to it. Pipeline reviews then turn into data-entry sessions, and leaders stop using the CRM to make decisions. Most of this is measurable in a few minutes, and most of it is fixable.

How It Relates to the Other Audits

This skill is a lens on the same engine that powers /hubspot-audit and /hubspot-marketing-audit. It runs the shared dimensions (database size, owner health, company data, duplicates) plus the sales dimensions, and skips deliverability and engagement entirely. Because the shared dimensions are computed by the same code under every scope, the numbers here match what the marketing team sees in their audit.

If you ownRun
Sales onlythis skill
Marketing only/hubspot-marketing-audit
The whole portal/hubspot-audit (both lenses in one report)

Prerequisites

  • The hubspot-audit skill installed alongside this one (it ships the engine)
  • HUBSPOT_ACCESS_TOKEN in .env, with read scopes for deals, contacts, companies, and owners. Add read scopes for tasks and leads to fill in the Activity & Follow-up dimension
  • Python 3.10+ with uv

The audit runs on any HubSpot tier with deals. The leads object needs Sales Hub; without it those rows show n/a.

Run It

The engine lives in the hubspot-audit skill, one directory over from this one. Run it from your project directory so .env and reports/ resolve there (in a clone of the repo the path is skills/hubspot-audit/scripts/audit_portal.py).

bash
uv run ../hubspot-audit/scripts/audit_portal.py --scope sales

Output: reports/hubspot-sales-audit-{YYYY-MM-DD}.md and a .json twin.

What It Measures

DimensionMetricsGraded on
Pipeline ConfigurationNumber of pipelines, deals (and open deals) per pipeline, pipelines with zero deals, pipelines with more than 10 open stagesempty + bloated pipelines
Deal Data QualityOpen deals missing amount, close date, owner, or any associated contact; closed-lost deals with no loss reasonmissing amount + close date
Pipeline Hygiene & VelocityOpen deals with no logged activity in 60+ days, open deals whose close date has passed, open deals with no next activity; deals closed and win rate over the last 90 daysstale + past-due deals
Sales Ownership & HandoffOpen deals owned by deactivated users; SQL and Opportunity contacts with no owner; Opportunity-stage contacts with no dealorphaned deals + unowned sales-stage contacts
Activity & Follow-upOpen tasks, overdue open tasks, leads, leads with no owneroverdue tasks
Shared: Owner Health, Company Data, Database Size, Duplicatessee /hubspot-audit

Thresholds are constants in the script's # --- Configuration --- block: STALE_DEAL_DAYS (60), WIN_RATE_WINDOW_DAYS (90), MAX_STAGES_PER_PIPELINE (10). Set them to match your sales cycle before reading the grades. A 60-day stale window is strict for enterprise deals and generous for transactional ones.

Reading the Results

  1. Past-due close dates come first. An open deal with a close date in the past is wrong by definition: it either closed, slipped, or died, and the record says none of those. This is the cheapest forecast fix available.
  2. Stale is a conversation, not a deletion. No logged activity in 60 days can mean a dead deal or a rep who does not log. Check a sample (the MCP server is good for this, see /connect-hubspot-mcp) before deciding which problem you have. The fixes are different: one is pipeline cleanup, the other is activity capture.
  3. Missing amounts skew weighted pipeline more than missing deals. A deal with no amount contributes zero to every weighted report. If early stages legitimately have no amount yet, make amount conditionally required from the stage where it should exist.
  4. Orphaned open deals are P0. A deal owned by a deactivated user gets no follow-up and appears in nobody's forecast. Reassign before anything else.
  5. Handoff gaps show where marketing and sales disagree. SQL or Opportunity contacts with no owner mean routing broke. Opportunity-stage contacts with no deal mean lifecycle stage is being set by hand or by a workflow that does not create deals. Share these two rows with marketing ops: the root cause usually sits on their side of the line.
  6. Loss reasons are the cheapest win/loss data you will ever get. If most closed-lost deals have none, make the property required on the Closed Lost stage.
  7. Win rate is context. It is reported so the other numbers can be read against it and does not affect any grade. A healthy win rate on a pipeline full of stale deals usually means the losses are never being closed out.

From Findings to Fixes

OrderSkillFixes
1/reassign-deactivated-ownersOpen deals and contacts owned by people who have left
2/assign-unowned-contactsSales-stage contacts nobody is working
3/cleanup-dealsMissing amounts and close dates, stale and past-due deals, test deals, unused pipelines
4/cleanup-lead-ownersUnowned companies, deals, and leads; non-employee users
5/fix-lifecycle-stagesOpportunity-stage contacts with no deal; customers at the wrong stage
6/lifecycle-progression-workflowHandoff automation, so the gaps do not reopen
7/merge-duplicate-companiesDuplicate accounts splitting deal history

Run /hubspot-implementation-plan to turn the report into a phased plan.

Prevention matters more than cleanup here. Three portal settings stop most of what this audit finds, and all three are configured in the HubSpot UI: required properties per deal stage (Settings > Objects > Deals > Pipelines), pipeline rules that restrict skipping stages and backward movement, and a workflow that creates a task for the owner when an open deal has had no activity for your stale window.

What This Audit Does Not Cover

  • Forecast accuracy and time in stage. HubSpot's forecast tool and pipeline reports own these. Forecast submissions are readable by API on Sales Hub Professional and above (crm.objects.forecasts.read) if you want to extend the engine.
  • Sequences. The Sequences API only works with user-level authentication, so an account-level token cannot audit enrollment.
  • Rep performance. The audit measures data quality, not people. Per-owner breakdowns are a deliberate omission: add them only if the team has agreed how they will be used.
  • Quotes, products, and line items. Out of scope for now.

Rollback

Nothing to roll back: the audit only reads. To remove its output, delete the files it wrote under reports/.

Frequently asked questions

What does the Hubspot Sales Audit AI skill do?

Audit the sales side of a HubSpot portal: pipeline configuration, deal data quality, stale and past-due deals, ownership and handoff gaps, and overdue follow-up. Read-only. Use when the forecast is not trusted, before a pipeline redesign or a new sales leader's first review, or when reps and reports disagree about what is in the pipeline.

Why use Hubspot Sales Audit on TypingMind?

Because you install it once and use it with any model. Hubspot Sales Audit is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Hubspot Sales Audit in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/TomGranot/hubspot-admin-skills/tree/main/skills/hubspot-sales-audit. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Hubspot Sales Audit?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Hubspot Sales Audit?

As many as you like. As long as a model supports skills, you can use Hubspot Sales Audit with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Hubspot Sales Audit AI skill free?

Yes. It is published on GitHub by TomGranot under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇