Skip to main content

1. Overview

QCall supports two webhook trigger modes. You configure them from the Tools section of your assistant inside the QCall Dashboard.
TriggerFires WhenTypical Use Case
In-Call WebhookTriggered by the AI during the conversation (e.g. “check my order”, “fetch product details”).Real-time data lookups, order verification, stock checks.
End-of-Call Webhook (Trigger on call end)Fires after the call ends. The AI fills the configured fields from the full transcript.Post-call reporting, CRM push, logging, analytics.
This guide focuses on the End-of-Call Webhook — the most common client integration.

2. How It Works (Flow)

┌───────────┐     1. Voice Call     ┌──────────────┐
│  Caller   │ ───────────────────► │ QCall Agent  │
└───────────┘                       └──────┬───────┘
                                           │ 2. Call Ends

                                 ┌────────────────────┐
                                 │  Transcript + Data │
                                 └─────────┬──────────┘
                                           │ 3. AI extracts fields

                                 ┌────────────────────┐
                                 │  Webhook Payload   │
                                 │  (JSON body)       │
                                 └─────────┬──────────┘
                                           │ 4. HTTP POST (or GET/PUT)

                                 ┌────────────────────┐
                                 │  YOUR SERVER /     │
                                 │  YOUR WEBHOOK URL  │
                                 └────────────────────┘
Behind the scenes:
  1. The assistant completes the call.
  2. QCall takes the full transcript + collected context.
  3. The AI extracts every Body Parameter value using strict rules (never invents data, only uses exact words from the user/transcript).
  4. QCall sends an HTTP request (method of your choice) to your configured URL with headers, query parameters, and body.
  5. Your server responds. The response status + body is logged in the QCall delivery history for audit.

3. Configuring the Webhook in the QCall Dashboard

Open Dashboard → Assistants → (select your assistant) → Tools → + Add Webhook. You’ll see the following fields:
Field (UI label)Description
Webhook URLYour public HTTPS endpoint. Must be reachable from the internet.
MethodPOST, GET, PUT, or DELETE. For end-of-call reporting use POST.
Trigger on Call EndToggle ON to fire AFTER the call ends. OFF = fire DURING the call.
Enable TriggerMaster switch — must be ON to actually fire the webhook.
Enable BodyToggle ON to send a JSON body built from the Body Parameters.
HeadersList of Name / Value pairs. Always include Content-Type: application/json and an Authorization header for security.
Query ParametersKey/value pairs appended to the URL.
Body ParametersThe fields you want QCall to send in the request body. Each parameter has: Identifier, Data Type, Required flag, Description, Value.

Body Parameter fields (each row)

FieldWhat to enter
IdentifierThe JSON key sent to your webhook (e.g. first_name). Always use lowercase snake_case.
Data Typestring, number, or boolean.
RequiredTurn ON if this field must be present on your side.
DescriptionShort hint telling the AI what to extract (e.g. “Caller’s first name”). Be specific — the AI uses this.
ValueLeave blank. QCall will automatically fill this from the call transcript when the call ends.

Configure the following Body Parameters inside your webhook tool to receive full caller + order information after each call.
IdentifierData TypeRequiredDescription
first_namestringyesCaller’s first name
last_namestringyesCaller’s last name
phone_numberstringyesCaller’s phone number in E.164 format
email_addressstringnoCaller’s email address
order_idstringnoOrder ID referenced in the call
call_datestringyesDate of the call (YYYY-MM-DD)
call_durationnumberyesTotal call duration in seconds
call_costnumbernoCost of the call (in account currency)
product_namestringnoProduct name discussed or ordered
quantitynumbernoQuantity of product ordered
order_valuenumbernoTotal order value (price × quantity)
addressstringnoDelivery address provided by the caller
pincodestringnoPostal / ZIP / pincode
sentiment_analysisstringnoCaller sentiment (Positive / Neutral / Negative)
call_outcomestringyesFinal outcome (Order Placed, Not Interested, Callback Requested, etc.)
call_summarystringyesShort summary of the conversation
recording_urlstringnoURL of the call recording
Webhook URL example: https://your-domain.com/api/qcall/call-report Method: POST Trigger on Call End: ON Enable Trigger: ON Enable Body: ON Headers:
NameValue
Content-Typeapplication/json
AuthorizationBearer YOUR_API_KEY

5. Example: The Payload Your Server Will Receive

When the call ends, QCall sends a request like this to the URL you configured: Request
POST /api/qcall/call-report HTTP/1.1
Host: your-domain.com
Content-Type: application/json
Authorization: Bearer YOUR_API_KEY
Body
{
  "first_name": "Kapil",
  "last_name": "Karda",
  "phone_number": "+919876543210",
  "email_address": "kapil@example.com",
  "order_id": "ORD-2026-00123",
  "call_date": "2026-04-24",
  "call_duration": 184,
  "call_cost": 0.42,
  "product_name": "Premium Wireless Earbuds",
  "quantity": 2,
  "order_value": 3998,
  "address": "42, Green Park, New Delhi",
  "pincode": "110016",
  "sentiment_analysis": "Positive",
  "call_outcome": "Order Placed",
  "call_summary": "Customer confirmed order of 2 premium wireless earbuds for delivery to Green Park. Payment on delivery agreed.",
  "recording_url": "https://cdn.qcall.ai/recordings/cs_abc123.mp3"
}

6. Expected Response from Your Server

Your server should respond with HTTP 200 or 201 and a JSON body. Non-2xx responses are logged as failures in QCall’s delivery history. Example response
{
  "success": true,
  "message": "Record saved",
  "record_id": "rec_78910"
}
  • Timeout: 10 seconds. If your endpoint does not respond within 10s, the delivery is marked failed.
  • Retries: The webhook fires once per call. Build your endpoint to be idempotent (use order_id or a call-level unique id to dedupe).

7. Security Recommendations

  1. Use HTTPS only. Plain HTTP endpoints are accepted but strongly discouraged.
  2. Protect your endpoint with a static bearer token / API key passed via the Authorization header:
    Authorization: Bearer LONG_RANDOM_SECRET
    
  3. Validate input server-side. Do not trust field values blindly — treat them like any user-supplied data.
  4. Log every request (request id, timestamp, IP) for auditing.

8. Content Types Supported

QCall automatically serializes the body based on the Content-Type header you set:
Content-TypeBody Sent As
application/json (default, recommended)Raw JSON object
application/x-www-form-urlencodedkey1=val1&key2=val2
multipart/form-dataMultipart form, each parameter becomes a form field
For GET / DELETE requests, the body is omitted automatically — use Query Parameters instead.

9. Testing Your Integration

  1. Build a test receiver — either a simple Express server or use webhook.site.
  2. Use the webhook.site URL as the Webhook URL in the QCall Dashboard while testing:
    https://webhook.site/<your-unique-id>
    
  3. Place a test call through the QCall dashboard or playground.
  4. End the call — the webhook should fire within a few seconds.
  5. Verify the received payload matches the Body Parameters you configured.

Minimal Node.js receiver example

const express = require("express");
const app = express();
app.use(express.json());

app.post("/api/qcall/call-report", (req, res) => {
  console.log("QCall webhook received:", req.body);

  // Validate auth
  const auth = req.headers.authorization;
  if (auth !== "Bearer YOUR_API_KEY") {
    return res.status(401).json({ error: "Unauthorized" });
  }

  // TODO: Save to your DB / CRM / spreadsheet
  return res.status(200).json({ success: true });
});

app.listen(3000, () => console.log("Listening on :3000"));

10. Frequently Asked Questions

Q. Can I receive multiple webhooks per call? Yes. Add multiple webhook tools under the same assistant. Each one has its own URL, method, and parameter set. Q. What happens to missing values? The AI will set the field to an empty string "" rather than invent data. Your server should handle empty strings gracefully. Q. Can I add custom fields? Yes. Any Body Parameter you add with a clear Description will be extracted by the AI. Always use lowercase snake_case identifiers. Q. Can I filter which calls trigger the webhook? Not natively — every call for that assistant fires the webhook. Filter on your side using call_outcome or sentiment_analysis. Q. Where can I see webhook delivery history? Contact your QCall account manager for access to the delivery log for your workspace.

11. Quick Checklist Before Going Live

  • Webhook URL is HTTPS and reachable from the public internet.
  • Trigger on Call End and Enable Trigger are both ON.
  • Content-Type header matches how you parse the body.
  • Authorization header is set and validated on your server.
  • Endpoint responds within 10 seconds.
  • Endpoint is idempotent (safe to receive same call twice).
  • Every Body Parameter identifier uses lowercase snake_case.
  • Tested end-to-end with a real call.

12. Support

For issues, error codes, or custom integrations, reach out to your QCall support contact with:
  • Assistant name
  • Approximate call timestamp (with timezone)
  • Your server’s response code + body
We will match it against QCall’s delivery log for debugging.