Data objects
Specification Reviewed · not yet fact-checked
In short
What is a contact in Reply and how does it behave?
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.
Contact vs Company. A Contact is a person; a Company 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 at a time and an owner; member of any number of lists; processed by 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 |
| 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 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, and bulk quick actions such as email validation, enrichment, and moving to sequences.
Relationships
| Relationship | Object |
|---|---|
| Belongs to | One company at a time, plus an owner — the team member responsible for the contact |
| Member of | Any number of lists |
| Processed by | Sequences — statuses track processing per sequence; the contact card's Sequences tab lists current and past sequences |
| Enriched by | 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, 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.
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.
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 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 |
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.
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.
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.
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 and Manage duplicates.
Related
- Companies · Lists · Prospect data
- Contact management
- Import contacts · Manage duplicate contacts
- Statuses · Status transitions
Build with Reply
- REST API: docs.reply.io — contacts endpoints
- MCP: agents.reply.io/mcp — agents search, create, and update contacts
- CLI: agents.reply.io/cli
- Agent skills: agents.reply.io/skills — the import-prospects workflow