Outbound Webhooks
Receive Salesight call_review.finalised events in Zapier, Make, n8n, or a custom HTTPS endpoint.
Outbound webhooks send finalised Salesight call reviews to an HTTPS endpoint. Use them when you want to write scored call data into a CRM, spreadsheet, data warehouse, or no-code automation tool.
Event
Salesight currently emits one event:
call_review.finalisedThe event fires after a call analysis has been saved as a CallReview.
Headers
Every delivery is a POST with JSON body and these verification headers:
Content-Type: application/json
User-Agent: Salesight-Outbound-Webhooks/1.0
X-Salesight-Event: call_review.finalised
X-Salesight-Delivery: del_...
X-Salesight-Timestamp: 1760000000
X-Salesight-Signature: sha256=...The signature is an HMAC SHA-256 digest of:
<X-Salesight-Timestamp>.<raw request body>Use the signing secret shown in the Integrations page. Compare signatures with a timing-safe equality function.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifySalesightWebhook({
body,
secret,
signature,
timestamp,
}: {
body: string;
secret: string;
signature: string;
timestamp: string;
}) {
const expected = `sha256=${createHmac("sha256", secret)
.update(`${timestamp}.${body}`)
.digest("hex")}`;
const expectedBuffer = Buffer.from(expected);
const signatureBuffer = Buffer.from(signature);
return (
expectedBuffer.length === signatureBuffer.length &&
timingSafeEqual(expectedBuffer, signatureBuffer)
);
}Payload
{
"event": "call_review.finalised",
"deliveryId": "del_0123456789abcdef",
"createdAt": "2026-05-25T03:00:00.000Z",
"data": {
"callReview": {
"id": "review_123",
"organization": {
"id": "org_123",
"name": "Acme Sales",
"slug": "acme-sales"
},
"company": {
"id": "company_123",
"name": "Acme",
"slug": "acme"
},
"product": {
"id": "product_123",
"name": "Revenue Platform",
"slug": "revenue-platform"
},
"offer": {
"id": "product_123",
"name": "Revenue Platform",
"slug": "revenue-platform",
"targetClient": "Mid-market sales teams",
"hasTiers": true,
"tiers": [
{
"id": "tier_growth",
"name": "Growth",
"kind": "standard",
"rank": 1,
"priceModel": "fixed",
"priceInterval": null,
"priceMinCents": 1200000,
"priceMaxCents": null,
"priceCurrency": "USD",
"priceNote": null
},
{
"id": "tier_pilot",
"name": "Pilot",
"kind": "fallback",
"rank": 1,
"priceModel": "custom",
"priceInterval": null,
"priceMinCents": null,
"priceMaxCents": null,
"priceCurrency": "USD",
"priceNote": "Custom pilot pricing"
}
],
"rules": [
{
"id": "rule_budget_gate",
"type": "tier_gate",
"description": "Confirm annual budget before recommending Growth.",
"appliesToTierId": "tier_growth",
"enforcedByCriterionKey": "budget-confirmed",
"appliesToTier": {
"id": "tier_growth",
"name": "Growth",
"kind": "standard",
"rank": 1
}
}
]
},
"soldTier": {
"id": "tier_growth",
"name": "Growth",
"kind": "standard",
"rank": 1,
"priceModel": "fixed",
"priceInterval": null,
"priceMinCents": 1200000,
"priceMaxCents": null,
"priceCurrency": "USD",
"priceNote": null
},
"score": 87,
"summary": "Rep handled pricing concerns and confirmed next steps.",
"sentiment": "Positive",
"topObjections": ["Price sensitivity", "Implementation timing"],
"coachingFlags": ["Confirm decision criteria earlier"],
"flagTriggers": [
{
"id": "flag_trigger_budget",
"triggered": true,
"transcriptQuote": "We still need finance to approve the annual budget.",
"timestampSec": 842,
"flag": {
"id": "flag_budget_risk",
"key": "budget-risk",
"name": "Budget risk",
"description": "Buyer indicates budget approval is not confirmed.",
"effect": "penalty",
"capScore": null,
"penaltyPoints": 8,
"order": 1
}
}
],
"rep": {
"id": "rep_123",
"name": "Avery Stone",
"email": "avery@example.com",
"memberId": "member_123",
"userId": "user_123"
},
"customer": {
"name": "Jordan Lee"
},
"source": {
"provider": "fathom",
"externalId": "call_123"
},
"timestamps": {
"finalisedAt": "2026-05-25T02:59:57.000Z",
"createdAt": "2026-05-25T02:59:57.000Z"
},
"links": {
"app": "https://salesight.ai/app/acme-sales/analyzer"
}
}
}
}Retries
Salesight treats any non-2xx response or network timeout as a failed delivery. Failed deliveries retry up to 5 times with exponential backoff. After 5 consecutive failures, the webhook is disabled and the Integrations page shows the failure count.
Test Events
Use Send test on the Integrations page after adding an endpoint. Test events use the same headers and payload shape, with fixture IDs like review_test_call_review_finalised.