Guia para IA — Criação de Automações

Prompt para LLMs, importação no painel, triggers, formato flat e checklist antes de entregar o JSON.

Uso: Cole este documento (ou a seção Prompt para IA) no contexto da conversa ao pedir para uma IA gerar automações.
Manifesto completo (anti-regressão LLM): AUTOMATION_LLM_MANIFEST.md v1.1 — especialmente §9.0


Prompt para IA

Você é um especialista em automações de marketing da plataforma Corvex Checkout.

Sua tarefa é gerar JSON válido para **importar no painel Corvex** (ou para o copilot editar o fluxo), seguindo EXATAMENTE as regras deste guia.

REGRAS OBRIGATÓRIAS:
1. Responda SOMENTE com JSON válido (objeto da automação ou array de steps), sem markdown extra, salvo se o usuário pedir explicação.
2. Use metatags APENAS no formato {{categoria.campo}} listadas para o trigger escolhido.
3. NUNCA invente metatags. Se não existir no catálogo do gatilho, não use.
4. Máximo 50 steps no array principal.
5. Todo step deve ter `id` string único (recomendado UUID v4; se omitir, o painel gera UUID ao salvar). Branches: `id` único no fluxo (UUID ou slug, ex: `pending-check1`).
6. Formato FLAT: array `steps` + `parentId` nas branches + `nextId` para o editor visual (ver seção Editor visual).
7. **Obrigatório `nextId` em cada step não-terminal** — sem isso o editor visual fica com nós desconectados.
8. **`parentId` = `branches[].id` apenas** — NUNCA use `parentId` como id do step anterior; para encadear use `nextId`.
9. Tronco (email, delays, conditions): **sem** `parentId`. Filhos de ramo: `parentId` = id da branch (ex: `pending-check1`).
10. NUNCA `parentId` em type "condition". IDs de branch únicos por bloco (`pending-check1`, `paid-check2`).
11. Todo ramo termina em `end` (último email pendente também: `action.nextId` → `end` com mesmo `parentId`).
12. NÃO use webhook/create_coupon (não implementados no executor).
13. Delay: minutes entre 1 e 10080 (7 dias).
14. Condições de pagamento: field `payment_status`, valores `paid` ou `pending` (minúsculas). NÃO use `order.status` em `conditions[]`.
15. WhatsApp button-actions: `type`, `message`, `choices` ou `buttonActions`.
16. Email: remetente fixo (sem metatag), subject, html ou body.
17. SMS: message máx. 160 caracteres no template.
18. Antes de entregar, valide o checklist § "Checklist antes de entregar o JSON" e AUTOMATION_LLM_MANIFEST.md §9.0.

Ao receber pedido do usuário, pergunte (se não informado): trigger, nome da automação, canais (WhatsApp/email/SMS), e tom da mensagem.
Depois gere o JSON completo da automação.

Como criar e editar no painel

Automações são criadas e editadas pelo painel Corvex, de duas formas:

  1. Editor visual — montar o fluxo arrastando steps e conectando ramos.
  2. Importar JSON — colar o JSON que a IA gerou; o painel valida e exibe no editor.

O copilot dentro do painel também pode propor alterações. A LLM deve gerar JSON pronto para importação, não instruções de API HTTP.

Estrutura do JSON

{
  "name": "PIX pendente - lembrete 5min",
  "trigger_event": "pix.generated",
  "active": true,
  "steps": [ /* array de steps — ver abaixo */ ]
}

Campos raiz

CampoTipoRegras
namestring3–100 caracteres
trigger_eventenumVer tabela de triggers
stepsarray1–50 itens
activebooleandefault true

Triggers disponíveis

trigger_eventQuando disparaMetatags validadas*
pix.generatedPIX gerado / pedido pendente PIXSim
payment.confirmedPagamento confirmadoSim
cart.abandonedCarrinho abandonadoSim
tracking_code_updatedCódigo de rastreio atualizadoSim
payment.failedPagamento falhouNão (save ok, sem validator de metatag)
boleto.generatedBoleto geradoNão
lead.createdLead criadoNão

* Validação de metatags controlada por AUTOMATION_TEMPLATE_VALIDATION_MODE=off|warn|block.


Como o motor executa (crítico para montar o fluxo)

  1. Ordem: Percorre o array steps na ordem (índice 0 → N).
  2. onNext: Após executar um step (action ou delay), executa todos os steps em onNext antes de ir ao próximo item do array principal. Delays em onNext bloqueiam (sleep real).
  3. parentId: Steps com parentId só rodam se uma condition anterior validou uma branch com id igual ao parentId.
  4. branches: Na condition, cada branch tem id, label, conditions[]. O motor avalia todas as branches e executa a primeira que der match.
  5. nextId: Ignorado pelo motor de execução na execução, mas obrigatório para o editor visual desenhar “Próxima etapa”. Sempre preencher ao gerar JSON para importação.
  6. end: Encerra a automação imediatamente.

Compatibilidade com o editor visual

O editor desenha as conexões principalmente com nextId (porta “Próxima etapa”) e parentId (saídas das branches). O motor de execução não segue nextId, mas o editor precisa dele para exibir o fluxo corretamente.

Problema no editorCausa no JSONCorreção
Nós totalmente desconectadosNenhum step com nextIdEncadear todos os steps não-terminais com nextId
parentId no step anteriorDelay com parentId: "id-do-email"Tronco sem parentId; use email.nextId → delay
parentId na conditionCondition com parentId do delayConditions nunca têm parentId
Delay com entrada mas sem saídaDelay só em onNext, sem nextId para o próximo nóDelay no array principal + nextId → próximo step
Tronco WA → email → SMS desconectadoSteps sem nextId entre siEncadear: "nextId": "id-do-proximo"
SMS → delay OK, delay → condition vazioonNext liga SMS→delay; delay sem nextIddelay.nextId = id da condition ou delay flat antes da condition
Último email pendente soltoSem end no final do ramoemail.nextId → end com mesmo parentId da branch

Padrão recomendado (editor + execução):

[step A].nextId → [step B].nextId → [delay].nextId → [condition]
                              branch paid/pending
                    [filho].nextId → [filho].nextId → [delay].nextId → [próxima condition]
  • Tronco inicial: sem parentId; cada step com nextId até a 1ª condition.
  • Delays: preferir nó no array principal (não aninhado em onNext), com nextId apontando para o próximo.
  • onNext: ainda funciona na execução; se usar, o último item do onNext deve ter nextId para o próximo nó do fluxo.
  • Ramo pago com end: action.nextId → end.id (além ou em vez de onNext).

Dupla regra nextId:

CamadanextId
Editor visualUsar — senão conexões vazias
Motor de execuçãoIgnorado — usa ordem do array + onNext + parentId

Mantenha ordem do array alinhada à cadeia nextId (mesma sequência lógica).

Exemplo completo: veja Manifesto LLM §12.

Limitações importantes (não é um grafo visual 100%)

O motor não interpreta conexões desenhadas no editor como um fluxograma arbitrário. Só vale o que está descrito abaixo.

SituaçãoComportamento real
nextId no motor de execuçãoIgnorado na execução — use ordem do array + onNext
nextId no editorObrigatório para desenhar “Próxima etapa”
parentId em type: "condition"Não filtra. Conditions sempre executam; parentId em condition não significa “filho da branch”.
parentId em action/delay/endSó executa se alguma condition anterior tiver validado a branch com esse parentId.
Várias conditions no mesmo fluxoO motor busca a primeira condition anterior (índice menor) com branch correspondente — não a mais recente.
Reusar o mesmo parentId após outra conditionSteps antigos podem rodar de novo se a 1ª condition ainda corresponder àquele ramo. Use IDs únicos por bloco (pending-1, pending-2).
Várias branches que dariam matchSó a primeira branch da lista executa.
webhook / create_couponAceitos no schema, mas não implementados no executor (não disparam integração).
Passar validação do painelNão garante envio (WhatsApp conectado, SMS ≤ 160 após expandir URL, etc.).

Padrão seguro com 2+ conditions:

[steps iniciais sem parentId]
[condition A] → filhos com parentId só de A (IDs únicos *-check1)
[condition B] → filhos com parentId só de B (IDs únicos *-check2), SEM parentId na condition B

Nunca coloque filhos da condition A depois da condition B usando o mesmo parentId de A.

IDs dos steps e branches (UUID obrigatório?)

CampoFormato aceitoObrigatório?
steps[].idQualquer string não vazia (ex: UUID ou slug)Opcional no JSON — se faltar, o painel gera UUID ao salvar
branches[].idQualquer string (ex: branch-paid, UUID)Recomendado; usado em parentId
parentIdDeve ser idêntico a branches[].idSó em filhos de branch — nunca id de outro step

nextId vs parentId (não confundir):

CampoSignificadoExemplo certoExemplo errado
nextIdPróximo step na sequênciaemail.nextId → delay-1—
parentIdPertence a esta saída de condiçãodelay.parentId → pending-check1delay.parentId → email-1

Recomendação para IA: UUID v4 em steps (id); slug descritivo em branches (pending-check1, paid-check2). A validação do painel não exige formato UUID.


Formato dos steps

Formato FLAT (recomendado para IA / editor visual)

Todos os steps no mesmo array. Steps filhos de uma branch usam parentId = branch.id (não o id do step anterior).

{
  "steps": [
    { "id": "email-1", "type": "action", "name": "send_email", "nextId": "delay-1", "data": { "...": "..." } },
    { "id": "delay-1", "type": "delay", "minutes": 5, "nextId": "cond-1" },
    {
      "id": "cond-1",
      "type": "condition",
      "nextId": "end-paid",
      "branches": [
        { "id": "branch-paid", "label": "Pago", "conditions": [{ "field": "payment_status", "operator": "=", "value": "paid" }] },
        { "id": "branch-pending", "label": "Pendente", "conditions": [{ "field": "payment_status", "operator": "=", "value": "pending" }] }
      ]
    },
    { "id": "end-paid", "type": "end", "parentId": "branch-paid" },
    { "id": "email-2", "type": "action", "name": "send_email", "parentId": "branch-pending", "nextId": "end-pending", "data": { "...": "..." } },
    { "id": "end-pending", "type": "end", "parentId": "branch-pending" }
  ]
}

Exemplo completo multi-etapa: · anti-padrões: AUTOMATION_LLM_MANIFEST.md §9.0

Formato aninhado (alternativo)

Steps dentro de branches[].steps, if_true, if_false, ou onNext.


Tipos de step

1. action — Enviar mensagem ou integração

{
  "id": "uuid",
  "type": "action",
  "name": "send_whatsapp | send_email | send_sms | webhook | create_coupon",
  "parentId": "branch-id-opcional",
  "onNext": [],
  "onResponse": [],
  "onOpen": [],
  "onClickLink": [],
  "data": {}
}
nameCanalCallbacks úteis
send_whatsappWhatsApponNext, onResponse
send_emailEmailonNext, onOpen, onClickLink
send_smsSMSonNext, onResponse
webhookHTTP externoonNext
create_couponCupomonNext

2. send_whatsapp

Texto simples

{
  "id": "uuid",
  "type": "action",
  "name": "send_whatsapp",
  "data": {
    "type": "text",
    "message": "Olá, {{customer.name}}! Seu pedido {{order.id}} está aguardando pagamento."
  }
}

message ou text (alias). Obrigatório para type: text ou whatsapp.

Botões de ação (button-actions)

{
  "data": {
    "type": "button-actions",
    "message": "Olá, {{customer.name}}, seu PIX está pendente",
    "footer": "PAGAMENTO 100% SEGURO",
    "menuType": "button",
    "frontendType": "carousel",
    "choices": [
      "Finalizar Compra|url:{{order.url_pix_gerado}}"
    ]
  }
}

Formato choices (frontend): "Label|url:https://..." ou "Label|url:{{order.url_pix_gerado}}".

Formato buttonActions (API):

"buttonActions": [
  { "id": "btn1", "type": "URL", "label": "Pagar PIX", "url": "https://..." },
  { "id": "btn2", "type": "CALL", "label": "Ligar", "phone": "5511999999999" }
]

Outros tipos WhatsApp

data.typeCampos obrigatórios
documentdocument (URL)
videovideo (URL)
audioaudio (URL)
linklinkUrl (URL)
button-listbuttonList.buttons[] ou choices[]
button-otpcode

3. send_email

{
  "id": "uuid",
  "type": "action",
  "name": "send_email",
  "data": {
    "remetente_nome": "Nome da Loja",
    "remetente_email": "[email protected]",
    "subject": "Seu PIX está pendente",
    "body": "<mjml>...</mjml>",
    "html": "<mjml>...</mjml>"
  }
}
CampoRegra
remetente_nomeObrigatório, não vazio
remetente_emailObrigatório, email válido
subjectObrigatório, mínimo 3 caracteres
body ou htmlPelo menos um obrigatório

Emails podem usar MJML em body/html. Metatags funcionam dentro do HTML.


4. send_sms

{
  "id": "uuid",
  "type": "action",
  "name": "send_sms",
  "data": {
    "message": "Olá {{customer.name}}, finalize: {{order.url_pix_gerado}}"
  }
}
RegraValor
messageObrigatório, máx. 160 caracteres

5. delay

{
  "id": "uuid",
  "type": "delay",
  "minutes": 5,
  "onNext": []
}
CampoRegra
minutesInteiro, 1–10080

6. condition

Formato com branches (recomendado — editor visual)

Importante: Pode usar somente branches (sem conditions no topo). Cada branch precisa de conditions[] com pelo menos 1 regra.

{
  "id": "uuid",
  "type": "condition",
  "branches": [
    {
      "id": "branch-paid-uuid",
      "label": "PEDIDO PAGO",
      "conditions": [
        { "field": "payment_status", "operator": "=", "value": "paid" }
      ]
    },
    {
      "id": "branch-pending-uuid",
      "label": "PEDIDO PENDENTE",
      "conditions": [
        { "field": "payment_status", "operator": "=", "value": "pending" }
      ]
    }
  ]
}

Steps filhos: "parentId": "branch-paid-uuid" ou "branch-pending-uuid".

Formato composto (if_true / if_false)

{
  "id": "uuid",
  "type": "condition",
  "operator": "AND",
  "conditions": [
    { "field": "payment_status", "operator": "=", "value": "paid" }
  ],
  "if_true": [ /* steps */ ],
  "if_false": [ /* steps */ ]
}

Formato simples (legado)

{
  "type": "condition",
  "field": "payment_status",
  "operator": "=",
  "value": "paid",
  "if_true": [],
  "if_false": []
}

7. retry

{
  "id": "uuid",
  "type": "retry",
  "maxAttempts": 3,
  "delayBetweenAttempts": 0,
  "steps": [ /* steps a repetir */ ]
}

8. loop

{
  "id": "uuid",
  "type": "loop",
  "maxIterations": 10,
  "stopOnError": true,
  "condition": { "field": "payment_status", "operator": "=", "value": "pending" },
  "steps": []
}

9. end

{
  "id": "uuid",
  "type": "end"
}

Condições — operadores e campos

Operadores permitidos

OperadorUso
=Igual (case-insensitive)
!=Diferente
inValor está no array value
not-inValor não está no array
emptyCampo vazio/nulo
not-emptyCampo preenchido
>, <, >=, <=Comparação numérica

Campos usados em runtime (condições)

CampoOrigemValores típicos
payment_statusBanco (Order.status → normalizado)paid, pending, cancelled, processing — único campo para condições de pagamento
payment_methodBancopix, credit_card, boleto, etc.
amountEventonúmero
customer.{campo}Eventoex: customer.email
lead.{campo}Eventoex: lead.name, lead.phone
tracking.statusEvento/bancostatus logístico
tracking.codeEventocódigo rastreio
tracking.urlEventoURL rastreio
tracking.carrierEventotransportadora

Campos não avaliados pelo motor retornam null e a condição tende a falhar. order.status em conditions[] não é suportado — use payment_status.

Operador lógico entre condições da mesma branch

Default: AND. Opcional por branch: "operator": "OR".


Metatags

Sintaxe

  • Formato: {{chave}} onde chave usa notação de ponto: {{customer.name}}, {{order.pix_code}}
  • Processadas no envio (WhatsApp, email, SMS)
  • Proibido inventar chaves não listadas no registry

Registry completo

Consulte o catálogo oficial via GET /automation/metatags?triggerType=... ou a página Metatags.
Somente metatags com status active (evitar legacy e planned).

Metatags essenciais por trigger

pix.generated (125 ativas no registry)

MetatagDescrição
{{customer.name}}Nome do cliente
{{customer.email}}Email
{{customer.phone}}Telefone
{{order.id}}ID do pedido
{{order.total}}Valor total formatado
{{order.pix_code}}Código PIX copia e cola
{{order.url_pix_gerado}}URL página de pagamento PIX
{{order.payment_method}}Método de pagamento
{{order.items}}Lista de itens
{{order.items.first.name}}Nome do 1º item
{{store.name}}Nome da loja
{{store.domain}}Domínio da loja
{{shipping.name}}Nome do frete
{{shipping.turnaround}}Prazo de entrega
{{shipping.price}}Valor do frete
{{payment.pix_code}}⚠️ Legacy — prefira {{order.pix_code}}

payment.confirmed

Mesmas de pedido/cliente/loja/frete, exceto PIX:

MetatagDescrição
{{customer.name}}Nome
{{order.id}}ID pedido
{{order.total}}Total
{{order.payment_method}}Forma de pagamento
{{shipping.turnaround}}Prazo entrega
{{shipping.carrier}}Transportadora
{{store.name}}Loja

cart.abandoned

MetatagDescrição
{{lead.name}}Nome do lead
{{lead.email}}Email
{{lead.phone}}Telefone
{{lead.url_checkout}}URL voltar ao checkout
{{cart.total}}Total do carrinho
{{cart.items}}Itens
{{cart.url_checkout}}URL checkout
{{cart.abandonedAt}}Data abandono
{{checkout.url}}URL checkout
{{order.url_checkout}}URL checkout (alias)
{{store.name}}Loja

tracking_code_updated

MetatagDescrição
{{tracking.code}}Código de rastreio
{{tracking.url}}Link rastreio
{{tracking.carrier}}Transportadora
{{tracking.status}}Status logístico
{{order.tracking_code}}Alias
{{order.tracking_url}}Alias
{{customer.name}}Cliente
{{order.id}}Pedido
{{shipping.name}}Frete

Metatags legacy (evitar em novas automações)

MetatagSubstituir por
{{payment.pix_code}}{{order.pix_code}}
{{payment.expiration_time}}(sem substituto ativo — usar texto fixo)
{{current_year}}Ano fixo ou texto

Exemplos completos

Exemplo 1 — PIX pendente com lembrete 5min (seu fluxo)

{
  "name": "PIX pendente - WhatsApp + email + confirmação",
  "trigger_event": "pix.generated",
  "active": true,
  "steps": [
    {
      "id": "b9c7efbe-bf59-42c6-8899-05be572f6fe0",
      "type": "action",
      "name": "send_whatsapp",
      "data": {
        "type": "button-actions",
        "action": "send_whatsapp",
        "message": "Olá, {{customer.name}}, seu pix está pendente",
        "footer": "PAGAMENTO 100% SEGURO",
        "choices": ["Finalizar Compra|url:{{order.url_pix_gerado}}"],
        "menuType": "button",
        "frontendType": "carousel"
      },
      "onNext": [
        {
          "id": "fe34ae30-8387-4ddf-914e-b0813d0646bd",
          "type": "delay",
          "minutes": 5
        }
      ]
    },
    {
      "id": "ecfd2d2b-830b-4795-8f82-75e8cde4a1de",
      "type": "condition",
      "branches": [
        {
          "id": "9d6eae25-ec0b-44df-b364-c0a9539f4db3",
          "label": "PEDIDO PAGO",
          "conditions": [{ "field": "payment_status", "operator": "=", "value": "paid" }]
        },
        {
          "id": "946961b2-1d31-46c7-b8c4-a3178a5d6d2a",
          "label": "PEDIDO PENDENTE AINDA",
          "conditions": [{ "field": "payment_status", "operator": "=", "value": "pending" }]
        }
      ]
    },
    {
      "id": "5c5a4e89-9fe2-43e0-a901-ad969302e2db",
      "type": "action",
      "name": "send_email",
      "parentId": "946961b2-1d31-46c7-b8c4-a3178a5d6d2a",
      "data": {
        "action": "send_email",
        "remetente_nome": "Minha Loja",
        "remetente_email": "[email protected]",
        "subject": "Seu PIX está pendente",
        "body": "<mjml>...{{customer.name}}...{{order.pix_code}}...{{order.url_pix_gerado}}...</mjml>",
        "html": "<mjml>...</mjml>"
      }
    },
    {
      "id": "34173385-81f6-440b-a0fe-b57c75e9c6b4",
      "type": "action",
      "name": "send_whatsapp",
      "parentId": "9d6eae25-ec0b-44df-b364-c0a9539f4db3",
      "data": {
        "type": "text",
        "message": "Olá, {{customer.name}}! ✅\n\nSua compra foi confirmada.\n\nPedido: {{order.id}}\nValor: {{order.total}}\nPagamento: {{order.payment_method}}\n\nPrevisão de entrega: {{shipping.turnaround}}\n\nObrigado pela compra! 💜"
      }
    }
  ]
}

Fluxo de execução:

  1. Envia WhatsApp com botão PIX
  2. Aguarda 5 min (onNext)
  3. Avalia payment_status
  4. Se pendente → email; se pago → WhatsApp de confirmação

Exemplo 2 — Carrinho abandonado

{
  "name": "Recuperação carrinho - 30min",
  "trigger_event": "cart.abandoned",
  "active": true,
  "steps": [
    {
      "id": "step-delay-1",
      "type": "delay",
      "minutes": 30
    },
    {
      "id": "step-wa-1",
      "type": "action",
      "name": "send_whatsapp",
      "data": {
        "type": "text",
        "message": "Oi {{lead.name}}! Você deixou itens no carrinho ({{cart.total}}). Finalize aqui: {{cart.url_checkout}}"
      }
    }
  ]
}

Exemplo 3 — Pagamento confirmado

{
  "name": "Pedido confirmado",
  "trigger_event": "payment.confirmed",
  "active": true,
  "steps": [
    {
      "id": "step-email-1",
      "type": "action",
      "name": "send_email",
      "data": {
        "remetente_nome": "{{store.name}}",
        "remetente_email": "[email protected]",
        "subject": "Pedido confirmado #{{order.id}}",
        "html": "<p>Olá {{customer.name}}, recebemos seu pagamento de {{order.total}}.</p>"
      }
    }
  ]
}

Exemplo 4 — Rastreio disponível

{
  "name": "Código de rastreio",
  "trigger_event": "tracking_code_updated",
  "active": true,
  "steps": [
    {
      "id": "step-wa-tracking",
      "type": "action",
      "name": "send_whatsapp",
      "data": {
        "type": "text",
        "message": "Olá {{customer.name}}! Seu pedido {{order.id}} foi enviado.\n\nRastreio: {{tracking.code}}\nAcompanhe: {{tracking.url}}"
      }
    }
  ]
}

Erros comuns (evitar)

ErroCorreção
Omitir nextId em toda a cadeiaCada step não-terminal precisa de nextId → próximo step
parentId = id do step anteriorEncadear com nextId; parentId só = branches[].id
parentId em conditionRemover; condition sempre roda, nunca tem parentId
order.status em conditions[]Usar payment_status + pending/paid (motor não avalia order.status)
Último ramo pendente sem endaction.nextId → end com mesmo parentId
Tronco sem nextId (editor vazio)Encadear cada step com nextId
Delay no ramo com parentId do emailDelay pendente: parentId = branch pending, não do action
Delay só em onNext sem nextId de saídaDelay flat + nextId → próximo step
parentId que não existe em branches[].idIgualar IDs exatamente
Metatag de outro triggerConsultar tabela por trigger_event
{{payment.pix_code}} em código novoUsar {{order.pix_code}}
SMS > 160 charsEncurtar mensagem
Email sem subject ou sem body/htmlPreencher todos obrigatórios
WhatsApp texto sem messageAdicionar message ou text
button-actions sem botõesAdicionar choices ou buttonActions
Mais de 50 stepsDividir em automações separadas
Condition depois dos filhos no arrayCondition deve vir antes dos steps com parentId
Condition só com branches sem conditions em cada branchCada branch precisa de conditions: [{ field, operator, value }]
remetente_nome com metatag {{store.name}}Use nome fixo da loja; metatag em remetente pode falhar validação de email
parentId em step conditionRemover; condition sempre roda
Mesmo parentId após 2ª conditionRenomear branches (*-check1, *-check2) e filhos só abaixo da condition certa
webhook / create_couponNão usar até estar implementado
Assumir grafo visual = execuçãoSeguir ordem do array + regras da seção "Limitações importantes"

Checklist antes de entregar o JSON

  • Todo step não-terminal tem nextId
  • parentId é sempre branches[].id — nunca id de outro step
  • Tronco (actions, delays, conditions): sem parentId
  • Condições de pagamento: payment_status + pending/paid (não order.status)
  • Cada ramo termina em end (inclusive último lembrete pendente)
  • trigger_event correto para o caso de uso
  • Todo step tem id único (UUID recomendado; branches podem ser slug único)
  • parentId === branch.id (texto exato)
  • Máximo 50 steps
  • Metatags existem no registry para esse trigger
  • Condition aparece antes dos steps com parentId correspondente
  • Delays com minutes entre 1 e 10080
  • Email com remetente, assunto e corpo
  • WhatsApp com mensagem/botões conforme o type
  • SMS ≤ 160 caracteres
  • Tronco e ramos pendentes com nextId encadeado (editor visual)
  • Delays críticos no array principal com nextId de saída
  • Nenhum parentId em steps condition
  • Se 2+ conditions: branch IDs únicos por bloco; filhos imediatamente após cada condition
  • Sem webhook / create_coupon