> ## Documentation Index
> Fetch the complete documentation index at: https://kb.vinfer.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Run High-Volume Outbound Campaigns with VInfer Neuron

> Plan, launch, and optimize outbound calling campaigns using VInfer Neuron — covering scripts, contact lists, retry logic, and live monitoring at scale.

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

<CardGroup cols={2}>
  <Card title="API Key" icon="key">
    Generate your API key from **Settings → API Keys** in the VInfer dashboard before making any API calls.
  </Card>

  <Card title="Contact List" icon="address-book">
    Prepare your contact list as a CSV file with at minimum `phone` and `name` columns.
  </Card>

  <Card title="Script Ready" icon="file-lines">
    Draft your conversation flow, including branching paths for yes, no, callback, and dispute responses.
  </Card>

  <Card title="Telephony Connected" icon="phone">
    Ensure your outbound telephony provider or SIP trunk is connected under **Settings → Telephony**.
  </Card>
</CardGroup>

***

## Campaign Setup Steps

<Steps>
  ### Plan Your Campaign

  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.

  **Choose your campaign type:**

  <CardGroup cols={2}>
    <Card title="Collections & Reminders" icon="circle-dollar-to-slot">
      Remind customers of upcoming or overdue payments; offer payment links or callback scheduling.
    </Card>

    <Card title="Lead Qualification" icon="filter">
      Ask a structured set of qualifying questions and score leads before passing them to your sales team.
    </Card>

    <Card title="Cross-Sell & Upsell" icon="arrow-trend-up">
      Pitch relevant products to existing customers based on their profile or recent transaction history.
    </Card>

    <Card title="Appointment Reminders" icon="calendar-check">
      Confirm or reschedule appointments, reducing no-show rates automatically.
    </Card>
  </CardGroup>

  **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.

  <Tip>
    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.
  </Tip>

  ***

  ### Create Your Script in the VInfer Dashboard

  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.

  **Key elements of a well-structured script:**

  <Accordion title="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.
  </Accordion>

  <Accordion title="Branching Paths">
    Define what Neuron should do for each major customer response:

    | Customer Response         | Neuron Action                                       |
    | ------------------------- | --------------------------------------------------- |
    | **Yes / Interested**      | Continue to main conversation flow                  |
    | **No / Not Interested**   | Acknowledge, offer a callback time, log disposition |
    | **Request Callback**      | Collect preferred time, confirm, update CRM         |
    | **Dispute / Angry**       | De-escalate, offer human agent transfer             |
    | **No Response / Silence** | Retry prompt once, then gracefully end the call     |

    Add branches using the **Flow Builder** canvas — drag connectors between response nodes to define transitions.
  </Accordion>

  <Accordion title="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.
  </Accordion>

  <Accordion title="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`).
  </Accordion>

  <Note>
    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.
  </Note>

  ***

  ### Upload Your Contact List

  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.

  **Required columns:**

  | Column  | Format                  | Example         |
  | ------- | ----------------------- | --------------- |
  | `phone` | E.164 with country code | `+919876543210` |
  | `name`  | Plain text              | `Priya Sharma`  |

  **Optional custom fields (examples):**

  | Column               | Use in Script                                  |
  | -------------------- | ---------------------------------------------- |
  | `loan_amount`        | "Your outstanding amount is ₹{{loan_amount}}"  |
  | `due_date`           | "Your payment is due on {{due_date}}"          |
  | `preferred_language` | Override campaign default language per contact |
  | `agent_id`           | Route escalations to a specific human agent    |

  <Warning>
    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.
  </Warning>

  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.

  ***

  ### Create and Configure the Campaign via API

  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.

  **Full API example with schedule, retry logic, and max attempts:**

  <CodeGroup>
    ```bash cURL theme={null}
    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 Python theme={null}
    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"])
    ```

    ```js Node.js theme={null}
    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);
    ```
  </CodeGroup>

  **Key configuration fields:**

  | Field             | Description                                                 |
  | ----------------- | ----------------------------------------------------------- |
  | `calling_hours`   | Restricts dials to within these hours in the given timezone |
  | `max_attempts`    | Total call attempts per contact including the first dial    |
  | `retry_gap_hours` | Minimum hours between attempts to the same number           |
  | `retry_on`        | Which call outcomes trigger a retry                         |
  | `concurrency`     | Maximum simultaneous outbound calls                         |

  <Info>
    The API returns a `campaign_id` in the response. Store this ID — you'll use it to monitor progress and fetch reports.
  </Info>

  ***

  ### Monitor the Campaign

  Track your campaign in real time from the **Supervisor Dashboard** under **Neuron → Campaigns → \[Campaign Name]**, or poll the API:

  ```bash theme={null}
  curl https://api.vinfer.ai/v1/campaigns/camp_xyz456 \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  **Example response:**

  ```json theme={null}
  {
    "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"
  }
  ```

  The Supervisor Dashboard also shows a live call feed with active call count, average call duration, and a real-time disposition breakdown chart.

  ***

  ### Review Results and Download Reports

  Once the campaign completes (or even mid-campaign), navigate to **Neuron → Campaigns → \[Campaign Name] → Reports** to download your disposition report as a CSV.

  **Fetch the report via API:**

  ```bash theme={null}
  curl https://api.vinfer.ai/v1/campaigns/camp_xyz456/report \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  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.

  <Tip>
    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.
  </Tip>
</Steps>

***

## Best Practices

<CardGroup cols={2}>
  <Card title="Optimal Calling Hours" icon="clock">
    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.
  </Card>

  <Card title="Retry Strategy" icon="arrows-rotate">
    **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.
  </Card>

  <Card title="Language Matching" icon="language">
    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.
  </Card>

  <Card title="Script Opening Tips" icon="microphone">
    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.
  </Card>
</CardGroup>
