تشغيل حملة لتأهيل العملاء المحتملين بالذكاء الاصطناعي مع Wixzel Voice
في النهاية ستكون قد رفعت قائمة عملاء محتملين، واتصل وكيل كتبته بكل واحد منهم عبر SIP trunk الخاص بك بأسئلة التأهيل التي حددتها، وقرأت حالة كل مكالمة ونصها المكتوب. يستغرق البناء نحو 30 دقيقة في Node.js مع حزمة wixzel-voice SDK، إضافةً إلى وقت المكالمات. المكالمات القصيرة ذات السيناريو المحدد هي أرخص أنواع الاستخدام: على محرك classic، بسعر $0.0867 لكل دقيقة اتصال، تكلف 1,000 مكالمة مدة كل منها دقيقتان نحو $173 من وقت المحرك، تُحتسب بالثانية من رصيد مسبق الدفع، إضافةً إلى سعر مزوّد الاتصالات. المكالمة التي لا يرد عليها أحد لا تكلف شيئًا.
بقلم Aqeel Shamsudheen · نُشر في · حُدّث في
- المدة
- نحو 30 دقيقة، إضافةً إلى وقت المكالمات
- المحرك
- classic
- وقت المحرك
- $0.0867 لكل دقيقة متصلة
ما الذي تحتاجه قبل أن تبدأ؟
- SIP trunk ورقم للمكالمات الصادرة مسجّل عليه. يغطي دليل Twilio ووثائق SIP trunks كليهما.
- مفتاح API من Wixzel Voice مع رصيد، وNode.js 20 أو أحدث مع
npm install wixzel-voice. - موافقة على الاتصال بكل عميل محتمل في القائمة حيث يشترط القانون ذلك. تلخّص خطوة الامتثال أدناه ما تطلبه سياسة الاستخدام المقبول.
كيف تبني هذا على Wixzel Voice، خطوة بخطوة؟
01اكتب المتصل
الوكيل هو سيناريو المكالمة. حقول الدمج تجعل كل مكالمة شخصية:
agent.mjsimport { WixzelVoice } from 'wixzel-voice'; const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY }); const agent = await client.agents.create({ name: 'Demo follow-up', outbound_phone_number_id: process.env.NUMBER_ID, system_prompt: [ 'You are calling {{name}} from {{company}}, who asked for a demo of Acme Scheduling.', 'Ask three questions, one at a time: how many staff take bookings,', 'what they use for bookings today, and when they would want to switch.', 'Keep replies short. If they are not interested, thank them and end the call.', 'If they ask not to be called again, confirm that you have noted it and end the call.', 'Finish by thanking them and saying a person will follow up by email.', ].join('\n'), opening_message: 'Hi {{name}}, this is an automated assistant calling for Acme about the demo you requested. Is now a good time?', voice: { stt: { model: 'deepgram/nova-3', language: 'en-US' }, llm: { model: 'openrouter/gpt-4o-mini' }, tts: { model: 'elevenlabs/eleven_flash_v2_5' }, }, }); console.log('AGENT_ID', agent.id);تُستبدل
{{name}}من بيانات العميل المحتمل، وكل مفتاح فيfieldsالخاصة بالعميل المحتمل يصبح حقل دمج أيضًا، لذا تأتي{{company}}من الرفع أدناه. تقول الجملة الافتتاحية إن المتصل آلي، وهي مكان ذلك الإفصاح حين يشترطه القانون.outbound_phone_number_idمطلوب للحملات: فهو رقم المتصل الذي تعرضه كل مكالمة.02ارفع العملاء المحتملين
بقية البناء سكربت واحد،
campaign.mjs. يبدأ بالرفع:campaign.mjs, part 1import { WixzelVoice } from 'wixzel-voice'; const client = new WixzelVoice({ apiKey: process.env.WIXZEL_API_KEY }); // From your CRM or a CSV: only people you have consent to call. const rows = [ { name: 'Priya Nair', phone_number: '+14155550111', fields: { company: 'Northside Physio' } }, { name: 'Sam Carter', phone_number: '+14155550112', fields: { company: 'Carter Auto' } }, ]; const upload = await client.leads.bulkCreate({ leads: rows }); console.log('created', upload.created_count, 'failed', upload.failed_count); for (const e of upload.errors) console.log('row', e.index, e.phone_number, e.error); const leadIds = upload.data.map((lead) => lead.id);يمكن رفع ما يصل إلى 1,000 عميل محتمل في طلب واحد. يُتحقق من الصفوف واحدًا تلو الآخر، لذا افحص
failed_countوerrorsبدلًا من افتراض أن القائمة كلها وصلت. لا يُطلق الرفع المجمّع أي webhooks.03شغّل حملات بحجم حد التزامن لديك
الحملة وكيل واحد وقائمة عملاء محتملين. إنشاؤها لا يتصل بأحد؛ أما
startفيتصل، وينفق الرصيد مع اتصال كل مكالمة.حاليًا تُجري الحملة مكالماتها متتابعةً بسرعة بدلًا من وضعها في طابور، وتُحتسب كل مكالمة ضمن حد المكالمات المتزامنة للحساب، خمس افتراضيًا. العميل المحتمل الذي يتجاوز الحد يُسجَّل كمكالمة فاشلة بدلًا من انتظار دوره. لذا شغّل القائمة على دفعات لا تتجاوز حدك، وابدأ الدفعة التالية حين تنتهي السابقة:
campaign.mjs, part 2const LIMIT = 5; // your account's concurrent-call limit, minus any calls you expect meanwhile const DONE = new Set(['completed', 'failed', 'busy', 'no-answer', 'canceled']); const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); async function finishedCalls(campaignId) { let finished = 0; for await (const call of await client.calls.list({ campaign_id: campaignId, limit: 100 })) { if (DONE.has(call.status)) finished++; } return finished; } const campaignIds = []; for (let i = 0; i < leadIds.length; i += LIMIT) { const batch = leadIds.slice(i, i + LIMIT); const campaign = await client.campaigns.create({ name: 'Demo follow-up ' + (i / LIMIT + 1), agent_id: process.env.AGENT_ID, lead_ids: batch, }); await client.campaigns.start(campaign.id); campaignIds.push(campaign.id); const giveUpAt = Date.now() + 30 * 60 * 1000; while ((await finishedCalls(campaign.id)) < batch.length && Date.now() < giveUpAt) { await sleep(15000); } }يجيب
startبالحملة في الحالةstatus: "running". لإيقاف دفعة مبكرًا، يوقفهاclient.campaigns.pause(campaign.id)ويُنهي مكالماتها الجارية، وبعدها تكون حالة الحملةstatus: "stopped". بدء حملة متوقفة من جديد يتصل بكل عميل محتمل فيها مرة أخرى، بمن فيهم من سبق الاتصال بهم، لذا للمتابعة أنشئ حملة جديدة من العملاء المحتملين الذين لم يُتصل بهم بعد. يبدأscheduled_atعند الإنشاء الحملة في وقت محدد بدلًا منstart.04اقرأ كل مكالمة
كل مكالمة سجل يحمل حالتها وتكلفتها ونصها المكتوب، مرتبط بالعميل المحتمل عبر
lead_id:campaign.mjs, part 3for (const campaignId of campaignIds) { for await (const call of await client.calls.list({ campaign_id: campaignId, limit: 100 })) { const detail = await client.calls.retrieve(call.id); const answers = detail.transcript .filter((line) => line.role === 'user') .map((line) => line.content) .join(' / '); console.log(call.lead_id, call.status, call.duration_seconds, call.failure_code, answers); } }تخبرك
statusما إذا كانت المكالمة قد اتصلت، وfailure_codeلماذا لم تتصل (17 مشغول، 19 لا رد، 21 رفضها مزوّد الاتصالات) وcost_microsكم كلفت. العميل المحتمل الذي رُفض قبل الاتصال، عند حد التزامن أو لنقص الرصيد، يظهر كـfailedدونfailure_code.التأهيل نفسه قرارك أنت. يسجّل Wixzel Voice المحادثة؛ ويحمل النص المكتوب الإجابات عن أسئلتك الثلاثة، فقيّمه بقواعدك أو بنموذجك الخاص واكتب النتيجة في نظام CRM لديك. قد يكون حقل
summaryفارغًا، فلا تعتمد عليه. للاستجابة عند انتهاء المكالمات بدلًا من الاستعلام المتكرر، اشترك في الـ webhookcallCompleted، الذي يحمل معرّفي العميل المحتمل والحملة مع حالة المكالمة ومدتها.05التزم بقواعد الاتصال
تضع سياسة الاستخدام المقبول هذه الالتزامات على المتصل، أي عليك. هذا ملخص لها، وليس استشارة قانونية.
اتصل فقط بالأشخاص الذين لديك موافقتهم حيث يشترط القانون ذلك. في الولايات المتحدة يعني ذلك عمومًا موافقة خطية صريحة مسبقة لمكالمات التسويق إلى أرقام الهواتف المحمولة بموجب TCPA؛ وفي الهند، لوائح تفضيلات العملاء الصادرة عن TRAI؛ وفي المملكة المتحدة والاتحاد الأوروبي، PECR واللائحة العامة لحماية البيانات (GDPR).
راجع سجلات عدم الاتصال الوطنية وسجلات الولايات وقائمة الاستبعاد الخاصة بك قبل كل رفع. عندما يطلب شخص عدم الاتصال به مجددًا، احذفه فورًا ونهائيًا: يستطيع الوكيل إنهاء المكالمة بلطف، لكن حذف العميل المحتمل مهمة الكود الخاص بك.
صرّح بأن المتصل آلي في بداية المكالمة حيث يشترط القانون ذلك، كما تفعل الجملة الافتتاحية أعلاه، والتزم بقيود ساعات الاتصال، واحتفظ بإثبات الموافقة طوال المدة التي يشترطها القانون.
كم يكلّف هذا البناء على Wixzel Voice؟
وقت المحرك لمكالمات مدة كل منها 2 دقيقة على محرك classic بسعر $0.0867 لكل دقيقة متصلة: نحو $0.17 للمكالمة. الاتصالات الهاتفية عبر trunk الخاص بك بسعر مزوّد الاتصالات، وهي غير مشمولة.
| المكالمات شهريًا | الدقائق المتصلة | تكلفة المحرك شهريًا |
|---|---|---|
| 1,000 | 2,000 | $173 |
| 5,000 | 10,000 | $867 |
| 20,000 | 40,000 | $3,468 |
يُحتسب وقت الاتصال الفعلي فقط، بالثانية. المكالمة المشغولة أو التي لم يُرد عليها أو المرفوضة قبل الاتصال لا تكلف شيئًا، لأن المحرك لا يبدأ أبدًا. يحاسبك مزوّد الاتصالات على الخط بشكل منفصل بأسعاره، دون أي هامش.
مسبق الدفع، دون اشتراك ودون خطة مجانية: أضِف رصيدًا بدءًا من $5 ويُستهلك مع الاستخدام. قدّر تكلفة استخدامك.
ما حدود Wixzel Voice التي تنطبق على هذا البناء؟
- تتصل الحملة بعملائها المحتملين متتابعين بسرعة ولا تنتظر في طابور خلف حد المكالمات المتزامنة، وهو خمس لكل حساب افتراضيًا؛ ويُسجَّل من يتجاوز الحد كفاشل. قسّم إلى دفعات بحجم حدك، أو اطلب حدًا أعلى.
- بدء حملة متوقفة يتصل بكل عميل محتمل فيها مرة أخرى. تابع بحملة جديدة من العملاء المحتملين الذين لم يُتصل بهم بعد.
- تتسع كل حملة لما يصل إلى 10,000 عميل محتمل، ويتسع الحساب لما يصل إلى 500 حملة افتراضيًا، ويُرفع ذلك عند الطلب.
- يسجّل Wixzel Voice المكالمة ونصها المكتوب. أما تحديد من تأهّل، والحفاظ على قائمة عدم الاتصال، فمهمة الكود الخاص بك.
- تُطرح التغييرات في سلوك Wixzel Voice خلف ترويسة
Wixzel-Versionمؤرّخة.
الأسئلة الشائعة
كيف أشغّل حملة اتصال صادر بالذكاء الاصطناعي على Wixzel Voice؟
POST /v1/leads/bulk، وأنشئ حملة بوكيل وأولئك العملاء، ثم يجعل POST /v1/campaigns/{id}/start الوكيلَ يتصل بكل واحد منهم عبر SIP trunk الخاص بك، واحدًا تلو الآخر. اجعل كل حملة لا تتجاوز حد المكالمات المتزامنة لديك، لأن العميل المحتمل الذي يتجاوزه يُعلَّم كفاشل بدلًا من وضعه في طابور. كل مكالمة سجل يحمل حالتها ونصها المكتوب وتكلفتها، مرتبط بالعميل المحتمل عبر lead_id. المكالمات الفردية تمر عبر POST /v1/calls.كم مكالمة صادرة يمكن تشغيلها في وقت واحد؟
هل أستخدم الحملات أم المكالمات الفردية؟
POST /v1/calls لكل عميل محتمل من طابورك الخاص يمنحك تحكمًا أدق: تأخذ كل مكالمة lead_id ومفتاح idempotency، وأنت من يقرر متى تبدأ المكالمة التالية.هل الاتصال الصادر بالذكاء الاصطناعي قانوني؟
للمزيد من القراءة
- البدء السريعالتوثيق
trunk ورقم ووكيل ومكالمة واحدة.
- الوكلاءالتوثيق
التعليمات والجمل الافتتاحية وأرقام المتصل.
- Webhooksالتوثيق
callCompleted وcampaignCompleted والتواقيع.
- مرجع الـ APIالتوثيق
العملاء المحتملون والحملات والمكالمات، حقلًا حقلًا.
عن Wixzel Voice
Wixzel Voice هو API للذكاء الاصطناعي الصوتي لبناء وكلاء ذكاء اصطناعي يجرون مكالمات هاتفية حقيقية ويردّون عليها عبر SIP trunk الخاص بك، أو يتحدثون إلى الناس في تطبيقات الويب والجوال الخاصة بك. مفتاح API واحد ورصيد مدفوع مسبقًا واحد يغطيان كل محركات الصوت، مع فوترة بالثانية حسب الاستخدام الفعلي.
المزيد من الأدلة
Claude، في Claude Code أو claude.ai، يجري مكالمة حقيقية عبر SIP trunk الخاص بك ويقرأ لك النص المكتوب، مع طلب تأكيد قبل أي اتصال.
رقم Twilio الحالي لديك يجيب عليه موظف استقبال بالذكاء الاصطناعي يحجز المواعيد عبر الـ API، مبني بـ Node.js.
وكيلان هاتفيان، أحدهما يتحدث الهندية والآخر المالايالامية، على نماذج Sarvam المخصصة للغات الهند، يجيبان على المكالمات أو يجريانها عبر SIP trunk الخاص بك.
تطبيق Flutter يتحدث فيه المستخدمون إلى وكيلك الصوتي عبر WebSocket، مع بقاء مفتاح API على خادمك ودون أي رقم هاتف.
وكيل Gemini Live يتصل بهاتف حقيقي عبر SIP trunk الخاص بك من أربعة طلبات cURL، وسجل المكالمة مع النص المكتوب والتكلفة.
شخصية تعريفية ناطقة في زاوية موقعك يتصل بها الزوار من المتصفح، مقيّدة بنطاقاتك وحدودك اليومية، مع قائمة بكل متصل.
شاشة Flutter فيها الشخصية التعريفية لوكيلك تحرّك فمها مع صوت الوكيل أثناء مكالمة آنية، مع بقاء مفتاح API على خادمك.
ابنِ أول وكيل صوتي لك

