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

# Steps, actions e conditions

> Tipos de passo, operators, actions e o que cada um faz ao executar.

Contrato do JSON salvo no painel. Qualquer valor fora desta página é rejeitado ou não executa.

Para **combinar** etapas, escrever mensagens e editar um fluxo existente, use [Criar e editar](/automations-builder) e [Templates](/automations-templates). O trigger fica em `trigger_event` (não é um step). O template fica em `action.data` (não é um step).

## Tipos de step

| `type`      | Função                                | Limites                                                                      |
| ----------- | ------------------------------------- | ---------------------------------------------------------------------------- |
| `action`    | Enviar mensagem                       | `name` na tabela de actions                                                  |
| `delay`     | Espera antes do próximo passo         | `minutes` inteiro **1–10080** (7 dias)                                       |
| `condition` | Ramifica o fluxo                      | operators abaixo                                                             |
| `end`       | Encerra aquele ramo                   |                                                                              |
| `retry`     | Repete os passos internos se falharem | `maxAttempts` 1–10 (padrão 3); `delayBetweenAttempts` 0–10080 min (padrão 0) |
| `loop`      | Repete os passos internos             | `maxIterations` 1–100 (padrão 10); `stopOnError` padrão `true`               |

Máximo **50** steps. `id` é opcional; o painel preenche se faltar.

## `nextId` e `parentId`

| Campo      | Significado                                                    |
| ---------- | -------------------------------------------------------------- |
| `nextId`   | Próximo step na sequência                                      |
| `parentId` | O step pertence a uma **saída** de condition (`branches[].id`) |

* O tronco não usa `parentId`.
* Steps `condition` não usam `parentId`.
* Nunca aponte `parentId` para o step anterior.

Dois formatos aceitos:

1. **Flat** (painel): branches com `id` e steps irmãos com o mesmo `parentId`.
2. **Aninhado:** `if_true` / `if_false` ou `branches[].steps`.

## Actions (`type: "action"`)

| `name`          | Ao salvar | Ao executar                                     |
| --------------- | --------- | ----------------------------------------------- |
| `send_sms`      | aceito    | envia SMS (`template_id` ou `message`)          |
| `send_whatsapp` | aceito    | envia WhatsApp (`template_id` ou `message`)     |
| `send_email`    | aceito    | envia e-mail (`template_id` ou conteúdo inline) |
| `webhook`       | aceito    | POST HTTPS para `data.url`                      |
| `create_coupon` | aceito    | cria cupom da loja                              |

Hooks opcionais: `onNext` (depois de enviar), `onResponse` (resposta no WhatsApp), `onOpen` e `onClickLink` (e-mail). São listas de steps extras, disparadas pelo evento correspondente — não pelo fluxo linear.

### `send_email` (obrigatório)

* `remetente_nome` (ou `content.remetente_nome`)
* `remetente_email` (e-mail válido; ou `content.remetente_email`)
* `subject` (mínimo 3 caracteres)
* `html` **ou** `body`

### `send_sms`

* `message` obrigatória, **≤ 160** caracteres no texto salvo.

### `send_whatsapp`

`data.type` (padrão `text`): `whatsapp` | `text` | `audio` | `video` | `document` | `link` | `button-actions` | `button-list` | `button-otp` | `pix-button` | `request-payment`.

| type                | Obrigatório                           |
| ------------------- | ------------------------------------- |
| `text` / `whatsapp` | `message` ou `text`                   |
| `document`          | `document` (URL)                      |
| `video`             | `video` (URL)                         |
| `audio`             | `audio` (URL)                         |
| `link`              | `linkUrl`                             |
| `button-actions`    | `buttonActions[]` ou `choices[]`      |
| `button-list`       | `buttonList.buttons` ou `choices[]`   |
| `button-otp`        | `code`                                |
| `pix-button`        | `pixKey`                              |
| `request-payment`   | `amount` > 0 **ou** metatag `{{...}}` |

Áudio, vídeo ou documento podem ser enviados como **texto** se a mídia não puder ser entregue.

### `webhook`

* `url` HTTPS pública obrigatória. A automação faz **POST JSON** com o contexto do evento (loja, pedido, cliente). Não use localhost.

### `create_coupon`

* `coupon_name` obrigatório
* `discountType`: `CURRENCY` ou `PERCENT`
* `amount` obrigatório
* `coupon_code` opcional (gerado se omitido)

Sem telefone (SMS/WhatsApp) ou sem e-mail (e-mail), a execução **falha**. Sem créditos da loja, a mensagem fica **bloqueada** e não sai.

## Conditions

### Operators

```
=   !=   in   not-in   empty   not-empty   >   <   >=   <=
```

Não use `equals`, `contains` nem `starts_with`.

Inválido:

```json theme={null}
{ "field": "payment_status", "operator": "equals", "value": "pending" }
```

Válido:

```json theme={null}
{ "field": "payment_status", "operator": "=", "value": "pending" }
```

Composto: `operator` `AND` | `OR` e `conditions[]` (mínimo 1).

Branches:

```json theme={null}
{
  "type": "condition",
  "branches": [
    {
      "id": "paid-branch",
      "label": "Pago",
      "operator": "AND",
      "conditions": [
        { "field": "payment_status", "operator": "=", "value": "paid" }
      ]
    }
  ]
}
```

A primeira branch verdadeira vence.

### Campos de condition

Conditions **não** usam o catálogo completo de metatags. Só estes campos:

| Campo                               | O que compara              | Observação                    |
| ----------------------------------- | -------------------------- | ----------------------------- |
| `amount`                            | valor do evento            | `0` é tratado como vazio      |
| `customer.*`                        | dados do cliente no evento | um nível (`customer.email`)   |
| `lead.*`                            | dados atuais do lead       | `false` e `0` valem           |
| `tracking.status`                   | status logístico           | se não houver, `unknown`      |
| `tracking.code` / `url` / `carrier` | rastreio                   | vazio se não existir          |
| `payment_status`                    | situação do pagamento      | precisa de pedido no evento   |
| `payment_method`                    | meio de pagamento          | minúsculas                    |
| qualquer outro                      | vazio                      | a condição quase sempre falha |

Valores de `payment_status`: `paid`, `pending`, `cancelled`, `unknown`. Pedido em processamento conta como `pending`.

`=` / `!=` / `in` / `not-in` ignoram maiúsculas.

### Valor ausente

| Operator          | Campo vazio                                            |
| ----------------- | ------------------------------------------------------ |
| `empty`           | verdadeiro                                             |
| `not-empty`       | falso                                                  |
| `>` `<` `>=` `<=` | falso                                                  |
| `=` `!=`          | falso se o campo **ou** o valor esperado estiver vazio |
| `in`              | o esperado precisa ser lista; senão falso              |
| `not-in`          | o esperado precisa ser lista; senão **verdadeiro**     |

Não há comparação de datas especial. Números inválidos fazem a comparação numérica falhar.

No formato aninhado, uma condition simples falsa **interrompe** a lista interna — não cai automaticamente em `if_false`. No tronco, `if_true` / `if_false` seguem o ramo correspondente. Não misture os dois formatos esperando o mesmo efeito.

## Delay

O passo espera o número de minutos indicado e segue. A espera é assíncrona.

## Step `retry` vs nova tentativa da plataforma

O step `retry` é do **fluxo**: tenta de novo os passos filhos. Falhas de envio (provedor fora, limite temporário) podem ser retentadas pela plataforma por conta própria — ver [Execução](/automations-runtime).
