n8n
Use an n8n Webhook node to receive Salesight call_review.finalised events.
n8n works well for teams that want self-hosted control or more complex CRM write logic.
Setup
- Create a workflow.
- Add a Webhook trigger node.
- Set the method to
POST. - Copy the production webhook URL.
- In Salesight, open Integrations, add an outbound webhook, and paste the URL.
- Click Send test.
- In n8n, execute the workflow and confirm the request body includes
data.callReview.
Signature Check
Add a Code node after the Webhook node if you want to verify signatures before writing to a CRM.
const crypto = require("crypto");
const secret = $env.SALESIGHT_WEBHOOK_SECRET;
const body = JSON.stringify($json.body ?? $json);
const timestamp = $json.headers["x-salesight-timestamp"];
const signature = $json.headers["x-salesight-signature"];
const expected =
"sha256=" +
crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${body}`)
.digest("hex");
if (signature !== expected) {
throw new Error("Invalid Salesight signature");
}
return $input.all();Attio Deal Recipe
Use this node chain:
- Webhook receives Salesight.
- Code verifies the signature.
- Set flattens fields like score, summary, objections, and rep email.
- HTTP Request calls Attio's API to create or update the target deal.
Suggested flattened fields:
| Field | Expression |
|---|---|
deal_name | {{$json.data.callReview.customer.name}} - {{$json.data.callReview.company.name}} |
score | {{$json.data.callReview.score}} |
summary | {{$json.data.callReview.summary}} |
rep_email | {{$json.data.callReview.rep.email}} |
objections | {{$json.data.callReview.topObjections.join(", ")}} |
coaching_flags | {{$json.data.callReview.coachingFlags.join(", ")}} |
salesight_url | {{$json.data.callReview.links.app}} |