Webhooks
Coldreach can send real-time HTTP POST notifications to your server when key events occur. Configure webhook URLs in your Coldreach settings to start receiving events.
Overview
Webhooks let you react to events in Coldreach without polling the API. When an event fires, Coldreach sends a JSON payload to your configured URL via HTTP POST with a Content-Type: application/json header.
| Webhook | Trigger |
|---|---|
| First Touch | The first email in a sequence is sent to a contact |
| Positive Reply | A positive reply is received from a contact |
| Outreach Finished | Outreach to a contact is completed for any reason |
Setting Up Webhooks
- Go to Settings > Developer (for Outreach Finished) or Settings > Notifications (for First Touch and Positive Reply) in the Coldreach app
- Find the webhook you want to enable
- Click Setup and enter your endpoint URL
- Coldreach will send a POST request to your URL whenever the event occurs
Your endpoint must return a 2xx status code. Non-2xx responses are treated as failures.
First Touch Webhook
Triggered when the first email in a sequence is sent to a contact. Useful for syncing outreach activity to your CRM or triggering downstream workflows.
Payload
{
"fullName": "Jane Smith",
"firstName": "Jane",
"lastName": "Smith",
"jobTitle": "VP of Sales",
"email": "[email protected]",
"linkedInURL": "https://linkedin.com/in/janesmith",
"companyName": "Acme Corp",
"companyWebsiteURL": "https://acme.com",
"companyDescription": "Enterprise SaaS platform for...",
"companyLocation": "San Francisco, CA",
"campaignId": 123,
"campaignName": "Series B SaaS Companies",
"subject": "Quick question about Acme",
"body": "Hi Jane, I noticed that..."
}
Fields
| Field | Type | Description |
|---|---|---|
fullName | string | Contact's full name |
firstName | string | Contact's first name |
lastName | string | Contact's last name |
jobTitle | string | Contact's job title |
email | string | Contact's email address |
linkedInURL | string | Contact's LinkedIn profile URL |
companyName | string | Company name |
companyWebsiteURL | string | Company website URL |
companyDescription | string | Company description from LinkedIn or website |
companyLocation | string | Company headquarters location |
campaignId | number | ID of the campaign that triggered outreach |
campaignName | string | Name of the campaign |
subject | string | Email subject line |
body | string | Email body content |
Positive Reply Webhook
Triggered when a contact sends a reply that is classified as positive. This fires for both email and LinkedIn channels.
Payload
{
"assignmentId": 456,
"channel": "email",
"contactEmail": "[email protected]",
"contactName": "Jane Smith",
"contactLinkedInUrl": "https://linkedin.com/in/janesmith",
"companyName": "Acme Corp",
"companyUrl": "https://acme.com",
"companyDomain": "acme.com",
"replyMessage": "Thanks for reaching out! I'd love to learn more...",
"senderEmail": "[email protected]",
"campaignId": 123,
"campaignName": "Series B SaaS Companies"
}
Fields
| Field | Type | Description |
|---|---|---|
assignmentId | number | Internal assignment ID |
channel | string | "email" or "linkedin" |
contactEmail | string | Contact's email address |
contactName | string | Contact's full name |
contactLinkedInUrl | string | Contact's LinkedIn profile URL |
companyName | string | Company name |
companyUrl | string | Company website URL |
companyDomain | string | Company domain (e.g. acme.com) |
replyMessage | string | The reply message body |
senderEmail | string | Email address that sent the original outreach |
campaignId | number | null | ID of the associated campaign |
campaignName | string | Name of the associated campaign |
Outreach Finished Webhook
Triggered when outreach to a contact is completed for any reason. This fires when a contact reaches the end of a sequence, replies, bounces, unsubscribes, or is otherwise removed from active outreach. Covers both email and LinkedIn channels.
Payload
{
"assignmentId": 789,
"reason": "last_step_sent",
"channel": "email",
"contactEmail": "[email protected]",
"contactName": "Jane Smith",
"contactLinkedInUrl": "https://linkedin.com/in/janesmith",
"companyName": "Acme Corp",
"companyUrl": "https://acme.com",
"companyDomain": "acme.com",
"campaignId": 123,
"campaignName": "Series B SaaS Companies"
}
Fields
| Field | Type | Description |
|---|---|---|
assignmentId | number | Internal assignment ID |
reason | string | Why outreach ended (see Reasons below) |
channel | string | "email" or "linkedin" |
contactEmail | string | Contact's email address |
contactName | string | Contact's full name |
contactLinkedInUrl | string | Contact's LinkedIn profile URL |
companyName | string | Company name |
companyUrl | string | Company website URL |
companyDomain | string | Company domain (e.g. acme.com) |
campaignId | number | null | ID of the associated campaign |
campaignName | string | Name of the associated campaign |
Reasons
| Reason | Description |
|---|---|
last_step_sent | All steps in the sequence have been sent |
replied | Contact replied to an outreach message |
bounced | Email bounced |
unsubscribed | Contact unsubscribed |
messaging_blocked | LinkedIn messaging was blocked |
existing_conversation | An existing LinkedIn conversation was detected |
invitation_withdrawn | LinkedIn invitation was withdrawn (final step) |
Best Practices
- Use HTTPS — Always use an HTTPS endpoint for security.
- Respond quickly — Return a 2xx response within a few seconds. Process the payload asynchronously if needed.
- Handle duplicates — In rare cases, the same event may be delivered more than once. Use
assignmentIdorcampaignId+emailas an idempotency key. - Validate payloads — Check that incoming requests contain the expected fields before processing.