Google Maps Export
gmapsscraper/google-maps-agent-skills
Export Google Maps business data to CSV, JSON, or CRM format (HubSpot, Pipedrive, Salesforce).
Agent skill
by jeremylongshore in jeremylongshore/tons-of-skills-marketplace
Automate and audit HubSpot deal pipeline operations without destroying real pipeline — covering stage automation loops, stale-deal safe-close logic, forecast reconciliation, custom property drift…
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automation --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .claude/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .claude/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automation --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .agents/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .agents/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automation --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .cursor/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .cursor/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jeremylongshore/tons-of-skills-marketplace.git --path skills/.curated/hubspot-deal-pipeline-automation--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automation --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .gemini/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .gemini/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .github/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .github/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jeremylongshore/tons-of-skills-marketplace hubspot-deal-pipeline-automation --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/.curated/hubspot-deal-pipeline-automation .opencode/skills/hubspot-deal-pipeline-automation && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "hubspot-deal-pipeline-automation" agent skill from https://github.com/jeremylongshore/tons-of-skills-marketplace/tree/main/skills/.curated/hubspot-deal-pipeline-automation into .opencode/skills/hubspot-deal-pipeline-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "hubspot-deal-pipeline-automation", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
hubspot-deal-pipeline-automationAutomate and audit HubSpot deal pipeline operations without destroying real pipeline — covering stage automation loops, stale-deal safe-close logic, forecast reconciliation, custom property drift…
Hubspot Deal Pipeline Automation is an agent skill from jeremylongshore/tons-of-skills-marketplace. Automate and audit HubSpot deal pipeline operations without destroying real pipeline — covering stage automation loops, stale-deal safe-close logic, forecast reconciliation, custom property drift detection, quota dashboard cache-busting, and multi-pipeline duplicate detection. Use when writing or debugging workflow automations that move deals between stages, auditing pipelines for stale or duplicated opportunities, reconciling forecast numbers that disagree across reports, or hardening RevOps dashboards against…
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/API_REFERENCE.md` and `references/implementation-guide.md`). Compatibility notes: Designed for Claude Code
It sits in Sales & Support, covering CRM management and Accounting and bookkeeping. It works with HubSpot. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteBash(curl:*)Bash(jq:*)Bash(python3:*)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqcurlpython3From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.hubapi.comAlso links to:
developers.hubspot.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
HUBSPOT_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designed for Claude Code
From compatibility in the SKILL.md frontmatter.
Hubspot Deal Pipeline Automation loads about 5.5k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 199 tokens; SKILL.md has 1,590 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 1,590 words, ~5,458 tokens.
.claude/skills/hubspot-deal-pipeline-automation/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Automate HubSpot deal pipelines without blowing up real revenue. This is not a walkthrough of workflow builder UI — it is the engineering behind six failure modes that silently destroy RevOps data while every dashboard stays green until a rep's quota call reveals the damage.
The six production failures this skill prevents:
Stage automation loops — a workflow moves a deal to "Demo Scheduled", which triggers a second workflow enrolled on "Demo Scheduled" that moves it back to "Qualified", which triggers the first workflow again. The deal bounces between stages until HubSpot's 100-action daily workflow execution limit for that deal is exhausted. RevOps sees "workflow failure" alerts but no stage history that makes sense.
Stale-deal auto-closing — a cleanup workflow auto-closes deals older than 90 days to clear pipeline bloat. The contact associated with deal #4872 responded to an email this morning. The deal is closed as Lost. The rep calls the contact, who says "I just told someone we were ready to sign." This failure costs quota attainment, not just data quality.
Forecast query inconsistency — amount, hs_projected_amount, and a
custom arr_value property all exist on the same deal. The CRO dashboard
queries amount. The ops team queries hs_projected_amount. RevOps built a
custom rollup on arr_value. At end of quarter they produce three different
forecast numbers for the same deal set with no canonical answer.
Custom property reporting gap — a RevOps engineer renames
deal_source_detail to original_lead_source in the property settings.
Every deal-source dashboard built on the old property name silently returns
zero. No error is thrown. The board sees a 100% collapse in deal source
tracking that is entirely an artifact, not a pipeline signal.
Quota dashboard staleness — HubSpot's reporting layer caches deal stage aggregates. A deal closes at 4:47pm. The quota attainment dashboard doesn't reflect it until 8:30pm. A rep who hit quota at EOD is told they're 3% short. This is a 4-hour cache lag in the default reporting stack, and it affects every quota conversation at month-end.
Multi-pipeline deal duplication — a new business opportunity becomes an expansion after the initial close. Someone creates a deal in the Expansion pipeline for the same company without deleting the original, or a workflow auto-creates expansion deals. The same revenue is counted in two pipeline forecasts with no cross-reference key linking them.
All API calls use a HubSpot private app token or OAuth access token in the
Authorization: Bearer $HUBSPOT_TOKEN header. The hubspot-auth skill covers
token caching, rotation, and rate-limit backoff patterns. For deal pipeline
automation, the required scopes are listed below.
crm.objects.deals.read, crm.objects.deals.write,
crm.schemas.deals.read, crm.schemas.deals.write,
crm.associations.read, crm.associations.write,
automationjq installed for shell-based audit scriptsGET /oauth/v1/access-tokens/$TOKEN)Build in this order. Each section neutralizes one production failure mode.
Workflow loops happen when a stage-change trigger has no memory of what caused
the change. The guard injects a sentinel property hs_pipeline_loop_guard
(type: string, format: workflowId:epochMs) that any workflow writes
immediately before it changes a stage, and reads before it fires. If the guard
was written by the same workflow within a debounce window, the workflow aborts.
Create the sentinel property first (one-time setup per portal):
curl -s -X POST "https://api.hubapi.com/crm/v3/properties/deals" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "hs_pipeline_loop_guard",
"label": "Pipeline Loop Guard",
"type": "string",
"fieldType": "text",
"groupName": "dealinformation",
"description": "Automation loop sentinel. Format: workflowId:epochMs. Written before any stage transition."
}' | jq '{name, label, type}'TypeScript guard — wrap every stage-change call in this:
const DEBOUNCE_MS = 60_000; // 60s window per workflow
async function safeStageTransition(
dealId: string,
workflowId: string,
targetStageId: string,
token: string,
): Promise<{ transitioned: boolean; reason: string }> {
// Read current guard value
const deal = await hubspotGet(`/crm/v3/objects/deals/${dealId}`, token, {
properties: "dealstage,hs_pipeline_loop_guard",
});
const guard: string | null = deal.properties.hs_pipeline_loop_guard ?? null;
if (guard) {
const [guardedWorkflowId, tsStr] = guard.split(":");
const elapsed = Date.now() - parseInt(tsStr, 10);
if (guardedWorkflowId === workflowId && elapsed < DEBOUNCE_MS) {
return {
transitioned: false,
reason: `Loop guard: workflow ${workflowId} already fired ${elapsed}ms ago`,
};
}
}
// Write guard, then transition
await hubspotPatch(`/crm/v3/objects/deals/${dealId}`, token, {
properties: {
hs_pipeline_loop_guard: `${workflowId}:${Date.now()}`,
dealstage: targetStageId,
},
});
return { transitioned: true, reason: "OK" };
}
hubspotGet and hubspotPatch are thin fetch wrappers — implementations in
implementation-guide.md.
Detecting existing loops via stage history audit:
# Pull stage change history for a specific deal — look for oscillation
DEAL_ID="12345678"
curl -s "https://api.hubapi.com/crm/v3/objects/deals/${DEAL_ID}/changelog" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" | \
jq '.results[] | select(.propertyName == "dealstage") | {timestamp, from: .previousValue, to: .currentValue}'If the output shows the same two stage IDs alternating more than twice in 24
hours, that deal has a live loop. Identify the responsible workflows by checking
hs_lastmodifieddate on the deal alongside the workflow enrollment history in
HubSpot UI (Contacts → Workflows → History tab for the deal).
Never auto-close a deal without first checking whether the associated contact has recent email activity. The safe-close criterion is: deal older than 90 days AND no inbound email in the last 30 days AND no open tasks.
The full stale_deal_audit.py script (with get_stale_open_deals, has_recent_inbound_email, has_open_tasks, and paginated search) lives in implementation-guide.md § Stale-Deal Audit.
Key points for the search query:
# CRM search filter for stale open deals (epoch ms cutoff)
CUTOFF=$(python3 -c "import datetime; print(int((datetime.datetime.utcnow()-datetime.timedelta(days=90)).timestamp()*1000))")
# filterGroups: createdate LT $CUTOFF AND hs_is_closed EQ falseThe script outputs a CSV with safe_to_close boolean. Only rows where safe_to_close=True are candidates for batch close. A separate batch_close_stale.py script (also in the implementation guide) handles the actual close — always requires human review of the CSV before executing.
HubSpot exposes four distinct amount-like fields on a deal. Using the wrong one in a report produces a different number without any error. The canonical selection logic:
| Field | When it is the right number |
|---|---|
amount | The rep-entered deal value. Use for quota credit and pipeline value in all CRM views. |
hs_projected_amount | Amount × current-stage probability. Use only for probability-weighted pipeline forecasts. |
hs_deal_stage_probability | The stage probability (0–1). Multiply amount by this yourself if you need weighted values. |
Custom arr_value, mrr_value, etc. | Only if your org has explicitly separated ARR/MRR from deal amount. Validate these exist on the deal before reading them. |
Always request all four amount fields — pick one canonical field per report:
# Fetch all four amount fields for a deal and compare
curl -s "https://api.hubapi.com/crm/v3/objects/deals/$DEAL_ID" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" \
--data-urlencode "properties=amount,hs_projected_amount,hs_deal_stage_probability,arr_value" | \
jq '.properties | {amount, projected: .hs_projected_amount, probability: .hs_deal_stage_probability, arr: .arr_value}'Discrepancy rule: if |hs_projected_amount - (amount × hs_deal_stage_probability)| / amount > 0.05,
hs_projected_amount is stale. Force recalculation by patching dealstage to
the current stage value — HubSpot recomputes on every stage write.
The full Python forecast_reconcile.py script (with paginated open-deal search
and --fix flag for bulk recalculation) is in
implementation-guide.md § Forecast Reconciliation.
When a deal property used in a dashboard is renamed or deleted, dashboards silently return zero without throwing an error. Run this check before every sprint that touches property schema, and wire it into a nightly CI job.
#!/usr/bin/env bash
# check-deal-properties.sh
# Usage: HUBSPOT_TOKEN=... ./check-deal-properties.sh properties-in-use.txt
# properties-in-use.txt: one property name per line (from dashboard/report definitions)
set -euo pipefail
PROPERTIES_FILE="${1:-properties-in-use.txt}"
TOKEN="${HUBSPOT_TOKEN:?HUBSPOT_TOKEN required}"
# Fetch all deal properties from the portal
ALL_PROPS=$(
curl -s "https://api.hubapi.com/crm/v3/properties/deals" \
-H "Authorization: Bearer $TOKEN" | \
jq -r '.results[].name'
)
echo "Checking properties against portal schema..."
MISSING=0
while IFS= read -r prop; do
[[ -z "$prop" ]] && continue
if ! echo "$ALL_PROPS" | grep -qx "$prop"; then
echo "MISSING: $prop"
MISSING=$((MISSING + 1))
fi
done < "$PROPERTIES_FILE"
if [[ $MISSING -gt 0 ]]; then
echo ""
echo "ERROR: $MISSING properties used in reports do not exist in this portal."
echo "Review recent property renames/deletions in Settings → Properties."
exit 1
else
echo "All $( wc -l < "$PROPERTIES_FILE" | tr -d ' ' ) properties found in portal schema."
fiGenerate properties-in-use.txt by extracting all property names from your
report/dashboard definitions. The list must be maintained alongside any schema
change — wire check-deal-properties.sh into your deployment pipeline so that
property renames fail the deploy before they break dashboards in production.
HubSpot's native reporting layer caches deal stage aggregates. The cache TTL in the standard reporting stack is up to 4 hours. For real-time quota views at month-end, bypass the reporting layer and query the CRM API directly with a current-state search.
interface QuotaSnapshot {
closedWon: number; // sum of amount for ClosedWon deals in current period
closedWonCount: number;
openPipeline: number; // sum of amount for open deals
asOf: string; // ISO timestamp of this query
}
async function liveQuotaSnapshot(
pipelineId: string,
closedWonStageId: string,
ownerId: string,
token: string,
periodStartMs: number,
): Promise<QuotaSnapshot> {
// Closed Won this period
const closedWonSearch = {
filterGroups: [
{
filters: [
{ propertyName: "pipeline", operator: "EQ", value: pipelineId },
{ propertyName: "dealstage", operator: "EQ", value: closedWonStageId },
{ propertyName: "hubspot_owner_id", operator: "EQ", value: ownerId },
{ propertyName: "closedate", operator: "GTE", value: String(periodStartMs) },
],
},
],
properties: ["amount"],
limit: 100,
};
const cwResp = await hubspotSearch("/crm/v3/objects/deals/search", closedWonSearch, token);
const closedWon = cwResp.results.reduce(
(sum: number, d: any) => sum + (parseFloat(d.properties.amount) || 0),
0,
);
// Open pipeline (not closed) — for forecast view
const openSearch = {
filterGroups: [
{
filters: [
{ propertyName: "pipeline", operator: "EQ", value: pipelineId },
{ propertyName: "hs_is_closed", operator: "EQ", value: "false" },
{ propertyName: "hubspot_owner_id", operator: "EQ", value: ownerId },
],
},
],
properties: ["amount"],
limit: 100,
};
const openResp = await hubspotSearch("/crm/v3/objects/deals/search", openSearch, token);
const openPipeline = openResp.results.reduce(
(sum: number, d: any) => sum + (parseFloat(d.properties.amount) || 0),
0,
);
return {
closedWon,
closedWonCount: cwResp.total,
openPipeline,
asOf: new Date().toISOString(),
};
}
hubspotSearch is the same helper defined in section 1. Serve this function
from your internal ops dashboard and poll it on page load instead of embedding
a HubSpot report iframe. The CRM API reflects stage changes within seconds of
them happening. The full polling service (Express + 30-second in-memory cache
The canonical deduplication key is company_id + closedate_month +
deal_type_custom_field. Without this cross-reference, the same opportunity
appears in two pipelines and inflates ARR forecast.
The full findDuplicateDeals() and searchAllOpenDeals() TypeScript implementations live in implementation-guide.md § Multi-Pipeline Duplicate Detection. The algorithm:
hs_is_closed EQ false)GET /crm/v3/objects/deals/$DEAL_ID/associations/companiescompanyId — companies with deals in more than one pipeline are duplicatesOnce duplicates are identified, link them with a cross-reference association before closing one:
# Link a new-business deal to its expansion deal (association type 5 = deal-to-deal)
curl -s -X PUT \
"https://api.hubapi.com/crm/v4/objects/deals/${NB_DEAL_ID}/associations/deals/${EXP_DEAL_ID}/5" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" | jq '{fromObjectId, toObjectId, associationTypes}'| HTTP Status | Error | Root Cause | Action |
|---|---|---|---|
400 BAD_REQUEST | INVALID_FILTER | Search filter uses a property name that doesn't exist or uses wrong operator for type | Validate property names via GET /crm/v3/properties/deals before building filter; use EQ for enum, GTE/LT for date/number |
400 BAD_REQUEST | PROPERTY_DOESNT_EXIST | PATCH payload includes a property that was deleted or renamed | Run check-deal-properties.sh against the payload property list; catch and surface the missing property name to RevOps |
403 FORBIDDEN | MISSING_SCOPES | Token lacks crm.objects.deals.write or automation scope | Verify scopes via GET /oauth/v1/access-tokens/$TOKEN; re-issue private app token with correct scopes |
404 NOT_FOUND | OBJECT_NOT_FOUND | Deal ID in URL doesn't exist, or association target object doesn't exist | Confirm deal exists with GET /crm/v3/objects/deals/$DEAL_ID before writing; handle 404 in batch loops gracefully |
409 CONFLICT | OBJECT_ALREADY_EXISTS | Batch create includes a deal that matches a unique property value | Deduplicate input set; use batch update instead of create for existing deals |
429 TOO_MANY_REQUESTS | RATE_LIMIT | Exceeded 100 API calls/10s (Professional/Enterprise) or 250K/500K daily | Read Retry-After header and pause; add 100ms sleep between pages in search loops; use batch endpoints to collapse N updates into one call |
MONTH_START=$(python3 -c "import datetime; now=datetime.datetime.utcnow(); print(int(datetime.datetime(now.year,now.month,1).timestamp()*1000))")
MONTH_END=$(python3 -c "import datetime; now=datetime.datetime.utcnow(); import calendar; end=calendar.monthrange(now.year,now.month)[1]; print(int(datetime.datetime(now.year,now.month,end,23,59,59).timestamp()*1000))")
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/deals/search" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"filterGroups\": [{
\"filters\": [
{\"propertyName\": \"closedate\", \"operator\": \"GTE\", \"value\": \"$MONTH_START\"},
{\"propertyName\": \"closedate\", \"operator\": \"LTE\", \"value\": \"$MONTH_END\"},
{\"propertyName\": \"hs_is_closed\", \"operator\": \"EQ\", \"value\": \"false\"}
]
}],
\"properties\": [\"dealname\",\"amount\",\"dealstage\",\"pipeline\",\"hubspot_owner_id\"],
\"sorts\": [{\"propertyName\": \"amount\", \"direction\": \"DESCENDING\"}],
\"limit\": 50
}" | jq '.results[] | {id, name: .properties.dealname, amount: .properties.amount, stage: .properties.dealstage}'# deals-to-update.json: {"id":"12345","properties":{"dealstage":"appointmentscheduled"}}
jq -n --argjson ids '["11111","22222","33333"]' \
'{inputs: [$ids[] | {id: ., properties: {dealstage: "qualifiedtobuy"}}]}' \
> batch_payload.json
curl -s -X POST "https://api.hubapi.com/crm/v3/objects/deals/batch/update" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" \
-H "Content-Type: application/json" \
-d @batch_payload.json | jq '{status, numResults: (.results | length), errors: (.errors // [])}'curl -s "https://api.hubapi.com/crm/v3/pipelines/deals" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" | \
jq '.results[] | {pipelineId: .id, label: .label, stages: [.stages[] | {stageId: .id, label: .label, probability: .metadata.probability}]}'curl -s "https://api.hubapi.com/crm/v3/properties/deals" \
-H "Authorization: Bearer $HUBSPOT_TOKEN" | \
jq '[.results[] | select(.hubspotDefined == false) | {name, label, type, fieldType, groupName}]'Working with this skill produces:
hs_pipeline_loop_guard sentinel property
created in the portal, and a TypeScript safeStageTransition() wrapper that
prevents any workflow from re-triggering itself within a 60-second windowstale_deals.csv with a safe_to_close boolean
column; only rows with safe_to_close=True are candidates for auto-close
workflowshs_projected_amount diverges from amount × stage_probability by more than
5%, identifying deals where stage probability was changed without
recalculating projectionsclosedWon, closedWonCount, openPipeline, and asOf with sub-second
freshness versus the 4-hour reporting cache© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in skills/.curated/hubspot-deal-pipeline-automation of jeremylongshore/tons-of-skills-marketplace.
Open the folder on GitHubat commit cfae287
Hubspot Deal Pipeline Automation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Hubspot Deal Pipeline Automation this skilljeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~5.5k | Automated safety check: Pass | MIT | |
| Google Maps Exportgmapsscraper/google-maps-agent-skills | 132 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Lost Deal Revival AgentOthmane-Khadri/YALC-the-GTM-operating-system | 318 | — | ~3k | Automated safety check: Pass | MIT | |
| HubspotOpenClaudia/openclaudia-skills | 713 | — | ~1.8k | Automated safety check: Notes | MIT | |
| Aai Hubspotaai-labs/agent-barn | 109 | — | ~223 | Automated safety check: Pass | Apache-2.0 | |
| Hubspotrefly-ai/refly-skills | 204 | — | ~491 | Automated safety check: Pass | None |
gmapsscraper/google-maps-agent-skills
Export Google Maps business data to CSV, JSON, or CRM format (HubSpot, Pipedrive, Salesforce).
Othmane-Khadri/YALC-the-GTM-operating-system
Drafts revival messages for closed-lost deals when a public company signal contradicts the original objection.
OpenClaudia/openclaudia-skills
Manage HubSpot CRM contacts, companies, deals, and CMS content via API.
aai-labs/agent-barn
Use aai-cli to inspect HubSpot CRM records, files, events, conversations, visitor identification, and custom channels.
refly-ai/refly-skills
Integrate with HubSpot for CRM management. An agent skill from refly-ai/refly-skills.
Anil-matcha/awesome-muse-connectors
Read and manage the HubSpot CRM: contacts, contact search, deals.
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.
jeremylongshore/tons-of-skills-marketplace
Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.
jeremylongshore/tons-of-skills-marketplace
Execute proactive auto-loading: automatically detects and loads agents.md files.
jeremylongshore/tons-of-skills-marketplace
Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.
jeremylongshore/tons-of-skills-marketplace
Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.
jeremylongshore/tons-of-skills-marketplace
Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.
Works with
Categories
Automate and audit HubSpot deal pipeline operations without destroying real pipeline — covering stage automation loops, stale-deal safe-close logic, forecast reconciliation, custom property drift…. Hubspot Deal Pipeline Automation is an agent skill from jeremylongshore/tons-of-skills-marketplace. Automate and audit HubSpot deal pipeline operations without destroying real pipeline — covering stage automation loops, stale-deal safe-close logic, forecast reconciliation, custom property drift detection, quota dashboard cache-busting, and multi-pipeline duplicate detection.
Hubspot Deal Pipeline Automation fits situations like: debugging workflow automations that move deals between stages; auditing pipelines for stale; duplicated opportunities; reconciling forecast numbers that disagree across reports.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a claude-code`. Or copy the skill folder (skills/.curated/hubspot-deal-pipeline-automation in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/hubspot-deal-pipeline-automation in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a codex`. Or copy the skill folder (skills/.curated/hubspot-deal-pipeline-automation in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/hubspot-deal-pipeline-automation in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill hubspot-deal-pipeline-automation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hubspot-deal-pipeline-automation, .gemini/skills/hubspot-deal-pipeline-automation, .github/skills/hubspot-deal-pipeline-automation and .opencode/skills/hubspot-deal-pipeline-automation in your project.
Going by SKILL.md and its folder, Hubspot Deal Pipeline Automation needs the command-line tools its instructions call (jq, curl and python3) and credentials named HUBSPOT_TOKEN. Our summary lists: Python 3; Node.js; A credential in HUBSPOT_TOKEN. Its frontmatter pre-approves these tools: Read, Write, Bash(curl:*), Bash(jq:*), Bash(python3:*). Compatibility (from SKILL.md): Designed for Claude Code.
SKILL.md names 2 domains. In commands or code: api.hubapi.com; the agent is likely to contact it when it follows the instructions. As links in the text: developers.hubspot.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Hubspot Deal Pipeline Automation is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 8.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Hubspot Deal Pipeline Automation: Google Maps Export (gmapsscraper/google-maps-agent-skills, 132 stars), Lost Deal Revival Agent (Othmane-Khadri/YALC-the-GTM-operating-system, 318 stars), Hubspot (OpenClaudia/openclaudia-skills, 713 stars) and Aai Hubspot (aai-labs/agent-barn, 109 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.
Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.