BV
All articles

How to Set Up a Retell AI Webhook

A Retell AI webhook pushes call events to your endpoint in real time. Here is how to set one up, verify it is genuinely from Retell, and connect it to your CRM.

Muhammad Bilal
Muhammad Bilal Virk
10 min read
How to Set Up a Retell AI Webhook

How to Set Up a Retell AI Webhook

If you are running Retell AI voice agents in production, you need a way to know what happened on every call without sitting there listening to it. That is what a Retell AI webhook is for. It pushes call events to your own endpoint the moment they happen, so your CRM, your database, or your automation platform can react in real time instead of you checking the Retell dashboard manually.

I set this up as one of the first things on almost every Retell project I take on, because without it you have a voice agent that works but nothing downstream that knows it worked. This post covers what a Retell webhook actually sends, how to register one, how to verify the requests are genuinely from Retell, and how to wire it into Make.com or n8n.


What Is a Retell AI Webhook?

A webhook is Retell sending an HTTP POST request to a URL you control, every time something relevant happens on a call. No polling, no checking back every few seconds. The event happens, Retell posts the payload, your endpoint receives it.

Webhooks vs polling

Before webhooks became the standard, the alternative was polling: hitting Retell's API every few seconds to ask "has anything changed?" That wastes API calls, adds latency between the event and your reaction to it, and scales badly once you have more than a handful of active calls. A webhook flips the direction. Retell tells you the moment something happens, and your endpoint just needs to be listening.

Account-level vs agent-level webhooks

Retell lets you set a webhook URL at the account level, which applies to every agent by default, or override it per agent. This matters more than it looks like at first. If you configure a webhook on a specific agent, that agent-level URL takes over completely for that agent and events stop hitting your account-level endpoint for it. I have seen this catch people out when they add a new agent, forget to check its webhook setting, and then wonder why events for that agent never show up. If you are running multiple agents, keep a note of which ones have their own webhook override and route consistently, or better, just use the account-level webhook everywhere unless you have a specific reason not to.


Retell AI Webhook Events

Retell sends a handful of distinct event types, each with its own use.

call_started

Fires the moment a call begins, whether inbound or outbound. Useful if you want to log that a call is in progress or update a live dashboard, but there is not much call data to work with yet since the conversation has not happened.

call_ended

Fires when the call disconnects. At this point you have the raw transcript, the call duration, and the call status (completed, no answer, voicemail, and so on). This is usually the first event worth acting on if you need basic call logging.

call_analyzed

Fires after Retell finishes post-call analysis, which includes the structured data you configured in the agent's post-call analysis fields, a call summary, and a sentiment or success indicator depending on your setup. For most CRM and automation use cases, this is the event you actually want. It is the one with the complete picture of what happened on the call and what the caller wanted.

There is also a transcript_updated event that streams throughout the call rather than firing once, and a family of transfer_started, transfer_bridged, transfer_cancelled, and transfer_ended events if your agent does live transfers to a human. You do not need to subscribe to everything Retell sends. Pick the events your automation actually needs and ignore the rest at the endpoint level.

One thing worth planning for from day one: call_started, call_ended, and call_analyzed all carry the same call_id and all hit your endpoint separately. If your automation only cares about the final outcome, filter for call_analyzed and let the other two pass through without triggering your main logic, otherwise you end up running your CRM update three times for one call.


How to Create a Retell AI Webhook

Create the endpoint

Your endpoint just needs to accept a POST request with a JSON body and return a 2xx status quickly. I usually build this in FastAPI or as an HTTP module trigger in Make.com or n8n, depending on where the rest of the automation logic lives. Speed matters here more than people expect: do the heavy lifting (writing to a database, calling a CRM API) after you have accepted the payload, not before. If your endpoint takes too long to respond, Retell treats it as a failure and retries.

Register the webhook

In the Retell dashboard, you set the webhook URL either at the account level under your general settings, or on an individual agent's configuration. Paste your endpoint URL, save, and Retell starts sending events to it for new calls. Test it with a live web call from the dashboard before trusting it with real traffic. You will usually catch a formatting assumption that was wrong the first time you look at a real payload.


How to Verify Retell AI Webhook Requests

Anyone can find your webhook URL if it leaks or gets guessed, so verifying that a request genuinely came from Retell is not optional for anything connected to your CRM.

x-retell-signature

Retell signs every webhook delivery with an X-Retell-Signature header. The detail worth knowing here is that the signing secret is your Retell API key, specifically the one flagged for webhook use, not a separate webhook secret you generate elsewhere. Retell's SDK includes a verify() helper that takes the raw request body, your API key, and the signature header, and tells you whether it is legitimate. Reject anything that fails verification with a 401 before you do anything else with the payload.

API-key verification

If you are not using Retell's SDK and building the check manually, make sure you are hashing the raw request body exactly as received, before any JSON parsing or reformatting touches it. A mismatched signature is almost always caused by verifying a re-serialized version of the body instead of the original bytes.


Sending Retell Events to a CRM

The pattern I build most often: webhook fires on call_analyzed, the endpoint extracts the caller's phone number, the structured post-call data, and the summary, then either creates a new contact or updates an existing one in GoHighLevel with the call outcome tagged. If the agent qualified the lead, a follow-up workflow triggers immediately. If you are building this specific flow, How to Use Retell AI covers the agent side, and the CRM handoff mirrors the same pattern I use for chatbot leads in AI Chatbot for Lead Generation.


Retell AI Webhook With Make.com or n8n

You do not need to write a custom backend for every project. Both Make.com and n8n can receive the webhook directly as a trigger, parse the JSON body, filter for the event type you care about, and continue into the rest of your automation.

In Make.com, add a Custom Webhook module as your trigger, register the generated URL in Retell, and use a filter immediately after it to only continue when event = call_analyzed. Make.com Webhook Tutorial covers the setup mechanics if you have not built a Make webhook trigger before.

In n8n, a Webhook node does the same job, and you can branch on event type with an IF node right after it. n8n Webhook Tutorial walks through the node setup and signature handling on that side.

For anything with heavier logic, custom validation, or database writes that do not fit neatly into a no-code flow, a FastAPI endpoint gives you full control. Python FastAPI Webhook Automation covers building that backend from scratch.

If your voice agent also runs a Custom LLM backend rather than Retell's built-in one, the webhook and the LLM endpoint are two separate integrations serving different purposes. Retell AI Custom LLM Integration covers that side in detail.


Common Webhook Errors

Events never arrive. Check whether an agent-level webhook override exists and is pointing somewhere unexpected. Also confirm your endpoint is publicly reachable and not sitting behind a firewall or local-only address.

Duplicate events for the same call. Expected behavior if your endpoint does not respond with a 2xx quickly enough or if you have not filtered event types. Retell retries deliveries that fail to get an acknowledgement, so a slow endpoint causes the same event to arrive more than once. Make your side effects idempotent (check if you have already processed this call_id and event type before acting) rather than assuming every delivery is new.

Signature verification always fails. Almost always caused by verifying a modified or re-parsed version of the request body instead of the raw bytes Retell actually sent.

Payload is missing fields you expected. Post-call analysis fields only populate after you configure them in the agent's settings. If a field is not defined on the agent, it will not appear in the call_analyzed payload no matter how the call went.


Production Checklist

Before trusting a Retell webhook with real leads, confirm the endpoint verifies the signature on every request, responds with a 2xx within a few seconds even if the downstream processing takes longer, filters for the specific event types you need, handles duplicate deliveries without creating duplicate CRM records, and logs failures somewhere you will actually see them.

A webhook that silently drops a lead because of a slow database write is worse than no webhook at all, because it looks like it is working until you go looking for a lead that never showed up in the CRM.


If you are building a Retell AI voice agent and need the webhook, CRM, and follow-up automation wired together as one working system, that is exactly the kind of project I take on for clients. Book a free 30-minute call and bring the CRM or stack you are already using, and we can scope the integration together.


Frequently Asked Questions

What is a Retell AI webhook?

It is Retell sending an HTTP POST to a URL you control whenever a call event happens, such as the call starting, ending, or finishing post-call analysis. It replaces polling the API for status changes with real-time delivery.

How do I create a webhook in Retell AI?

Build an endpoint that accepts a POST request and returns a 2xx response quickly, then paste that URL into Retell's account-level or agent-level webhook setting. Test it with a live web call before routing real traffic through it.

What events does the Retell AI webhook support?

The core events are call_started, call_ended, and call_analyzed, plus transcript_updated for streaming transcript updates and a set of transfer events if the agent hands off to a human. Most CRM automations only need call_analyzed.

How do I verify a Retell AI webhook?

Check the X-Retell-Signature header against the raw request body using your Retell API key as the signing secret. Retell's SDK includes a verify() helper that does this for you. Reject anything that fails with a 401.

Can Retell AI webhooks update a CRM?

Yes. The webhook fires on call_analyzed with the structured post-call data, and your endpoint or automation platform passes that into GoHighLevel or another CRM to create or update a contact and trigger follow-up.

Can I connect Retell AI to n8n with a webhook?

Yes. n8n has a native Webhook node that can receive the Retell payload directly as a workflow trigger, then branch on event type and continue into whatever logic you need, no custom backend required for most use cases.

Why am I getting the same event three times for one call?

Retell sends call_started, call_ended, and call_analyzed separately, all with the same call_id. If your endpoint is slow to acknowledge a delivery, Retell may also retry it. Filter for the event type you actually need and make your processing idempotent by call_id.


If you would rather have this built than build it, I take on Retell AI and voice agent integration work through Upwork.

Muhammad Bilal
Muhammad Bilal Virk
AI automation engineer — building agents, workflows, and RPA that remove repetitive work.
Share
Newsletter

One email, when I ship something worth reading.

No cadence, no filler. Unsubscribe any time.

Free consultation

Want this built against your real numbers?

A 30-minute call to scope the workflow, agent, or automation you actually need.

Book a free consultation
Next step

Have a workflow that's burning hours every week?

Bring me one real bottleneck. I'll tell you whether it's worth automating, and what it would take.

Book 30 Minutes Call