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