
Crm Lookup
Resolve HubSpot contacts, companies, deals, and tickets by ID, email, domain, or name, then follow associations before outreach or downstream CRM writes.
Overview
crm-lookup is an agent skill for the Grow phase that finds HubSpot CRM records and associations via the HubSpot CLI.
Install
npx skills add https://github.com/hubspot/agent-cli-skills --skill crm-lookupWhat is this skill?
- Read-only HubSpot CLI lookups by ID (batch up to ~100), email, domain, or name fragment
- Live schema-driven property picks via hubspot properties list per object type
- First-pass property sets for contacts, companies, deals, and tickets plus hs_analytics attribution fields on contacts
- Association traversal for full account pictures (contacts at company, deals for contact)
- Explicit handoff to bulk-operations for JSONL piping, pagination, and any write after lookup
- Up to ~100 record IDs in a single batch lookup
- First-pass property tables for contacts, companies, deals, and tickets
Adoption & trust: 1 installs on skills.sh; 2 GitHub stars; trending (+100% hot-view momentum).
What problem does it solve?
You need a specific HubSpot contact, company, or deal but only have an email, domain, name fragment, or a handful of IDs.
Who is it for?
Indie operators and solo founders who already use HubSpot CLI skills and need quick, read-only account context before lifecycle or support actions.
Skip if: Builders who want to create or bulk-update records without reading bulk-operations first, or teams on CRMs other than HubSpot.
When should I use this skill?
Triggers such as find contact, find contact by email, find company by domain, look up deal, contacts at this company, deals for this contact, or find record.
What do I get? / Deliverables
You get matching records with the properties you chose and linked objects mapped so a follow-on bulk-operations flow can update or export safely.
- Resolved CRM records with selected properties
- Association map for related contacts, companies, and deals
Recommended Skills
Journey fit
Canonical shelf is Grow because solo builders reach for this skill when managing pipeline, accounts, and support context—not when first wiring integrations. Lifecycle fits record lookup and association traversal for contacts, companies, and deals in an active customer base.
How it compares
Use targeted CLI lookups instead of ad-hoc chat guesses or full-object exports when you already know the identifier.
Common Questions / FAQ
Who is crm-lookup for?
Solo and indie builders running HubSpot from the terminal who need accurate record and association context before sales, support, or pipeline work.
When should I use crm-lookup?
In Grow lifecycle work when you need to find a contact by email, a company by domain, a deal by name, or contacts and deals tied to an account; also during Build integrations when an agent must resolve HubSpot IDs before automation.
Is crm-lookup safe to install?
The skill is read-only by design, but you should still review the Security Audits panel on this Prism page and treat HubSpot CLI credentials as secrets.
Workflow Chain
Then invoke: bulk operations
SKILL.md
READMESKILL.md - Crm Lookup
## Source of truth `hubspot <command> --help` is authoritative. Read [`bulk-operations/SKILL.md`](../bulk-operations/SKILL.md) first — it owns JSONL piping, pagination, batch-get-via-stdin, and the safety flow for any write that comes after a lookup. This skill is read-only. ## Pick properties from the live schema Schemas drift. Run `hubspot properties list --type <type>` for the live set. First-pass `--properties` for a brief: | Object | `--properties` | |---|---| | contacts | `email,firstname,lastname,company,phone,lifecyclestage,hubspot_owner_id` | | companies | `name,domain,industry,annualrevenue,numberofemployees,hubspot_owner_id` | | deals | `dealname,amount,dealstage,closedate,hubspot_owner_id,hs_is_closed_won` | | tickets | `subject,hs_pipeline_stage,hs_ticket_priority,hubspot_owner_id` | Contact ad/campaign attribution lives on `hs_analytics_*` (e.g. `hs_analytics_source`, `hs_analytics_source_data_1`/`_2`, `hs_analytics_first_touch_converting_campaign`, `hs_analytics_last_touch_converting_campaign`). Full list: `hubspot properties list --type contacts | grep hs_analytics_`. ## 1. Lookup by ID Up to ~100 IDs in a single batch call: ```bash hubspot objects get --type contacts 12345 67890 23456 --properties email,firstname,lastname,company,phone,lifecyclestage ``` ## 2. Find one by email / domain (exact match) `email`/`domain` are exact-match — normalize to lowercase. Multiple `--filter` flags are OR'd. ```bash hubspot objects search --type contacts --filter "email=jane@acme.com" \ --properties email,firstname,lastname,company,lifecyclestage,hubspot_owner_id hubspot objects search --type companies --filter "domain=acme.com" \ --properties name,domain,industry,annualrevenue,hubspot_owner_id # OR — multiple emails in one call hubspot objects search --type contacts \ --filter "email=alice@acme.com" --filter "email=bob@acme.com" --properties email,firstname ``` ## 3. Find by partial name (token + client-side narrowing) `~` is CONTAINS_TOKEN — matches whole space-separated words. `dealname~acme` finds "Acme Renewal" but **not** "AcmeCorp". For substring, pipe to `jq`. There's no full-text search across all fields — pick the property. ```bash hubspot objects search --type deals --filter "dealname~acme" --properties dealname,amount,dealstage \ | jq -c 'select(.properties.dealname | ascii_downcase | contains("acme corp"))' ``` ## 4. Find all associated records (two CLI calls, not xargs) Pattern: `associations list` → `jq -c '{id}'` → `objects get` batch. **Never** `xargs -I{} hubspot objects get …` — that spawns one process per record. Use **plural** in `--from` (`contacts:`, `companies:`, `deals:`); `--help` shows singular but only plural avoids a warning. ```bash # All contacts at a company hubspot associations list --from companies:67890 --to contacts \ | jq -c '{id}' \ | hubspot objects get --type contacts --properties email,firstname,lastname,jobtitle # Open deals for a contact (filter client-side; "open" varies by pipeline) hubspot associations list --from contacts:12345 --to deals | jq -c '{id}' \ | hubspot objects get --type deals --properties dealname,amount,dealstage,hs_is_closed \ | jq -c 'select(.properties.hs_is_closed != "true")' ``` ## 5. Get a record plus its associations ```bash contact_id=12345 hubspot objects get --type contacts $contact_id --properties email,firstname,lastname,company,lifecyclestage # Associated company (usually one) hubspot associations list --from contacts:$contact_id --to companies | jq -c '{id}' | head -1 \ | hubspot objects get --type companies --properties name,domain,industry,annualrevenue # Associated deals hubspot