Automatic call summaries turn a recorded sales call into a few lines a manager can read in ten seconds: what the customer wanted, how the call went and what happens next. With Edesy, every recorded click-to-call gets a transcript and a summary automatically. They reach your systems as signed webhooks, transcript.ready and call.analyzed, which your handler writes onto the lead in your CRM.
This post explains what you get, how it flows, and the code to put it in your CRM.
What you get after each call
| Event | What it adds |
|---|---|
call.completed |
Outcome, duration, talk time, who hung up |
recording.ready |
Recording URL, two channels (agent and customer) |
transcript.ready |
Speaker-labelled segments: agent, customer, with timings |
call.analyzed |
Summary, sentiment, action items, suggested disposition |
An analysis block looks like this (example):
"analysis": {
"summary": "Customer wants the 2BHK price list; send PDF and call back Friday.",
"sentiment": "positive",
"action_items": ["Send price list PDF", "Call back on Friday"],
"disposition": "callback"
}The suggested disposition comes from a fixed list: interested, callback, not_reachable, qualified, converted, not_interested, wrong_number, do_not_call. That makes it safe to map onto your CRM's own stages.
Which calls are covered
- Calls placed with the click-to-call API.
- Calls agents place from LeadSquared or Zoho CRM through Edesy's CRM calling integrations, which use the same click-to-call bridge.
Two conditions: the call is recorded (the default) and auto insights are on for the workspace (also the default). A call placed with record: false gets no transcript or summary.
Where the summary goes
The LeadSquared and Zoho connectors write the call log, the recording link and the agent's disposition notes. They don't write the AI summary. The transcript and summary are delivered as Call Events v1 to an endpoint you register. That keeps you in control: you decide whether the summary becomes a note, a custom field, a task or a Slack message from your own code.
| Destination | How |
|---|---|
| A note on the lead | Your handler calls your CRM's notes API with analysis.summary |
| A follow-up task | One task per item in analysis.action_items |
| The lead stage | Map analysis.disposition to your stage, or show it as a suggestion |
| A manager dashboard | Store sentiment and disposition per call |
Step 1: register an endpoint
curl -X POST https://voice-api.edesy.in/v1/webhooks/subscriptions \
-H "Authorization: Bearer $EDESY_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://crm.example.com/edesy/call-events",
"format": "edesy.call.v1",
"event_types": ["transcript.ready", "call.analyzed"]
}'Save the whsec_ secret in the response. It is shown only once.
Step 2: pass your IDs when you place the call
If you place calls yourself, send your CRM's IDs in correlation. They come back on every event, so your handler knows which lead to update without a lookup.
{
"agent": { "phone": "+9198XXXXXXXX" },
"customer": { "phone": "+9197XXXXXXXX" },
"correlation": { "lead_id": "L-1042" }
}For calls placed through the connectors, match on call.to or call.from against the lead's phone instead.
Step 3: handle the event
const express = require('express');
const crypto = require('crypto');
const app = express();
function verify(secret, h, raw) {
const ts = h['webhook-timestamp'];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const key = Buffer.from(secret.replace(/^whsec_/, ''), 'base64');
const want = Buffer.from(crypto.createHmac('sha256', key)
.update(`${h['webhook-id']}.${ts}.${raw}`).digest('base64'));
return (h['webhook-signature'] || '').split(' ').some((s) => {
const got = Buffer.from(s.slice(3));
return s.startsWith('v1,') && got.length === want.length && crypto.timingSafeEqual(got, want);
});
}
app.post('/edesy/call-events', express.raw({ type: 'application/json' }), async (req, res) => {
if (!verify(process.env.EDESY_WHSEC, req.headers, req.body)) return res.sendStatus(401);
res.sendStatus(204); // answer fast, work after
const ev = JSON.parse(req.body);
if (ev.type !== 'call.analyzed') return;
const leadId = ev.call.correlation?.lead_id;
await crm.addNote(leadId, ev.analysis.summary); // your CRM client
for (const item of ev.analysis.action_items || []) await crm.addTask(leadId, item);
});Answer within 5 seconds and do the CRM writes afterwards. Failed deliveries are retried, and webhook-id stays the same on every retry, so store it and skip repeats. See retries and replay.
Good practice
- Show the summary as a suggestion. Let the rep confirm the disposition rather than overwriting their pick.
- Keep the transcript out of the main timeline. Store it in a field or link; the summary is what people read.
- Mind the recording link. Anyone with it can play the call. Don't paste it into channels with wide access.
- Tell customers. A short recording notice plays to the customer by default when recording is on. Keep it on unless you have another way to inform them; see call recording compliance.
What it costs
There is no separate fee for Call Events, transcripts or summaries. You pay the click-to-call rate of Rs 1.50 per minute with a 60-second pulse, plus number rental. Prices exclude 18% GST. New accounts get Rs 20 welcome credit.
For contact-center teams using live agent assist instead, see AI call summaries for contact center agents.
FAQ
Which calls get an automatic summary?
Recorded calls placed with Edesy click-to-call, from the API or from the LeadSquared and Zoho CRM connectors. Auto insights are on by default as a workspace setting; a call placed with record set to false gets no transcript or summary.
What is in the summary?
The call.analyzed event carries a short summary, an overall sentiment (positive, neutral, negative or mixed), a list of action items and a suggested disposition from a fixed list such as interested, callback or not_interested.
Do the LeadSquared and Zoho connectors write the summary into the CRM?
No. They write the call log, recording link and disposition notes. The transcript and summary are delivered as signed Call Events to an endpoint you register, and your handler writes them wherever you want.
Is there an extra charge for transcripts and summaries?
No separate fee. You pay the click-to-call rate of Rs 1.50 per minute plus number rental, excluding 18% GST.
How do I know an event really came from Edesy?
Each delivery is signed with Standard Webhooks headers. Recompute the HMAC-SHA256 of the event id, timestamp and raw body with your whsec_ secret and compare it with webhook-signature, and reject old timestamps.
Start building: read the Call Events v1 docs and get an API key at voice-app.edesy.in.