
ربط وكلاء الصوت الذكيين بنظام CRM: HubSpot وSalesforce وPipedrive (مع الكود الكامل)
في مشروع Vapi أطلقناه في وقت سابق من هذا العام، سجّل المسار الكامل — وكيل الصوت ← API البحث الداخلي ← قراءة جهة الاتصال في HubSpot — زمن استجابة بلغ 410ms عند P50 و1,240ms عند P95. هذا الرقم وحده هو سبب وجود هذا المقال. تكامل وكيل الصوت مع CRM يعيش أو يموت على ساعة يتحكم بها المتصل. اربطه كما يعمل تزامن Zapier، وسيصمت الوكيل في منتصف جملة بينما يزحف الـ webhook. الحل ليس المزيد من طلبات API. بل هو نمطان، ومهلة واحدة، وجملة احتياطية. إليك الثلاثة مع الكود الجاهز للنشر.
معظم الأدلة في هذا الموضوع تعلّمك الفكرة ثم تبيعك المنتج. لا أحد يشحن المعالج. نحن سنفعل العكس.
النقاط الرئيسية
- يتصل وكيل الصوت بـ CRM بطريقتين: function calling للقراءات المباشرة أثناء المكالمة، وwebhooks للكتابة بعد انتهائها.
- القراءات أثناء المكالمة تحتاج إلى ميزانية 5 ثوانٍ مع جملة احتياطية منطوقة حتى لا يسمع المتصل صمتاً.
- عيّن بيانات المكالمة إلى حقول CRM باستخدام مفتاح idempotency لضمان عدم تكرار السجلات عند إعادة إرسال الـ webhook.
- Pipedrive لا يدعم webhook لتغييرات الحقول المخصصة؛ بدلاً من ذلك، استعلم عن
dealFieldsبجدول منتظم.
ما يعنيه "تكامل وكيل الصوت مع CRM" فعلاً (طريقتان، لا طريقة واحدة)
تكامل وكيل الصوت مع CRM يربط الوكيل بنظام إدارة العلاقات بطريقتين مختلفتين: function calling لقراءة البيانات مباشرة بينما المتصل على الخط، وwebhooks لكتابة نتيجة المكالمة بعد انتهائها. القراءة المباشرة تُضفي الطابع الشخصي على المحادثة؛ والكتابة اللاحقة تسجّل ما حدث. الاثنتان تعملان على ساعتين مختلفتين، وتفشلان بطريقتين مختلفتين.
النموذج الذهني في جملة واحدة: function calling هو وكيل الصوت يسأل CRM سؤالاً في منتصف الجملة؛ والـ webhook هو الوكيل يرسل تقريره بعد إغلاق الخط.
Function calling: قراءة البيانات مباشرة
Function calling هو الآلية التي يتوقف بها LLM عن توليد النص، يستدعي أداة خارجية حددتَها، ثم يدمج النتيجة في ما يقوله بعد ذلك. لوكيل الصوت، تلك الأداة هي "ابحث عن هذا المتصل في CRM." يقرر النموذج أنه يحتاج البيانات، يجلبها خادمك، ويرحّب الوكيل بالمتصل باسمه ومستوى خطته. إن أردت التعمق في الآليات، يشرح دليل function calling مخطط تعريف الأدوات بالتفصيل. القيد هنا هو الوقت؛ هذا يحدث مباشرة، ويتسابق مع صبر المتصل.
Webhooks: كتابة البيانات بعد المكالمة
Webhook هو طلب POST يستقبله خادمك حين تنتهي عملية ما. لوكلاء الصوت، الأهم هو حدث نهاية المكالمة: تُرسل المنصة إليك النص الكامل والملخص والتصنيف ورابط التسجيل فور انتهاء المكالمة. تأخذ هذا الحمولة وتكتبها في CRM كنشاط، ثم تحرّك مرحلة الصفقة. لا ضغط زمني هنا. المتصل انصرف. يمكنك إعادة المحاولة والوضع في قائمة انتظار والمطابقة.
معظم التكاملات الإنتاجية تستخدم الاثنتين. اقرأ مباشرة، اكتب بعدها.
البنية المعمارية: ما يحدث على مكالمة واردة من البداية إلى النهاية
يتبع تكامل وكيل الصوت مع CRM دورة حياة ثابتة من خمس خطوات على كل مكالمة واردة. تصل المكالمة، يقرأ الوكيل سجل المتصل مباشرة عبر function call، تجري المحادثة، يُطلق webhook نهاية المكالمة، ثم يكتب معالجك النتيجة في CRM ويُبلّغ إنساناً إن لزم. كل مثال كود في هذا المقال يتعلق بواحدة من هذه الخطوات الخمس.
إليك الخطوات بالتفصيل:
- وصول المكالمة الواردة. تستجيب المنصة (Vapi أو Retell أو مجموعة وكيل الصوت الخاصة بك) وتعرّف المتصل برقم هاتفه.
- البحث المباشر (function call). يستدعي الوكيل أداة البحث، التي تستعلم عن CRM وتعيد جهة الاتصال ومرحلة الصفقة والسياق الأخير.
- المحادثة. يتحدث الوكيل، مع استدعاء أدوات إضافية اختيارياً (التحقق من مواعيد الجدول، البحث عن طلب).
- Webhook نهاية المكالمة. تنتهي المكالمة، وترسل المنصة تقرير نهاية المكالمة عبر POST إلى خادمك.
- الكتابة في CRM والتسليم. يسجّل معالجك النشاط، يضبط التصنيف، يحرّك الصفقة، ويُنشئ مهمة للمندوب البشري مع السياق الكامل.
المخطط التوضيحي في الأعلى يُرسم هذا بالضبط: سهم وارد واحد، ينقسم إلى "قراءة مباشرة" و"كتابة بعد المكالمة"، وثلاث بطاقات CRM، وعقدة تسليم. احتفظ بهذه الصورة في ذهنك؛ كل ما يلي مجرد ملء هذه المربعات.
قراءة بيانات CRM أثناء المكالمة (ولماذا لديك ميزانية 5 ثوانٍ)
نعم، يمكن لوكيل الصوت سحب بيانات CRM أثناء المكالمة. يستخدم function call يُرسل طلباً إلى نقطة بحثك ويعود قبل الجملة التالية للوكيل. القيد هو الوقت. وفقاً لـ وثائق أحداث خادم Vapi، تعمل طلبات function call ضمن مهلة زمنية، وعلى مكالمة مباشرة يكون السقف الحقيقي هو صبر المتصل، لا المهلة في API. خصّص خمس ثوانٍ واجعل لديك خطاً احتياطياً.
هنا الجزء الذي لا يقيسه أحد على الإنترنت. على مسار Vapi ← API البحث الداخلي ← قراءة جهة اتصال HubSpot، سجّلنا 410ms عند P50 و1,240ms عند P95 ذهاباً وإياباً عبر آلاف المكالمات. معظم القراءات سريعة. لكن الذيل عند P95 — backoff بسبب حدود معدل HubSpot، lambda بارد، جلب علاقة بطيء — هو مكان سكوت المكالمات. هذا الذيل هو سبب ضبطنا مهلة أداة function call على 5 ثوانٍ: أعلى بشكل مريح من P95، وأدنى بشكل مريح من النقطة التي يقول فيها الإنسان "مرحبا؟ هل أنت هناك؟"
والقاعدة المهمة: إذا استغرق بحث CRM أطول من صبر المتصل، يجب أن يقول الوكيل شيئاً. لا تسمح بالصمت أبداً. الصمت أسرع طريقة لخسارة مكالمة. في مشاريعنا، ينطق الوكيل بجملة احتياطية فور انتهاء مهلة الأداة: "دعني أبحث عن ذلك، لحظة من فضلك." يسمع المتصل توقفاً طبيعياً، لا ربوتاً معطلاً.
هذا هو تعريف أداة function call الذي نشحنه للبحث المباشر في CRM:
{
"type": "function",
"function": {
"name": "lookup_crm_contact",
"description": "Look up the caller in the CRM by phone number before greeting them. Returns name, plan, and open deal stage.",
"parameters": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Caller phone number in E.164 format"
}
},
"required": ["phone"]
}
},
"server": {
"url": "https://api.yourdomain.com/voice/crm-lookup",
"timeoutSeconds": 5
}
}شيئان يجعلان هذا آمناً للصوت. timeoutSeconds: 5 يمنع الوكيل من الانتظار إلى الأبد. وserver.url يشير إلى نقطتك، لا إلى CRM مباشرة، فأنت تتحكم في التخزين المؤقت وإعادة المحاولات وشكل ما يُعاد. في تجربتنا، وضع API داخلي بين الوكيل وCRM هو أفضل قرار يمكنك اتخاذه؛ هناك تعيش منطق الخطأ الاحتياطي وتعيين الحقول.
الكتابة بعد المكالمة: تسجيل النشاط والملخص والتصنيف
لتسجيل مكالمة وكيل الصوت في CRM، تستقبل webhook نهاية المكالمة من المنصة، تستخرج النص والملخص والتصنيف، ثم ترسل POST لنشاط المكالمة إلى CRM وتضبط حالة العميل المحتمل. لا ضغط زمني هنا — المتصل غادر — لذا هنا تُجري الكتابات الثقيلة وإعادة المحاولات وتحريك مرحلة الصفقة التي لن تجرؤ عليها أثناء مكالمة مباشرة.
حمولة نهاية المكالمة (يسمّيها Vapi حدث end-of-call-report وفق وثائق أحداث الخادم) تحمل النص الكامل وملخصاً مُولَّداً ونتيجة المكالمة ورابط التسجيل ومدة المكالمة. مهمتك تعيين ذلك إلى نشاط CRM وتحريك السجل إلى الأمام.
إليك معالج Node/TypeScript جاهز للتشغيل يستقبل التقرير ويكتب نشاط مكالمة في HubSpot، ثم يُحرّك مرحلة الصفقة. نقطة POST /crm/v3/objects/calls ونمط الربط بجهة الاتصال مأخوذان مباشرة من دليل HubSpot لـ API المكالمات:
import express from "express";
const app = express();
app.use(express.json());
const HUBSPOT_TOKEN = process.env.HUBSPOT_TOKEN!;
const seen = new Set<string>(); // swap for Redis/DB in production
app.post("/voice/end-of-call", async (req, res) => {
const report = req.body.message; // Vapi end-of-call-report
if (report?.type !== "end-of-call-report") return res.sendStatus(200);
const key = report.call.id; // idempotency key (see field-mapping section)
if (seen.has(key)) return res.sendStatus(200);
seen.add(key);
const { contactId, dealId } = report.call.metadata; // set when call started
// 1. Write the call Activity (engagement)
await fetch("https://api.hubapi.com/crm/v3/objects/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${HUBSPOT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
properties: {
hs_call_title: "AI Voice Agent Call",
hs_call_body: report.summary,
hs_call_duration: String(report.durationMs ?? 0),
hs_call_recording_url: report.recordingUrl ?? "",
hs_call_status: "COMPLETED",
hs_timestamp: Date.now(),
},
associations: [
{
to: { id: contactId },
types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 194 }],
},
],
}),
});
// 2. Move the deal stage based on disposition
if (dealId && report.analysis?.disposition === "qualified") {
await fetch(`https://api.hubapi.com/crm/v3/objects/deals/${dealId}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${HUBSPOT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ properties: { dealstage: "qualifiedtobuy" } }),
});
}
res.sendStatus(200);
});
app.listen(3000);هذا ما وعد به العنوان: معالج جاهز للنشر، لا مجرد وصف له. لا تريد كتابة هذا واستضافته بنفسك؟ بديل سير العمل البصري مثل n8n — راجع درس وكلاء n8n — يمكنه استقبال نفس الـ webhook والكتابة في CRM عبر عقد مرئية، مقابل التنازل عن بعض التحكم في إعادة المحاولات ومعالجة الأخطاء.
تعيين بيانات المكالمة إلى حقول CRM (بدون إنشاء سجلات مكررة)
تعيين الحقول يربط كل جزء من بيانات المكالمة بكائن وحقل محدد في CRM: نية المتصل بخاصية الصفقة، والتصنيف بحالة العميل المحتمل، والملخص بنص النشاط. هناك مشكلتان إنتاجيتان شائعتان: تنسيق البيانات للنطق قبل أن يقرأها الوكيل بصوت عالٍ، واستخدام مفتاح idempotency حتى لا يُنشئ webhook مُعاد إرساله سجلاً ثانياً لنفس المكالمة.
في مشاريعنا نحتفظ بالتعيين في كائن إعداد واحد حتى يتمكن غير المهندسين من تعديله دون المساس بالمعالج. إليك شكل تعيين حقيقي:
| بيانات المكالمة | كائن CRM.حقل | النوع | مثال |
|---|---|---|---|
| نية المتصل | deal.intent_summary | string | "يريد عرض خطة Pro" |
| التصنيف | contact.lead_status | enum | "qualified" |
| ملخص المكالمة | call.hs_call_body | string | "تناقشنا الأسعار، حجزنا عرضاً" |
| رابط التسجيل | call.hs_call_recording_url | url | "https://..." |
| المدة (بالملي ثانية) | call.hs_call_duration | number | 184000 |
| علامة التأهّل | deal.dealstage | enum | "qualifiedtobuy" |
المشكلة الأولى: التنسيق لنظام تحويل النص إلى كلام. وكيل يقرأ JSON خاماً لمتصل يبدو معطلاً. نسّق بيانات CRM في جملة قبل وصولها إلى نظام TTS. لا ترجع {"plan":"pro","renewed":"2026-03"} للنموذج. أرجع "هم على خطة Pro، جُدِّدت في مارس الماضي" حتى ينطق بها الوكيل بشكل طبيعي.
المشكلة الثانية: idempotency. منصات الصوت تُعيد إرسال webhooks. إن لم يكن معالجك idempotent، يُسجَّل نفس المكالمة مرتين وتحصل على سجلات مكررة. استخدم معرف المكالمة كمفتاح:
const key = report.call.id;
if (await store.has(key)) return res.sendStatus(200); // already processed
await store.add(key);
// ...do the CRM writeفي الإنتاج، ذلك store هو Redis أو صف في قاعدة بيانات مع قيد تفرد على معرف المكالمة، لا Set في الذاكرة. Set المذكورة أعلاه تصلح للعرض التجريبي؛ تفقد محتواها في كل مرة يُعاد فيها تشغيل الخادم.
قبل أقسام كل CRM على حدة، إليك كيف تختلف المنصات الثلاث في الأمور التي تهم فعلاً لوكلاء الصوت:
| HubSpot | Salesforce | Pipedrive | |
|---|---|---|---|
| كائن النشاط/المكالمة | engagement / crm/v3/objects/calls | Task / Activity | Activity |
| كائن الصفقة | Deal | Opportunity | Deal |
| المصادقة | OAuth / private app token | OAuth | API token / OAuth |
| الكتابة بعد المكالمة | engagement API | REST / Composite | Activities API |
| Webhook للحقول المخصصة | نعم | نعم | لا، استعلم عن dealFields |
تكامل HubSpot (Vapi → HubSpot، خطوة بخطوة)
لتكامل Vapi → HubSpot، تعيّن القراءة المباشرة إلى بحث Contact والكتابة بعد المكالمة إلى نشاط مكالمة مرتبط بذلك Contact وصفقته. نموذج كائنات HubSpot هو Contact وDeal والنشاط (engagement)، ونقطة POST /crm/v3/objects/calls هي هدف الكتابة. هذا هو نمط تكامل Vapi مع HubSpot الذي يبحث عنه معظم الناس.
القراءة المباشرة هي function call إلى نقطة البحث لديك، التي تستعلم عن GET /crm/v3/objects/contacts/search برقم الهاتف وتعيد Contact وأي صفقة مفتوحة. الكتابة بعد المكالمة هي المعالج في القسم السابق: ينشئ نشاط مكالمة ويربطه بـ Contact عبر نوع الارتباط 194، ثم يُحدّث dealstage للصفقة.
التفصيل الذي يُغفله الناس: ارتباطات HubSpot مُنوَّعة بالنوع. ارتباط مكالمة بجهة اتصال يستخدم associationTypeId محدداً، ولن تظهر المكالمة على جدول زمني جهة الاتصال إن أغفلته. دليل HubSpot لـ API المكالمات يسرد المعرفات. للمصادقة، private app token هو الأسرع لمساحة عمل واحدة؛ استخدم OAuth إن كنت تشحن هذا لحسابات HubSpot متعددة.
تكامل Salesforce (الكائنات والمصادقة والقراءة/الكتابة في الوقت الفعلي)
تكامل Salesforce لوكيل الصوت يقرأ من Contact أو Lead أثناء المكالمة، ويكتب Task (كائن النشاط) بعدها. الصفقة تعيش على Opportunity. النمط مطابق لـ HubSpot — قراءة مباشرة، كتابة لاحقة — لكن أسماء الكائنات ومسار المصادقة يختلفان. ستستخدم REST API أو Composite API للكتابة.
للقراءة المباشرة، تستعلم نقطة البحث لديك عن Salesforce بطلب SOQL مثل SELECT Id, Name, Account.Name FROM Contact WHERE Phone = '...' وتُعيده للوكيل. للكتابة بعد المكالمة، تُنشئ Task مع ضبط WhoId على Contact/Lead وWhatId على Opportunity، وفق دليل Salesforce REST API:
await fetch(
`${INSTANCE_URL}/services/data/v60.0/sobjects/Task`,
{
method: "POST",
headers: {
Authorization: `Bearer ${sfToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
Subject: "AI Voice Agent Call",
Description: report.summary,
Status: "Completed",
WhoId: contactId, // Contact or Lead
WhatId: opportunityId, // Opportunity
CallDurationInSeconds: Math.round((report.durationMs ?? 0) / 1000),
}),
}
);المشكلة الخاصة بالصوت: رموز OAuth في Salesforce تنتهي صلاحيتها، ولا تريد تجديد الرمز وهو يتسابق مع ميزانية القراءة المباشرة البالغة 5 ثوانٍ. جدّد الرموز بجدول منتظم في الخلفية، خزّن رمز الوصول، وابقِه دافئاً حتى لا تدفع تكلفة التجديد على مكالمة مباشرة.
تكامل Pipedrive (الذي يتخطاه الجميع)
تكامل Pipedrive يعمل عبر Persons وDeals وActivities، وله مشكلة حقيقية: لا يوجد webhook لتغييرات الحقول المخصصة. إن كتب وكيل الصوت حقلاً مخصصاً وتحتاج للتفاعل مع هذا التغيير في مكان آخر، لا يمكنك الاشتراك به. Pipedrive لن يُرسل إليك webhook حين يتغير حقل مخصص؛ عليك استعلام dealFields بجدول منتظم. لا يغطي هذا تقريباً أحد، وهذا بالضبط سبب فشل تكامل وكيل الصوت مع Pipedrive بطرق غير واضحة.
دورة حياة الصوت تُعيَّن بوضوح: القراءة المباشرة تستعلم عن GET /persons/search برقم الهاتف، الكتابة بعد المكالمة تُنشئ Activity عبر POST /activities مرتبطة بـ Person وDeal، والتأهيل يُحرّك الصفقة للمرحلة التالية. كل شيء قياسي.
الفخ هو الحقول المخصصة. في Pipedrive، تُشار إلى الحقول المخصصة بـ مفتاح hash مكوّن من 40 حرفاً، لا باسم بشري، لذا يجب أن يخزّن إعداد التعيين شيئاً مثل dcf558aba6... بدلاً من plan_tier. ووفق وثائق Pipedrive لـ DealFields، لا يوجد حدث تغيير لها. إن احتاج نظام آخر معرفة متى حدّث الوكيل حقلاً مخصصاً، تستعلم عن GET /dealFields وتقارن بلقطتك الأخيرة على جدول cron. ليس أنيقاً. هكذا يعمل Pipedrive، واكتشاف ذلك الساعة 2 صباحاً في الإنتاج أسوأ من قراءته هنا.
تسليم العملاء المؤهّلين: تحريك الصفقة وإحاطة المندوب البشري
التسليم هو المرحلة التي يُحرّك فيها وكيل الصوت مرحلة الصفقة عند التأهيل، يُنشئ مهمة للمندوب البشري، ويُمرّر النص والملخص حتى يدخل المندوب على الفور وهو يعرف السياق. حين يتم ذلك بشكل صحيح، يستلم الإنسان عميلاً محتملاً دافئاً مؤهّلاً مع ملاحظات مرفقة، لا مجرد اسم ورقم هاتف.
ميكانيكياً هي ثلاث كتابات، كلها في معالج ما بعد المكالمة: PATCH للصفقة إلى المرحلة المؤهّلة، POST لنشاط/مهمة مخصصة للمندوب مع تاريخ استحقاق، وحشو ملخص المكالمة في نص المهمة. يفتح المندوب CRM، يرى "AI مؤهّل: يريد عرض Pro، الميزانية مؤكّدة، يفضّل الخميس"، ويتصل مستعداً.
هنا يظهر أثر اختيار المنصة أيضاً. إن كنت لا تزال تقرر أي محرك ستبني عليه، يقارن تحليلنا لـ المنصات من حيث تكامل CRM كيف تُعرض Vapi وRetell وBland بيانات تعريف المكالمة وأحداث الـ webhook، وهذا الاختلاف يُشكّل مباشرة مدى نظافة تسليمك.
البناء بنفسك أم التوكيل (بساعات صادقة)
بناء تكامل وكيل صوت مع CRM بمستوى إنتاجي يستغرق تقريباً 20 إلى 40 ساعة لكل CRM، والساعات لا تذهب حيث تتوقع. المسار السعيد للقراءة والكتابة يوم ربما. الباقي في إدارة رموز المصادقة، وتعيين الحقول، ومعالجة الأخطاء الاحتياطية، وidempotency، والاختبار ضد حدود معدل CRM وتفاصيله. فكم يستغرق هذا فعلاً؟ إليك التوزيع الصادق.
في مشاريعنا، تتوزع الساعات تقريباً هكذا: 3 إلى 5 ساعات على المصادقة وتجديد الرموز، 4 إلى 6 على تعيين الحقول وطبقة التنسيق لنظام TTS، 4 إلى 8 على معالجة الأخطاء الاحتياطية والمهل الزمنية، 3 إلى 5 على idempotency وإزالة التكرار، والباقي على الاختبار بحركة مكالمات حقيقية. أول CRM يُعلّمك النمط؛ الثاني والثالث يسيران بشكل أسرع، لكن لكل منهما مشكلته الخاصة، كغياب webhook للحقول المخصصة في Pipedrive.
هل تبني أم تشتري؟ إن كان لديك مطوّر يمكنه استضافة نقطة webhook وتدمج CRM واحداً، ابنِ. هذا المقال هو دليلك. إن احتجت ثلاثة CRMs ومصادقة متعددة المستأجرين وشخصاً متاحاً حين يفرض عليك HubSpot حدود معدل الساعة 9 صباحاً، تتغير المعادلة. نستعرض هذا القرار بالتفصيل في دليل البناء مقابل الشراء، وتفصيل الأسعار يُظهر كمية عمل التكامل التي تُضاف إلى المشروع.
إن كنت تفضّل عدم الاهتمام بأي هذا، نحن نفعله للعملاء. Techsy تشحن وكلاء صوت إنتاجية مرتبطة بـ CRM: قراءات function call، كتابات webhook، معالجة الأخطاء الاحتياطية، كل شيء. لا ضغط في أي من الاتجاهين؛ الكود أعلاه ملكك لتشغيله بصرف النظر.
عن الكاتب
مرت باتور غوربوز هو المؤسس المشارك لـ Techsy.io، حيث يشحن الفريق وكلاء الذكاء الاصطناعي وأنظمة الأتمتة وخطوط الصوت/SDR لعملاء B2B. يدرس في جامعة برمنغهام ويكتب عن مجموعة أدوات LLM التي يستخدمها فريق Techsy فعلاً في الإنتاج. تواصل عبر LinkedIn.
الأسئلة الشائعة
كيف تربط وكيل صوت ذكي بـ CRM؟
تربط الوكيل بـ CRM بطريقتين: function calling للقراءات المباشرة أثناء المكالمة، وwebhook للكتابة بعد انتهائها. يبحث الوكيل عن المتصل مباشرة عبر نقطتك، ثم يُطلق webhook نهاية المكالمة معالجك الذي يسجّل نشاطاً ويُحدّث مرحلة الصفقة في CRM.
هل يمكن لوكيل الصوت سحب بيانات CRM أثناء المكالمة؟
نعم. يستخدم الوكيل function calling ليُرسل طلباً إلى نقطة البحث، التي تستعلم عن CRM وتعيد بيانات جهة الاتصال والصفقة قبل الجملة التالية للوكيل. اضبط مهلة أداة لخمس ثوانٍ واجعل لديك جملة احتياطية منطوقة، لأنك على مكالمة مباشرة تتسابق مع صبر المتصل، لا مع المهلة في API.
كيف تسجّل مكالمات وكيل الصوت في CRM؟
تستقبل webhook نهاية المكالمة من المنصة، التي تحمل النص والملخص والتصنيف ورابط التسجيل. يستخرج معالجك تلك البيانات، يُرسل POST لنشاط مكالمة أو نشاط engagement إلى CRM مرتبطاً بجهة الاتصال، ويضبط حالة العميل المحتمل. لا ضغط زمني هنا لأن المتصل أغلق الخط.
ما الفرق بين webhook وfunction calling لوكلاء الصوت؟
Function calling هو قراءة مباشرة أثناء المكالمة: يسأل الوكيل CRM سؤالاً في منتصف المحادثة ويستخدم الإجابة فوراً. Webhook هو كتابة بعد المكالمة: ترسل المنصة نتيجة المكالمة إلى خادمك بعد انتهاء المكالمة. Function calling يتسابق مع الساعة؛ webhooks لا تفعل ذلك.
هل تتكامل Vapi مع HubSpot وSalesforce وPipedrive؟
Vapi لا تشحن موصّلات أصلية للثلاثة، لكنها تتكامل مع أي منهم عبر أدوات function call (قراءات مباشرة) وwebhooks عبر server URL (كتابات بعد المكالمة). تُوجّه تلك إلى نقطتك الخاصة التي تتحدث مع HubSpot أو Salesforce أو Pipedrive عبر REST APIs. النمط مطابق عبر الـ CRMs الثلاثة.
كيف تعيّن بيانات المكالمة إلى الحقول المخصصة في CRM؟
احتفظ بكائن إعداد يعيّن كل حقل من بيانات المكالمة إلى كائن وحقل في CRM. لـ HubSpot وSalesforce، تستخدم الحقول المخصصة أسماء داخلية مقروءة. Pipedrive يُشير إلى الحقول المخصصة بمفتاح hash مكوّن من 40 حرفاً، لذا يخزّن إعدادك الـ hash، لا اسماً سهلاً. نسّق القيم للنطق قبل أن يقرأها الوكيل بصوت عالٍ.
هل يمكن لوكيل الصوت تحديث CRM في الوقت الفعلي أثناء المكالمة؟
يمكنه القراءة في الوقت الفعلي، لكن معظم المشاريع الإنتاجية تُؤجّل الكتابة إلى ما بعد المكالمة. القراءات المباشرة يجب أن تكون سريعة وهي آمنة. الكتابات المباشرة تُخاطر بالتأخر والتحديثات الجزئية إن انقطعت المكالمة في منتصف الكتابة. النمط القياسي هو القراءة مباشرة والكتابة على webhook نهاية المكالمة، مما يحمي تجربة المتصل.
كيف تمنع وكيل الصوت من إنشاء سجلات CRM مكررة؟
استخدم مفتاح idempotency؛ معرف المكالمة مثالي. قبل أن يكتب معالجك أي شيء، تحقق مما إذا كنت قد عالجت هذا المعرف من قبل؛ إن كان الأمر كذلك، أعِد 200 وتخطَّ. خزّن المفتاح في Redis أو قاعدة بيانات مع قيد تفرد، لا في الذاكرة، حتى يصمد عند إعادة التشغيل. Webhooks تُعيد الإرسال، لذا هذا غير اختياري.
هل تتكامل Retell مع Pipedrive؟
Retell تتكامل مع Pipedrive عبر نفس نمط function call وwebhook كأي CRM، حتى حيث لا يُدرج موصّل أصلي. تربط أحداث مكالمة Retell بنقطتك التي تستخدم Activities وDeals APIs في Pipedrive. انتبه لقيد الحقول المخصصة: Pipedrive لا يملك webhook لتغييرات الحقول المخصصة، لذا تستعلم عن dealFields بدلاً من ذلك.
كم من الوقت يستغرق بناء تكامل وكيل الصوت مع CRM؟
تقريباً 20 إلى 40 ساعة لكل CRM لمشروع بمستوى إنتاجي. المسار السعيد سريع؛ الوقت يذهب في المصادقة وتجديد الرموز، وتعيين الحقول، ومعالجة الأخطاء الاحتياطية والمهل الزمنية، وidempotency، والاختبار بحركة مكالمات حقيقية. أول CRM هو الأبطأ لأنه يُعلّمك النمط. كل CRM إضافي لا يزال يملك تفاصيله الخاصة.