# Workflow Triggers and Steps Reference

> Reference for every Edesy workflow trigger (call ended, data extracted, manual, API, scheduled, CRM webhook) and every step type, with the variables each one can use.

Source: https://edesy.in/docs/voice-agent/workflows/triggers-and-steps

Every workflow has one trigger and one or more steps. This page lists each trigger, each step type and the variables available to steps. Call-based triggers can be limited to one or several agents; the **Call ended** trigger can also be filtered by call outcome.

## Triggers

| Trigger | ID | Fires when | Filters |
|---------|----|-----------|---------|
| Call ended | `call.ended` | A voice call ends | Agents; call outcomes (dispositions) |
| Data extracted | `data.extracted` | Post-call extraction finishes for a call | Agents |
| Manual | `manual` | You run it from the dashboard | - |
| API call | `api_call` | Your system calls the trigger endpoint | - |
| Scheduled | `scheduled` | On a schedule (cron) | - |
| CRM webhook | `crm_webhook` | Your CRM sends an event, for example a new lead | - |

A call-based trigger with no agent selected listens to every agent in the workspace.

### Trigger from the API

```bash
curl -X POST https://voice-agent.edesy.in/api/v1/workflows/WORKFLOW_ID/trigger \
  -H "Authorization: Bearer $EDESY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "recipientPhone": "+91XXXXXXXXXX", "recipientName": "Asha" }'
```

## Steps

| Step | Type ID | What it does |
|------|---------|--------------|
| Voice call | `VOICE_CALL` | Calls a number with a chosen agent. Can wait for the call to end or for its extraction before the next step |
| WhatsApp template | `WHATSAPP_TEMPLATE` | Sends an approved WhatsApp template message |
| WhatsApp bot | `WHATSAPP_BOT` | Starts a WhatsApp bot conversation |
| SMS | `SMS` | Sends an SMS |
| Email | `EMAIL` | Sends an email |
| Condition | `CONDITION` | Branches on a variable, for example `disposition == QUALIFIED` |
| Delay | `DELAY` | Waits before the next step. Can respect callback hours |
| Set variable | `SET_VARIABLE` | Sets or computes a variable for later steps |
| CRM update | `CRM_UPDATE` | Creates or updates a lead or contact via Edesy workflow integrations |
| Webhook | `WEBHOOK` | Sends an HTTP request to your URL |
| Google Sheets update | `GOOGLE_SHEETS_UPDATE` | Updates a row |
| Google Sheets append | `GOOGLE_SHEETS_APPEND` | Adds a row |
| Google Sheets lookup | `GOOGLE_SHEETS_LOOKUP` | Finds a row and makes its columns available as variables |
| Send payment link | `SEND_PAYMENT_LINK` | Creates and sends a Razorpay, Stripe or PayU link |
| Calendar booking | `CALENDAR_BOOK` | Books a slot on a connected calendar |

## Variables

Steps use `{{variable}}` placeholders. Extracted fields are flattened to the top level, so a template field `budget_range` is `{{budget_range}}`.

| Variable | Call ended | Data extracted | Meaning |
|----------|-----------|----------------|---------|
| `recipientPhone` | Yes | Yes | The caller's number |
| `recipientName` | Yes | Yes | The caller's name, if known |
| `disposition` | Yes | Yes | The call outcome, such as `QUALIFIED` |
| `callStatus` | Yes | Yes | Conversation status |
| `callDuration` | Yes | Yes | Duration in seconds |
| `conversationId` | Yes | Yes | The call ID |
| `endReason` | Yes | Yes | Why the call ended |
| `callTranscript` | Yes | Yes | The full transcript |
| `callRecordingUrl` | Yes | Yes | The recording link |
| `agentName` | Yes | Yes | The agent that handled the call |
| `callSource` | Yes | Yes | campaign, api, inbound or test |
| `campaignName`, `campaignId` | Yes | Yes | The campaign, if any |
| `_timestamp` | Yes | Yes | Call time (DD/MM/YYYY HH:mm IST) |
| `callSummary` | - | Yes | The AI summary |
| Your extracted fields | - | Yes | For example `{{buying_intent}}` |

## FAQs

**How do I run a step only for qualified leads?**
Filter the **Call ended** trigger by outcome, or add a **Condition** step on `{{disposition}}`.

**What happens if a step fails?**
The execution is marked failed at that step. Fix the cause and retry it from the execution history.

**Can a workflow call the same person again later?**
Yes. Add a **Delay** and then a **Voice call** step, for example for a callback.

## Related

- [Workflows overview](https://edesy.in/docs/voice-agent/workflows)
- [Workflow templates](https://edesy.in/docs/voice-agent/workflows/templates)
- [Dispositions reference](https://edesy.in/docs/voice-agent/post-call/dispositions)
