Event envelope
Every webhook delivery includes the same top-level event envelope:Shared conventions
- Property names use
snake_case, for exampleevent_type,sequence_fields, andreply_message_url. - Enum values are PascalCase strings, for example
"Personal","EmailDetected", and"Hard". - Timestamps use ISO-8601 UTC format with millisecond precision.
- Events associated with a contact include a
contact_fieldsobject. Usecontact_fields.idas the stable contact identifier. - If the subscription was created with
includeProspectCustomFields: true, acontact_custom_fieldsobject is also included. - Events associated with a sequence include a
sequence_fieldsobject. - If
SequenceIdis0, the event is not associated with a sequence andsequence_fieldsmay be empty or omitted. - Email-related events respect the subscription’s
includeEmailUrlandincludeEmailTextsettings. Disabled fields are omitted from the payload.
Reusable blocks
The following objects appear in multiple event payloads.contact_fields
contact_custom_fields
Only included when the subscription was created with payloadConfig.includeProspectCustomFields: true.
Keys match the custom field names configured on the contact.
sequence_fields
Event reference
email_replied
When it fires: Once per recorded email reply — when Reply detects an incoming reply to a sequence email, or a direct reply that is not tied to a sequence.
Field notes
email_account_id- The Reply email account that received the reply.
sent_email_id- The sequence email that was replied to.
nullfor direct replies that are not tied to a sequence email.
- The sequence email that was replied to.
email_from- Present when the replying email account is known.
reply_message_url- Included when
includeEmailUrl: true.
- Included when
email_text- Included when
includeEmailText: true.
- Included when
sequence_fields- Omitted for direct replies that have no sequence context.
contact_custom_fields- Included when
includeProspectCustomFields: true.
- Included when
sequence_fieldsincludesid,name, andstep_number.
reply_categorized
When it fires: An email reply is categorized automatically by Reply or manually by a user.
Field notes
reply_inbox_category_name- Human-readable category name.
- Built-in values include:
"No categories""Interested""Not interested""Do not contact""Not now""Forwarded""Meeting intent"
- Teams can create custom categories. Treat this field as a free-form string.
reply_message_id- May be
nullfor older replies where the original message ID was not captured.
- May be
reply_date- May be
nullfor older replies where the original timestamp is unavailable.
- May be
reply_message_url- Included when
includeEmailUrl: trueand a stored reply is available.
- Included when
email_text- Included when
includeEmailText: trueand the reply body can be extracted.
- Included when
contact_custom_fields- Included when
includeProspectCustomFields: true.
- Included when
sequence_fieldsincludesid,name, andstep_number. Omitted if the reply is not associated with a sequence.
email_sent
When: Reply sends an email from a sequence step.
Field notes
sent_email_variantidentifies the A/B variant that was sent. Omitted when the step has only one variant.sent_message_urlis included whenincludeEmailUrlis enabled and the message blob is available.email_textis included whenincludeEmailTextis enabled and the message body can be parsed.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
email_opened
When: A recipient opens a tracked email.
Opens from IP addresses in the user’s exclusion list are ignored.
Field notes
opens_countis the total number of opens for the email. It increases each time the email is opened.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
email_link_clicked
When: A recipient clicks a tracked link in an email.
email_bounced
When: A sent email bounces or is rejected by the recipient’s mail server.
Field notes
bounce_typecan be:UnknownSoftHardGmailApiLimitWarningOffice365LimitWarningMailboxFullAuthenticationFailureSpamRejectionPolicyViolation
sent_message_urlis included whenincludeEmailUrlis enabled and the message blob is available.email_textis included whenincludeEmailTextis enabled and the message body can be parsed.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
email_auto_reply
When: Reply identifies an incoming message as an auto-reply or out-of-office message.
Field notes
reply_typeis:AutoReplyfor automatic responder messagesOutOfOfficefor out-of-office messages
email_account_idmay benull.email_fromis included only when the email account is known.reply_message_urlis included whenincludeEmailUrlis enabled.email_textis included whenincludeEmailTextis enabled and the message body can be parsed.user_nameanduser_emailidentify the Reply user who owns the sequence when the event is generated.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
email_account_connection_lost
When: A connected mailbox can no longer authenticate, such as after an OAuth revocation or password change.
This is an account-level event and does not include contact or sequence information.
email_account_error
When: A connected mailbox reports an IMAP or SMTP error, such as an authentication failure, send failure, health check failure, reputation issue, or sending limit.
The event is generated each time the underlying error changes to a non-empty value. Clearing the error does not generate an event.
Field notes
email_account_erroris a free-form error message.- Error messages always begin with either:
Receiving:for IMAP-related errorsSending:for SMTP-related errors
email_account_addressmay be omitted if the email account can no longer be loaded.
contact_finished
When: A contact’s participation in a sequence ends.
This can happen when the contact completes the sequence, reaches a terminal status, or is manually finished.
Field notes
finish_reason can be one of:
Additional fields:
contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesidandname. The whole sequence has ended, so this event is not tied to a single step andstep_numberis not included.
contact_opted_out
When: A contact opts out of future outreach.
This event is generated when a contact:
- Clicks an unsubscribe link
- Is manually opted out by a user
- Is marked as Do Not Contact
Field otes
contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
contact_called
When: A call with a contact reaches a final state, such as answered, missed, busy, timed out, or logged manually.
The event is generated after call details have been collected and are ready to deliver.
Field notes
from_numberis the phone number used to place the call.durationis the call length in seconds. It is0for manually logged calls and calls that never connected.dispositioncan be:AnsweredLoggedManuallyNoAnswerBusyFail
resolutioncan be one of Reply’s built-in values (Positive,ToCall,Negative) or a custom resolution defined by the team. Treat this field as a free-form string.notescontains any notes entered by the user. It isnullwhen no notes were saved.recording_urlcontains a recording URL when a recording is available. It isnullwhen the call was not recorded.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.step_numberis0for calls not tied to a sequence step.
linkedin_connection_request_sent
When: Reply sends a LinkedIn connection request as part of a sequence step.
Field notes
sender_linkedin_account_idis the Reply LinkedIn account ID. It is not a LinkedIn public identifier.initial_messagecontains the connection request note that was sent. It may benullif no note was included.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesidandname.step_numberis not included for this event.
linkedin_connection_request_accepted
When: A LinkedIn connection request previously sent through Reply is accepted.
Only connection requests sent through Reply generate this event.
Field notes
contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
linkedin_message_sent
When: Reply sends a LinkedIn message or InMail.
Field notes
linkedin_message_idis a Reply-generated message identifier. It is not a LinkedIn message ID.is_inmailistruefor InMail messages andfalsefor regular LinkedIn messages.is_voice_attachedistruewhen a voice attachment was included.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fieldsincludesid,name, andstep_number.
linkedin_message_replied
When: A contact replies to a LinkedIn conversation associated with a sequence contact.
Only replies linked to known contacts in Reply generate this event.
Field notes
linkedin_message_idis a Reply-generated identifier. It is not a LinkedIn message ID.linkedin_messagecontains the reply text.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.sequence_fields.nameandsequence_fields.step_numberare always included.sequence_fields.idis included only when the contact is currently associated with a sequence.
linkedin_reply_categorized
When: Reply assigns a category to a LinkedIn conversation.
A separate event is generated for each affected conversation.
Field notes
reply_inbox_category_namecan be one of:No categoriesInterestedNot interestedDo not contactNot nowForwardedMeeting intent
- LinkedIn categories do not support custom category names.
last_reply_dateis included when available.contact_custom_fieldsis included whenincludeProspectCustomFieldsis enabled.linkedin_messagecontains the raw reply text from the contact. It is included only whenincludeLinkedInMessageTextis enabled.sequence_fieldsincludesid,name, andstep_numberwhen the conversation is associated with a sequence; it is empty when it is not.
autopilot_stopped
When: An evergreen sequence’s autopilot is disabled.
This event is generated only for the reasons listed in autopilot_error_message.
Field notes
autopilot_error_message is one of:
the sequence has been deactivatedthe active contacts limit has been reachedthere are no more contacts/companies matching the filter criteria
user_nameanduser_emailidentify the user who triggered the deactivation.sequence_owner_nameandsequence_owner_emailidentify the sequence owner.- Owner fields may be omitted if the corresponding user cannot be resolved.
- One for the acting user
- One for the sequence owner
linkedin_account_alerts
When: Reply detects a LinkedIn account issue that requires attention.
Examples include a disconnected Sales Navigator account, exhausted InMail credits, or a connection request limit.
Field notes
linkedin_idandlinkedin_nameidentify the LinkedIn account associated with the alert.linkedin_account_alertcontains a human-readable description of the issue.team_namemay be omitted if the workspace has no name.linkedin_owner_nameandlinkedin_owner_emailmay be omitted if the account owner cannot be resolved.
Alert types
contact_replied
When it fires: Each time a sequence contact is recorded as replied — Reply detects a reply to a sequence email (reason: "EmailDetected"), a sequence LinkedIn message (reason: "LinkedInDetected"), or a sequence SMS (reason: "SmsDetected"), or a user or the API marks the contact as replied (reason: "StatusSetManually").
This is a channel-agnostic status signal: subscribe to it once to learn whenever a contact enters the replied state, regardless of channel, instead of combining email_replied, linkedin_message_replied, and manual actions yourself. It carries who replied, which sequence/step, when, and why — not the message content. For channel-specific detail (message body, mailbox, sender account) subscribe to the matching per-channel webhook and correlate by reply_message_id.
Field notes
reason"EmailDetected"when Reply detects a reply to a sequence email."LinkedInDetected"when Reply detects a reply to a sequence LinkedIn message."SmsDetected"when Reply detects a reply to a sequence SMS."StatusSetManually"when a user or the API marks the contact as replied.
reply_message_id- Correlation key to the matching per-channel webhook (
email_replied/linkedin_message_replied): email reply message id, LinkedIn message id, or SMS provider message id.nullfor manually marked replies, which carry no stored message.
- Correlation key to the matching per-channel webhook (
contact_fields- The contact who replied. See the shared
contact_fieldsblock above for the full field list.
- The contact who replied. See the shared
sequence_fields- Always present;
contact_repliedfires only for contacts in a sequence.
- Always present;
contact_custom_fields- Included when
includeProspectCustomFields: true.
- Included when