Wixzel Voice के साथ AI लीड-क्वालिफ़िकेशन कैंपेन चलाएँ
इस गाइड के अंत तक लीड की एक लिस्ट अपलोड हो चुकी होगी, आपके लिखे एजेंट ने आपके अपने SIP ट्रंक पर आपके क्वालिफ़ाइंग सवालों के साथ हर लीड को कॉल किया होगा, और हर कॉल का स्टेटस और ट्रांसक्रिप्ट आपके पास होगा। Node.js में wixzel-voice SDK के साथ बिल्ड में लगभग 30 मिनट लगते हैं, और फिर कॉल में जितना समय लगे। छोटी, स्क्रिप्ट वाली कॉल सबसे सस्ता काम है: classic इंजन पर, $0.0867 प्रति कनेक्टेड मिनट, दो मिनट की 1,000 कॉल का इंजन टाइम लगभग $173 आता है, जो प्रीपेड बैलेंस से प्रति सेकंड बिल होता है, साथ में आपके कैरियर का रेट। जिस कॉल का कोई जवाब नहीं देता, उसका कोई खर्च नहीं।
लेखक Aqeel Shamsudheen · प्रकाशित · अपडेट
- समय
- लगभग 30 मिनट, और कॉल का समय
- इंजन
- classic
- इंजन टाइम
- $0.0867 प्रति कनेक्टेड मिनट
शुरू करने से पहले आपको क्या चाहिए?
- एक SIP ट्रंक और उस पर रजिस्टर किया हुआ आउटगोइंग नंबर। Twilio गाइड और SIP ट्रंक docs दोनों बताते हैं।
- क्रेडिट वाली Wixzel Voice API की, और
npm install wixzel-voiceके साथ Node.js 20 या बाद का वर्शन। - लिस्ट की हर लीड को कॉल करने की सहमति, जहाँ कानून इसकी माँग करता है। नीचे का नियमों वाला स्टेप बताता है कि स्वीकार्य उपयोग नीति (Acceptable Use Policy) क्या माँगती है।
इसे 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की हर key भी एक मर्ज फ़ील्ड बन जाती है, इसलिए{{company}}नीचे के अपलोड से आता है। शुरुआती लाइन बताती है कि कॉल करने वाला ऑटोमेटेड है; जहाँ कानून यह बताना ज़रूरी करता है, वहाँ इसकी सही जगह यही है। कैंपेन के लिएoutbound_phone_number_idज़रूरी है: यही वह कॉलर 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देखें। बल्क अपलोड पर कोई webhook नहीं चलता।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"दिखाता है। रुके हुए कैंपेन को फिर से शुरू करने पर उसकी हर लीड दोबारा डायल होती है, जिन्हें पहले कॉल हो चुकी है वे भी, इसलिए आगे बढ़ने के लिए उन लीड से नया कैंपेन बनाएँ जिन तक अभी नहीं पहुँचे। create पर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बताता है कि खर्च कितना हुआ। जो लीड डायल होने से पहले ही रिजेक्ट हुई, एक साथ चलने वाली कॉल की सीमा या क्रेडिट की कमी की वजह से, वह बिनाfailure_codeकेfailedदिखती है।क्वालिफ़िकेशन का फ़ैसला आपका है। Wixzel Voice बातचीत रिकॉर्ड करता है; ट्रांसक्रिप्ट में आपके तीनों सवालों के जवाब होते हैं, इसलिए उसे अपने नियमों या अपने मॉडल से स्कोर करें और नतीजा अपने CRM में लिखें।
summaryफ़ील्ड खाली हो सकती है, इसलिए उस पर निर्भर न रहें। पोलिंग के बजाय कॉल खत्म होते ही प्रतिक्रिया देने के लिएcallCompletedwebhook सब्सक्राइब करें, जिसमें कॉल के स्टेटस और अवधि के साथ लीड और कैंपेन की ids होती हैं।05कॉलिंग के नियमों के भीतर रहें
स्वीकार्य उपयोग नीति ये ज़िम्मेदारियाँ कॉल करने वाले पर डालती है, यानी आप पर। यह उसका सारांश है, कानूनी सलाह नहीं।
सिर्फ़ उन लोगों को कॉल करें जिनकी सहमति आपके पास है, जहाँ कानून इसकी माँग करता है। अमेरिका में इसका आम तौर पर मतलब है TCPA के तहत मोबाइल नंबरों पर मार्केटिंग कॉल के लिए पहले से ली गई स्पष्ट लिखित सहमति; भारत में TRAI के customer preference नियम; UK और EU में PECR और GDPR।
हर अपलोड से पहले राष्ट्रीय और राज्य स्तर की do-not-call रजिस्ट्री और अपनी suppression list जाँचें। जब कोई दोबारा कॉल न करने को कहे, तो उसे तुरंत और हमेशा के लिए हटा दें: एजेंट विनम्रता से कॉल खत्म कर सकता है, लेकिन लीड हटाना आपके कोड का काम है।
जहाँ कानून माँगता है, कॉल की शुरुआत में बताएँ कि कॉल करने वाला ऑटोमेटेड है, जैसा ऊपर की शुरुआती लाइन करती है, कॉल करने के समय की पाबंदियों का पालन करें, और जब तक कानून माँगे, सहमति का सबूत रखें।
Wixzel Voice पर इस बिल्ड की लागत कितनी है?
$0.0867 प्रति कनेक्टेड मिनट पर classic इंजन पर 2 मिनट की कॉल का इंजन टाइम: हर कॉल पर लगभग $0.17। टेलीफ़ोनी आपका अपना ट्रंक है, आपके कैरियर की दर पर, और यह इसमें शामिल नहीं है।
| हर महीने की कॉल | कनेक्टेड मिनट | हर महीने का इंजन खर्च |
|---|---|---|
| 1,000 | 2,000 | $173 |
| 5,000 | 10,000 | $867 |
| 20,000 | 40,000 | $3,468 |
सिर्फ़ कनेक्टेड समय बिल होता है, प्रति सेकंड। जो कॉल बिज़ी हो, जिसका जवाब न मिले या जो डायल होने से पहले रिजेक्ट हो जाए, उसका कोई खर्च नहीं, क्योंकि इंजन शुरू ही नहीं होता। लाइन का बिल आपका कैरियर अपने रेट पर अलग से देता है, बिना मार्कअप के।
प्रीपेड, बिना सब्सक्रिप्शन और बिना फ़्री टियर: $5 से क्रेडिट जोड़ें और इस्तेमाल उसी से कटता है। अपने इस्तेमाल का अनुमान लगाएँ।
इस बिल्ड पर Wixzel Voice की कौन-सी सीमाएँ लागू होती हैं?
- कैंपेन अपनी लीड को तेज़ी से एक के बाद एक डायल करता है और एक साथ चलने वाली कॉल की सीमा (डिफ़ॉल्ट रूप से हर अकाउंट पर पाँच) के पीछे कतार नहीं लगाता; उससे ऊपर की लीड फ़ेल दर्ज होती हैं। अपनी सीमा के हिसाब से बैच बनाएँ, या ज़्यादा सीमा माँगें।
- रुके हुए कैंपेन को फिर से शुरू करने पर उसकी हर लीड दोबारा डायल होती है। जिन लीड तक अभी नहीं पहुँचे, उनसे नया कैंपेन बनाकर आगे बढ़ें।
- हर कैंपेन में 10,000 तक लीड हो सकती हैं, और एक अकाउंट में डिफ़ॉल्ट रूप से 500 तक कैंपेन, जो माँगने पर बढ़ाए जाते हैं।
- Wixzel Voice कॉल और उसका ट्रांसक्रिप्ट रिकॉर्ड करता है। कौन क्वालिफ़ाई हुआ यह तय करना, और अपनी do-not-call लिस्ट रखना, आपके कोड का काम है।
- Wixzel Voice के व्यवहार में बदलाव तारीख वाले
Wixzel-Versionहेडर के पीछे आते हैं।
अक्सर पूछे जाने वाले सवाल
Wixzel Voice पर आउटगोइंग AI कॉलिंग कैंपेन कैसे चलाएँ?
POST /v1/leads/bulk से लीड अपलोड करें, एक एजेंट और उन लीड के साथ कैंपेन बनाएँ, और POST /v1/campaigns/{id}/start से एजेंट आपके अपने SIP ट्रंक पर हर लीड को एक के बाद एक कॉल करता है। हर कैंपेन को एक साथ चलने वाली कॉल की अपनी सीमा से बड़ा न रखें, क्योंकि उससे ऊपर की लीड कतार में लगने के बजाय फ़ेल मार्क होती है। हर कॉल एक रिकॉर्ड है जिसमें स्टेटस, ट्रांसक्रिप्ट और खर्च है, और lead_id से लीड से जुड़ा है। अकेली कॉल POST /v1/calls से होती हैं।एक साथ कितनी आउटगोइंग कॉल चल सकती हैं?
कैंपेन इस्तेमाल करें या अकेली कॉल?
POST /v1/calls ज़्यादा बारीक कंट्रोल देता है: हर कॉल एक lead_id और एक idempotency key लेती है, और अगली कॉल कब शुरू हो यह आप तय करते हैं।क्या AI से आउटगोइंग कॉलिंग कानूनी है?
और कहाँ पढ़ें
- क्विकस्टार्टडॉक्स
एक ट्रंक, एक नंबर, एक एजेंट और एक कॉल।
- एजेंटडॉक्स
निर्देश, शुरुआती लाइन और कॉलर ID।
- Webhookडॉक्स
callCompleted, campaignCompleted और सिग्नेचर।
- API रेफ़रेंसडॉक्स
लीड, कैंपेन और कॉल, हर फ़ील्ड के साथ।
Wixzel Voice के बारे में
Wixzel Voice एक वॉइस AI API है, जिससे ऐसे AI एजेंट बनते हैं जो आपके अपने SIP ट्रंक पर असली फ़ोन कॉल करते और उनका जवाब देते हैं, या आपके वेब और मोबाइल ऐप में लोगों से बात करते हैं। एक API की और एक प्रीपेड बैलेंस हर वॉइस इंजन को कवर करते हैं, और बिल असली इस्तेमाल के हर सेकंड के हिसाब से बनता है।
और गाइड
Claude Code या claude.ai में Claude आपके SIP ट्रंक से असली कॉल करता है और ट्रांसक्रिप्ट पढ़कर बताता है, और कुछ भी डायल होने से पहले आपसे पुष्टि लेता है।
आपके मौजूदा Twilio नंबर पर एक AI रिसेप्शनिस्ट जवाब देता है और API में अपॉइंटमेंट बुक करता है, Node.js में बना हुआ।
दो फ़ोन एजेंट, एक हिंदी और एक मलयालम बोलने वाला, Sarvam के भारतीय भाषा मॉडल पर, जो आपके SIP ट्रंक से कॉल का जवाब देते हैं या कॉल करते हैं।
एक Flutter ऐप जिसमें यूज़र WebSocket पर आपके वॉइस एजेंट से बात करते हैं, API की आपके सर्वर पर रहती है और कोई फ़ोन नंबर शामिल नहीं होता।
चार cURL रिक्वेस्ट से आपके SIP ट्रंक पर असली फ़ोन को कॉल करता Gemini Live एजेंट, और ट्रांसक्रिप्ट और खर्च के साथ कॉल रिकॉर्ड।
आपकी वेबसाइट के कोने में एक बोलने वाला मैस्कट, जिसे विज़िटर ब्राउज़र से कॉल करते हैं, आपके डोमेन और आपकी रोज़ की सीमाओं तक सीमित, और हर कॉलर की लिस्ट के साथ।
एक Flutter स्क्रीन, जिसमें आपके एजेंट का मैस्कट realtime कॉल के दौरान एजेंट की आवाज़ के साथ मुँह हिलाता है, और आपकी API की आपके सर्वर पर रहती है।
अपना पहला वॉइस एजेंट बनाएँ

