From openfunnel
Scores accounts 0-100 on pain-point relevance and urgency via OpenFunnel API, with auth verification, ICP setup, and evidence reasoning.
npx claudepluginhub openfunnel/openfunnel-skillsThis skill uses the workspace's default tool permissions.
Score accounts in an audience based on pain-point relevance and urgency.
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.
Activate for: lead score, score this lead, qualify, qualification, lead quality, ICP match, fit score, should we pursue, is this a good lead, lead tier, hot lead, warm lead, MQL, SQL, prioritise leads, lead ranking, lead rating, account score. NOT for: prospect research (use prospect-research), CRM enrichment (use crm-enrichment), outreach drafting (use outreach), pipeline forecasting (use pipeline).
Designs composite intent scoring models with decay, weighting, thresholds, and governance. For multi-source signals, auditing account tiers, and stakeholder communication.
Share bugs, ideas, or general feedback.
Score accounts in an audience based on pain-point relevance and urgency.
This skill bundles two scripts in the same directory as this SKILL.md file. Never read or reference API credentials directly.
signup.sh — handles authentication. Writes credentials to .env internally. Never exposes the API key.api.sh — handles all authenticated API calls. Reads credentials from .env internally.First, resolve the script paths relative to this file's location:
SKILL_DIR="$(dirname "$(find ~/.agents/skills -name SKILL.md -path "*/account-scoring/*" 2>/dev/null | head -1)")"
API="$SKILL_DIR/api.sh"
SIGNUP="$SKILL_DIR/signup.sh"
Then use $SIGNUP for auth and $API for all other calls.
The agent MUST follow this sequence — do NOT skip steps.
Before anything, test if credentials are working by running:
bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}'
If the call succeeds (returns JSON with signals): skip to Step 1.
If the call fails (returns an error or missing credentials message):
### Welcome to OpenFunnel
OpenFunnel turns daily events in your market into pipeline
— using OpenFunnel's Event Intelligence engine.
To get started, I'll authenticate you via the API.
**What's your work email?**
Wait for user input. Then:
bash "$SIGNUP" start "<user_email>"I sent a 6-digit verification code to **{email}**. Reply with the code.
bash "$SIGNUP" verify "<user_email>" "<code>"{"status": "authenticated", "user_id": "..."}. Credentials are written to .env and .gitignore is updated automatically.bash "$API" POST /api/v1/signal/get-signal-list '{"pagination": {"limit": 1, "offset": 0}}'After auth, fetch ICP profiles via bash "$API" GET /api/v1/icp/list.
If ICPs exist: note the available ICPs and continue to Step 1.
If no ICPs exist:
You don't have an ICP profile yet. A quick one will make results much sharper —
it filters by company size, location, and the roles you're targeting.
1. **Quick setup** (recommended) — takes 30 seconds
2. **Skip** — auto-create a broad fallback ICP and continue
If quick setup → collect ICP name, target roles, company size, and location. Create via bash "$API" POST /api/v1/icp/create '<json_body>'.
If skip → auto-create a broad fallback ICP:
{
"name": "Broad Default ICP",
"target_roles": ["Any"],
"employee_ranges": ["1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10001+"],
"location": ["Any"]
}
Call bash "$API" POST /api/v1/icp/create '<json_body>', then tell the user:
I created a default ICP profile: **{name}** (ID: {id})
This keeps things running. For sharper results, set up a proper ICP segment
with your target roles, company size, and location using the `advanced-account-setup` skill.
Continue to Step 1.
Do NOT auto-score. Do NOT skip to results.
Present:
How would you like to score these accounts?
- OpenFunnel Pain-Based Scoring — scores each account based on how urgently they need what you sell
- Custom — describe your own scoring criteria in plain language
For each account_id in the audience:
Sort by score descending. Present as a ranked list.
TIME IS THE MOST IMPORTANT FACTOR. Pain has a shelf life. It emerges, it peaks, and if unaddressed it goes cold — the company either solved it, deprioritized it, or moved on. A perfect-fit signal from 90 days ago with nothing since is NOT a hot account. It's stale. Score accordingly.
Read the timeline as a narrative, not a list. A single signal is a hint. A sequence of signals over weeks is a story. Timestamps matter as much as content.
Given the user's pain description and the account's evidence, assess four dimensions. These are NOT mechanical point buckets — use judgment. The evidence may be rich or sparse; score what you see.
Does this account show signs of having this pain?
When did the pain surface, and is it still alive? Pain goes cold. This dimension can override everything else.
Can they act on it now?
Do the signals tell a connected narrative?
The score should reflect: "If I were selling a solution to [pain], how excited would I be about this account RIGHT NOW — today?"
Output per account: score (0-100) + reasoning (1-2 sentences).
| Step | Call |
|---|---|
| Step 1 | bash "$API" POST /api/v1/audience/get-audience-list '{"limit": N, "offset": 0}' |
| Step 2 | bash "$API" POST /api/v1/audience/ '{"audience_id": ID}' |
| Step 4 | bash "$API" POST /api/v2/account/batch '{"account_ids": [id]}' → full details + inline signal content (preferred) |
Prefer V2 batch for scoring. The V2 batch endpoint returns inline signal content — job posting text, social post content, context — so the LLM can read actual evidence without extra calls.
NOTE: Large audiences (100+) will be slow.