تخطَّ إلى المحتوى
دليل

تشغيل حملة لتأهيل العملاء المحتملين بالذكاء الاصطناعي مع Wixzel Voice

في النهاية ستكون قد رفعت قائمة عملاء محتملين، واتصل وكيل كتبته بكل واحد منهم عبر SIP trunk الخاص بك بأسئلة التأهيل التي حددتها، وقرأت حالة كل مكالمة ونصها المكتوب. يستغرق البناء نحو 30 دقيقة في Node.js مع حزمة wixzel-voice SDK، إضافةً إلى وقت المكالمات. المكالمات القصيرة ذات السيناريو المحدد هي أرخص أنواع الاستخدام: على محرك classic، بسعر $0.0867 لكل دقيقة اتصال، تكلف 1,000 مكالمة مدة كل منها دقيقتان نحو $173 من وقت المحرك، تُحتسب بالثانية من رصيد مسبق الدفع، إضافةً إلى سعر مزوّد الاتصالات. المكالمة التي لا يرد عليها أحد لا تكلف شيئًا.

بقلم · نُشر في · حُدّث في

المدة
نحو 30 دقيقة، إضافةً إلى وقت المكالمات
المحرك
classic
وقت المحرك
$0.0867 لكل دقيقة متصلة

ما الذي تحتاجه قبل أن تبدأ؟

  • SIP trunk ورقم للمكالمات الصادرة مسجّل عليه. يغطي دليل Twilio ووثائق SIP trunks كليهما.
  • مفتاح API من Wixzel Voice مع رصيد، وNode.js 20 أو أحدث مع npm install wixzel-voice.
  • موافقة على الاتصال بكل عميل محتمل في القائمة حيث يشترط القانون ذلك. تلخّص خطوة الامتثال أدناه ما تطلبه سياسة الاستخدام المقبول.

كيف تبني هذا على Wixzel Voice، خطوة بخطوة؟

  1. 01اكتب المتصل

    الوكيل هو سيناريو المكالمة. حقول الدمج تجعل كل مكالمة شخصية:

    agent.mjs
    import { 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 مطلوب للحملات: فهو رقم المتصل الذي تعرضه كل مكالمة.

  2. 02ارفع العملاء المحتملين

    بقية البناء سكربت واحد، campaign.mjs. يبدأ بالرفع:

    campaign.mjs, part 1
    import { 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.

  3. 03شغّل حملات بحجم حد التزامن لديك

    الحملة وكيل واحد وقائمة عملاء محتملين. إنشاؤها لا يتصل بأحد؛ أما start فيتصل، وينفق الرصيد مع اتصال كل مكالمة.

    حاليًا تُجري الحملة مكالماتها متتابعةً بسرعة بدلًا من وضعها في طابور، وتُحتسب كل مكالمة ضمن حد المكالمات المتزامنة للحساب، خمس افتراضيًا. العميل المحتمل الذي يتجاوز الحد يُسجَّل كمكالمة فاشلة بدلًا من انتظار دوره. لذا شغّل القائمة على دفعات لا تتجاوز حدك، وابدأ الدفعة التالية حين تنتهي السابقة:

    campaign.mjs, part 2
    const 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.

  4. 04اقرأ كل مكالمة

    كل مكالمة سجل يحمل حالتها وتكلفتها ونصها المكتوب، مرتبط بالعميل المحتمل عبر lead_id:

    campaign.mjs, part 3
    for (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 فارغًا، فلا تعتمد عليه. للاستجابة عند انتهاء المكالمات بدلًا من الاستعلام المتكرر، اشترك في الـ webhook callCompleted، الذي يحمل معرّفي العميل المحتمل والحملة مع حالة المكالمة ومدتها.

  5. 05التزم بقواعد الاتصال

    تضع سياسة الاستخدام المقبول هذه الالتزامات على المتصل، أي عليك. هذا ملخص لها، وليس استشارة قانونية.

    اتصل فقط بالأشخاص الذين لديك موافقتهم حيث يشترط القانون ذلك. في الولايات المتحدة يعني ذلك عمومًا موافقة خطية صريحة مسبقة لمكالمات التسويق إلى أرقام الهواتف المحمولة بموجب TCPA؛ وفي الهند، لوائح تفضيلات العملاء الصادرة عن TRAI؛ وفي المملكة المتحدة والاتحاد الأوروبي، PECR واللائحة العامة لحماية البيانات (GDPR).

    راجع سجلات عدم الاتصال الوطنية وسجلات الولايات وقائمة الاستبعاد الخاصة بك قبل كل رفع. عندما يطلب شخص عدم الاتصال به مجددًا، احذفه فورًا ونهائيًا: يستطيع الوكيل إنهاء المكالمة بلطف، لكن حذف العميل المحتمل مهمة الكود الخاص بك.

    صرّح بأن المتصل آلي في بداية المكالمة حيث يشترط القانون ذلك، كما تفعل الجملة الافتتاحية أعلاه، والتزم بقيود ساعات الاتصال، واحتفظ بإثبات الموافقة طوال المدة التي يشترطها القانون.

كم يكلّف هذا البناء على Wixzel Voice؟

وقت المحرك لمكالمات مدة كل منها 2 دقيقة على محرك classic بسعر $0.0867 لكل دقيقة متصلة: نحو $0.17 للمكالمة. الاتصالات الهاتفية عبر trunk الخاص بك بسعر مزوّد الاتصالات، وهي غير مشمولة.

تكلفة المحرك الشهرية لما يبنيه هذا الدليل
المكالمات شهريًاالدقائق المتصلةتكلفة المحرك شهريًا
1,0002,000$173
5,00010,000$867
20,00040,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.

كم مكالمة صادرة يمكن تشغيلها في وقت واحد؟

خمس لكل حساب افتراضيًا، تشمل كل مكالمة نشطة وجلسة ويب. يُرفع الحد عند الطلب: راسل aqeel@wixzel.com بحجم الاستخدام الذي تتوقعه.

هل أستخدم الحملات أم المكالمات الفردية؟

تناسب الحملات قائمة تتصل بها دفعة واحدة. عندما تريد التحكم في الوتيرة وإعادة المحاولة بنفسك، فإن POST /v1/calls لكل عميل محتمل من طابورك الخاص يمنحك تحكمًا أدق: تأخذ كل مكالمة lead_id ومفتاح idempotency، وأنت من يقرر متى تبدأ المكالمة التالية.

هل الاتصال الصادر بالذكاء الاصطناعي قانوني؟

يعتمد ذلك على مكان الأشخاص الذين تتصل بهم وعلى موافقتهم. تشترط سياسة الاستخدام المقبول الحصول على الموافقة حيث يشترطها القانون، واحترام سجلات عدم الاتصال وطلبات إلغاء الاشتراك، والإفصاح عن أن المتصل آلي حيث يُشترط ذلك. يوفّر Wixzel Voice الأدوات، لا الأساس القانوني.

للمزيد من القراءة

  • البدء السريعالتوثيق

    trunk ورقم ووكيل ومكالمة واحدة.

  • الوكلاءالتوثيق

    التعليمات والجمل الافتتاحية وأرقام المتصل.

  • Webhooksالتوثيق

    callCompleted وcampaignCompleted والتواقيع.

  • مرجع الـ APIالتوثيق

    العملاء المحتملون والحملات والمكالمات، حقلًا حقلًا.

واجهات API للاتصالات الهاتفية القائمة على الوكلاء

عن Wixzel Voice

Wixzel Voice هو API للذكاء الاصطناعي الصوتي لبناء وكلاء ذكاء اصطناعي يجرون مكالمات هاتفية حقيقية ويردّون عليها عبر SIP trunk الخاص بك، أو يتحدثون إلى الناس في تطبيقات الويب والجوال الخاصة بك. مفتاح API واحد ورصيد مدفوع مسبقًا واحد يغطيان كل محركات الصوت، مع فوترة بالثانية حسب الاستخدام الفعلي.

أعطِ Claude خط هاتف حقيقيًا عبر خادم MCP من Wixzel Voice

Claude، في Claude Code أو claude.ai، يجري مكالمة حقيقية عبر SIP trunk الخاص بك ويقرأ لك النص المكتوب، مع طلب تأكيد قبل أي اتصال.

بناء موظف استقبال بالذكاء الاصطناعي على Twilio في Node.js مع Wixzel Voice

رقم Twilio الحالي لديك يجيب عليه موظف استقبال بالذكاء الاصطناعي يحجز المواعيد عبر الـ API، مبني بـ Node.js.

وكيل هاتفي بالهندية والمالايالامية على محرك sarvam من Wixzel Voice

وكيلان هاتفيان، أحدهما يتحدث الهندية والآخر المالايالامية، على نماذج Sarvam المخصصة للغات الهند، يجيبان على المكالمات أو يجريانها عبر SIP trunk الخاص بك.

أضف وكيلًا صوتيًا إلى Flutter عبر WebSocket مع Wixzel Voice

تطبيق Flutter يتحدث فيه المستخدمون إلى وكيلك الصوتي عبر WebSocket، مع بقاء مفتاح API على خادمك ودون أي رقم هاتف.

Gemini Live في مكالمة هاتفية حقيقية عبر Wixzel Voice API

وكيل Gemini Live يتصل بهاتف حقيقي عبر SIP trunk الخاص بك من أربعة طلبات cURL، وسجل المكالمة مع النص المكتوب والتكلفة.

أضف شخصية تعريفية ناطقة بالذكاء الاصطناعي إلى موقعك مع Wixzel Voice

شخصية تعريفية ناطقة في زاوية موقعك يتصل بها الزوار من المتصفح، مقيّدة بنطاقاتك وحدودك اليومية، مع قائمة بكل متصل.

اعرض الشخصية التعريفية لوكيلك في تطبيق Flutter مع Wixzel Voice

شاشة Flutter فيها الشخصية التعريفية لوكيلك تحرّك فمها مع صوت الوكيل أثناء مكالمة آنية، مع بقاء مفتاح API على خادمك.