Hubspot Audit logo

Hubspot Audit

Community
TomGranot
hubspot-audit

Run a full, read-only HubSpot portal audit covering both the marketing and sales sides: database, deliverability, engagement, owners, pipelines, deal quality, and follow-up. Grades each dimension and prescribes the skills that fix what it finds. Use when starting a CRM cleanup, onboarding a new portal, or running a quarterly health check.

Overview

PublisherTomGranot
Repositoryhubspot-admin-skills
Skill namehubspot-audit
Stars
79
Forks
18
Bundled files
1
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.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

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

Installation

Install the Hubspot 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-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-audit .claude/skills/hubspot-audit
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Hubspot 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 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 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 Portal Audit

Run a full diagnostic audit of a HubSpot portal. One read-only script collects the metrics, grades each dimension, and writes a report that opens with a prioritized list of skills to run.

One Engine, Three Lenses

The audit is a single engine (scripts/audit_portal.py) with a --scope flag. Every dimension is tagged shared, marketing, or sales:

ScopeRunsReportEntry point
full (default)shared + marketing + salesreports/hubspot-audit-{date}.mdthis skill
marketingshared + marketingreports/hubspot-marketing-audit-{date}.md/hubspot-marketing-audit
salesshared + salesreports/hubspot-sales-audit-{date}.md/hubspot-sales-audit

The shared dimensions run under every scope, so a marketing audit and a sales audit of the same portal agree on the numbers they have in common. Use this skill when you own the whole portal; hand a team the scoped audit when they only own one side.

Setup

  1. Get the API token. Check .env for HUBSPOT_ACCESS_TOKEN. If it is not set, ask the user for a read-scoped HubSpot access token and store it in .env:

    HUBSPOT_ACCESS_TOKEN=pat-na1-xxxxxxxx
  2. Run the audit. The script carries PEP 723 inline metadata and runs with uv, which resolves its dependencies automatically:

    bash
    uv run scripts/audit_portal.py              # full
    uv run scripts/audit_portal.py --scope marketing
    uv run scripts/audit_portal.py --scope sales

The script creates reports/ if needed and writes a markdown report plus a JSON twin (same name, .json) for other skills to read.

Audit Dimensions

Shared (every scope)

DimensionWhat it measuresGraded on
Database SizeTotal contacts, companies, dealsnot graded
Owner HealthUnowned contacts and companies; records still owned by deactivated ownersunowned + orphaned contacts
Company Data CompletenessCompanies missing domain, industry, countrymissing domain
DuplicatesFlagged for /merge-duplicate-companies (exact scans need full pagination)not graded

Marketing

DimensionWhat it measuresGraded on
Email DeliverabilityMarketing contacts, hard bounces, global unsubscribes, 3+ bounces, never emailedhard bounces + unsubscribes
Contact Data CompletenessContacts missing email, lifecycle stage, company, industry, country, job titlemissing lifecycle stage
Engagement HealthOpened in 90 days, never opened, last open over a year ago, current customers at the wrong lifecycle stagenever opened
List, Workflow & Form HealthTotal lists, workflows (active vs inactive), formsnot graded

Sales

DimensionWhat it measuresGraded on
Pipeline ConfigurationPipelines, deals per pipeline, empty pipelines, pipelines with more than 10 open stagesempty + bloated pipelines
Deal Data QualityOpen deals missing amount, close date, owner, or an associated contact; closed-lost deals with no loss reasonmissing amount + close date
Pipeline Hygiene & VelocityOpen deals with no activity in 60+ days, close dates in the past, no next activity; 90-day win ratestale + past-due deals
Sales Ownership & HandoffOpen deals owned by deactivated owners; SQL/Opportunity contacts with no owner; Opportunity contacts with no dealorphaned deals + unowned sales-stage contacts
Activity & Follow-upOpen and overdue tasks; leads and unowned leadsoverdue tasks

Thresholds (stale-deal window, win-rate window, stage limit) are in the # --- Configuration --- block at the top of the script.

API Technical Notes

  • Null checks: use the NOT_HAS_PROPERTY operator to find records where a property has never been set. HubSpot stores "never happened" as an absent property, not as 0 or an empty string.
  • Counting: the script counts with the Search API's total, which is exact even past the 10,000-result paging cap. Paging through more than 10,000 records requires segmenting the query.
  • Search limits: 5 requests per second, 5 filter groups per query, 6 filters per group. The script paces itself under the rate limit.
  • n/a is not zero: when the token cannot read an object (missing scope, or the hub is not purchased), the row shows n/a and the dimension grades ?. Fix the scope and re-run rather than reading it as clean.
  • Deactivated owners: the Owners API only returns them with archived=true.
  • Open deals: filtered with hs_is_closed = false, which works across every pipeline regardless of stage names.
  • Marketing contact status: hs_marketable_status is readable and filterable but read-only via API.
  • Not available by API: per-email open/click rates come from the marketing email statistics API or the UI; forecast accuracy and time-in-stage come from the UI's forecast and pipeline reports.

Scripts

Script paths are relative to this skill's directory. Run them from your project directory so .env, data/, and reports/ resolve there: prefix each path with wherever this skill is installed (skills/hubspot-audit/ in a clone of the repo).

StageScriptRun with
Audit (read-only)scripts/audit_portal.pyuv run scripts/audit_portal.py [--scope full|marketing|sales]

If a portal needs a check the script does not cover, add a dimension function with the right tag rather than writing a separate one-off script. The offline tests in tests/test_audit_portal.py run against a fake API and need no portal.

MCP note: if HubSpot's MCP server is connected (see /connect-hubspot-mcp), use it for spot-checks while auditing: opening sample records behind a suspicious count is faster than writing one-off queries. The counting queries themselves stay in the script for reproducibility.

Grading Rubric

GradeMeaningCriteria
AHealthy< 5% of records affected
BMinor issues5-15% of records affected
CNeeds attention15-30% of records affected
DSignificant problems30-50% of records affected
FCritical> 50% of records affected
?UnknownThe metric could not be read

The script grades each dimension on the metric named in the tables above. Treat the grade as a starting point: a portal with 40 open deals and 3 stale ones is in a different place than one with 4,000 and 300, even though both grade B.

Report Structure

markdown
# HubSpot CRM Audit Report

**Date:** YYYY-MM-DD
**Scope:** full

## Executive Summary

| Dimension | Lens | Grade |
|---|---|---|
| Owner Health | shared | C |
| Email Deliverability | marketing | D |
| Deal Data Quality | sales | B |

## Prescription

| # | Skill | Why | Records | Priority |
|---|---|---|---|---|
| 1 | `/delete-no-email-contacts` | Contacts missing email | X,XXX | P0 |
| 2 | `/suppress-hard-bounced` | Hard bounced | X,XXX | P0 |

## 1. Database Size
...one section per dimension, each a Metric | Count | % table...

Skill Prescription

The script builds the prescription itself: every metric with a non-zero count that maps to a fix skill becomes a row, each skill appears once, and rows are ordered by priority (P0 first), then by record count.

After the script finishes:

Step 1: Read the Report

Read the generated markdown report. Do not re-derive counts by hand; the report and its JSON twin are the source of truth.

Step 2: Present the Ordered Prescription

Present the prescription as a numbered action list grouped by urgency, with the real counts:

markdown
## Your Cleanup Prescription

### Immediate (P0)
1. `/delete-no-email-contacts`: X,XXX contacts with no email are inflating your bill
2. `/reassign-deactivated-owners`: XX open deals belong to people who have left

### Next (P1)
3. `/cleanup-deals`: XXX open deals have no amount or close date
...

Add judgment the script cannot: which findings share a root cause, which are expected for this business, and what order respects dependencies (enrichment before scoring, ownership before routing).

Step 3: Handle Missing Skills

If the audit reveals a problem that no existing skill covers, do the following:

  1. Tell the user clearly: "This audit found an issue that isn't covered by any existing skill: [description]."

  2. Offer to create it on the spot: "I can create a new skill for this right now. It would be called /[suggested-name] and would handle [brief description]."

  3. Ask about contributing upstream: "Would you like to contribute this new skill back to the community? If yes, I'll:

    • Create the skill in skills/[name]/SKILL.md
    • Fork the repo (if not already forked)
    • Push the new skill to your fork
    • Open a pull request to tomgranot/hubspot-admin-skills

    This helps everyone who uses these skills in the future."

  4. If the user agrees, create the skill following the standard SKILL.md format, commit it, and open the PR.

  5. If the user declines the upstream contribution, still create the skill locally so they can use it.

Step 4: Suggest Next Step

End with:

Ready to start? Run `/hubspot-implementation-plan` to generate a full phased plan,
or jump straight to the first skill in your prescription.

After Running

  • Print the file path of the saved report
  • Present the ordered skill prescription (Step 2 above)
  • Highlight the top 3 most critical findings
  • Flag any findings that have no matching skill (Step 3 above)
  • Suggest running /hubspot-implementation-plan for the full phased plan

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Hubspot Audit AI skill do?

Run a full, read-only HubSpot portal audit covering both the marketing and sales sides: database, deliverability, engagement, owners, pipelines, deal quality, and follow-up. Grades each dimension and prescribes the skills that fix what it finds. Use when starting a CRM cleanup, onboarding a new portal, or running a quarterly health check.

Why use Hubspot Audit on TypingMind?

Because you install it once and use it with any model. Hubspot 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 Audit in TypingMind?

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

Which AI models can use Hubspot 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 Audit?

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

Is the Hubspot 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 👇