Lead lifecycle
The complete state machine a lead moves through - Active, Contacted, ReplyReceived, Interested, MeetingBooked, Bounced, Unsubscribed - and what triggers each transition.
Every lead in a campaign has a status. That status changes in response to specific events - an email sending, a reply landing, a bounce event, a meeting being booked. This page documents every status and the event that drives each transition, so you can read the Leads tab with confidence and understand why a lead is stuck where it is.
The 14 statuses
Source of truth: packages/db/src/types/enums.ts - the OutreachLeadStatus enum.
| Status | What it means |
|---|---|
| Active | Default. Lead is in the pool, waiting to be contacted. |
| NotYetContacted | Lead is explicitly held out of the sequence - imported but not queued. |
| Contacted | Step 1 has been delivered. |
| ReplyReceived | Lead replied to any step (not yet classified). |
| Replied | Reply has been acknowledged / processed. |
| Interested | Reply classified as positive by the AI SDR. |
| NotInterested | Reply classified as negative or objection by the AI SDR. |
| OutOfOffice | An auto-reply was detected - lead hasn't seen the email yet. |
| MeetingBooked | A call or meeting has been scheduled on the salesperson's calendar. |
| Completed | The booked meeting has occurred. |
| Converted | The deal has closed - lead is now a customer. |
| Bounced | Email delivery failed (hard or soft bounce). |
| Unsubscribed | Lead has unsubscribed. |
| CompletedNoReply | Legacy status - a lead that walked the whole sequence without replying. |
What triggers each transition
Leads are event-driven. Every status change comes from a specific system event:
| Transition | Event |
|---|---|
| - Contacted | email_sent - step 1 is delivered to the inbox provider. |
| - ReplyReceived | reply_received or auto_reply_received - any inbound message on the thread. |
| - Interested | lead_interested - AI SDR classifier decides the reply is positive. |
| - NotInterested | lead_not_interested - AI SDR classifier decides the reply is negative. |
| - OutOfOffice | lead_out_of_office - detected from the reply content. |
| - MeetingBooked | lead_meeting_booked - a calendar event exists on the assigned salesperson's calendar. |
| - Completed | lead_meeting_completed - the calendar event passed and wasn't cancelled. |
| - Converted | lead_closed - marked as closed-won in the CRM. |
| - Bounced | email_bounced - inbox provider returned a bounce code. |
| - Unsubscribed | lead_unsubscribed or DNC handling - the person opted out or was blocked from future outreach. |
Important distinction - classification vs scheduling
Interested and MeetingBooked are two different things:
- Interested is a classification - the AI decided the reply text sounded positive. The lead hasn't booked anything yet.
- MeetingBooked is a calendar event - there's an actual slot on your salesperson's calendar.
A lead can be Interested without being MeetingBooked (they expressed interest but didn't click the link yet). A lead rarely becomes MeetingBooked without first being Interested, but it's possible if they reply directly with a time.
The AI SDR's role in this lifecycle
When AI SDR reply handling is on for a campaign:
- Every reply gets classified automatically - driving the Interested / NotInterested / OutOfOffice transition.
- Positive replies may be auto-answered to keep the conversation moving toward a booked meeting.
- A booked meeting is routed to the campaign's Assigned Salesperson - whoever you picked on the Options tab.
If AI SDR is off, replies still land in the AI SDR inbox but you classify them manually.
Bounce handling and unsubscribe
- Bounced is a terminal state for that lead in that campaign. Re-adding bounced leads should be a deliberate choice (often a mailing error, not a real bounce).
- Unsubscribed / DNC blocks future outreach to that address. Only remove a person from DNC or the blocklist when they have explicitly re-consented.
Where to see statuses in the UI
- The Leads tab shows every lead with their current status.
- Status filters in the Leads table let you jump straight to Bounced, Interested, or any other state.
- The Leads tab's History view separates manual uploads from lead-search/import batches so you can see where leads came from.
- The Analytics tab aggregates these statuses into positive reply rate, booked call rate, and bounce rate.