# Automatic Call Summaries in Your CRM: Transcripts After Every Sales Call

> How to get automatic call summaries and transcripts into your CRM after every sales call: Edesy's transcript.ready and call.analyzed Call Events, what the summary contains, and a webhook handler that writes it onto the lead.

Source: https://edesy.in/blog/automatic-call-summaries-in-crm-2026

**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):

```json
"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](https://edesy.in/voice-api/click-to-call-api).
- Calls agents place from LeadSquared or Zoho CRM through Edesy's [CRM calling integrations](https://edesy.in/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](https://edesy.in/docs/voice-api/webhooks/call-events) 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

```bash
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.

```json
{
  "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

```js
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](https://edesy.in/docs/voice-api/webhooks/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](https://edesy.in/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](https://edesy.in/blog/ai-call-summary-for-contact-center-agents-2026).

## 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](https://edesy.in/docs/voice-api/webhooks/call-events) and get an API key at [voice-app.edesy.in](https://voice-app.edesy.in).
