Skip to main content
Running outbound campaigns at scale requires more than just a list of phone numbers — you need the right script, smart retry logic, and real-time visibility into results. VInfer Neuron handles all of this, letting you launch thousands of concurrent AI-driven calls across 25+ languages while you monitor progress from a single dashboard. This guide walks you through every step, from planning your campaign goal to reviewing the final disposition report.

Before You Begin

API Key

Generate your API key from Settings → API Keys in the VInfer dashboard before making any API calls.

Contact List

Prepare your contact list as a CSV file with at minimum phone and name columns.

Script Ready

Draft your conversation flow, including branching paths for yes, no, callback, and dispute responses.

Telephony Connected

Ensure your outbound telephony provider or SIP trunk is connected under Settings → Telephony.

Campaign Setup Steps

1
Plan Your Campaign
2
Start by defining a clear goal for your campaign. Neuron is optimized for high-frequency, structured conversations — the more precisely you define the outcome, the better your script and routing logic will perform.
3
Choose your campaign type:
4

Collections & Reminders

Remind customers of upcoming or overdue payments; offer payment links or callback scheduling.

Lead Qualification

Ask a structured set of qualifying questions and score leads before passing them to your sales team.

Cross-Sell & Upsell

Pitch relevant products to existing customers based on their profile or recent transaction history.

Appointment Reminders

Confirm or reschedule appointments, reducing no-show rates automatically.
5
Decide on language(s). VInfer Neuron supports 25+ Indian and global languages. Match the language to your audience geography or CRM preference data for the highest engagement rates. A customer in Tamil Nadu reached in Tamil will respond far better than one reached in English.
6
If you’re unsure which language to use, set a primary language and enable language detection fallback in the campaign settings so Neuron can adapt mid-call if the customer responds in a different language.
7
8
Create Your Script in the VInfer Dashboard
9
Navigate to Neuron → Scripts → New Script. Scripts in VInfer define the full conversation tree — what Neuron says, what it listens for, and how it branches based on customer responses.
10
Key elements of a well-structured script:
11

Opening Statement (Target: under 10 seconds)

Your opening must identify the brand, state the purpose, and invite a response — all within the first few seconds. Customers who don’t understand why they’re being called will hang up immediately.Example (Hindi):
“Namaste, main ABC Bank ki taraf se Rahul bol raha hoon. Aapki EMI payment ke baare mein baat karni thi — kya aap abhi baat kar sakte hain?”
Keep it brief, clear, and non-pushy. Avoid reading out long disclaimers in the opening turn.
12

Branching Paths

Define what Neuron should do for each major customer response:
Customer ResponseNeuron Action
Yes / InterestedContinue to main conversation flow
No / Not InterestedAcknowledge, offer a callback time, log disposition
Request CallbackCollect preferred time, confirm, update CRM
Dispute / AngryDe-escalate, offer human agent transfer
No Response / SilenceRetry prompt once, then gracefully end the call
Add branches using the Flow Builder canvas — drag connectors between response nodes to define transitions.
13

Data Collection Nodes

If your campaign needs to collect information (e.g., preferred callback time, reference number, confirmation), insert a Collect node. Neuron will listen for and extract the required entity, confirm it with the customer, and store it against the call record.
14

Closing and Disposition

Always end with a courteous closing that sets expectations — “We’ll send you a payment link on your registered number” or “Our team will call you back by 5 PM today.” The final node should set the call disposition (e.g., interested, callback_requested, not_interested, not_reachable).
15
Save your script and click Validate before using it in a campaign. The validator checks for unreachable nodes, missing disposition assignments, and incomplete branch coverage.
16
17
Upload Your Contact List
18
Go to Neuron → Contacts → Import and upload your CSV file. The file must include at minimum the phone and name columns. Additional custom fields are passed to your script as variables at call time.
19
Required columns:
20
ColumnFormatExamplephoneE.164 with country code+919876543210namePlain textPriya Sharma
21
Optional custom fields (examples):
22
ColumnUse in Scriptloan_amount”Your outstanding amount is ₹due_date”Your payment is due on preferred_languageOverride campaign default language per contactagent_idRoute escalations to a specific human agent
23
Phone numbers must be in E.164 format (e.g., +919876543210). Numbers without country codes or with formatting characters like dashes or spaces will be rejected at import. Run a format check on your list before uploading.
24
After upload, VInfer displays a preview with row count, detected columns, and any validation errors. Fix errors before proceeding — rows with invalid phone numbers are dropped automatically.
25
26
Create and Configure the Campaign via API
27
Once your script and contact list are ready, create the campaign. You can do this from the dashboard (Neuron → Campaigns → New Campaign) or via the API for programmatic control.
28
Full API example with schedule, retry logic, and max attempts:
29
cURL
curl -X POST https://api.vinfer.ai/v1/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Q1 EMI Reminder - North India",
    "script_id": "scr_abc123",
    "contact_list_id": "list_xyz789",
    "language": "hi-IN",
    "schedule": {
      "start_at": "2024-02-01T09:00:00+05:30",
      "end_at": "2024-02-03T19:00:00+05:30",
      "calling_hours": {
        "start": "09:00",
        "end": "19:00",
        "timezone": "Asia/Kolkata"
      },
      "calling_days": ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]
    },
    "retry": {
      "max_attempts": 3,
      "retry_gap_hours": 4,
      "retry_on": ["no_answer", "busy", "failed"]
    },
    "concurrency": 50,
    "caller_id": "+918001234567"
  }'
Python
import requests

response = requests.post(
    "https://api.vinfer.ai/v1/campaigns",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json"
    },
    json={
        "name": "Q1 EMI Reminder - North India",
        "script_id": "scr_abc123",
        "contact_list_id": "list_xyz789",
        "language": "hi-IN",
        "schedule": {
            "start_at": "2024-02-01T09:00:00+05:30",
            "end_at": "2024-02-03T19:00:00+05:30",
            "calling_hours": {
                "start": "09:00",
                "end": "19:00",
                "timezone": "Asia/Kolkata"
            },
            "calling_days": [
                "monday", "tuesday", "wednesday",
                "thursday", "friday", "saturday"
            ]
        },
        "retry": {
            "max_attempts": 3,
            "retry_gap_hours": 4,
            "retry_on": ["no_answer", "busy", "failed"]
        },
        "concurrency": 50,
        "caller_id": "+918001234567"
    }
)

campaign = response.json()
print(campaign["campaign_id"])
Node.js
const response = await fetch("https://api.vinfer.ai/v1/campaigns", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Q1 EMI Reminder - North India",
    script_id: "scr_abc123",
    contact_list_id: "list_xyz789",
    language: "hi-IN",
    schedule: {
      start_at: "2024-02-01T09:00:00+05:30",
      end_at: "2024-02-03T19:00:00+05:30",
      calling_hours: { start: "09:00", end: "19:00", timezone: "Asia/Kolkata" },
      calling_days: ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]
    },
    retry: {
      max_attempts: 3,
      retry_gap_hours: 4,
      retry_on: ["no_answer", "busy", "failed"]
    },
    concurrency: 50,
    caller_id: "+918001234567"
  })
});

const campaign = await response.json();
console.log(campaign.campaign_id);
30
Key configuration fields:
31
FieldDescriptioncalling_hoursRestricts dials to within these hours in the given timezonemax_attemptsTotal call attempts per contact including the first dialretry_gap_hoursMinimum hours between attempts to the same numberretry_onWhich call outcomes trigger a retryconcurrencyMaximum simultaneous outbound calls
32
The API returns a campaign_id in the response. Store this ID — you’ll use it to monitor progress and fetch reports.
33
34
Monitor the Campaign
35
Track your campaign in real time from the Supervisor Dashboard under Neuron → Campaigns → [Campaign Name], or poll the API:
36
curl https://api.vinfer.ai/v1/campaigns/camp_xyz456 \
  -H "Authorization: Bearer YOUR_API_KEY"
37
Example response:
38
{
  "campaign_id": "camp_xyz456",
  "name": "Q1 EMI Reminder - North India",
  "status": "running",
  "progress": {
    "total_contacts": 5000,
    "dialed": 2341,
    "completed": 2198,
    "pending": 2659,
    "in_progress": 143
  },
  "dispositions": {
    "interested": 412,
    "callback_requested": 287,
    "not_interested": 891,
    "not_reachable": 608
  },
  "estimated_completion": "2024-02-02T14:30:00+05:30"
}
39
The Supervisor Dashboard also shows a live call feed with active call count, average call duration, and a real-time disposition breakdown chart.
40
41
Review Results and Download Reports
42
Once the campaign completes (or even mid-campaign), navigate to Neuron → Campaigns → [Campaign Name] → Reports to download your disposition report as a CSV.
43
Fetch the report via API:
44
curl https://api.vinfer.ai/v1/campaigns/camp_xyz456/report \
  -H "Authorization: Bearer YOUR_API_KEY"
45
The report includes one row per contact with columns for final disposition, number of attempts, call duration, language used, timestamp, and a link to the call transcript via NeuronLens.
46
Use NeuronLens to drill into any disposition group — for example, listen to a sample of “interested” calls to validate that Neuron is correctly classifying them, or review “dispute” calls to identify common objection patterns to address in your next script revision.

Best Practices

Optimal Calling Hours

In India, 9 AM – 7 PM IST yields the best answer rates. Avoid calling before 9 AM or after 7 PM. For rural segments, mid-morning (10 AM – 12 PM) and late afternoon (3 PM – 6 PM) tend to perform best. Never schedule calls on national holidays.

Retry Strategy

3 attempts with 4-hour gaps is the benchmark for most use cases. Dialing more than 3 times in a day increases complaint rates without meaningfully improving contact rates. Space retries across different times of day to catch different availability windows.

Language Matching

Use geography or CRM language preference data to assign the right language per contact. A campaign targeting Maharashtra can use Marathi as primary with Hindi fallback. Matching language to preference increases engagement rates significantly.

Script Opening Tips

Keep your opening under 10 seconds and state the purpose in the first sentence. Introduce a callback option early (within the first 30 seconds) so resistant customers have a graceful exit — this reduces hang-ups and preserves a positive brand impression.