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

# Enroll and Monitor

> Add contacts to a workflow and follow every run

## Add contacts to a workflow

Contacts enter a workflow from the CRM.

<Steps>
  <Step title="Open the CRM">
    Go to **CRM → Leads** and narrow the list with **Filters**, or find a single contact.
  </Step>

  <Step title="Assign">
    Click **Assign** on a row for one contact, or in the toolbar for everyone matching the filters (every page, not just the one on screen).
  </Step>

  <Step title="Choose the workflow">
    Set **Assign to** to **Workflow** and pick it under **Choose Workflow**.
  </Step>

  <Step title="Choose when to start">
    Start now, or turn on **Schedule Later** and pick a date and time.
  </Step>
</Steps>

The workflow itself decides which agent calls, how many retries it gets and what happens in between, so there is nothing else to set. Each contact gets their own run, starting at **Start**.

<Note>
  A contact who is already partway through this workflow is skipped. Assigning the same filter twice adds only the contacts who were not in it yet.
</Note>

Each contact's CRM attributes come with them into the run. They are what the **Contact** value source reads, and they are copied into **Call Metadata**, so `{{city}}` in an agent's prompt works on calls the workflow places.

## Add contacts through the API

To start a workflow from your own system, such as a website form, your CRM or your backend, call [Assign to Workflow](/api-reference/workflow-assign) with the phone number and the workflow's ID.

```bash theme={null}
curl -X POST "https://api.callkaro.ai/workflow/assign" \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -d '{
    "to_number": "+919876543210",
    "workflow_id": "6ab6243266ba77dbaf2276c7",
    "attributes": [
      { "key": "first_name", "value": "Rahul", "replace": true }
    ]
  }'
```

* **workflow\_id**: open the workflow; the ID is the last part of the URL.
* **attributes**: optional values saved on the contact before the run starts, so every step can use them. Each `key` must be an attribute that exists in **CRM → Attributes**. `replace: true` overwrites an existing value; `false` only fills an empty one.
* **schedule\_at**: optional start time in IST, as `YYYY-MM-DDTHH:mm:ss`. Leave it out to start now.

A number that is already partway through the workflow is not started again, the same as when assigning from the CRM.

## Follow the runs

Open the workflow from **Workflows** to see every contact in it.

The counts at the top show **Total Leads**, **Active** (running, waiting or awaiting a call), **Completed**, **Failed** and **Cancelled**. Use **Search phone number** to find one contact.

| Column | Shows |
| - | - |
| **Phone** | The contact. |
| **Status** | Where the run stands. See [Run statuses](/workflows/introduction#run-statuses). |
| **Current Step** | The step the run is on, or finished at. |
| **Enrolled** | When the contact was added. |
| **Calls Attempted** | Calls this run has placed. |
| **Last Call** | The most recent call's outcome. |
| **Duration** | The most recent call's duration. |
| **Cost** | What this run's calls have cost so far. |

Click a row to open that contact's **timeline**: every step the run took, in order, with what each one did. That includes the call SID and outcome of each call, the API response, which branch a Conditions step took and why, and any error.

<Tip>
  When a contact ended up on the wrong path, open their timeline and look at the Conditions step. It shows the value each rule compared against, which is usually the quickest way to spot a field that was empty or spelled differently than expected.
</Tip>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.