audience-targeting

Build a targeted contact segment by filtering on lifecycle, engagement, jobtitle, geography, or firmographics — then export it as JSONL for a campaign or downstream tool.

By hubspot · 1,289 installs

npx skills add hubspot/agent-cli-skills --skill audience-targeting

Source repository · Upstream listing

Foundation Read bulk operations/SKILL.md first — pagination, JSONL piping, destructive op safety. Reshape recipes in bulk operations/resources/json patterns.md . Resource: resources/contact segmentation filters.md is the filter expression cookbook (lifecycle, lead status, email engagement, activity, deals, owner). Filter syntax cheat sheet Source of truth: hubspot objects search help . One filter flag = one AND group: filter "lifecyclestage=lead AND !hubspot owner id" . Multiple filter flags are OR'd. Use for enum OR enum. Operators: = , != , , = , < , <= , ~ (CONTAINS TOKEN — whole word, NOT substring), @= (IN), @!= (NOT IN). HAS PROPERTY: bare name or name? . NOT HAS PROPERTY: !name . Dates: YYYY MM DD . Limits (CRM search API): max 5 filter flags, max 6 conditions per flag, max 18 conditions total. Prefer @= / @!= for enum lists — lifecyclestage@=lead,customer is one condition, filter "lifecyclestage=lead" filter "lifecyclestage=customer" is two groups. "None of these, or empty" needs two groups — @!= skips records where the property is unset, so OR in a !name group and repeat the shared conditions in both: filter "hubspot owner id=123 AND lifecyclestage@!=customer,evangelist" filter "hubspot owner id=123 AND !lifecyclestage" ~ gotcha: jobtitle~director matches the token "director", not arbitrary substrings. No regex operator — search broadly, post filter with jq . Properties this skill turns on Full live list: hubspot properties list type contacts . Enum options: hubspot properties options list type contacts <name jq r '.value' . As a fallback (e.g. to see which values are actually in use), read live records: hubspot objects list type contacts properties <name limit 100 format json jq r '.data[].properties.<name // empty' sort u . Core fields used here: lifecyclestage , hubspot owner id (bare/ ! for owned/unowned; hubspot owners list for IDs), hs email optout ( !=true excludes opted out), hs email last open date / notes last contacted (recency), jobtitle / country / city (string = or ~ ), num associated deals (0 net new, =1 has pipeline). Firmographics ( industry , numberofemployees , annualrevenue ) live on companies — see cross object section. Common segments More patterns (lead status, deals, owners, combined AND/OR) in resources/contact segmentation filters.md . Cross object: companies in industry → their contacts industry / numberofemployees / annualrevenue live on the company. Build the company set, then traverse — never xargs I{} hubspot objects get per company. associations list emits {"id":"...","labels":[...],"associationTypes":[...]} — {id} feeds directly into a single batched objects get . Saving and reusing a segment A segment is a JSONL file. Re use for updates, exports, or re fetches: Destructive ops on a saved segment follow the dry run → digest → confirm flow in bulk operations/SKILL.md . Save as a HubSpot list or view A JSONL segment is portable, but you can also persist an audience in HubSpot: List — hubspot segments create saves a list; segments get / list inspect it; segments members list reads members; segments members add / members remove manage membership. Use segments update filters to set a dynamic list's filter criteria. View — hubspot views create type <t name "..." columns a,b [ filters file filters.json] [ sort prop:asc] saves a filter set as a reusable object view; views list / get / update / replace field / delete manage it. Size it first — hubspot objects count type contacts filter "..." returns {"object type":"contacts","total":N} without paging, so you can size an audience before saving or exporting it. Related read only signals (context for targeting) hubspot buyer intent — visiting company intent signals (read only). Requires OAuth login ( hubspot auth login ); service keys are NOT supported. hubspot analytics traffic sources — where sessions/contacts came from, for source based segmentation. hubspot marketing forms list — form definitions, to segment by which form a contact converted on. Run each command's help for the full surface. Known limits ~ is token match, not substring. No regex operator. Enum options: hubspot properties options list type contacts <name (fallback: read live records via objects list + jq ). associations list has no batch from , and returns one page (default 100) per call. Loop to gather IDs and page each call with limit / after until .meta.next is null, then batch the downstream objects get — otherwise a company with 100 associated contacts truncates silently. For 100 results, use the pagination loop in bulk operations/SKILL.md .