---
ref: workflow:job-title-personas
title: Sort contacts into buyer personas from their job titles
author: thedogwiththedataonit
tools: [tool:hubspot/search-crm-records, tool:typesafe/answer-typed-questions, tool:hubspot/upsert-contacts, tool:hubspot/add-to-segment]
tags: [capability:build-audience, capability:classify-signals, capability:manage-crm, has:api, motion:outbound]
updated: 2026-09-29
---

# 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 roles
- `persona_property`: the HubSpot contact property that holds the persona, created once as a dropdown with the persona names, e.g. buyer_persona
- `seniority_property`: the HubSpot contact property that holds the seniority, created once as a dropdown of the five levels in step 2, e.g. buyer_seniority
- `persona_lists`: the static HubSpot list for each buyer persona, e.g. Persona: Economic buyer
- `max_contacts`: the most contacts to sort in one run, e.g. 500
- `min_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`, `email` or a custom unique property. On MCP, `manage_crm_objects` waits for the user to confirm the proposed changes before it writes.
- Add records to a segment: Only `MANUAL` or `SNAPSHOT` segments take records; `DYNAMIC` ones 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.

```json
{ "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

1. **Find unsorted contacts** with Search CRM records (HubSpot). Search contacts that have a `jobtitle` and an `email` and no `persona_property`, up to `max_contacts`. Keep each contact's ID, email, job title and company.
2. **Map each title** with Answer typed questions (TypeSafe AI). Send each job title and company as the state, with a choice `persona` over `personas`, each label described by its line, and a score `seniority` on 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** 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.
4. **Save them** with Create or update contacts (HubSpot). After the user approves, update each contact by email with its persona in `persona_property` and its most likely seniority level in `seniority_property`.
5. **Add them to lists** with Add records to a segment (HubSpot). Add each contact ID to the list in `persona_lists` for 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.
