Sort contacts into buyer personas from their job titles
Finds HubSpot contacts with no persona, maps each job title to a persona and seniority with Jev, and adds them to a list per persona.
Outcome
A table of every contact checked, with its job title, persona, seniority and Jev's confidence.
Each contact's persona and seniority saved on its HubSpot record, with the unsure ones decided by you.
Each buyer added to the HubSpot list for its persona, ready for that persona's sequence.
How it works
- 1
Find unsorted contacts
HubSpotSearch contacts that have a
jobtitleand anemailand nopersona_property, up tomax_contacts. Keep each contact's ID, email, job title and company. - 2
Map each title
TypeSafe AISend each job title and company as the state, with a choice
personaoverpersonas, each label described by its line, and a scoreseniorityon five levels (individual contributor, manager, director, vice president or head of, C-level or founder). Keep each contact's persona, seniority and their confidences. - 3
Check the unsure ones with the user
Your agentShow the user every contact whose persona or seniority confidence is below
min_confidence, with Jev's two most likely answers, and keep the one the user picks. - 4
Save them
HubSpotAfter the user approves, update each contact by email with its persona in
persona_propertyand its most likely seniority level inseniority_property. - 5
Add them to lists
HubSpotAdd each contact ID to the list in
persona_listsfor its persona, leaving out the personas marked as not buyers.
You'll be asked for
Your buyer personas, each with one line on who belongs, marking any that are not buyers
e.g. economic_buyer: owns the budget; champion: runs the work every day; technical_evaluator: vets security and integrations; end_user: uses the product; not_a_buyer (not a buyer): students, recruiters and unrelated roles
The HubSpot contact property that holds the persona, created once as a dropdown with the persona names
e.g. buyer_persona
The HubSpot contact property that holds the seniority, created once as a dropdown of the five levels in step 2
e.g. buyer_seniority
The static HubSpot list for each buyer persona
e.g. Persona: Economic buyer
The most contacts to sort in one run
e.g. 500
How sure Jev must be before its answer is used without you
e.g. 0.8
The file your agent runs
job-title-personas.md
Sort contacts into buyer personas from their job titles
Finds HubSpot contacts with no persona, maps each job title to a persona and seniority with Jev, and adds them to a list per persona.
Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.
Outcome
- A table of every contact checked, with its job title, persona, seniority and Jev's confidence.
- Each contact's persona and seniority saved on its HubSpot record, with the unsure ones decided by you.
- Each buyer added to the HubSpot list for its persona, ready for that persona's sequence.
Inputs
Ask the user for these before you start.
personas: your buyer personas, each with one line on who belongs, marking any that are not buyers, e.g. economic_buyer: owns the budget; champion: runs the work every day; technical_evaluator: vets security and integrations; end_user: uses the product; not_a_buyer (not a buyer): students, recruiters and unrelated rolespersona_property: the HubSpot contact property that holds the persona, created once as a dropdown with the persona names, e.g. buyer_personaseniority_property: the HubSpot contact property that holds the seniority, created once as a dropdown of the five levels in step 2, e.g. buyer_senioritypersona_lists: the static HubSpot list for each buyer persona, e.g. Persona: Economic buyermax_contacts: the most contacts to sort in one run, e.g. 500min_confidence: how sure Jev must be before its answer is used without you, e.g. 0.8
Set up
HubSpot (tool:hubspot/search-crm-records, tool:hubspot/upsert-contacts, tool:hubspot/add-to-segment)
Use the first option your agent supports.
Notes:
- Search CRM records: The MCP tool takes up to five groups of six filters and returns up to 200 records per page.
- Create or update contacts: Matches each contact on
idProperty,emailor a custom unique property. On MCP,manage_crm_objectswaits for the user to confirm the proposed changes before it writes. - Add records to a segment: Only
MANUALorSNAPSHOTsegments take records;DYNAMICones follow their filters. The MCP tool asks the user to confirm each write.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "hubspot": { "url": "https://mcp.hubspot.com" } } }
- Search CRM records: call the MCP tool
search_crm_objects - Create or update contacts: call the MCP tool
manage_crm_objects - Add records to a segment: call the MCP tool
manage_segment
API (official)
- Base URL: https://api.hubapi.com
- Search CRM records:
POST /crm/objects/2026-09/{objectType}/search - Create or update contacts:
POST /crm/objects/2026-09/contacts/batch/upsert - Add records to a segment:
PUT /crm/lists/2026-09/{listId}/memberships/add - Auth: send the header
Authorization: Bearer $HUBSPOT_API_KEY
Note: Use a service key or an app's static access token with the CRM scopes the calls need; paths carry a dated version such as 2026-09.
Answer typed questions (TypeSafe AI, tool:typesafe/answer-typed-questions)
Use the API.
- Base URL: https://api.typesafe.ai
- Endpoint:
POST /v1/systemone - Auth: send the header
Authorization: Bearer $TYPESAFE_API_KEY - Get a key: https://console.typesafe.ai
Note: Put every question about one record in one request. GET /v1/models lists the models and is the cheapest check of a key; a request over the rate limit gets a 429 with a Retry-After header.
Note: Send state, model (jev-latest) and named questions, each with type, instructions and criteria: a choice maps labels to descriptions, a score lists its levels in order, a noul's is optional. Read a score by its most likely level; send unsure answers to a person.
Before step 1, confirm access to each service with its cheapest read-only call, like a list or a search. Never send or change anything to test access.
Steps
- Find unsorted contacts with Search CRM records (HubSpot). Search contacts that have a
jobtitleand anemailand nopersona_property, up tomax_contacts. Keep each contact's ID, email, job title and company. - Map each title with Answer typed questions (TypeSafe AI). Send each job title and company as the state, with a choice
personaoverpersonas, each label described by its line, and a scoreseniorityon five levels (individual contributor, manager, director, vice president or head of, C-level or founder). Keep each contact's persona, seniority and their confidences. - Check the unsure ones with the user yourself. Show the user every contact whose persona or seniority confidence is below
min_confidence, with Jev's two most likely answers, and keep the one the user picks. - Save them with Create or update contacts (HubSpot). After the user approves, update each contact by email with its persona in
persona_propertyand its most likely seniority level inseniority_property. - Add them to lists with Add records to a segment (HubSpot). Add each contact ID to the list in
persona_listsfor its persona, leaving out the personas marked as not buyers.
Notes
Keyword rules break on titles like "Growth Ninja", "GM, Americas" or "Head of People & Revenue Ops"; the one-line description of each persona is what Jev decides against, so write them in your own words. A title that sits between two seniority levels shows it in the probabilities, which is why step 3 checks seniority too.
Run it weekly, or after every list import, so new contacts land in the right sequence.
Rules
- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
