# Contacts

> The specification of the Reply contact — one record per person with profile fields, custom fields, an email validation status, 14 sequence statuses, and a separate pipeline stage. Called People in the app.

**A contact is Reply's record for one person — profile fields, custom fields, an email validation status, and a pipeline stage. The app labels the section People; the API noun is Contact. Inside each sequence the contact carries statuses drawn from 14 values, and Opted Out is the only status retained outside sequences.**

_Status: Reviewed — human-edited, facts not yet confirmed against the product._

> **Contact vs Company.** A Contact is a person; a [Company](/specifications/companies) is
> the organization the person belongs to. The Reply app labels these People and Accounts.

## At a glance

| Aspect | Detail |
| --- | --- |
| **What it is** | The record for one person — profile fields, custom fields, an email validation status, sequence statuses, and a stage. People in the app; Contact in the API |
| **Belongs to / Contains** | Belongs to one [company](/specifications/companies) at a time and an owner; member of any number of [lists](/specifications/lists); processed by [sequences](/specifications/sequences) |
| **Surfaces** | UI (People → Contacts) · REST API · MCP |
| **Key limit** | Up to **50** custom fields per account; contact storage **100,000** by default — see [Limits](/reference/limits) |
| **Lifecycle** | Statuses (14 values, up to 4 at once) track processing inside a sequence; a separate stage tracks engagement across all outreach |
| **Does not** | Send anything by itself, keep the Bounced status when moved to another sequence, or shed Opted Out — that status is retained even outside sequences |
| **Plans** | With Team Edition in public mode, only the sequence owner can change a contact's status |

## Definition

A contact is the record for one person. The app calls the section **People** — the
People → Contacts page — and the API noun is Contact. The contact grid shows the standard
profile fields — Name, Email, Provider, Account, Domain, Company Size, Stage, Industry,
Owner, Title, Sequence, Status, Inbox, # Of Calls, Country, City, State, Phone, LinkedIn
Recruiter, LI Sales Navigator, and Timezone — plus any custom fields you add.

## Purpose

Contacts are what sequences process, what imports and [prospect searches](/specifications/prospect-data)
produce, what enrichment fills in, and what replies are matched against. The People page
organizes them with quick filters (All, My, Opened, Replied, Bounced, Opted Out, To Call,
Clicked), smart filters with saved views, [lists](/specifications/lists), and bulk quick
actions such as email validation, enrichment, and moving to sequences.

## Relationships

| Relationship | Object |
| --- | --- |
| Belongs to | One [company](/specifications/companies) at a time, plus an owner — the team member responsible for the contact |
| Member of | Any number of [lists](/specifications/lists) |
| Processed by | [Sequences](/specifications/sequences) — statuses track processing per sequence; the contact card's Sequences tab lists current and past sequences |
| Enriched by | [Prospect data](/specifications/prospect-data) services — enrichment, AI custom fields, and email validation |

## Creation

Contacts are created by manual entry (**New Contact → Create manually** on the People
page — **Email** and **First Name** are the mandatory fields), CSV import, a
[Realtime B2B Data search](/specifications/prospect-data), CRM integration sync, and the
API. Edits happen in the contact card; to edit in bulk, re-import a CSV with the new
values and the **Update missing fields** option checked. Duplicates are matched rather
than re-created — see [Contact deduplication](/behavior/contact-deduplication).

## Lifecycle and states

> **Status vs stage.** Contact statuses represent the state of processing within a specific
> sequence, and Reply assigns them automatically based on the interaction. Contact stages
> represent the level of interaction and engagement across the entire outreach process and
> are set from the People page. See [Statuses](/reference/statuses).

A contact that is part of a sequence carries statuses drawn from these 14 values:

| Status | Assigned when | Manual control |
| --- | --- | --- |
| **Active** | The contact is added to an active sequence — steps can be sent and replies tracked | Yes — can be changed to Paused, Finished, Out of office, or Opted Out; to Bounced or Replied only after at least one email was received |
| **Paused** | Set manually to temporarily halt sending and reply tracking | Yes — only for contacts that are in a sequence; revert to Active to resume |
| **Missing Data** | A template variable has no value in the contact's profile | Removal is manual — fill in the variable or remove it from the template; no emails are sent while set |
| **Bounced** | An email is returned undelivered | Can also be set manually after at least one email was sent; fix the address, remove the status, and set Active to resend |
| **Out of office** | An auto-reply with out-of-office key words is detected | Yes — further steps stop until the status is removed or the reply is processed automatically |
| **Finished** | The prospect replies, or all steps have been sent | Yes — back to Active only if steps remain or new steps were added; no sending or reply detection while set |
| **Contacted** | The contact received at least one email from the current sequence | No |
| **Opted Out** | The prospect clicks the opt-out link, or an unsubscribe reply is sorted into the Do Not Contact inbox category | Yes — can be set and removed manually; any team member can set it |
| **Replied** | The prospect responds by email (from the same address, or forwarded from a thread) or by SMS | Yes — the sequence stops by default; usually comes together with Finished |
| **Opened** | The prospect opens an email, with opens tracking enabled | No |
| **Clicked** | The prospect clicks a tracked link, with links tracking enabled | No |
| **Auto-replied** | An automatic reply is detected | No — cannot be set or removed manually; comes along with Finished |
| **To call** | The contact is moved to a Call step in a sequence | Yes — can also be set from the Contact sidebar |
| **Called** | Any call action — a completed Call task, a Cloud Calls call, or a logged call | Permanent — removable only manually via the Contact sidebar |

Rules that apply across statuses:

- Each contact can have up to **4** statuses at the same time.
- With Team Edition in public mode, only the sequence owner can change the status of contacts not assigned to them; any team member can assign Opted Out.
- Opted Out is the only status retained for a contact even when it is not in a sequence, and a contact with it cannot be moved to a different sequence.
- Bounced is not retained when the prospect is shifted to a different sequence.

Separately from statuses, each contact carries one **stage** — a label such as
Interested, Engaging, Not Interested, or Do Not Contact — describing engagement across
the whole outreach process. Stages are assigned via **Set stage** on the People page.

Each contact's email address also carries a validation status — **Valid**, **Risky**, or
**Invalid**; contacts with Invalid addresses do not receive sequence emails. See
[Prospect data](/specifications/prospect-data) for the validation service.

## Configuration

- **Custom fields** (Settings → Contacts): **Text** (up to 4000 characters), **Number** (numeric values only), and **AI custom fields** whose value is generated from a prompt after enrichment. Fields are shared with all team members. A field can be marked **Use this field as a phone field** so its value is treated as a phone number for calling. A Text field cannot be changed to Number once at least one contact has a value in it, and fields are deleted one by one, not in bulk.
- **Stages** (Settings → Contacts → Contacts stages): you cannot create new stages, only edit the existing ones — name, label color, and description.
- **Tracking**: the Opened and Clicked statuses depend on opens tracking and links tracking, toggled per sequence in Sequence → Settings → General Settings.
- **Replies handling**: whether a reply finishes the contact or processing continues is set per sequence in Sequence → Settings → Replies handling.

## Processing behavior

Reply assigns statuses automatically as interactions happen: replies and SMS responses
set Replied, undelivered email sets Bounced, detected auto-replies set Auto-replied or
Out of office, and opt-out clicks or unsubscribe replies set Opted Out. The AI that sorts
unsubscribe replies into the Do Not Contact category understands English only — replies
in other languages need their inbox category set manually.

When a contact is created or updated, Reply normalizes the LinkedIn profile URL to the
canonical `https://www.linkedin.com/in/username` format. This applies to every ingestion
source — CSV import, API import, enrichment, CRM integration sync (Salesforce, HubSpot,
Pipedrive, Copper), and manual edits — and automatic LinkedIn steps save the resolved
profile URL back to the contact. Normalization is best-effort: a URL that cannot be
parsed, such as a company page, is stored as-is. Duplicate detection by LinkedIn URL is
format-agnostic, so URL variants of the same profile do not create duplicates.

## Side effects

- **Move to sequence** automatically removes the selected contacts from their previous sequence, and the email is delivered immediately despite the Step setting.
- A reply stops the sequence for the contact by default, unless **Continue processing steps** is selected in the sequence's replies-handling settings.
- Every action is recorded in the contact card's Activity tab, from creation onward — including AI field enrichment events and manual AI field updates. The Sequences and Emails tabs keep the sequence history and all sent emails.

## Limits

| Limit | Value |
| --- | --- |
| Custom fields per account | **50** (standard and AI combined) |
| Text custom field value | Up to **4000** characters |
| AI custom field value | Up to **1500** characters |
| Statuses per contact | Up to **4** |
| Stage name | **21** symbols maximum |
| Stage description | **512** symbols maximum |
| Contact storage | **100,000** by default — see [Limits](/reference/limits) |

## Deletion behavior

The **Delete** quick action permanently removes the contact. To stop outreach without
deleting, use the Opted Out status (retained even outside sequences and blocks moving
the contact to another sequence) or **Blacklist**, which excludes the contact from
further communication and is reversible with **Unblacklist**.

## Edge cases

- A contact can show **Bounced** and **Opened** together — the recipient provider's email checker may register an open on an invalid address, or the open may be your own view of the bounce-back message.
- The Bounced status does not follow the contact into a different sequence.
- Missing Data never clears itself — fix the variable value or remove the variable from the template, then remove the status manually.
- Auto-replied cannot be set or removed manually and arrives together with Finished.
- A LinkedIn company-page URL cannot be normalized and is stored exactly as entered.

## FAQ

### Can a contact be in two sequences at once?

Moving contacts with **Move to sequence** automatically removes them from the previous
sequence. Team Edition lets the same prospect be pushed to several sequences of different
team members. A contact with the Opted Out status cannot be moved to another sequence at
all. See [Contact enrollment](/behavior/contact-enrollment).

### What is the difference between a status and a stage?

Statuses describe processing within one sequence (Active, Replied, Bounced, and the other
values above) and are mostly assigned automatically. The stage is a single manually set
label — Interested, Engaging, Not Interested, Do Not Contact, and similar — describing
the relationship across all outreach. See [Statuses](/reference/statuses).

### Why is a contact not receiving emails?

The Missing Data, Finished, Paused, and Opted Out statuses all stop sends, contacts with
an Invalid email validation status are skipped to protect the bounce rate, and
blacklisted contacts are excluded from further communication. See
[Why was an email not sent](/troubleshooting/email-was-not-sent).

### Why did creating a contact not add a new record?

Reply matches duplicates instead of re-creating them — including by LinkedIn URL, where
matching is format-agnostic across URL variants of the same profile. See
[Contact deduplication](/behavior/contact-deduplication) and
[Manage duplicates](/how-to/manage-duplicates).

## Related

- [Companies](/specifications/companies) · [Lists](/specifications/lists) · [Prospect data](/specifications/prospect-data)
- [Contact management](/capabilities/contact-management)
- [Import contacts](/how-to/import-contacts) · [Manage duplicate contacts](/how-to/manage-duplicates)
- [Statuses](/reference/statuses) · [Status transitions](/behavior/status-transitions)

## Build with Reply

- REST API: [docs.reply.io](https://docs.reply.io/api-reference/introduction) — contacts endpoints
- MCP: [agents.reply.io/mcp](https://agents.reply.io/mcp) — agents search, create, and update contacts
- CLI: [agents.reply.io/cli](https://agents.reply.io/cli)
- Agent skills: [agents.reply.io/skills](https://agents.reply.io/skills) — the import-prospects workflow
