A contact is one person, and the Contacts section is where they live. This page covers three things that sit next to each other in the Engage workspace: the contact list, the record you get when you select someone, and the Contact Filters section that turns that list into saved views, clusters and groups.
Contacts, the profile, editing and contact groups are free on every plan. Two things are conditional and both are marked where they appear: per-person site history needs Starter, and how many contacts your plan lets you see is a quota with an unusually quiet failure mode.
What a contact is
One person, keyed by email address within your workspace. The email address is the natural key, which is why it is the one field you cannot edit — see the note at the end of this page. Everything else about the person can be changed, by you or by a later import.
The six sources
Every contact records how it first arrived, and that value is stamped once and never rewritten.
| Source | Shown in the Profile facet as | What created it | Ever changes |
|---|---|---|---|
| Form submission | form | Somebody submitted one of your published forms | No |
| CSV import | upload | A row in a file you imported | No |
| Email address capture | valid_email | An address confirmed through the email flows | No |
| Salesforce | salesforce | The bespoke Salesforce integration | No |
| Documentation sign-in | mcp | A reader signed in to your documentation | No |
| Added by hand | manual | Somebody used + in Engage, or the create_contact tool | No |
The commonest by a distance is form — a contact is created the moment someone submits one of your forms, as Form submissions describes. A reader who signs in to your documentation through the MCP flow becomes a contact too, with source mcp: see Reader sign-in flow. A contact whose source reads salesforce came in through one inbound webhook rather than a configurable sync — CRM integration is specific about what is and is not connected. Bringing an existing list in is its own flow.
Because source is insert-only, re-importing a CSV row for someone who first arrived through a form leaves them stamped form. That is deliberate: the source answers “how did we meet”, not “when did we last touch this record”.
Reading the list
The list is fetched a page at a time — 50 rows per request, capped at 100 — and virtualized, so it scrolls continuously rather than paging, and stays smooth at tens of thousands of rows.
Each row shows an initials avatar, the person’s name (falling back to their email address when they have no name), their job title or email as a subtitle, and a readiness dot. Where a person has opted out, an Opted out marker takes the dot’s place — a deliberately louder signal, because the dot is about how ready they are and the marker is about whether you may contact them at all.
Rows are sorted by readiness, highest first. The group label reads By readiness · N with your workspace’s total; while a search is running it reads By readiness · n of N, so the total stays visible while you narrow.
The search box is server-backed and debounced, so it fires when you pause rather than on every keystroke. It matches name, email and title. When nothing matches it says “No contacts match your search.”
The same list answers two quite different questions, and it is worth knowing which one you are asking:
- Find a person
- Build an audience
Type into the left-panel search box. It matches name, email and title, so a surname, a domain fragment or a job title all work. Selecting a row puts that person in the center card and their facets in the right rail, and the URL becomes a link you can send to a colleague.
This is the mode for answering “what do we know about this person before I reply to them”.
Switch to the Contact Filters section instead. Its left panel is a set of saved views and clusters — Hot leads, Stalled, one row per persona, one per committee role — and below them your saved contact groups. Selecting one puts a filterable contact table in the center card.
This is the mode for answering “who should this email go to”, and its output is a group that an email send can be addressed to.
The contact record
Selecting a person opens their record. The first card is the profile, and every field on it edits in place — click a value, type, move on. Each field saves on its own; there is no edit mode and no Save button.
Editing needs contact:write, which starts at the Content Publisher role. Without it the same card renders as read-only text. Note that this is a stronger requirement than editing a form, which only needs Content Writer — see Roles and permissions.
| Field | Editable here | Set by an import or a form | Notes |
|---|---|---|---|
| No | Yes, on creation | The natural key; rendered with a (not editable) marker | |
| First name | Yes | Yes | |
| Last name | Yes | Yes | |
| Title | Yes | Yes | Drives the inferred committee role |
| Account | Yes | Yes, via the company column or field | A picker over your accounts; clearing it detaches the contact |
| Phone | Yes | Yes | |
| LinkedIn URL | Yes | Yes | Rendered as a View profile link in the Profile facet |
| Country | Yes | Yes | |
| Timezone | Yes | Yes | An IANA picker; an invalid value is discarded rather than stored |
| Source | No | Set once, on creation | See the table above |
| Email domain | No | Derived from the email address | Used to tell corporate addresses from consumer ones |
| Hard bounce | No | Set by the mail system | Recorded when a send permanently fails |
The status strip and what Leed says
Under the profile card: a Readiness meter, the Journey stage as four dots and a pill, Fit out of 100, Intent out of 100, and — when one was inferred — a Committee role pill. Until the first recompute these read as dashes.
The generated sentence below the strip names the person’s stage and then either the persona they matched with its confidence in words, or a prompt to run Recompute scores. All of it comes from one deterministic pass over your own data, described on Engage scores.
Persona match
A card showing the matched persona’s name, the committee role label, and a confidence meter labeled High, Likely or Low. When there is no match it says so in a sentence rather than showing an empty meter, which matters because “no match” and “match with zero confidence” mean very different things.
A persona is matched through the contact’s inferred committee role, and only through that — so a contact with no job title never matches a persona, however well the persona’s prose describes them. Personas covers how to set them up so they can match.
Site engagement
Above Starter, this block shows Sessions, Pages viewed, Form fills and Last active across the person’s whole history; then Content consumption, the six pages they read most, each with a bar and a view count plus a +N more pages tail; then their six most recent sessions with date, duration, page count and entry source. Entry source is the referring host of the session’s first page view, falling back to Email for a session that began from an email link and Direct otherwise.
The gate withholds data rather than erroring — nothing 402s, nothing fails — which is exactly why the panel says “upgrade” instead of “no activity yet”. It is one of the four gate behaviors described in When a feature is gated. Because the data was captured all along, upgrading reveals history retroactively rather than starting a clock. What Leed was recording before this person had a name is the subject of Lead profiles and visitor identity.
Emails
Every email this contact was sent, newest first, each with the batch name, when it was sent, and one status pill. The pill shows the furthest action taken, not a history — one row, one pill.
| Pill | Meaning | Wins over |
|---|---|---|
| Opted out | They unsubscribed from this send | Everything |
| Clicked | They followed a tracked link | Opened, Bounced, Received |
| Opened | The open pixel fired | Bounced, Received |
| Bounced | The message never landed | Received |
| Received | Sent, with nothing recorded since | — |
Note the precedence: opting out outranks a click, and a click outranks an open, so a contact who clicked and then unsubscribed shows Opted out. This is per-recipient tracking written by the open and click trackers described in Tracked links and open tracking. An opted-out contact is suppressed on every subsequent send, not merely filtered out of a list — see Unsubscribes and opt-outs.
The facet rail
| Facet | What it holds |
|---|---|
| Profile | Email, Title, Account, Phone, Country, Timezone, LinkedIn as a View profile link, and Source. Fields with no value are omitted rather than shown blank. |
| Match | The matched persona, its committee role, the confidence as a percentage and a meter, and a fixed “Why this match” sentence. |
| Signals | The readiness meter, then Readiness, Fit, Intent, Stage and the date the score was computed — or “Not scored yet.” |
| Activity | Page views and form submissions interleaved newest-first, capped at the 24 most recent items. Starter and up. |
| Actions | A red opted-out warning when it applies, then Draft direct outreach, which opens Chat with a prompt naming this person, their title, their account and their address. |
Adding a contact by hand
The + button opens /engage/contacts/new — a real URL, so a create form is linkable and survives a reload. It asks for Email (required), First name, Last name and Title. The button stays disabled until the address looks like an address; the server validates it properly and derives the email domain.
The behavior when that address already exists is worth knowing, because it is the safe one: only the fields you actually filled in are applied, and the existing contact keeps its original source. Adding “someone we already have” by hand is a merge, never an overwrite, and it never re-stamps a form-fill contact as manual.
Contact Filters: saved views, clusters and groups
The Contact Filters section is the same people, arranged for choosing rather than for looking up. Its left panel is grouped into up to four blocks, each row showing a count:
| View | How membership is decided | Includes unscored contacts | Cap |
|---|---|---|---|
| All contacts | Everyone you can see | Yes | — |
| Hot leads | Readiness of 70 or more | No | — |
| Stalled | Readiness of 45 or less | No | — |
| Cluster by persona | One row per persona with at least one matched contact | No | — |
| Cluster by committee role | One row per inferred role with at least one contact | No | — |
| Contact group | The group’s saved filters and upload batches | Yes | 1,000 members |
An unscored contact is in neither Hot nor Stalled — it has no readiness to band. Clusters appear only for personas and roles that actually have someone in them, so an empty workspace shows just the three saved views.
Selecting a view puts a contact table in the center card, with a four-stage funnel strip above it, its own search box, and a table/cards/compact view switch. When a contact group resolves to more than 1,000 members the table says so directly, and suggests refining the group with a filter rather than scrolling.
Note that the Hot and Stalled bands (70 and 45) are not the same numbers as the readiness dot colors (75 and 50). A contact can carry a green dot and not appear in Hot. Both sets of thresholds are documented on Engage scores.
Building a contact group
A group is a name, a description, a set of filters and any number of selected upload batches. It stores the filters, not a frozen list, so anyone who matches later is included automatically — which is what makes a group usable as a standing audience.
Create one with + in the Contact Filters section. As you edit the filters, the right rail previews the members they currently match, so you can see the size of the audience before you save it.
| Field | Kind | Operators | In the builder |
|---|---|---|---|
email | String, one or more values | Contains | Emails |
title | String, one or more values | Contains | Titles |
company_name | String, one or more values | Contains | Companies |
competitive_products | String, one or more values | Contains | Competitive Products |
company_size | Number | = > >= < <= | Company Size |
company_revenue | Number | = > >= < <= | Company Revenue |
company_sic_codes | String, one or more values | Contains | API only |
company_industry | String, one or more values | Contains | API only |
current_customer | Boolean | Is | API only |
| Upload batches | Selection | — | Uploads |
The last three exist in the data model and are honored by the server, but the builder has no control for them — a group filtering on industry or on current-customer status has to be created through the API. Leaving every filter blank includes every contact, which is a legitimate way to make an “everyone” group.
A saved group is what a marketing email is addressed to; Contact groups and audiences picks the story up from there. Each CSV import also creates a group for you automatically, named after the import.
What your plan hides
Your plan caps how many contacts you can see, not how many you can capture:
| Plan | Contacts you can see |
|---|---|
| Free | 250 |
| Starter | 1,000 |
| Growth | 10,000 |
| Enterprise | Unlimited |
Capture never stops. Forms keep working, imports keep running, readers keep signing in. What changes above the cap is which contacts are readable: the window keeps the oldest contacts — the set you held when you crossed the line — and locks the newest ones.
A locked contact is excluded from the list, from search, from every saved view and cluster, from paging and from export.
The meter itself, what it looks like as you approach the limit, and what happens when you cross it are on Usage and limits.
Contacts from an AI client
Four Operator MCP tools cover contacts: list_engage_contacts (paginated, searchable, readiness-sorted), get_engage_contact, create_contact and update_contact. They call the same routes as the screen, so they obey the same RBAC and the same visibility cap — including the 404 for a locked contact. create_contact is the same non-destructive merge described above. See MCP tools for contacts and accounts.
Why I cannot change an email address
The email address is the key Leed matches a person on. Every capture path — a form submission, a CSV row, a documentation sign-in, an email confirmation — resolves to “the contact in this workspace with this address, or a new one”. A contact’s sessions, page views, form fills, email history, opt-in records and score all hang off the row that address resolved to.
Editing the address would therefore mean one of two things: silently pointing the record at a different person’s key, or leaving the old address in every downstream capture path so the next form fill from that person creates a duplicate. Neither is a good outcome, so the field is read-only and marked (not editable) in the profile card.
If someone’s address has genuinely changed, add a contact with the new address — it will begin accumulating its own history from that point — and treat the old record as historical. There is no merge tool.