tomgranot/hubspot-admin-skills/suppress-ghost-contacts
Claude Code and agent skill by tomgranot/hubspot-admin-skills
- community
Checking that the SKILL.md file is still in the repository.
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.
Install
npx vskill@latest install tomgranot/hubspot-admin-skills/suppress-ghost-contactsSKILL.md
Suppress Ghost Contacts (Delivered, Never Opened)
Purpose
Ghost contacts have received marketing emails but have never opened a single one. They are the largest threat to email deliverability because ISPs like Gmail and Microsoft track engagement at the sender level. Consistently sending to people who never open signals that the sender is producing unwanted email, causing inbox placement to deteriorate even for engaged contacts.
Prerequisites
- A HubSpot service key (
HUBSPOT_ACCESS_TOKENin.env; an existing legacy private app token also works) withcrm.objects.contacts.readandcrm.lists.read/crm.lists.writescopes - Python 3.10+ with
uvfor package management - A
.envfile containingHUBSPOT_ACCESS_TOKEN - Super Admin or Marketing Hub Admin permissions for the manual UI suppression step
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/suppress-ghost-contacts/ in a clone of the repo).
| Stage | Script | Run with | |
|---|---|---|---|
| Before | `scripts/before.py` | uv run scripts/before.py | |
| After | `scripts/after.py` | uv run scripts/after.py |
There is no execute script: the marketing-status change itself must happen via a HubSpot workflow or the UI (see Key Constraint and Stage 3).
Key Constraint
`hs_marketable_status` is read-only via the API. Suppression must happen in the HubSpot UI.
CRITICAL: "Never Opened" Is Null, Not Zero
HubSpot stores "never opened" as a null/absent property, not as the number 0. You MUST use the NOT_HAS_PROPERTY operator to find contacts who have never opened an email. Using EQ 0 will return zero results because the property is not set at all for these contacts.
The same applies to hs_email_bounce -- "never bounced" is also null.
Execution Pattern
This skill follows a 4-stage execution pattern: Plan -> Before -> Execute -> After.
Stage 1: Plan
Before writing any code, confirm with the user:
- Graduated approach: Recommend suppressing only contacts above your delivery threshold (typically 5-15, adjust based on your email cadence) first. Contacts below that threshold may not have had enough chances to engage.
- Overlap with previous processes: Some ghost contacts may already be non-marketing from hard-bounce or unsubscribe suppression. The Before State will measure this overlap.
- Open tracking caveat: Some email clients block tracking pixels. However, at the scale of thousands of contacts with zero opens across multiple sends, the overwhelming majority are genuinely unengaged.
- Apple Mail Privacy Protection: Introduced in iOS 15 / macOS Monterey, it pre-loads tracking pixels, which can create false-positive opens. Contacts who do NOT show opens despite this feature are almost certainly truly unengaged.
Stage 2: Before
Discover all ghost contacts, break down by delivery volume, and generate an audit CSV.
Step 4: Export full CSV using segmented queries
The Search API caps at 10K results. For ghost contacts (often >10K), segment by delivery volume brackets to bypass the limit.
Stage 3: Execute
Step 3a: Create HubSpot active lists via API
Create two lists: a main suppression list and a worst-offender review list.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/suppress-ghost-contacts/SKILL.md
Popularity
- Repository stars
- 56
- Repository forks
- 15
- 7-day trend score
- 20
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tomgranot/hubspot-admin-skills/suppress-ghost-contacts)