What Auto-Call does
Every CRM and form tool can do one thing: send an HTTP request when a new lead arrives. Auto-Call gives you a single webhook URL per source. You paste that URL into your CRM or form, and whenever a new lead comes in, Vaaad receives it and places an outbound call automatically.
There is no separate integration to build for each CRM. The same URL works with HubSpot, Zoho, Salesforce, Pipedrive, Zapier, Make, plain website forms, and anything that can send a webhook.
Quick start
- Go to Calls, Auto-Call and create a source. Give it a name and pick the agent that should make the calls.
- Copy the webhook URL shown once on creation. It looks like
https://YOUR-APP-URL/api/auto-call/ac_xxxxxxxx. - Paste that URL into your CRM or form's webhook setting (see the next section for the exact place in popular tools).
- Submit a test lead and watch the source's Recent leads list. The lead should show as Called and the phone should ring.
That is the whole setup. You only do it once per source.
Connecting your CRM or form
Wherever your tool lets you send data to a URL on a new lead, paste your Auto-Call URL there.
- HubSpot. Workflows, add a “Send a webhook” action, method POST, paste the URL.
- Zoho CRM. Workflow Rules, Actions, Webhooks, method POST, paste the URL.
- Salesforce. Flow with an HTTP Callout (or Outbound Message) to the URL.
- Pipedrive. Settings, Webhooks (or an automation), POST to the URL.
- Zapier / Make. Add a “Webhooks, POST” step that sends the new lead fields to the URL. Use this for tools that cannot POST directly, such as Google Forms or Typeform.
- Your own website form. POST the form fields to the URL on submit.
Plain HTML form
<form
action="https://YOUR-APP-URL/api/auto-call/ac_your_token_here"
method="POST"
enctype="application/json"
>
<input name="name" placeholder="Your name" />
<input name="phone" placeholder="Phone number" />
<input name="email" placeholder="Email" />
<textarea name="message" placeholder="How can we help?"></textarea>
<button type="submit">Submit</button>
</form>From your own code
await fetch("https://YOUR-APP-URL/api/auto-call/ac_your_token_here", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: lead.name,
phone: lead.phone,
email: lead.email,
message: lead.message,
}),
})Field mapping
Different tools name their fields differently. Vaaad needs to find the phone (required), and optionally the name and email, inside whatever JSON your tool sends.
Auto-detect (most forms)
Leave the mapping blank and Vaaad looks for common names automatically, including phone, phone_number, mobile, name, email, and nested ones like properties.phone. For most simple forms you do not need to map anything.
Manual mapping (unusual payloads)
If your tool uses an unusual shape, set a dot path for each field on the source's settings. A dot path walks into nested JSON, and [0] indexes into arrays. Say your CRM sends this:
{
"properties": {
"firstname": "Rahul Sharma",
"phone": "+919876543210",
"email": "rahul@acme.com",
"message": "Interested in your enterprise plan, would like a demo."
}
}You would map it like this:
{
"phone": "properties.phone",
"name": "properties.firstname",
"email": "properties.email",
"inquiry": "properties.message"
}Send one test lead first, then open Recent leads to see exactly what arrived, and adjust the paths if needed.
What the agent knows on the call
Captured fields become variables you can drop into your agent's prompt or greeting, so the call is personalized and the agent knows why it is calling.
| Variable | What it holds |
|---|---|
{{name}} | The lead's name |
{{email}} | The lead's email |
{{message}} | The full message they submitted |
{{reason}} | A short summary of the message (long messages are summarized automatically) |
{{subject}} / {{notes}} | Auto-detected if present in the payload |
custom, e.g. {{inquiry}} | Any extra field you map yourself |
Recommended setup on your agent:
- Greeting uses the short summary, for example
Hi {{name}}, you reached out about {{reason}}. Happy to help. - System prompt keeps the full message for depth, for example
Their full message: {{message}}. Acknowledge it briefly, do not read it back word for word, then have a normal conversation.
Guards and safety
Auto-Call decides whether to actually place each call. These run on every incoming lead, so a misconfigured form or a leaked URL cannot bypass them.
- Pause / Resume. When paused, leads are saved (not dropped). You can dial them by hand later.
- Business hours. Optional. Off-hours leads are queued and called when hours open, or manually.
- Skip repeat calls. The same number within your dedup window is skipped, so a double form-submit does not call twice.
- Max calls per day. A daily ceiling per source. Extra leads are saved until the next day.
- Wallet check. Calls only place when your balance is sufficient. Otherwise the lead is queued.
Securing your webhook
The URL is like a password. Anyone who has it can trigger calls, so treat it carefully.
- Regenerate URL. If the URL leaks, click Regenerate. The old URL stops working immediately. Paste the new one into your tool.
- Daily cap and rate limit. Even with a leaked URL, calls stop at your daily cap and are rate limited, so your wallet cannot be drained.
- HMAC signature (optional, advanced). Require a signed request so the URL alone is not enough. Enable it on the source to get a secret, then have your tool sign each request.
To sign, compute an HMAC-SHA256 of the exact request body using your secret, and send it in the X-Signature header as sha256=<hex>:
import crypto from "crypto"
const body = JSON.stringify(lead) // the exact bytes you POST
const signature = crypto
.createHmac("sha256", process.env.VAAAD_AUTOCALL_SECRET)
.update(body)
.digest("hex")
await fetch(webhookUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Signature": "sha256=" + signature,
},
body,
})Activity log and manual dialing
Each source keeps a Recent leads log showing every lead and what happened:
- Called. A call was placed.
- Queued. Saved but not called yet (paused, off-hours, or low wallet).
- Skipped. A guard skipped it (duplicate, daily cap, rate limit, or invalid phone).
- Failed. Something went wrong, for example no agent set on the source.
Tick any queued or failed leads and press Call selected to dial them by hand whenever you are ready.
Sample lead payload
The simplest thing you can send. Vaaad auto-detects all of these:
{
"name": "Rahul Sharma",
"phone": "+919876543210",
"email": "rahul@acme.com",
"subject": "Enterprise inquiry",
"message": "Interested in your enterprise plan, would like a demo this week."
}Testing it
- Make sure the source has an active agent with a system prompt, and your wallet has balance.
- Send a real test lead with a phone number you can answer.
- Watch Recent leads. If a lead shows Skipped or Failed, the reason is shown next to it.
- To see a long message getting summarized, submit a long paragraph and listen to how the agent opens.
.png)