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:
- Editor visual — montar o fluxo arrastando steps e conectando ramos.
- 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
| Campo | Tipo | Regras |
|---|---|---|
name | string | 3–100 caracteres |
trigger_event | enum | Ver tabela de triggers |
steps | array | 1–50 itens |
active | boolean | default true |
Triggers disponíveis
trigger_event | Quando dispara | Metatags validadas* |
|---|---|---|
pix.generated | PIX gerado / pedido pendente PIX | Sim |
payment.confirmed | Pagamento confirmado | Sim |
cart.abandoned | Carrinho abandonado | Sim |
tracking_code_updated | Código de rastreio atualizado | Sim |
payment.failed | Pagamento falhou | Não (save ok, sem validator de metatag) |
boleto.generated | Boleto gerado | Não |
lead.created | Lead criado | Não |
* Validação de metatags controlada por AUTOMATION_TEMPLATE_VALIDATION_MODE=off|warn|block.
Como o motor executa (crítico para montar o fluxo)
- Ordem: Percorre o array
stepsna ordem (índice 0 → N). onNext: Após executar um step (action ou delay), executa todos os steps emonNextantes de ir ao próximo item do array principal. Delays emonNextbloqueiam (sleep real).parentId: Steps comparentIdsó rodam se uma condition anterior validou uma branch comidigual aoparentId.branches: Na condition, cada branch temid,label,conditions[]. O motor avalia todas as branches e executa a primeira que der match.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.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 editor | Causa no JSON | Correção |
|---|---|---|
| Nós totalmente desconectados | Nenhum step com nextId | Encadear todos os steps não-terminais com nextId |
parentId no step anterior | Delay com parentId: "id-do-email" | Tronco sem parentId; use email.nextId → delay |
parentId na condition | Condition com parentId do delay | Conditions nunca têm parentId |
| Delay com entrada mas sem saída | Delay só em onNext, sem nextId para o próximo nó | Delay no array principal + nextId → próximo step |
| Tronco WA → email → SMS desconectado | Steps sem nextId entre si | Encadear: "nextId": "id-do-proximo" |
| SMS → delay OK, delay → condition vazio | onNext liga SMS→delay; delay sem nextId | delay.nextId = id da condition ou delay flat antes da condition |
| Último email pendente solto | Sem end no final do ramo | email.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 comnextIdaté a 1ª condition. - Delays: preferir nó no array principal (não aninhado em
onNext), comnextIdapontando para o próximo. onNext: ainda funciona na execução; se usar, o último item doonNextdeve ternextIdpara o próximo nó do fluxo.- Ramo pago com
end:action.nextId→end.id(além ou em vez deonNext).
Dupla regra nextId:
| Camada | nextId |
|---|---|
| Editor visual | Usar — senão conexões vazias |
| Motor de execução | Ignorado — 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ção | Comportamento real |
|---|---|
nextId no motor de execução | Ignorado na execução — use ordem do array + onNext |
nextId no editor | Obrigató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/end | Só executa se alguma condition anterior tiver validado a branch com esse parentId. |
| Várias conditions no mesmo fluxo | O motor busca a primeira condition anterior (índice menor) com branch correspondente — não a mais recente. |
Reusar o mesmo parentId após outra condition | Steps 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 match | Só a primeira branch da lista executa. |
webhook / create_coupon | Aceitos no schema, mas não implementados no executor (não disparam integração). |
| Passar validação do painel | Nã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?)
| Campo | Formato aceito | Obrigatório? |
|---|---|---|
steps[].id | Qualquer string não vazia (ex: UUID ou slug) | Opcional no JSON — se faltar, o painel gera UUID ao salvar |
branches[].id | Qualquer string (ex: branch-paid, UUID) | Recomendado; usado em parentId |
parentId | Deve ser idêntico a branches[].id | Só em filhos de branch — nunca id de outro step |
nextId vs parentId (não confundir):
| Campo | Significado | Exemplo certo | Exemplo errado |
|---|---|---|---|
nextId | Próximo step na sequência | email.nextId → delay-1 | — |
parentId | Pertence a esta saída de condição | delay.parentId → pending-check1 | delay.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
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": {}
}name | Canal | Callbacks úteis |
|---|---|---|
send_whatsapp | onNext, onResponse | |
send_email | onNext, onOpen, onClickLink | |
send_sms | SMS | onNext, onResponse |
webhook | HTTP externo | onNext |
create_coupon | Cupom | onNext |
2. send_whatsapp
send_whatsappTexto 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)
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.type | Campos obrigatórios |
|---|---|
document | document (URL) |
video | video (URL) |
audio | audio (URL) |
link | linkUrl (URL) |
button-list | buttonList.buttons[] ou choices[] |
button-otp | code |
3. send_email
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>"
}
}| Campo | Regra |
|---|---|
remetente_nome | Obrigatório, não vazio |
remetente_email | Obrigatório, email válido |
subject | Obrigatório, mínimo 3 caracteres |
body ou html | Pelo menos um obrigatório |
Emails podem usar MJML em body/html. Metatags funcionam dentro do HTML.
4. send_sms
send_sms{
"id": "uuid",
"type": "action",
"name": "send_sms",
"data": {
"message": "Olá {{customer.name}}, finalize: {{order.url_pix_gerado}}"
}
}| Regra | Valor |
|---|---|
message | Obrigatório, máx. 160 caracteres |
5. delay
delay{
"id": "uuid",
"type": "delay",
"minutes": 5,
"onNext": []
}| Campo | Regra |
|---|---|
minutes | Inteiro, 1–10080 |
6. condition
conditionFormato 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
retry{
"id": "uuid",
"type": "retry",
"maxAttempts": 3,
"delayBetweenAttempts": 0,
"steps": [ /* steps a repetir */ ]
}8. loop
loop{
"id": "uuid",
"type": "loop",
"maxIterations": 10,
"stopOnError": true,
"condition": { "field": "payment_status", "operator": "=", "value": "pending" },
"steps": []
}9. end
end{
"id": "uuid",
"type": "end"
}Condições — operadores e campos
Operadores permitidos
| Operador | Uso |
|---|---|
= | Igual (case-insensitive) |
!= | Diferente |
in | Valor está no array value |
not-in | Valor não está no array |
empty | Campo vazio/nulo |
not-empty | Campo preenchido |
>, <, >=, <= | Comparação numérica |
Campos usados em runtime (condições)
| Campo | Origem | Valores típicos |
|---|---|---|
payment_status | Banco (Order.status → normalizado) | paid, pending, cancelled, processing — único campo para condições de pagamento |
payment_method | Banco | pix, credit_card, boleto, etc. |
amount | Evento | número |
customer.{campo} | Evento | ex: customer.email |
lead.{campo} | Evento | ex: lead.name, lead.phone |
tracking.status | Evento/banco | status logístico |
tracking.code | Evento | código rastreio |
tracking.url | Evento | URL rastreio |
tracking.carrier | Evento | transportadora |
Campos não avaliados pelo motor retornam
nulle a condição tende a falhar.order.statusemconditions[]não é suportado — usepayment_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)
pix.generated (125 ativas no registry)| Metatag | Descrição |
|---|---|
{{customer.name}} | Nome do cliente |
{{customer.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
payment.confirmedMesmas de pedido/cliente/loja/frete, exceto PIX:
| Metatag | Descriçã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
cart.abandoned| Metatag | Descrição |
|---|---|
{{lead.name}} | Nome do lead |
{{lead.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
tracking_code_updated| Metatag | Descriçã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)
| Metatag | Substituir 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:
- Envia WhatsApp com botão PIX
- Aguarda 5 min (
onNext) - Avalia
payment_status - 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)
| Erro | Correção |
|---|---|
Omitir nextId em toda a cadeia | Cada step não-terminal precisa de nextId → próximo step |
parentId = id do step anterior | Encadear com nextId; parentId só = branches[].id |
parentId em condition | Remover; 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 end | action.nextId → end com mesmo parentId |
Tronco sem nextId (editor vazio) | Encadear cada step com nextId |
Delay no ramo com parentId do email | Delay pendente: parentId = branch pending, não do action |
Delay só em onNext sem nextId de saída | Delay flat + nextId → próximo step |
parentId que não existe em branches[].id | Igualar IDs exatamente |
| Metatag de outro trigger | Consultar tabela por trigger_event |
{{payment.pix_code}} em código novo | Usar {{order.pix_code}} |
| SMS > 160 chars | Encurtar mensagem |
Email sem subject ou sem body/html | Preencher todos obrigatórios |
WhatsApp texto sem message | Adicionar message ou text |
button-actions sem botões | Adicionar choices ou buttonActions |
| Mais de 50 steps | Dividir em automações separadas |
| Condition depois dos filhos no array | Condition deve vir antes dos steps com parentId |
Condition só com branches sem conditions em cada branch | Cada 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 condition | Remover; condition sempre roda |
Mesmo parentId após 2ª condition | Renomear branches (*-check1, *-check2) e filhos só abaixo da condition certa |
webhook / create_coupon | Não usar até estar implementado |
| Assumir grafo visual = execução | Seguir ordem do array + regras da seção "Limitações importantes" |
Checklist antes de entregar o JSON
- Todo step não-terminal tem
nextId -
parentIdé semprebranches[].id— nunca id de outro step - Tronco (actions, delays, conditions): sem
parentId - Condições de pagamento:
payment_status+pending/paid(nãoorder.status) - Cada ramo termina em
end(inclusive último lembrete pendente) -
trigger_eventcorreto 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
parentIdcorrespondente - Delays com
minutesentre 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
nextIdencadeado (editor visual) - Delays críticos no array principal com
nextIdde saída - Nenhum
parentIdem stepscondition - Se 2+ conditions: branch IDs únicos por bloco; filhos imediatamente após cada condition
- Sem
webhook/create_coupon