# Workflows

> Automatizações por acionador. Quando algo acontece (alguém entra, compra, conclui um curso, ou passa N dias sem entrar), cada pessoa segue um caminho de esperas, condições, e-mails da biblioteca, mensagens, comentários, reações, etiquetas, grupos e publicações no Slack, ao seu ritmo. Editor em canvas, variáveis entre os blocos, fim com sucesso ou erro, taxa de sucesso, envio adiado pela cota, simulação, histórico, limites, quem assina e os 9 modelos. Também Chamar webhook com as Variáveis e chaves, as ações da plataforma, Chamar workflow e com que papel os passos agem. Também os blocos de IA Claude e ChatGPT, com a chave de API da própria comunidade, os Limites de IA e as ações de publicação, certificado, reconhecimento, chat, 1:1 e PDI.

Um **workflow** é uma automatização por acionador: quando algo acontece com uma pessoa (entra na comunidade, compra, conclui um curso, passa 30 dias sem entrar), ela entra num caminho que desenha, com esperas, condições e ações, e segue esse caminho ao seu ritmo. É a sequência de boas-vindas, o lembrete a quem desapareceu, os parabéns pelo curso, sem que ninguém da equipa tenha de carregar em nada.

A Memberfy ajuda os RH a manter toda a gente envolvida: os mesmos workflows lembram uma avaliação pendente, uma 1:1 sem registo ou uma meta sem check-in.

**Onde fica:** **Administração › Workflows**. O proprietário e o administrador criam, editam, ligam e pausam; o moderador e o financeiro veem, simulam e acompanham o histórico; o membro não vê a área.

## Como funciona

### O acionador

Cada workflow começa num **único acionador**, um bloco do desenho arrastado da categoria **Gatilhos**. Cada família tem o seu bloco (**Membros**, **Compras**, **Subscrições**, **Eventos**, **Cursos**, **Certificados**, **Badges**, **Níveis e pontos**, **Formulários**, **Pesquisas**, **Chamadas de trabalhos**, **Publicações e comentários**, **Votações**, **Downloads**, **Espaços**, **Mensagens**, os de RH, **Tempo**, **Manual** e **Webhook**), por ordem dos mais usados, e o evento é escolhido no painel do bloco, em **Dispara quando**; trocar o evento não troca o bloco. Procurar um evento (*"subscrição cancelada"*) encontra o respetivo bloco e cria-o logo nesse evento. No desenho, o bloco mostra a família em cima e o evento em baixo. Com um acionador no desenho, a categoria **Gatilhos** desaparece do seletor; para outro tipo de acionador, troque o bloco.

**Quando algo acontece**, por exemplo:

| Assunto | Acionadores |
|---|---|
| Membros | **Novo membro na comunidade** (registo, convite aceite, compra, equipa, empresa ou importação, com a **Origem**; não é o início de sessão), alguém sai, muda de papel, recebe ou perde uma etiqueta, entra ou sai de um grupo, muda um campo do perfil; **Alguém volta depois de N dias sem aceder** (com **Ficou pelo menos** 7 dias ou mais; conta o acesso pela app ou pelo assistente) |
| Compras e subscrições | Uma compra é concluída (com o filtro **Só a primeira compra**: a primeira compra da pessoa, de qualquer produto, gratuitas incluídas) ou reembolsada; alguém começa uma compra, abandona o carrinho, ou um carrinho é recuperado; uma subscrição começa, é renovada, muda de plano, fica em atraso, tem o período de teste grátis a terminar, é cancelada ou termina |
| Conteúdo e espaços | Alguém publica, comenta ou reage; visita um espaço pela primeira vez; ganha acesso a um espaço; o ciclo de vida de publicações, espaços e downloads (ver [Eventos do ciclo de vida](#eventos-do-ciclo-de-vida)) |
| Cursos e eventos | Matrícula, aula ou curso concluído, questionário aprovado ou não, certificado emitido; inscrição, bilhete recebido, inscrição cancelada, vaga da lista de espera, check-in feito ou desfeito |
| Níveis e pontos | **Subiu de nível**, **Desceu de nível** (com o **Motivo**) e **Atingiu N pontos**. Ver [Níveis e pontos](#niveis-e-pontos) |
| Outros módulos | Formulário, inquérito e proposta respondidos ou decididos, tópico de votação, ficheiro descarregado, registo de entrada e de saída na assiduidade, reservas, reconhecimento e feedback recebidos, e a [DM recebida](#dm-recebida). O evento de reconhecimento recebido traz o tipo do reconhecimento (`type`: `APPRECIATION`, `WELCOME`…). |
| Pessoas (RH) | Um ciclo de avaliação abre, alguém envia uma avaliação, um resultado é libertado; uma 1:1 é registada; um resultado-chave recebe check-in ou fica em risco; um plano de desenvolvimento é aprovado; uma ronda de inquérito abre |

A **Origem** de **Novo membro na comunidade** inclui **Veio de aprovação**, para quem entrou pelo [registo com aprovação](/membros/cadastro-e-entrada#registo-com-aprovacao) (`member.joined` com `source: approval`). É o "registo aprovado": um workflow de boas-vindas com esse filtro dispara quando a equipa aprova o pedido, não quando a pessoa pede. O pedido em si, e a recusa, não disparam workflow nem webhook.

Cada acionador aceita o seu filtro: o produto, o curso, o evento, o espaço, o grupo, a etiqueta, o campo, o ciclo ou o inquérito (vazio: qualquer um). O painel do acionador (**Entrada no workflow**) reúne o filtro, [quantas vezes a pessoa entra](#quantas-vezes-a-pessoa-entra), o **Limite de frequência** e a descrição.

**Tempo (todos os dias, por data)**: uma passagem por dia, a partir das 9h no fuso horário da comunidade, para quem cumpre a regra nesse dia: *Alguém está há N dias sem aceder*, *Todo dia, para todos*, *Avaliação pendente há N dias*, *Avaliação vence em N dias*, *1:1 daqui a N dias*, *1:1 sem registo há N dias*, *Combinado de 1:1 atrasado há N dias*, *Resultado-chave sem check-in há N dias*, *Ciclo de metas termina em N dias*, *Ação do plano de desenvolvimento atrasada há N dias* e *Inquérito sem resposta há N dias*. Cada pessoa entra uma vez pelo mesmo facto. No acionador *Alguém está há N dias sem aceder*, ao ligar o workflow pela primeira vez, **Incluir quem já está há mais de N dias sem entrar** coloca também quem já passou desse ponto: a janela mostra quantas pessoas são e pede a confirmação, e cada uma entra uma vez, ao ritmo do limite diário.

**Manual (pessoas escolhidas):** a equipa inicia o workflow para quem escolher. Com o workflow ligado, **Executar agora** pede as **Pessoas** ou um **Público** (como o das campanhas), mostra antes quantas entram, quem fica de fora (quem anulou a subscrição, com e-mail inválido ou que denunciou) e em quantos dias os e-mails saem pelo limite diário, e pede a confirmação (*"Compreendo que N pessoas vão receber os passos deste workflow agora"*). Confirmar duas vezes não inicia duas vezes. Até 20 mil pessoas de cada vez, em lotes.

**Agendado:** todos os dias, todas as semanas (nos **Dias da semana**) ou todos os meses (no **Dia do mês**, de 1 a 28), no **Horário** escolhido no fuso da comunidade, **Para quem** definir. Ligar pede a mesma confirmação dos acionadores por data, e um dia com o envio da comunidade [suspenso](/notificacoes/reputacao-de-envio) é saltado.

**Webhook recebido:** outro sistema chama o endereço do acionador e inicia o workflow para a pessoa indicada no corpo da chamada. Ver [Webhook de entrada](/integracoes/webhook-de-entrada).

**Chamado por outro workflow:** o workflow começa quando outro o chama pelo passo **Chamar workflow**, para a mesma pessoa. Ver [Ações da plataforma e outros workflows](#acoes-da-plataforma-e-outros-workflows).

### Os passos

| Passo | O que faz |
|---|---|
| **Esperar** | De 5 minutos a 365 dias |
| **Condição (se / senão)** | Divide o caminho em **Sim** e **Não** por regras, lidas no momento do passo: etiquetas (várias de uma vez, com *tem qualquer uma das etiquetas*, *tem todas as etiquetas* ou *não tem nenhuma das etiquetas*), grupo, campo do perfil, último acesso, curso concluído ou em curso, produto comprado, carrinho abandonado, acesso e visita a um espaço, inscrição e presença num evento, nível e pontos (grupo **Engajamento**) e a regra [Variável](#condicao-variavel). **Todas as regras valem** ou **Pelo menos uma regra vale**. As regras aparecem em frases, como *"Se a pessoa tem a etiqueta VIP e não entra há mais de 30 dias"* |
| **Enviar e-mail** | Um e-mail da [biblioteca](/notificacoes/campanhas-de-email#e-mails-e-disparos); cada pessoa recebe a versão no seu idioma e, se não houver, a principal |
| **Mandar mensagem (DM)** | Uma mensagem no [chat](/membros/mensagens) em nome de alguém da equipa (ver [Em nome de quem](#em-nome-de-quem)) |
| **Comentar no item** e **Reagir ao item** | Em nome de alguém da equipa, sobre o item do acionador: a publicação, o comentário, a reação ou a inscrição da pessoa |
| **Adicionar ou remover etiqueta** e **Adicionar a um grupo** | Organiza a pessoa |
| **Postar no Slack** | Uma mensagem no canal da instalação do [Slack](/integracoes/slack) da comunidade |
| **Enviar SMS** e **Enviar WhatsApp** | Um aviso no telemóvel da pessoa, na categoria **Mensagens**: no SMS, um texto de até 300 caracteres; no WhatsApp, um modelo aprovado com os campos preenchidos (ver [Enviar SMS e Enviar WhatsApp](#enviar-sms-e-enviar-whatsapp)) |
| **Chamar webhook** | Uma chamada HTTPS para outro sistema (um CRM, uma folha de cálculo, o n8n), com as chaves guardadas em **Variáveis e chaves** (ver [Chamar webhook](#chamar-webhook)) |
| **Claude** e **ChatGPT** | Pedem um texto ou um JSON à IA, com a chave de API da própria comunidade, na categoria **IA** (ver [Blocos de IA](#blocos-de-ia-claude-e-chatgpt)) |
| **Ações da plataforma** | Mudar papel, ajustar pontos, conceder ou remover badge, publicar publicação, emitir certificado, reconhecer, bloquear no chat, agendar 1:1, adicionar ação ao PDI, inscrever num evento, matricular num curso, dar acesso por cortesia, mandar um aviso na app; cada ação é um bloco, em **Pessoas**, **Conteúdo** ou **Mensagens** (ver [Ações da plataforma e outros workflows](#acoes-da-plataforma-e-outros-workflows)) |
| **Chamar workflow** | Corre outro workflow para a mesma pessoa e espera que ele termine, na categoria **Fluxo** |
| **Enquanto (repetir)** | Repete um trecho enquanto as regras valem, até um máximo de 1 a 10 vezes (predefinição: 3). Todos os caminhos do trecho precisam de uma espera de pelo menos 1 dia |
| **Registar log** | Anota uma linha na execução (ver [Registar log](#registar-log)) |
| **Fim: sucesso** e **Fim: erro** | Onde cada caminho termina (ver [Como um workflow termina](#como-um-workflow-termina)) |

Cada bloco tem um **Nome do bloco**, para o reconhecer no desenho e encontrar as respetivas variáveis em **Inserir variável**. Os textos aceitam as [variáveis](#variaveis) do acionador e dos passos anteriores. O que um workflow faz nunca aciona outro workflow. A única forma de um workflow iniciar outro é o passo **Chamar workflow**.

### O editor

O **Desenho** ocupa a altura total do ecrã:

- **A barra de ícones** à esquerda abre os blocos por categoria (**Gatilhos**, **Fluxo**, **Mensagens**, **Pessoas**, **Conteúdo**, **Integrações**, **IA** e **Fim**), com pesquisa (**Procurar bloco…**, atalho `/`); cada categoria tem a sua cor. As categorias abrem e fecham como um acordeão (clique, `Enter` ou espaço), mostram quantos blocos têm quando estão fechadas, e o navegador lembra-se das que deixou fechadas; uma pesquisa abre as que têm resultados. Arraste um bloco para o desenho ou clique para o adicionar depois do bloco selecionado.
- **Barras laterais redimensionáveis:** arraste a margem da barra dos blocos ou do painel do bloco para mudar a largura, e um duplo clique repõe o padrão. A largura fica guardada no navegador.
- **O "+" dos dois lados de cada bloco** é o ponto de ligação. **Clicar** abre o seletor de blocos (depois da saída, ou antes da entrada); **arrastar** puxa um fio; **largar** um bloco do desenho, um bloco da barra ou a ponta de um fio sobre um **+** liga-os. O **+** no meio de uma ligação põe um passo no meio.
- **Uma ligação recusada diz porquê**, num aviso no desenho: *"O gatilho não recebe ligações: é sempre o início."*, *"Um bloco não pode levar a si próprio."* e *"Isto criaria um ciclo. Para repetir passos, use o bloco "Enquanto (repetir)"."*
- **Um clique num bloco** abre o respetivo painel, com o **Nome do bloco**, os campos e as opções reais da comunidade (e-mails, etiquetas, grupos, cursos, produtos, espaços e eventos, com pesquisa). Um passo fora de qualquer caminho fica marcado como **Solto**, e um passo com erro, marcado a vermelho.
- **Menu de contexto** (botão direito): **Abrir**, **Duplicar**, **Eliminar**, **Adicionar bloco depois**, **Desligar**, **Colar**.
- **Barra de ferramentas e minimapa:** **Aproximar**, **Afastar**, **Ver tudo**, **Organizar**, **Desfazer**, **Refazer** e um minimapa do desenho completo.
- **Atalhos do teclado:** eliminar o que está selecionado, desfazer e refazer, copiar, colar e duplicar blocos, selecionar tudo, `Esc` para fechar o painel, guardar, `Shift` + clique para selecionar vários, arrastar no fundo para selecionar por área e `Ctrl/⌘` + deslocar para o zoom. **Atalhos do teclado** mostra a lista.

Guardar um workflow ligado cria uma versão nova: vale para quem entrar daqui em diante, e quem já está a meio termina na versão em que começou.

### Simular, testar e estimar

- **Simular com uma pessoa** percorre o desenho com os dados atuais dessa pessoa (incluindo o que ainda não foi guardado) e destaca o caminho: *Seguiria pelo "sim"*, *Esperaria 3 dias*, *Enviaria "…"*. Nada é enviado.
- **Enviar teste para mim**, num passo de e-mail, envia o e-mail apenas a quem tem a sessão iniciada.
- **Simular e me enviar os e-mails** faz a mesma simulação e envia os e-mails que a pessoa receberia, com o mesmo texto e as mesmas variáveis, **apenas para si**, com *[Teste]* no assunto. Não contam como envio (nem nos limites, nem na reputação de envio, nem no histórico) e não levam as ligações de cancelamento da subscrição da pessoa. Até 10 e-mails por simulação (num caminho com mais, saem os 10 primeiros) e 10 simulações com envio por hora. O botão aparece quando o desenho tem um passo **Enviar e-mail**, para quem pode simular, incluindo o moderador e o financeiro.
- **Ao ligar**, a janela mostra quantas pessoas ativaram o acionador no último dia, em 7 e em 30 dias, para dar uma ideia do volume; num acionador por data, quantas entrariam hoje. Só os próximos acionadores contam: quem passou pelo acionador antes não entra.

A simulação mostra o texto final de cada passo, com as variáveis preenchidas pela última vez que o acionador aconteceu para essa pessoa nos últimos 30 dias (*"Textos preenchidos com a ocorrência de 20/10 desta pessoa."*), ou com os dados de exemplo, e diz como o caminho termina: *Terminaria em sucesso* ou *Terminaria em erro*.

Num bloco de IA, a simulação mostra o prompt preenchido e *"Perguntaria ao modelo … (a simulação não chama a IA)"*: não gasta tokens.

### Histórico

O separador **Histórico** tem a lista das execuções à esquerda e o detalhe da escolhida à direita (*"Escolha uma execução à esquerda para ver os passos."*). Por cima da lista, a barra de filtros: a pesquisa por pessoa (pelo nome ou e-mail), o botão **Período** (**7 dias**, **30 dias** ou **Tudo**) e o resultado em pílulas (**Todas**, **Sucesso**, **Erro**…), numa só linha. Os filtros ficam no endereço da página.

O detalhe mostra o **Início**, o **Fim** e a **Duração**, os **Dados do gatilho** e, em cada passo, as **Entradas** e as **Saídas** de quando ele correu: o texto enviado na DM, no comentário ou no Slack; o assunto e a entrega do e-mail; numa condição, o que a pessoa tinha (*"Tem: VIP"*, *"Último acesso: …"*); numa chamada de webhook, o estado, a duração, o tamanho, as tentativas, as chaves usadas (só o nome) e de onde a chamada saiu (**IP fixo** ou **IP variável**). Cada execução mostra o desenho da versão em que correu, e um passo que saiu do desenho aparece como *"Passo que não está mais no desenho"*. **Copiar ID** copia o código da execução, **Ver no desenho** mostra onde a pessoa está, e **Parar execução** (ou **Encerrar execução**) tira a pessoa do workflow. No perfil de cada membro, **Automatizações** lista os workflows por onde ela passou.

Num passo de IA, o detalhe mostra o **Modelo**, os **Tokens** (de entrada e de saída) e a duração; nunca a chave, o prompt nem a resposta.

Cada execução aparece como **Sucesso**, **Erro**, **Cancelada**, **Pulada** ou **Em andamento**, com o bloco de fim e o motivo, e o filtro **Resultado** separa cada uma. Os passos podem ficar como **Erro** e **Aguardando cota** (*"Aguardando cota: adiado até 27/10, 9:00 por limite diário de envios da comunidade"*). O cartão **Como as execuções terminam** fica no topo: ver [Taxa de sucesso e aviso de erros](#taxa-de-sucesso-e-aviso-de-erros).

**Eliminar execução e Limpar histórico.** O proprietário e o administrador tiram execuções terminadas do histórico: **Eliminar execução**, no menu **Mais ações** da execução (desativado enquanto ela corre: *"Pare primeiro a execução."*), ou **Limpar histórico**, com **Todas as execuções terminadas** ou **As que começaram antes de uma data**. A janela mostra antes quantas saem e pede a confirmação; as que estão em curso ficam. Elas saem da lista, dos números e da taxa de sucesso, mas continuam a contar para [quantas vezes a pessoa entra](#quantas-vezes-a-pessoa-entra) (quem já passou por um workflow de **Uma vez só** não entra de novo) e para os limites. Fica o registo em [Logs](/membros/registros-de-atividades). Pelo assistente: `delete_workflow_run` e `clear_workflow_runs`.

## A lista de workflows

Por cima da lista, o botão **Período** (**7 dias**, **30 dias** ou **Tudo**) e o estado em pílulas: **Todos**, **Ligado**, **Pausado** e **Rascunho**. Cada linha mostra o estado e o acionador do workflow e os números do período escolhido:

![Administração › Workflows](/screens/workflows.png "O botão Período, o estado em pílulas e cada workflow com os números do período.")

| Número | O que conta |
|---|---|
| **Entraram** | Execuções que começaram no período |
| **Em execução** | Pessoas que estão no caminho agora (contam sempre, seja qual for o período) |
| **Terminaram** | Execuções que chegaram ao fim |
| **Erros** | Execuções que terminaram em erro |
| **Sucesso** | Sucesso ÷ (sucesso + erro), em percentagem, com a cor da faixa; ao lado, a data da última execução |

As ações ficam na própria linha (ícones no computador, uma folha de opções no telemóvel):

- **Ligar** (ou **Retomar**, num workflow pausado): pede a confirmação de consentimento quando o acionador é por data ou agendado; se faltar algo no desenho, a lista diz o que é e abre o workflow para o resolver.
- **Pausar**: ninguém novo entra e cada pessoa fica **congelada** no passo em que está, incluindo numa espera; **Retomar** continua de onde parou.
- **Parar**: ninguém novo entra e as execuções em curso são **canceladas** (*"Ninguém novo entra e 12 execuções em curso serão canceladas."*). O workflow fica pausado e pode voltar a ser ligado; quem foi cancelado não volta.
- **Execuções**: abre o histórico do workflow, com cada pessoa, o estado e onde está ou onde parou.

**Pausar ou Parar?** Pause para corrigir algo e continuar com as mesmas pessoas; pare quando o que está no caminho já não deve sair.

**Workflows ligados por plano.** Acima da lista, *"3 de 10 workflows ligados"* (ou *"3 workflows ligados"*, quando o plano não tem limite). O plano define quantos workflows ficam ligados ao mesmo tempo: **3** no Starter, **10** no Growth, **30** no Business e **sem limite** no Scale (ver [Plano e extensões](/configuracoes/plano#workflows-ligados)). Com o limite cheio, ligar ou retomar outro mostra *"O seu plano permite 10 workflows ligados ao mesmo tempo, e 10 já estão ligados. Pause ou pare outro, ou mude de plano."*, com **Ver planos**. Pausar ou parar um liberta a vaga. O SuperAdmin pode dar uma exceção a uma comunidade, e o novo limite vale de imediato.

## Quantas vezes a pessoa entra

O campo **Quantas vezes a pessoa entra** tem **Uma vez só**, **De novo depois de alguns dias** e **Toda vez que o gatilho acontecer**, e só aparece quando o acionador pode voltar a acontecer para a mesma pessoa. Cada acionador tem a sua natureza:

| O acionador acontece… | Exemplos | O campo |
|---|---|---|
| **Uma vez por entrada na comunidade** | *Novo membro na comunidade*; *Uma compra é concluída* com **Só a primeira compra** | Desaparece. O ecrã diz *"Este gatilho acontece uma vez por entrada na comunidade. Quem sai e volta entra de novo."* (ou *"Só a primeira compra: este gatilho acontece uma vez por pessoa."*) |
| **Uma vez por pessoa e item** | Inscrição e conclusão de curso, aula concluída, questionário aprovado, certificado emitido, primeira visita e acesso a um espaço, inquérito respondido, resultado de avaliação, plano de desenvolvimento aprovado, item publicado ou apagado | Desaparece quando o filtro escolhe **um** item (um curso, um espaço, um inquérito, um ciclo): *"Este gatilho acontece uma vez por pessoa para o item escolhido."* Com **qualquer** item, aparece |
| **Pode repetir-se** | Compra, subscrição, inscrição e check-in em evento, comentário, reação, publicação, etiqueta, grupo, campo do perfil, carrinho, DM recebida, *Alguém volta depois de N dias sem aceder* | Aparece |
| **Por tempo ou execução** | Os acionadores por data, **Agendado**, **Manual** e **Webhook recebido** | Aparece |

Quando o campo desaparece, vale **Uma vez só** dentro da mesma entrada na comunidade: quem sai e volta à comunidade entra de novo.

**Nunca duas execuções ao mesmo tempo** vale para qualquer acionador: um evento que chega com a pessoa a meio de uma execução não abre outra e aparece no histórico como **Pulada**, com o motivo *"já estava em andamento"*.

## Como um workflow termina

Cada workflow tem **uma entrada e um fim explícito**, para saber se cada execução correu bem e o que fazer quando não correu.

- **Um só acionador.** O desenho aceita um acionador; a API recusa um segundo.
- **Fim: sucesso** e **Fim: erro**, na categoria **Fim** dos blocos. Cada caminho termina num deles: um caminho sem fim fica marcado (*"Este caminho precisa terminar num Fim: sucesso ou Fim: erro"*) e o workflow não é guardado. Um fim só entra onde não há nada depois. Um workflow antigo abre com **Fim: sucesso** desenhado nas pontas soltas e continua a funcionar da mesma forma.
- **Saídas "ok" e "erro" em cada ação** (enviar e-mail, enviar mensagem, comentar, reagir, etiqueta, grupo e Slack). A saída "ok" segue o caminho; **Ligar a saída de erro** leva a falha para outro bloco, como uma DM para a equipa ou o **Fim: erro**. Sem a saída de erro ligada, uma falha termina a execução em erro, com o motivo. **Esperar**, **Condição**, **Enquanto** e **Registar log** não têm saída de erro.
- **Resumo e aviso:** ver [Taxa de sucesso e aviso de erros](#taxa-de-sucesso-e-aviso-de-erros).

**O que é erro.** Só o que falha de facto no momento do passo: o e-mail que foi apagado da biblioteca ou que não entrou na fila de envio, o item do acionador ou o grupo que já não existe, a mensagem que não pôde ser criada, o Slack não instalado, sem o canal ou em baixo, e a espera pela cota que passou do limite (ver [Quando o envio é adiado](#quando-o-envio-e-adiado)). No e-mail, conta só a falha ao colocar na fila: uma devolução ou falha do fornecedor depois disso não muda o caminho.

**O que não é erro.** Um passo **pulado** por uma regra que não muda com o tempo (anulação da subscrição, devolução, mensagens desligadas, bloqueio) e um passo **adiado** pela cota seguem pela saída "ok". Os dois aparecem no histórico, mas nunca contam como erro.

Cada passo deixa o resultado para os seguintes: `{{steps.<bloco>.result}}` (`done`, `skipped` ou `failed`), `{{steps.<bloco>.reason}}` e, só no caminho de erro desse passo, `{{steps.<bloco>.error}}`, o motivo da falha. Ver [Variáveis](#variaveis).

### Taxa de sucesso e aviso de erros

No **Histórico**, o cartão **Como as execuções terminam** mostra:

- **Sucesso em 7 dias** e **Sucesso em 30 dias**, em percentagem (*"18 de 20 execuções"*); sucesso e erro contam pelo bloco de fim;
- **Passos pulados (7 dias)**, **Logs de erro (7 dias)**, **Aguardando cota** (agora) e **Já em curso** (eventos em 30 dias);
- **Últimos erros**: as 10 últimas execuções que terminaram em erro, com o bloco e o motivo.

Passos pulados, adiados e logs não contam como erro. O moderador e o financeiro veem o cartão só para leitura.

**Aviso de taxa de erro.** Quando mais de 20% das execuções das últimas 24 horas terminam em erro (com pelo menos 20 execuções no período), o proprietário e os administradores recebem um aviso no sino e por e-mail (*"O workflow "Boas-vindas" está com 35% de erros nas últimas 24 h (7 de 20 execuções). Veja o que falhou."*), no máximo um por dia para cada workflow.

## Variáveis

Cada acionador entrega os dados do que aconteceu aos blocos seguintes: o nome do curso nos parabéns, o produto e o valor no agradecimento pela compra, a data no lembrete do evento. As variáveis têm nomes em inglês, com ponto, como `{{course.name}}` e `{{purchase.product}}`, e valem nos textos da **mensagem (DM)**, do **comentário**, do **Slack**, do **Registar log** e no **e-mail** (assunto e corpo).

**Inserir variável.** O botão fica em cada campo de texto. O menu agrupa as variáveis pelo bloco que as gerou, com o nome que deu ao bloco e o respetivo ícone (*"Gatilho · Cursos"*, *"Pessoa"*, *"Comunidade"*), pela ordem do fluxo, e só mostra os blocos que vêm **antes** do bloco em edição. Cada variável traz o nome legível, o código e um exemplo: *"Curso · `{{course.name}}` · ex.: Curso de Liderança"*. A pesquisa encontra pelo nome da variável ou do bloco. Por isso vale a pena dar um **Nome do bloco** a cada passo.

**No e-mail.** **Editar e-mail**, no passo **Enviar e-mail**, abre o e-mail da biblioteca com o **Inserir variável** desse ponto do fluxo.

**Como a pessoa vê.** Por baixo de cada texto com variável, a pré-visualização mostra o texto preenchido com dados de exemplo (Maria Souza, maria@memberfy.net). A simulação mostra os textos com os dados reais da pessoa (ver [Simular, testar e estimar](#simular-testar-e-estimar)).

**Valor de reserva.** Para quem não tem o dado, escreva um texto depois da barra: `{{purchase.discount|sem desconto}}`. Uma variável sem valor sai vazia, ou com o valor de reserva, e o envio não falha.

**As variáveis:**

| De onde | Variáveis |
| Blocos de IA | `steps.<bloco>.output` (o texto ou o JSON), `steps.<bloco>.output.<campo>` (cada campo do JSON), `steps.<bloco>.tokens` e `steps.<bloco>.model` |
|---|---|
| **Pessoa** (todos os workflows) | `member.first_name`, `member.name`, `member.email`, `member.phone`, `member.role`, `member.language`, `member.member_since`, `member.last_seen_at`, `member.tags`, `member.groups` e `member.field.<chave>` (os campos do perfil) |
| **Comunidade** (todos os workflows) | `community.name`, `community.language` |
| Compras | `purchase.product`, `purchase.product_type`, `purchase.amount`, `purchase.discount`, `purchase.payment_method`, `purchase.installments`, `purchase.free`, `purchase.first`, `purchase.tickets`, `purchase.ticket_type`, `purchase.batch`; no reembolso, `refund.product`, `refund.amount`, `refund.partial`; no carrinho, `cart.product` |
| Subscrições | `subscription.product`, `subscription.plan`, `subscription.interval`, `subscription.amount`, `subscription.period_end`, `subscription.ends_at`, `subscription.canceled_by`, `subscription.previous_plan`, `subscription.trial_ends_at` (conforme o acionador) |
| Eventos | `event.title`, `event.date`, `event.time`, `event.type`, `event.ticket_type`, `event.check_in_method`, `event.previous_date` (no evento remarcado) |
| Cursos | `course.name`, `course.completed_at`, `lesson.title`; `certificate.title`, `certificate.source` |
| Espaços, publicações e comentários | `space.name`, `target.type` (onde foi o comentário ou a reação), `target.reaction` |
| Etiquetas, grupos e campos | `tag.name`, `group.name`, `field.name` |
| Downloads | `download.title`, `download.folder` (a categoria), `download.previous_folder`, `download.file_name`, `download.file_type`, `download.size`, `download.version` |
| Formulários, inquéritos e chamadas | `form.name`, `survey.title`, `call.name`, `proposal.status` |
| Níveis e pontos | `level.name` (o nome do nível), `level.previous_name`, `level.number`, `level.direction` (**Subiu** ou **Desceu**), `level.cause` (**Pontos** ou **Atividade da semana**), `points.total`, `points.previous` |
| Reservas | `booking.resource`, `booking.starts_at`, `booking.ends_at` |
| Avaliações (RH) | `cycle.name`, `cycle.due_at` |
| Acesso | `absence.days` (dias sem aceder), em *Alguém volta depois de N dias sem aceder* e *Alguém está há N dias sem aceder* |
| Quem fez a ação | `actor.name`, nos [eventos do ciclo de vida](#eventos-do-ciclo-de-vida) |
| DM recebida | `dm.from.name`, `dm.from.email`, `dm.to.name`, `dm.conversation_url` e, com regra própria, `dm.text` (ver [DM recebida](#dm-recebida)) |
| Webhook recebido | `trigger.<nome>`, os valores que definiu no acionador |
| Passos anteriores | `steps.<bloco>.result`, `steps.<bloco>.skipped`, `steps.<bloco>.reason` e, no caminho de erro, `steps.<bloco>.error` |

**Os formatos.** Os valores em dinheiro saem na moeda e no idioma da pessoa (*R$ 197,00*); as datas, no fuso da comunidade e no idioma da pessoa. `member.language` e `community.language` saem como o código do idioma (`pt-PT`).

**Regras:**

- Os dados do acionador são guardados quando a pessoa entra: uma espera de 3 dias não muda o produto nem o valor, mesmo que o produto mude de nome entretanto.
- Uma variável que não chega ao bloco (de um passo que vem depois, ou de outro acionador) impede guardar, e o bloco fica marcado com o nome dela.
- Os valores entram como texto: o HTML sai escapado no e-mail e no comentário, sem `<>` na DM e sem menção nem ligação no Slack; no assunto, sem quebra de linha. Nenhuma variável entra no endereço de uma ligação, e `trigger.*` não entra no assunto.
- A resposta de um bloco de IA e a de um **Chamar webhook** vêm de fora: saem escapadas onde entram e nunca vão no assunto de um e-mail.
- Nenhuma variável traz o que um membro escreveu (publicação, comentário, resposta, título de votação ou de anúncio), taxas, documentos ou conteúdo de avaliação de RH além do nome e do prazo do ciclo. O e-mail e o telefone da pessoa podem ir na publicação do Slack.
- Os nomes antigos continuam a funcionar (`{{nome}}`, `{{comunidade}}`, `{{campo_<chave>}}`, `{{gatilho_<chave>}}`), mas não aparecem em **Inserir variável**.

**Nas campanhas.** Um e-mail da biblioteca que usa variáveis de workflow mostra *"Usa variáveis de workflow"*. Numa [campanha](/notificacoes/campanhas-de-email), essas variáveis saem vazias, e **Novo disparo** avisa: *"Este e-mail usa variáveis de workflow (…). Numa campanha saem vazias: troque por variáveis da pessoa ou da comunidade, ou use valores de reserva."*

## Condição "Variável"

A regra **Variável**, no grupo **Variáveis do fluxo** da **Condição**, compara um dado do fluxo: escolha a variável (no mesmo menu de **Inserir variável**) e o operador, que depende do tipo:

| Tipo | Operadores |
|---|---|
| Texto | é igual a, não é igual a, contém, não contém, começa com, termina com, está vazio, não está vazio. Não distingue maiúsculas nem acentos (*"avancado"* corresponde a *"Avançado"*) |
| Número e dinheiro | é igual a (=), é diferente de (≠), é maior que (>), é maior ou igual a (≥), é menor que (<), é menor ou igual a (≤), está vazio. Dinheiro na moeda da comunidade, no formato dela |
| Data | é antes de, é depois de, está entre, foi há mais de N dias, foi há menos de N dias, é nos próximos N dias |
| Lista (etiquetas, grupos, campo de escolha múltipla) | contém, não contém, contém qualquer de, contém todos de |
| Sim/não | é verdadeiro, é falso |

Exemplos: *"Valor é maior ou igual a 100,00"*, *"Formato é igual a Presencial"*, *"Curso contém Avançado"*, *"Data é nos próximos 7 dias"*.

As outras regras usam os mesmos operadores: **Tem a etiqueta** e **Está no grupo** com contém, não contém, qualquer de e todos de (e vários grupos de uma vez); **Campo do perfil** com os operadores do tipo do campo (num campo de [escolha múltipla](/membros/campos-customizados#escolha-multipla), *contém qualquer de*, *contém todos de* e *não contém*, com as opções; a variável `{{member.field.<chave>}}` traz as opções assinaladas), sempre com o valor atual do campo. A regra é lida no momento do passo.

## Registar log

O bloco **Registar log** anota uma linha na execução: escolha o **Nível** (**Info**, **Aviso** ou **Erro**) e escreva a mensagem, que aceita variáveis (*"{{member.first_name}} chegou ao fim das boas-vindas"*).

- Só texto: o HTML sai como texto, e a mensagem é cortada em 1.000 caracteres depois de preenchida.
- Até **20 logs por execução**; o 21.º é descartado (*"limite de logs da execução"*).
- A saída é sempre "ok". Um log de nível **Erro** não muda o resultado da execução nem conta para o aviso de taxa de erro; o resumo mostra quantos houve.
- O log aparece no histórico da execução e em **Administração › Logs**, tipo **Workflows**, com filtro por workflow e por nível. Ver [Logs](/membros/registros-de-atividades#workflows).
- **A mensagem só é visível para o proprietário e o administrador**, porque pode conter qualquer variável. O moderador e o financeiro veem que houve um log no histórico, com *"Mensagem visível só para owner e admin."* no lugar do texto.

## Chamar webhook

O bloco **Chamar webhook**, na categoria **Integrações**, envia uma chamada HTTPS para outro sistema a meio do caminho: avisar o CRM de uma compra, gravar uma linha numa folha de cálculo, chamar um fluxo do n8n.

- **Método** e **Endereço (URL)**: só `https://`, porta 443 e um host fixo. Variáveis podem ir no caminho, nunca no host, e as chaves do cofre não entram no endereço.
- **Cabeçalhos** e **Corpo (JSON)**: aceitam variáveis e as chaves do cofre (`{{env.CRM_TOKEN}}`), só para os endereços da chave, quando tem algum. O corpo vai com `memberfy.memberLanguage` e `memberfy.communityLanguage` acrescentados.
- **Tempo máximo de resposta**: de 2 a 15 segundos (predefinição 10).
- **O que os próximos blocos podem usar:** `{{steps.<bloco>.status}}`, `{{steps.<bloco>.duration}}` (ms), `{{steps.<bloco>.size}}` (bytes) e os campos da resposta JSON, até 16 KB (`{{steps.<bloco>.body.<campo>}}`). Valores que vêm de fora nunca entram no assunto de um e-mail.

| Resposta | O que acontece |
|---|---|
| 2xx | Segue pelo caminho "ok" |
| 3xx (o redirecionamento não é seguido), 4xx, endereço bloqueado, resposta acima de 64 KB, corpo inválido, chave fora dos endereços dela | Vai pelo caminho de erro, de imediato |
| 5xx, demora além do tempo máximo ou falha de rede | Tenta de novo após 1, 5 e 15 minutos; sem sucesso, vai pelo caminho de erro |

**Limites:** 60 chamadas por minuto e 2.000 por dia em cada workflow; 300 por minuto e 20.000 por dia na comunidade. O que passa espera a vez, em vez de falhar. Um destino que falha várias vezes seguidas fica alguns minutos em espera.

### IPs fixos

Nos planos **Business** e **Scale**, as chamadas saem de **IPs fixos**, os mesmos das entregas de webhook (ver [IPs fixos](/api/ips-fixos)), para autorizar na firewall do destino. O painel do bloco mostra os IPs, com **Copiar IPs**, e quantas chamadas do mês já saíram por eles.

- O limite é de **10.000 chamadas por IP fixo por mês**. Passado esse limite, as restantes saem de IPs que mudam até o mês virar, e o proprietário recebe um aviso no sino, que abre as automações. O mês é o do calendário no fuso horário da comunidade: a contagem recomeça à meia-noite do dia 1 e não se acumula no plano anual.
- Nos outros planos, as chamadas saem de IPs que mudam.
- O histórico mostra, em cada chamada, de onde ela saiu: **IP fixo**, **IP variável** ou *"IP variável (limite mensal de IP fixo atingido)"*.

## Variáveis e chaves

**Variáveis e chaves**, no topo de **Administração › Workflows**, é o cofre da comunidade: os tokens e as chaves que o **Chamar webhook** usa nos cabeçalhos e no corpo. Só o proprietário e o administrador veem e mexem.

1. Antes da primeira chave, leia o aviso **Antes de começar: um aviso sobre dados pessoais** e clique em **Li e aceito**: os dados das pessoas enviados por webhook saem da Memberfy para o sistema que indicar, e a comunidade é a responsável pelo tratamento desses dados. O aceite vale uma só vez, para a comunidade inteira; depois, o ecrã mostra quando foi dado.
2. **Nova chave** abre uma janela com três campos:
   - **Nome**: como chama a chave dentro do workflow. Ajusta-se enquanto escreve (letras maiúsculas, números e `_`; espaços e acentos passam a `_`), e logo abaixo aparece a forma exata de escrever no bloco: *"No bloco "Chamar webhook", escreva"* `{{env.CRM_TOKEN}}`.
   - **Valor**: cole o token ou a palavra-passe. O ícone do olho mostra ou oculta o que colou (**Mostrar o valor** / **Ocultar o valor**), só enquanto a janela está aberta.
   - **Pode ser enviada só para** (opcional): os endereços para onde a chave pode ir, como `api.seucrm.pt` (Enter ou **Adicionar**; se colar um URL inteiro, fica só o domínio). **Vazio, a chave pode ser usada com qualquer endereço**; com endereços, só sai para eles. Para uma chave de um único sistema, como o token do CRM, preencha: é mais seguro.
3. No bloco, use `{{env.CRM_TOKEN}}`.

- **O valor nunca volta ao ecrã.** Fica guardado cifrado, e a lista mostra só o final (*"…a1b2"*), para onde pode ir (ou *"Qualquer endereço"*) e quando foi usada. Para trocar, **Substituir**.
- **Eliminar** apaga o valor de imediato; os workflows que usam a chave passam a ir pelo caminho de erro.
- O histórico mostra o nome das chaves usadas numa chamada, nunca o valor.

### Limites de IA

O cartão **Limites de IA**, em **Variáveis e chaves**, controla o gasto dos [blocos Claude e ChatGPT](#blocos-de-ia-claude-e-chatgpt), que é da comunidade. Só o proprietário e o administrador o veem e alteram, e cada alteração fica registada.

**O que é um token.** A IA lê e escreve o texto em tokens, pedaços de palavra: 1.000 tokens dão cerca de 750 palavras. Conta a entrada (as instruções e o prompt) e a saída (a resposta). Nada disto usa a quota de IA da Memberfy.

| Teto | Predefinição | Quando passa |
|---|---|---|
| **Por chamada** | 4.000 tokens | É o máximo que o modelo escreve numa resposta: um bloco que pede mais fica com este número |
| **Por execução** | 20.000 tokens | O total de uma pessoa a passar pelo workflow. Passou, o bloco segue pela saída de erro (*"Teto de tokens de IA por execução atingido."*) |
| **Por dia** | 200.000 tokens | O total da comunidade no dia, no fuso horário da comunidade. Passou, os blocos esperam pelo dia seguinte e saem quando ele começa |

Por chamada tem de ser menor ou igual a por execução, e por execução menor ou igual a por dia. O cartão mostra quanto já foi usado hoje (*"Hoje: 12.400 de 200.000 tokens usados."*); **Salvar limites** grava e **Voltar ao padrão** repõe os números da tabela.

## Blocos de IA (Claude e ChatGPT)

Os blocos **Claude** e **ChatGPT**, na categoria **IA**, pedem à IA um texto ou um JSON a meio do caminho: escrever umas boas-vindas pessoais, classificar um pedido de suporte, resumir a resposta a um formulário. A chamada usa **a chave de API da própria comunidade**, criada na Anthropic (Claude) ou na OpenAI (ChatGPT): quem paga o uso é a comunidade, diretamente ao fornecedor.

**Antes do primeiro bloco:**

1. Em [Variáveis e chaves](#variaveis-e-chaves), aceite o aviso de dados pessoais e crie uma chave com a chave de API do fornecedor. Em **Pode ser enviada só para**, coloque `api.anthropic.com` (Claude) ou `api.openai.com` (ChatGPT). Uma chave sem endereço também aparece no bloco, mas restringir é mais seguro; uma chave com outros endereços, não.
2. Confira os [Limites de IA](#limites-de-ia).

**O painel do bloco:**

| Campo | O que é |
|---|---|
| **Modelo** | A família do modelo, descrita pelo uso: *o mais capaz, para tarefas difíceis* (mais lento e mais caro), *equilíbrio entre qualidade, velocidade e custo*, ou *o mais rápido e económico, para tarefas simples*. A lista acompanha os modelos atuais de cada fornecedor |
| **Chave de API** | Só as chaves de Variáveis e chaves que podem ir para o fornecedor; **Criar chave em Variáveis e chaves** leva ao cofre. A chave nunca entra no prompt nem no histórico |
| **Instruções do sistema** (opcional) | Como o modelo se comporta em todas as chamadas: papel, tom, regras |
| **Prompt** | O pedido, com [variáveis](#variaveis) (*"Escreva uma mensagem de boas-vindas para {{member.first_name}}, que acabou de entrar na comunidade."*). As chaves do cofre (`{{env.*}}`) não entram |
| **Formato da resposta** | **Texto** ou **JSON**. Com JSON, um **Esquema JSON** opcional, e cada campo da resposta torna-se uma variável |
| **Máximo de tokens** | O tamanho máximo da resposta, de 16 a 8.000 tokens (predefinição 1.024); o teto por chamada da comunidade pode baixar esse número |
| **Tempo de espera** | Quanto esperar pela resposta, de 5 a 60 segundos (predefinição 30) |

As variáveis entram no prompt como dados, nunca como ordens ao modelo, juntamente com o idioma da pessoa e o da comunidade. Ponha no prompt só o que a tarefa precisa.

**O que os blocos seguintes podem usar:** `{{steps.<bloco>.output}}` (o texto ou o JSON), `{{steps.<bloco>.output.<campo>}}` (cada campo do JSON, também numa [Condição "Variável"](#condicao-variavel)), `{{steps.<bloco>.tokens}}` e `{{steps.<bloco>.model}}`, pelo **Inserir variável**. A resposta fica guardada até 16 KB. É um valor externo, como a de um webhook: sai escapada onde entra e **nunca vai no assunto de um e-mail**.

**Como o bloco se comporta:**

| Resposta | O que acontece |
|---|---|
| Resposta recebida | Segue pelo caminho "ok", com a resposta nas variáveis |
| Chave ou pedido recusado, recusa do modelo, resposta vazia ou cortada pelo máximo de tokens, JSON inválido no esquema | Vai pelo caminho de erro, de imediato |
| Tempo esgotado, fornecedor em baixo ou limite do fornecedor | Tenta de novo depois de 1, 5 e 15 minutos; sem sucesso, vai pelo caminho de erro (*"O provedor de IA não respondeu (3 novas tentativas)."*) |
| Teto por execução dos Limites de IA | Vai pelo caminho de erro |
| Teto diário dos Limites de IA | O passo espera pelo dia seguinte, no fuso horário da comunidade |

A simulação mostra o prompt preenchido sem chamar a IA, e o histórico mostra o modelo, os tokens e a duração de cada chamada, nunca a chave, o prompt nem a resposta (ver [Histórico](#historico)).

## Enviar SMS e Enviar WhatsApp

Os blocos **Enviar SMS** e **Enviar WhatsApp**, na categoria **Mensagens**, enviam um aviso de serviço para o telemóvel da pessoa da execução, com as regras de [Avisos por SMS e WhatsApp](/notificacoes/avisos-por-sms-e-whatsapp): o canal ativo em **E-mails e notificações**, telemóvel confirmado (ou indicado pela equipa ao declarar o consentimento), consentimento de serviço desse canal e a categoria **Automatizações** ativa em **A minha conta › Avisos**.

- **Texto (SMS):** até 300 caracteres, com [variáveis](#variaveis) (*"Olá {{member.first_name}}, o seu evento começa daqui a 1 hora."*). As variáveis entram como texto simples. Ao enviar, a Memberfy põe o nome da comunidade à frente (*"[Clube de Corrida] …"*) e, no SMS, a ligação para sair no fim.
- **Partes (SMS):** o painel conta as partes do texto sozinho e **como sai** (com *[Comunidade]* à frente e a ligação para sair). Uma parte tem 160 caracteres, ou 153 quando a mensagem se divide; um acento como ã, õ ou ç, ou um emoji, faz cada parte levar 70 (67 quando divide). As variáveis contam como escritas.
- **Modelo (WhatsApp):** o WhatsApp não aceita texto livre. Escolha o **Modelo** (*Ingresso confirmado*, *Pagamento recusado*, *Aviso da comunidade*…), preencha os **Campos do modelo** (até 300 caracteres cada, com variáveis; o primeiro nome da pessoa e o nome da comunidade a Memberfy preenche) e, se quiser, a **Página que o botão abre** (um caminho da comunidade, como `/eventos`; vazio, a página inicial). Para um recado sem modelo próprio, use **Aviso da comunidade**, cujo campo é o seu texto. **Como chega** mostra a mensagem montada. Um modelo de marketing só chega a quem aceitou novidades pelo WhatsApp. Não repita num workflow uma [mensagem que a plataforma já envia](/notificacoes/avisos-por-sms-e-whatsapp#mensagens-da-plataforma-no-whatsapp), como o pagamento confirmado ou o lembrete do evento.
- **Modelos que um workflow pode usar (WhatsApp):** *Aviso da comunidade* (também na versão *serviço*), *Ingresso confirmado*, *Pagamento confirmado*, *Pagamento recusado*, *Compra não concluída*, *Evento amanhã* e *Evento começando* (com as versões presenciais, que trazem o mapa), *Evento ao vivo*, *Resposta no post*, *Menção*, *Mensagem direta*, *Conteúdo novo*, *Proposta decidida*, *1:1*, *Feedback recebido* (também na versão *serviço*), *Pendência de RH*, *Lembrete de reserva*, *Subscrição a renovar*, *Reembolso*, *Vaga na lista de espera* e *Certificado emitido*. Ficam de fora os que nenhum gatilho consegue preencher (*Visitante na receção*, *Encomenda recebida*, *Cartão a expirar*, *Resposta ao pedido de suporte* e *Registo aprovado*): esses saem só como [mensagem da plataforma](/notificacoes/avisos-por-sms-e-whatsapp#mensagens-da-plataforma-no-whatsapp).
- **Modelos de marketing (WhatsApp):** o WhatsApp classifica como marketing o *Aviso da comunidade* e o *Feedback recebido* (as duas versões de cada), a *Compra não concluída*, a *Menção* e o *Conteúdo novo*. Quem não aceitou novidades pelo WhatsApp não os recebe: o passo é **ignorado** (*"sem consentimento para WhatsApp"*) e segue pelo caminho "ok". Para que toda a gente receba o recado, coloque depois do bloco uma [condição "Variável"](#condicao-variavel) com `{{steps.<bloco>.result}}` igual a `skipped` a levar a um **Enviar e-mail**. Ver [Modelos de marketing](/notificacoes/avisos-por-sms-e-whatsapp#modelos-de-marketing).

**Como o bloco se comporta:**

| Situação | O que acontece |
|---|---|
| Enviado | Segue pelo caminho "ok". O histórico mostra o texto e, no SMS, as **Partes de SMS** |
| A pessoa não pode receber: canal desativado na comunidade, saiu da comunidade, sem telemóvel, telemóvel não confirmado (nem indicado pela equipa ao declarar o consentimento), país não servido, sem consentimento, parou os avisos desta comunidade ou respondeu SAIR, desativou a categoria **Automatizações**, texto vazio. No WhatsApp, também o modelo ainda não aprovado e o modelo de marketing para quem não aceitou novidades | **Saltado**, com o motivo (*"telemóvel não confirmado"*), e segue pelo caminho "ok" |
| Horário de silêncio (21h às 8h, no fuso de quem recebe), teto diário da comunidade ou quota do mês | **Aguarda a quota** e sai quando ela liberta, como em [Quando o envio é adiado](#quando-o-envio-e-adiado) |
| A pessoa já recebeu o **limite por pessoa** do dia (5 por omissão, no cartão do SMS) | Fica para o dia seguinte, às 8h |
| O envio foi recusado | Vai pelo caminho de erro, com o **Código da recusa** no histórico |
| Falha passageira | Tenta de novo passados 1, 5 e 15 minutos |

Com o envio da comunidade suspenso, os dois blocos esperam, como as outras mensagens. Nem o saltado nem o adiado contam como erro.

### Lembretes que também vão por SMS

Com o SMS ativo na comunidade, três lembretes da plataforma também saem por SMS, sem workflow, para quem pode receber: o **lembrete do evento**, 1 hora antes; os **lembretes do ciclo de PDI** (enviar e aprovar o PDI); e o **lembrete da 1:1**. O ecrã de cada um avisa (*"O lembrete de 1 hora antes também sai por SMS para quem consentiu."*). Um lembrete que o horário de silêncio ou o teto diário atrasaria é saltado no SMS; o e-mail sai como sempre. Com o SMS desativado, nada muda.

## Ações da plataforma e outros workflows

Cada **ação da plataforma** é um bloco da barra, com o nome da ação, na categoria do que ela toca (**Pessoas**, **Conteúdo** ou **Mensagens**). Faz pela pessoa da execução o mesmo que a equipa faz no ecrã; o painel do bloco pede os campos da ação (o curso, o evento, o plano ou produto e o grupo pela pesquisa, o **Campo do registo**, o **Novo papel**, os **Pontos** e o **Motivo**, as datas e os textos, com variáveis) e diz o papel que ela exige:

| Ação | O que faz | Papel mínimo de quem liga |
|---|---|---|
| **Mudar papel** | Muda o papel da pessoa, incluindo para administrador (nunca para owner, nem o papel de um owner ou o próprio) | Administrador |
| **Remover do grupo** e **Alterar registo** | Remove a pessoa de um grupo; grava um valor num campo do registo | Administrador |
| **Ajustar pontos** | Soma ou retira pontos do [ranking](/membros/gamificacao), com o motivo no histórico | Administrador |
| **Conceder badge** e **Remover badge** | Concede um [badge](/membros/engajamento#badges) do catálogo, com o **Motivo** opcional (quem já o tem é saltado), com o aviso no sino e o e-mail de **Conquistas**; ou retira-o, sem avisar (quem não o tem é saltado) | Administrador |
| **Dar acesso por cortesia** e **Encerrar cortesia** | Dá um plano por cortesia até uma data de fim, ou encerra a cortesia (uma subscrição paga nunca é tocada) | Administrador |
| **Dar ingresso de cortesia** | Um ingresso de cortesia no evento | Administrador |
| **Agendar 1:1** | Cria um [1:1](/espacos/1-1) recorrente entre a pessoa e o líder direto dela, com a **Frequência** (semanal, quinzenal ou mensal), o **Dia da semana**, o **Horário** e a **Duração (minutos)**. Sem líder direto, ou com um 1:1 recorrente já marcado, o passo é saltado | Administrador |
| **Adicionar ação ao PDI** | Inclui uma ação, com **Prazo (dias)**, no [PDI](/espacos/pdi) ativo da pessoa; sem PDI ativo, cria um rascunho com ela. No PDI, a ação mostra *"Criado pelo workflow …"* | Administrador |
| **Publicar publicação** | Publica uma publicação (em Markdown, com variáveis) num espaço de feed ou de conteúdo, em nome de quem ligou o workflow, com a regra de quem pode criar do espaço e sem aviso por e-mail | Moderador |
| **Emitir certificado** | Emite um [certificado](/espacos/certificados) de um modelo ativo para a pessoa, com o e-mail de aviso se **Enviar o certificado por e-mail** estiver marcado; quem já tem o certificado é saltado | Moderador |
| **Reconhecer** | Quem ligou o workflow publica um [reconhecimento](/espacos/reconhecimento) para a pessoa, com a mensagem e, se quiser, um valor da comunidade | Moderador |
| **Bloquear no chat** | Quem ligou o workflow bloqueia a pessoa no [chat](/membros/mensagens), sem aviso a ninguém; a ação não tem campos | Moderador |
| **Inscrever no evento** e **Matricular no curso** | Só eventos e cursos gratuitos | Moderador |
| **Mandar aviso no app** | Um aviso no sino da pessoa, com título e texto. O aviso chega também por [notificação no navegador e no telemóvel](/conceitos/notificacoes-no-navegador), na categoria **Avisos da equipa**; tocar abre o sino | Moderador |

O que mexe com dinheiro ou apaga em definitivo nunca corre num workflow.

**Chamar workflow** corre, para a mesma pessoa, um workflow que começa com **Chamado por outro workflow**. No acionador desse workflow, **Valores que este workflow recebe** declara o que ele espera (nomes com letras minúsculas, números e `_`), usados nos blocos como `{{trigger.<nome>}}`; no **Fim: sucesso**, **Valores devolvidos** diz o que volta para quem chamou. No bloco **Chamar workflow**, escolha o **Workflow chamado**, preencha os **Valores enviados** e veja **O que ele devolve**, que os blocos seguintes usam como `{{steps.<bloco>.output.<nome>}}`. O workflow que chama espera o outro terminar e segue pelo "ok" ou pelo erro. Um workflow não chama a si próprio nem quem o chama, e a cadeia vai até 3 workflows. Assim, umas boas-vindas comuns ficam num workflow só, chamado por vários.

### Com que papel os passos agem

Um workflow nunca faz mais do que a pessoa que o pôs a correr:

- Os passos agem com o papel de **quem guardou, ligou, retomou ou executou** o workflow. Uma ação acima do papel de quem edita fica marcada no painel (*"Esta ação exige proprietário: você não consegue guardar o workflow com ela."*) e o workflow não é guardado.
- O papel é lido de novo a cada passo: se a pessoa perdeu o papel, a ação é saltada; se saiu da comunidade, o passo falha.
- **O administrador age como o proprietário.** Guarda, liga e executa workflows com qualquer ação da plataforma, incluindo tornar alguém administrador. Só uma ação marcada como exclusiva do proprietário ficaria acima dele (o workflow abriria só para leitura: *"Este workflow tem ações que só um proprietário pode alterar. Você pode ver e simular."*), e hoje nenhuma é: a titularidade da comunidade e o plano não são ações de workflow.
- **O moderador e o financeiro têm limites:** veem, simulam e acompanham o histórico, mas não guardam, ligam nem executam workflows, e um workflow nunca lhes dá um poder que não têm.
- Um workflow chamado por outro age com o menor papel da cadeia.

## Eventos do ciclo de vida

29 acionadores com o ciclo de vida de cada módulo, cada um no bloco da sua família e também nos [webhooks](/api/eventos-de-webhook).

| Família | Acionadores |
|---|---|
| Downloads | Um ficheiro é publicado, editado, muda de categoria ou é apagado; um anexo é adicionado, substituído por uma versão nova ou removido; uma categoria de downloads é criada |
| Publicações e comentários | Uma publicação é editada, muda de espaço ou é apagada; um comentário é apagado; alguém remove uma reação |
| Eventos | Um evento é criado, editado, remarcado ou apagado; a transmissão começa; a gravação é publicada |
| Cursos | Um curso é publicado ou editado; uma aula é publicada; alguém sai de um curso |
| Espaços | Um espaço é criado, editado ou apagado |
| Formulários | Um formulário é publicado, encerrado ou reaberto |

- **Só os itens publicados disparam:** um rascunho editado ou apagado não inicia nada.
- **Apagar um evento é a forma de cancelar um evento** hoje, e o acionador di-lo: *"Um evento é apagado (é assim que se cancela)"*.
- A pessoa da execução é **quem fez a ação** (`{{actor.name}}`). Quando é a equipa que publica (um evento, uma aula), o acionador serve para avisar no Slack ou reconhecer o autor; para avisar todos os membros de um conteúdo novo, use os [avisos por e-mail](/notificacoes/emails-desta-comunidade) ou um workflow **Agendado** ou **Manual** com público.

## Níveis e pontos

O bloco de gatilho **Níveis e pontos** (*"Uma pessoa sobe ou desce de nível, ou atinge um total de pontos"*) acompanha os [níveis](/membros/gamificacao#niveis) da comunidade:

| Gatilho | Quando dispara | Filtros |
|---|---|---|
| **Subiu de nível** | No momento em que a pessoa chega a um nível mais alto, por pontos (ação, ajuste da equipa ou de workflow) ou por cumprir o requisito da semana que faltava. Saltar dois níveis dispara uma vez | **Nível**: o nível alcançado (**Qualquer nível**, vazio) |
| **Desceu de nível** | À segunda-feira às 00:00, no fuso horário da comunidade, para quem não cumpriu os requisitos da semana anterior, e no momento em que um ajuste negativo deixa a pessoa abaixo do mínimo do nível | **Nível** (o nível em que a pessoa ficou) e **Motivo**: *"Não cumpriu a atividade da semana (na segunda)"* e *"Perdeu pontos (ajuste da equipa ou de workflow)"*, os dois marcados por predefinição (*"Pelo menos um motivo fica marcado."*) |
| **Atingiu N pontos** | *"Dispara quando o total passa desse número para cima. Quem desce e volta a passar dispara de novo."* | **Pontos** (obrigatório) |

Nenhum dos três dispara num recálculo de pontos, numa importação, quando a comunidade muda os níveis ou com a gamificação desligada.

**Condições.** Na **Condição**, o grupo **Engajamento** tem as regras **Nível** (*"está no nível Kernel ou acima"*, ou *"está abaixo do nível Kernel"*) e **Pontos** (*"tem pelo menos 500 pontos"*, ou *"tem menos de 500 pontos"*), lidas no momento do passo.

**Exemplos:** *"Subiu para Kernel → atribuir o badge Kernel"*; *"Desceu de Kernel, motivo atividade da semana → retirar do grupo Kernel"*; *"Atingiu 1000 pontos → enviar uma DM de parabéns"*.

## DM recebida

O bloco de acionador **Mensagens** tem o acionador **Um membro envia uma DM para a equipa**: dispara quando um membro envia uma [mensagem](/membros/mensagens) a alguém da equipa. A pessoa da execução é quem enviou a DM. Uma DM entre membros, ou de alguém da equipa, não dispara.

**Filtros:**

- **Quem recebe**: uma ou várias pessoas da equipa (obrigatório).
- **Quem envia tem a tag** e **Quem envia está no grupo** (vazio: qualquer membro).
- **Só a primeira mensagem de uma conversa nova**. Desmarcado, cada mensagem dispara, com a regra de [Quantas vezes a pessoa entra](#quantas-vezes-a-pessoa-entra).

**Variáveis:** `{{dm.from.name}}` e `{{dm.from.email}}` (quem enviou), `{{dm.to.name}}` (quem recebeu) e `{{dm.conversation_url}}` (a ligação para a conversa).

**O texto da DM (`{{dm.text}}`)** segue a regra das mensagens: a equipa não lê as conversas dos outros. Por isso, só fica disponível quando o workflow é **de quem recebeu a mensagem**:

- o filtro **Quem recebe** tem exatamente essa pessoa, e só ela guarda e liga o workflow;
- o texto só pode ir numa DM assinada por essa pessoa, no corpo de um e-mail ou numa condição. Em qualquer outro sítio (assunto, Slack, comentário, log, DM em nome de outra pessoa), ou num workflow guardado ou ligado por outra pessoa, o bloco fica marcado com erro no desenho e o workflow não é guardado.

O evento também chega aos [webhooks](/api/eventos-de-webhook) como `message.received`, **sem o texto** da mensagem.

## Limites

- **Limite de frequência**, opcional, em cada workflow: no máximo N e-mails a cada tantas horas ou dias para a mesma pessoa; o que passar fica [a aguardar a cota](#quando-o-envio-e-adiado).
- **Limite diário da comunidade**: os e-mails de workflows por dia do plano (40 no Starter, 80 no Growth, 200 no Business e 350 no Scale; ver [Plano e extensões](/configuracoes/plano#as-quotas-do-plano)); o que passar espera pelo dia seguinte. Os e-mails transacionais nunca entram neste limite.
- **SMS e WhatsApp por pessoa**: no máximo 5 mensagens de workflow por pessoa por dia em cada canal, por omissão (de 1 a 20, no cartão do SMS); o que passar sai no dia seguinte, às 8h.
- **Mensagens:** no máximo 1 mensagem de workflow por pessoa por dia; quem desligou as mensagens ou bloqueou quem assina não recebe.
- **Webhook recebido:** no máximo 5 execuções por pessoa por dia em cada workflow.
- Quem cancelou a subscrição de **Automações**, os endereços com devolução ou denúncia e a [reputação de envio](/notificacoes/reputacao-de-envio) da comunidade também retêm os e-mails.
- **Chamar webhook:** ver os [limites das chamadas](#chamar-webhook).
- Com o envio da comunidade suspenso, **Executar agora** e o **Agendado** não iniciam ninguém, e as mensagens, os comentários, as reações e as publicações no Slack de quem já está no caminho esperam que a suspensão termine (as etiquetas e os grupos continuam).

### Quando o envio é adiado

Quando um limite que se liberta com o tempo retém o passo, este **fica a aguardar a cota** e sai assim que ela se liberta, em vez de ser saltado:

| Limite | Até quando espera |
|---|---|
| **Limite de frequência** do workflow | Até ao fim da janela do limite (a janela vai até 90 dias) |
| **Limite diário da comunidade** | Até 7 dias |
| **Reputação de envio** em alerta ou pausada | Até 7 dias |
| **Envio da comunidade suspenso** | Até 48 horas |
| **1 mensagem de workflow por pessoa por dia** | Até 7 dias |

- O histórico mostra *"Aguardando cota: adiado até 28/10, 9:00 por limite de frequência do workflow"*.
- Quando a cota se liberta, os passos saem distribuídos ao longo de uma hora; depois de uma suspensão, a um ritmo controlado, e não todos de uma vez.
- Depois de sair, o passo segue pela saída "ok". Passado o tempo máximo, a execução segue pela saída "erro" com o motivo *"esperou a cota além do limite"*.
- **Pausar** o workflow congela a espera; **Retomar** recomeça a contagem; **Encerrar execução** ou **Parar** cancela, e nada é enviado.
- Um novo evento da mesma pessoa durante a espera não abre outra execução (*"já estava em andamento"*).

**Um impedimento permanente conta como pulado.** A anulação da subscrição de **Automações**, um e-mail com devolução ou denúncia, uma pessoa sem e-mail, mensagens desligadas, o bloqueio de quem assina e quem assina fora das pessoas permitidas não se libertam com o tempo: o passo é **pulado**, com o motivo, e o caminho segue pela saída "ok" (`{{steps.<bloco>.result}}` é `skipped`).

**Nem o adiado nem o pulado contam como erro**: não mudam o resultado da execução nem o aviso de taxa de erro.

## Consentimento e quem assina

**Acionador por data e Agendado:** ao ligar, a janela pede uma vez a confirmação de que essas pessoas, que já estão na comunidade, podem receber estes e-mails.

### Em nome de quem

Quem pode assinar as mensagens dos workflows é uma escolha da comunidade:

- Em **Administração › Definições › E-mails e notificações**, o cartão **Mensagens dos workflows em nome de** (o mesmo aparece no topo de **Administração › Workflows**) diz em nome de quem os workflows podem enviar DM, comentar e reagir: **Toda a equipa** (a predefinição: proprietário, administradores, moderadores e financeiro) ou **Só o owner**. Só o proprietário e o administrador veem e alteram.
- O campo **Em nome de quem** de cada bloco de DM, comentário e reação lista as pessoas que a configuração permite. Ninguém precisa de aceitar nem de aprovar textos.
- Com **Só o owner**, os passos desenhados em nome de outra pessoa são **pulados**, com o motivo *"quem assina não está entre as pessoas permitidas"*, e o editor marca esses blocos (*"Esta pessoa já não pode assinar: com "Só o owner", este passo é pulado até trocar quem assina."*).
- **Fica o registo:** cada versão guarda quem a ligou ou publicou e os textos que saem em nome de cada pessoa. Quando outra pessoa da equipa liga um workflow que fala em seu nome, recebe um aviso no sino, que abre o workflow (*"Ana ligou o workflow "Boas-vindas", que fala em seu nome. Veja os textos."*).

## Modelos

**Modelos** cria um rascunho a partir de um dos 9 modelos, com os e-mails já na biblioteca, no idioma da comunidade. Nada é enviado até o ligar.

| Família | Modelo | O que faz |
|---|---|---|
| Engajamento | **Régua de boas-vindas** | Três e-mails na primeira semana de quem entra |
| Engajamento | **Incentivo de uso** | Entrou e não começou um curso em 3 dias: um empurrãozinho |
| Engajamento | **Reconquista** | Sem acesso há 30 dias: um convite para voltar |
| Engajamento | **Parabéns pelo curso** | Um e-mail quando a pessoa conclui um curso |
| Engajamento | **Primeira inscrição em evento** | Boas-vindas na primeira inscrição num evento |
| Engajamento | **Obrigado pela presença** | Um dia depois do check-in, um obrigado |
| Pessoas (RH) | **Lembrete de avaliação pendente** | Avaliação não enviada há 3 dias no ciclo aberto |
| Pessoas (RH) | **1:1 sem registro** | A 1:1 passou e ainda não foi registada |
| Pessoas (RH) | **Metas sem check-in** | Resultado-chave sem check-in há 14 dias |

Abrir um modelo mostra os passos e os assuntos dos e-mails antes de o usar (*"Cria N e-mails na biblioteca"*).

## E-mails e cancelamento da subscrição

Os e-mails dos workflows saem na categoria **Automações** de [E-mails desta comunidade](/notificacoes/emails-desta-comunidade), ligada por predefinição, com a ligação para a desligar no rodapé.

## Passo a passo

Um exemplo: uns parabéns com o nome do curso.

1. Em **Administração › Workflows**, clique em **Novo workflow** (ou em **Modelos**, para começar a partir de um modelo).
2. Arraste o bloco **Cursos** da categoria **Gatilhos** e, em **Dispara quando**, escolha *Alguém conclui um curso*. Escolha o curso: o campo **Quantas vezes a pessoa entra** desaparece, porque cada pessoa conclui esse curso uma vez.
3. Clique no **+** depois do acionador e escolha **Enviar e-mail**. Dê o **Nome do bloco** *Parabéns* e escolha o e-mail. Em **Editar e-mail**, use **Inserir variável** › **Gatilho · Cursos** › **Curso** para colocar `{{course.name}}` no assunto.
4. Ligue a saída "ok" a **Fim: sucesso**. Se quiser, ligue a saída "erro" a uma **Mandar mensagem (DM)** para si, com `{{steps.<bloco>.error}}` no texto, e depois a **Fim: erro**.
5. **Guardar** e **Simular com uma pessoa**, com uma aluna que concluiu o curso: a simulação mostra o assunto com o nome do curso e *Terminaria em sucesso*. Num passo de e-mail, **Enviar teste para mim** envia o e-mail apenas para si. **Simular e me enviar os e-mails** envia-lhe o e-mail tal como a aluna o receberia.
6. **Ligar** e confirme. Na lista, acompanhe **Entraram**, **Terminaram** e **Sucesso**.

## Pelo assistente (MCP)

O proprietário e o administrador criam, editam, ligam, pausam e retomam workflows pelo assistente, incluindo a partir dos modelos; ligar e retomar mostram antes o acionador, os e-mails e a estimativa. A equipa consulta, simula e acompanha o histórico. Também pelo assistente: `run_workflow` (executar agora), `stop_workflow` (parar, com a contagem das execuções canceladas antes da confirmação), `get_workflow_summary` (a taxa de sucesso e os últimos erros), `list_workflow_variables` e `preview_workflow_text` (as variáveis de um bloco e o texto preenchido), `get_workflow_settings` e `update_workflow_settings` (em nome de quem) e o endereço do [webhook de entrada](/integracoes/webhook-de-entrada). Ver as [receitas](/mcp/receitas#93-pare-um-workflow-ou-so-pause) e [Ferramentas · Comunidade](/mcp/ferramentas-comunidade#workflows).

O assistente também aprende a automatizar: o **guia de workflows** (`get_workflow_guide` e a receita **Automatizar uma regra com um workflow**) explica acionadores, blocos, regras e variáveis e traz receitas prontas; `suggest_workflow` transforma uma regra em palavras (*"quem compra o curso ganha 7 dias de acesso à mentoria"*) num rascunho, sem guardar nada; e, depois de enviar uma campanha, emitir certificados ou convidar pessoas, o assistente sugere o workflow que automatiza isso. Pelo assistente ainda: as chaves do cofre (`list_env`, `set_env`, `delete_env`, sem nunca mostrar o valor), os blocos de ações da plataforma e **Chamar workflow**, e tirar execuções do histórico (`delete_workflow_run`, `clear_workflow_runs`, com confirmação).

Para a IA e as ações novas: o guia traz o bloco `ai` (com os modelos e os limites do bloco) e 48 receitas, entre elas *DM de boas-vindas escrita por IA*, *Triagem de chamados de suporte com IA*, *Resumo de resposta de formulário com IA*, *Certificado no check-in* e *1:1 recorrente para quem entra num time*. `get_ai_limits` e `update_ai_limits` leem e alteram os [Limites de IA](#limites-de-ia), `adjust_member_points` ajusta os pontos de alguém sem workflow, e `simulate_workflow` com `send_emails_to_me` envia os e-mails da simulação apenas para si. Nenhuma das quatro pede confirmação.

Para o SMS e o WhatsApp: o guia descreve os blocos `sendSms` e `sendWhatsapp` (o limite, a regra das 24 horas e os motivos de salto e de espera, lidos de `list_workflow_triggers`), e as receitas passam a 56, com *Boas-vindas por SMS*, *Inscrição no evento confirmada por SMS*, *Evento remarcado por SMS*, *Pagamento em atraso por SMS*, *1:1 amanhã por SMS*, *Inscrição no evento confirmada por WhatsApp*, *Pagamento em atraso por WhatsApp* e *Vaga da lista de espera por WhatsApp*. Ver [Avisos por SMS e WhatsApp](/notificacoes/avisos-por-sms-e-whatsapp#pelo-assistente-mcp). No WhatsApp, o guia monta o bloco com o modelo, os campos e a página do botão, nunca com texto livre, e as receitas usam *Ingresso confirmado*, *Pagamento recusado* e *Aviso da comunidade*.

Para os campos de escolha múltipla e os badges, as receitas passam a 61: *Boas-vindas pelo interesse* e *Etiqueta pelo interesse* (com *contém qualquer de* na condição **Campo do perfil**), *Badge ao concluir um curso*, *Grupo para quem recebe um badge* e *Badge no check-in do evento*.

Para os níveis: o guia descreve os gatilhos **Subiu de nível**, **Desceu de nível** e **Atingiu N pontos** e as regras `levelAtLeast` e `pointsAtLeast`, com três receitas novas: *Subiu de nível, ganha um badge*, *Desceu de nível, sai de um grupo* e *Atingiu N pontos, ganha um badge*. Os níveis propriamente ditos estão em `get_ranking_levels` e `update_ranking_levels`.

## Na API

As rotas ficam em `/api/workflows`: acionadores, lista, criar, editar, eliminar, ligar, pausar, retomar, parar, estimativa, simulação, teste, execuções, histórico por membro, modelos e executar agora (`POST /api/workflows/{id}/run`). Ver a [Referência da API](/api/referencia). Também `POST /api/workflows/{id}/stop`, `GET /api/workflows/{id}/summary`, `GET /api/workflows/{id}/variables` e `POST /api/workflows/variables` (as variáveis de um desenho ainda não guardado), `GET` e `PUT /api/workflows/settings` (em nome de quem), `occurs` e `variables` em cada acionador de `GET /api/workflows/triggers`, `activeCount` e `maxActive` na lista, e o tipo `workflows` em `GET /api/logs`. Um desenho recusado volta com 422 e o bloco: `singleTriggerOnly`, `pathWithoutEnd`, `variableUnavailable`. Também `actionAboveRole` e `subWorkflowAboveRole` (ação acima do papel de quem guarda), `subWorkflowCycle`, `httpTimeoutInvalid`, `externalInSubject`; Executar agora ou o endereço de webhook de um workflow com ações acima do seu papel: 403 `workflows.actionsAboveRole`. E `DELETE /api/workflows/runs/{runId}`, `POST /api/workflows/{id}/runs/clear`, os blocos `http`, `platformAction` e `runWorkflow`, o acionador `workflow.called`, `platformActions` e `subWorkflow` em `GET /api/workflows/triggers`, e o cofre em `/api/vault` (o valor de uma chave nunca volta).

Os blocos de IA são o bloco `ai` (`provider` `anthropic` ou `openai`, `model`, `keyEnv`, `system`, `prompt`, `outputFormat` `text` ou `json`, `jsonSchema`, `maxOutputTokens`, `timeoutSeconds`, `next` e `error`), com os modelos e os limites do bloco em `aiProviders` e `aiNode` de `GET /api/workflows/triggers`; os tetos ficam em `GET` e `PUT /api/vault/ai-limits` (proprietário e administrador). As ações novas estão em `platformActions` (`content.post.create`, `certificate.issue`, `recognition.give`, `chat.block`, `oneOnOne.schedule`, `developmentPlan.action.add`), com o campo opcional `ownerOnly`, e `POST /api/gamification/points` ajusta pontos fora de um workflow. `POST /api/workflows/{id}/simulate` aceita `sendEmailsToMe: true` e devolve `emailsToMe`; passar de 10 simulações com envio por hora: `429`; conta sem e-mail: `422`.

Os blocos de SMS e WhatsApp são `sendSms` (`text`, até 300 caracteres, `next` e `error`) e `sendWhatsapp` (`template`, `variables`, até 300 caracteres cada, `link`, `next` e `error`; os modelos e os campos de cada um vêm em `whatsappNode.templates`), descritos em `smsNode` e `whatsappNode` de `GET /api/workflows/triggers`. Os motivos ficam no passo: saltado (`smsNoPhone`, `smsPhoneUnverified`, `smsNoConsent`, `smsOptedOut`, `smsOptedOutAll`, `smsCategoryOff`, `smsCountryUnsupported`, `smsChannelDisabled`, `smsMemberGone`, `smsTextEmpty` e os `whatsapp*` equivalentes, mais `whatsappNotOnPlan`, `whatsappTemplateNotApproved`, `whatsappNoConsent`), adiado (`smsQuietHours`, `smsDailyCapReached`, `smsMonthlyQuotaReached`, `smsPersonDailyCapReached` e os do WhatsApp) e erro (`smsSendFailed`, `whatsappSendFailed`). O contador de partes é `POST /api/sms/segments`.

As ações de badge são `badge.award` (com `badgeId` e `reason`, que aceita variáveis) e `badge.revoke`, em `platformActions`; os acionadores são `badge.awarded` (filtros `badgeId` e `sources`) e `badge.revoked`, com a variável `{{badge.name}}`. Os gatilhos de nível e pontos são `member.level_changed` (filtros `direction`, `up` por predefinição ou `down`, `levelId` e, na descida, `causes`: `points` e `activity`) e `member.points_changed` (filtro `points`, obrigatório: dispara quando `from < N <= to`); as regras são `levelAtLeast` (`levelId`) e `pointsAtLeast` (`points`), com `not`. Num campo de escolha múltipla, a regra `fieldEquals` aceita `op` `containsAny`, `containsAll`, `notContains` e `contains`, com `values`.

## Relacionados

- [Campanhas de e-mail](/notificacoes/campanhas-de-email)
- [Reputação de envio](/notificacoes/reputacao-de-envio)
- [Mensagens](/membros/mensagens)
- [Logs](/membros/registros-de-atividades)
- [Slack](/integracoes/slack)
- [IPs fixos](/api/ips-fixos)
