How to Create a Webhook in Salesforce for AI Follow-Up Calls
How to create a webhook in Salesforce: build a flow or outbound message that fires on new leads and sends the payload an AI caller needs.

To create a webhook in Salesforce, build a record-triggered flow on Lead that fires when a record is created and sends the data to your endpoint with an HTTP Callout. If the receiver can parse SOAP, an Outbound Message works too. Send the lead ID, phone, name, source, consent flag and owner, so a voice agent can dial within a minute.
Salesforce has no button called "webhook"
Admins coming from other tools look for a webhook setting and don't find one. Salesforce has three ways to push a record change to an outside URL, and they behave differently.
| Method | Format sent | Best for | Watch out for |
|---|---|---|---|
| Outbound Message | SOAP XML | Receivers that already speak SOAP, or a middleware step that translates | The receiver must reply with an acknowledgment or Salesforce retries (for up to 24 hours) |
| Flow HTTP Callout | JSON you define | A modern endpoint, such as an AI caller or an n8n webhook | Needs a Named Credential, and the callout must run on the asynchronous path |
| Apex callout from a trigger or queueable | Anything | Retries, custom signing, batching | Needs a developer and test coverage |
For a follow-up caller, use the Flow HTTP Callout. Voice platforms and automation tools expect JSON, and you can build it without code. Use an Outbound Message only when the endpoint is middleware that can unwrap SOAP.
What the caller needs from the lead
The goal of the webhook is a phone call in about a minute, so the payload must be enough to place that call without a second lookup. In the Outbound Follow-Up Caller we build, the agent needs to know who to call, what they asked about, whether it is legal to call, and where to write the result.
| Salesforce field | Payload key | Why the caller needs it |
|---|---|---|
Id |
lead_id |
Write-back target for notes, status and call tasks |
FirstName, LastName |
first_name, last_name |
The greeting |
MobilePhone or Phone |
phone |
The number to dial, in E.164 format (+14155550123) |
DoNotCall |
do_not_call |
Hard stop before any dial |
Custom SMS_Consent__c |
sms_consent |
Decides whether a text fallback is allowed |
LeadSource |
source |
Lets the script mention the right ad or form |
Custom Product_Interest__c |
interest |
Auto quote vs. term life, or which program a student asked about |
OwnerId |
owner_id |
Who gets the handoff when the lead wants a human |
CreatedDate |
created_at |
Lets the caller drop stale leads instead of calling days later |
Here is the JSON body we ask the flow to send:
{
"event": "lead.created",
"lead_id": "00Q5e00000AbCdEFG",
"first_name": "Maria",
"last_name": "Alvarez",
"phone": "+14155550123",
"email": "maria@example.com",
"source": "Meta Lead Form",
"interest": "Term life, 20 year",
"do_not_call": false,
"sms_consent": true,
"owner_id": "0055e00000XyZ123",
"created_at": "2026-11-04T15:02:11Z"
}
Phone formatting is the moost common reason a call never happens. Salesforce stores whatever a human typed, so normalize to E.164 inside the flow with a formula field before the callout. Do not leave it for the caller to guess.
Step by step: the flow and the callout
- Create the Named Credential. In Setup, add an External Credential and a Named Credential that point to the caller's endpoint. Put the shared secret or bearer token there, never in the flow.
- Add the fields you need. Create
SMS_Consent__candProduct_Interest__con Lead if they don't exist, and add a formula field that returns the E.164 phone number. - Create the flow. In Flow Builder, choose a record-triggered flow on Lead, triggered when a record is created, with "Actions and Related Records" selected.
- Set entry conditions. Require a phone number,
DoNotCallequal to false, and a lead source that should get a call. Excluding internal test leads here saves embarrassing calls later. - Add the asynchronous path. Callouts cannot run in the same transaction as the save, so put the HTTP Callout action on "Run Asynchronously."
- Define the callout. Use the HTTP Callout wizard, choose POST, select the Named Credential, and paste a sample of the JSON above so Salesforce builds the request shape. Map each key to a flow variable or record field.
- Handle failure. Add a fault path on the callout that creates a Task assigned to the lead owner with the subject "Auto call failed, call manually." A silent failure here means a lead gets no follow-up at all.
- Test in a sandbox. Create a lead with your own number, watch the request arrive at the endpoint, and check that the formatted phone number and consent flags carry through.
If you go with an Outbound Message instead, create it under Setup, choose the Lead object, enter the endpoint URL, tick the fields to send, and add the message as an action in the same flow. The endloint gets an XML envelope and must return an acknowledgment, so you will need a small translation step in front of the caller.
Where the form sits in the workflow
For leqd-heavy insurance and education teams, the Salesforce record usually starts as a form submission from a landing page, so the webhook chain begins one step earlier. A form posts to a small automation, the automation creates the Lead through the Salesforce REST API, and the flow above fires on that create. The form is the first link, and the data it captures decides whether the caller has a usable number and consent.
Qwenvo is a free form builder our team builds, and it fits that first link. Webhooks, hidden fields, paartial submissions, a custom domain and removing the badge are all free there, and those are the features this chain leans on. A hidden field can carry the UTM campaign into LeadSource, and a partial submission means a half-finished quote form with a phone number still reaches your automation. Qwenvo sends webhooks to any URL, so Zapier, Make or n8n can receive the submission and create the Lead. One-click Salesforce connections are not available there, so plan for that middleware stp. Our form webhooks guide covers the sending side in more detail.
One honest limit: Qwenvo is hosted in the United States, which matters if an education client has a European data residency requirement. Tally is hosted in Europe.
Once the Lead exists, the Outbound Follow-Up Caller takes over from your Salesforce webhook. It calls the lead, texts if a call is not answered, and handles reminders and no-show recovery afterward.
Writing the result back to Salesforce
The webhook is one direction. The caller sgould write back with the Salesforce REST API using a connected app or integration user, not a human's login. We usually write three things after every attempt:
- A completed Task on the lead (
WhoIdset to the lead,CallTypeOutbound,CallDispositionfilled in, and a short summary inDescription). - A Status update, such as moving Open to Working when a conversation happenned.
- A booked time, if the lead agreed to one, written to a field or Event your reps already watch.
Give that integration user a narrow permission set: edit on Lead, create on Task and Event, and nothing else.
Failure cases to test before launch
- Duplicate leads. If your intake creates a second Lead for the same person, the flow fires twice and the person gets two calls. Dedupe before create, or add a "Called__c" checkbox the flow checks.
- Bulk loads. A list import fires the flow for every row. Add an entry conditipn on
LeadSourceso imports don't trigger calls. - After hours. Decide whether the caller holds a lead until morning in the lad's time zone. Pass a
time_zonefield if you need it. - Wrong owner. If assignment rukes run after your flow,
OwnerIdmay still be the queue. Set the flow to run after assignment, or have the caller look up the owner on handoff. - Retries. Make the endpoint idempotent on
lead_idso a retried request does not produce a second call.
Questions teams ask
Can Salesforce send a webhook without Apex?
Yes. A record-triggered flow with an HTTP Callout action sends JSON to any URL without code, provided you set up a Named Credential first. Outbound Messages also need no code, but they send SOAP.
Should I use Outbound Message or HTTP Callout?
Use the HTTP Callout if your receiver takes JSON, which most AI callers and automation tools do. Choose an Outbound Message only when the receiver already handles SOAP or sits behind middlewae that can translate it.
What should I do about do-not-call and consent?
Filter in the flow entry conditions and send the flags in the payload as well. The flow stops the obvious cases, and the caller checks again before dialing. Keep consent in a field on the record, not in the notes.
Do I need Qwenvo to do this?
No. Any form that can create a Salesforce Lead works. Qwenvo is a good fit if you want the webhook, hidden fields and partial submissions without paying for a plan.
Next step
Open a Salesforce sandbox, create the Named Credential and a three-field flow thta posts lead_id, phone and do_not_call to a webhook inspector. Once you see that request arrive, add the rest of the payload. If you want the caller on the other end, the Outbound Follow-Up Caller page has the scope and pricing.
Outbound Follow-Up Caller
Third-party platform and model usage billed to you directly. No lock-in. Live in 10 days.