# Make Calls (Reference: https://docs.iqra.bot/build/operations/manual-calls) The **Make Calls** interface is your command center for outbound traffic. Located in the sidebar, it allows you to bypass the API and trigger calls directly from the UI. 1. Single Call (Testing) [#1-single-call-testing] Designed for rapid QA. Use this to verify your Script logic before launching a campaign. Select Campaign [#select-campaign] Choose the [Outbound Campaign](/build/campaigns/outbound). This loads the default Agent, Script, and Caller ID strategy. Enter Destination [#enter-destination] Enter the phone number in **E.164** format (e.g., `+1234567890`). Fill Variables [#fill-variables] The system automatically detects variables in your script. * **Base Values:** You can fill in default values (e.g., `customer_name` = "Test User") here. Launch [#launch] Click **Launch Call**. The system places the call immediately. *** 2. Bulk Calls (CSV Upload) [#2-bulk-calls-csv-upload] The Bulk Call engine is designed for scale. You can upload thousands of contacts, and the system will process them according to your concurrency limits. Base Configuration vs. Overrides [#base-configuration-vs-overrides] * **Base Config:** You set default variables in the UI (e.g., `campaign_name` = "Winter Sale"). * **CSV Overrides:** Any value in the CSV row **overrides** the base configuration for that specific call. The CSV Schema [#the-csv-schema] Iqra AI supports a sophisticated CSV format that allows you to change the Agent, Language, or Retries *per row*. **Required Column:** * `to_number`: The destination phone number (International format). **Advanced Columns (Optional):** | Header | Description | | :-------------------------------- | :------------------------------------------------------------------- | | `from_number_id` | Override the Caller ID (Must be a valid UUID from your Numbers tab). | | `dynamic_variables` | A JSON object string containing specific variable values. | | `override_agent_id` | UUID of a different Agent to handle this specific call. | | `override_agent_script_id` | UUID of a different Script to run. | | `override_agent_language_code` | Force a language (e.g., `en`, `ar`) for this call. | | `override_retry_on_call_declined` | JSON configuration for retry logic. | Example CSV Data [#example-csv-data] Notice how `dynamic_variables` accepts a JSON object for complex data injection. ```csv to_number,dynamic_variables,override_agent_language_code +96899999999,"{""first_name"": ""Ali"", ""balance"": 500}",en +97150000000,"{""first_name"": ""Fatima"", ""balance"": 120}",ar ``` When putting JSON inside a CSV column, you must escape double quotes by doubling them (e.g., `""key"": ""value""`). *** Scheduling & Expiry [#scheduling--expiry] You don't have to call everyone right now. You can manage the **Time Window** of the blast. 1. Start Time [#1-start-time] * **Immediate:** Begins processing the queue instantly. * **Scheduled:** Holds the queue until a specific future date/time. 2. Max Schedule Try (Expiry) [#2-max-schedule-try-expiry-] This is a critical "Safety Switch." * **The Problem:** You upload 5,000 leads at 4:00 PM. Your concurrency limit is 10 calls. The queue is slow. By 9:00 PM, the system is still dialing, disturbing people at night. * **The Solution:** Set **Max Schedule Try** to `08:00 PM`. * **Behavior:** If a queued call attempts to launch *after* 8:00 PM, the system **cancels** it automatically. *** Monitoring Progress [#monitoring-progress] Once launched, the job creates a **Queue**. 1. Go to the **Conversations Tab**. 2. Filter by **Status: Queued**. 3. **Concurrency:** The system respects the limits defined in your [Billing Plan](/platform/billing). If you have 50 slots, it processes 50 rows at a time.