{
"event_type": "SEND_FIRST_OUTREACH",
"timestamp": "2026-03-18T16:00:00.000Z",
"user": {
"id": "usr_123",
"name": "Jane Doe",
"email": "[email protected]"
},
"workspace_id": "ws_123",
"workspace_name": "Acme",
"prospect": {
"id": "pros_123",
"name": "Taylor Smith",
"company_name": "Example Inc",
"title": "VP Sales",
"linkedin_url": "https://linkedin.com/in/taylor-smith"
},
"campaign": {
"id": "camp_123",
"name": "Q2 outbound"
},
"outbound_content": "Hi Taylor — quick question...",
"is_first_outreach": true
}Webhook Setup
Webhooks let you stream Valley events to another system via HTTP POST requests with a JSON payload.
This ticket’s description is intended to be the most accurate (implementation-aligned) reference we have for Webhook setup, trigger semantics, payload shape, and delivery behavior as of 2026-03-18.
Configure a webhook in Valley
Go to Settings → Integrations → Webhooks.
Click + Webhook.
Set a Webhook label (used only for your own organization).
Paste your Webhook URL (must accept
POST+ JSON).Select one or more trigger types.
(Optional) Select additional payload fields.
Click Save.
(Optional) Click Test to send sample requests.
Trigger types (what events you can subscribe to)
These are the trigger labels shown in-product, with the event_type value that will be sent in the payload.
Campaign Lifecycle
Prospect Added to Campaign (
PROSPECT_ADDED_TO_CAMPAIGN)Prospect Removed (
PROSPECT_REMOVED_FROM_CAMPAIGN)
Responses & Connections
Connection Accepted (
CONNECTION_ACCEPTED)First Prospect Response (
SEND_FIRST_PROSPECT_RESPONSE)All Prospect Responses (
PROSPECT_RESPONSE)
Interest Level
Interested Responses (
SEND_INTERESTED_RESPONSES)Might Be Interested (
SEND_MIGHT_BE_INTERESTED_RESPONSES)Not Interested (
SEND_NOT_INTERESTED_RESPONSES)
Outreach
First Outreach Sent (
SEND_FIRST_OUTREACH)Any Outreach Sent (
SEND_ANY_NEW_OUTREACH)
Copy Generation
Copy Generated (Draft) (
SEND_COPY_GENERATED_DRAFT)Copy Approved (
SEND_COPY_FOR_MESSAGES_AFTER_APPROVAL)
Tags
Tag Changed (
PROSPECT_TAG_CHANGED)
Notes:
Tag changes fire for any tag add/remove. Consumers should filter by
tag.name(and optionallytag_change_type).
Website Intent
Website Intent Prospect (
SEND_WEBSITE_INTENT_PROSPECTS)
Additional payload fields (optional)
Valley always sends the “core payload” for an event. These toggles only affect a small set of extra fields; if you don’t enable a toggle, the corresponding field is omitted.
ICP Fit Score (
include_icp_fit→icp_fit)ICP Fit Reasoning (
include_icp_fit_justification→icp_fit_justification)Template Name (
include_template_name→campaign.template_name)Inmail Subject (
include_subject→subject)Message Type (
include_message_type→message_type)Message Step/Index (
include_message_index→message_index)
Payload contract (high-level)
Request
Method:
POSTBody: JSON
Timeout: Valley times out requests at 30 seconds
Success: any 2xx response is treated as delivered
Core payload fields
Every webhook includes:
event_type(string enum)timestamp(ISO 8601)user:{ id, name, email }
Depending on trigger type, the payload may also include some of:
workspace_id,workspace_nameprospect:{ id, name, company_name?, title?, linkedin_url?, email? }campaign:{ id, name, template_name? }message:{ content, sender, timestamp, message_id?, subject? }conversation:{ id, medium }Interest fields:
interest_level,from_interest_level,to_interest_level,interest_selected_atTag fields:
tag,tag_change_type,tag_changed_atOutreach/copy fields:
outbound_content,generated_text,is_first_outreachWebsite intent fields:
intent_metadata,page_domain,intent_source
Extra fields (only present when enabled in “Additional payload fields”):
icp_fit,icp_fit_justificationsubject,message_type,message_indexcampaign.template_name
Example payload (illustrative)
Delivery behavior (what to expect)
Delivery is handled asynchronously (via background workers), so webhooks may arrive a short time after the originating event.
Delivery is best-effort. Assume at-least-once semantics and build your receiver to be idempotent.
Automatic retries are limited today:
429responses are treated as rate-limited and are retried with exponential backoff (up to 3 retry attempts).400(payload rejected) and404(endpoint not found) are treated as configuration errors.Other failures (timeouts, 5xx, network issues) may not be retried automatically.
Valley does not currently expose delivery logs in the product UI.
Valley does not currently sign webhook requests (no HMAC signature header). If you need verification, include a secret in your URL and validate it server-side.
Common integrations/gotchas
Slack notifications
Valley sends a JSON event payload. Slack Incoming Webhooks expect Slack’s message schema (for example { "text": "..." } or blocks).
So, for Slack notifications, use Zapier/Make (or a small relay service) to transform Valley’s payload into Slack’s format.
Debugging
Use a request bin tool (Webhook.site, RequestBin, etc.) to inspect the raw payload.
If you’re testing a local server, use ngrok (or similar) to expose a public HTTPS URL.