Pular para conteúdo

TWILIO SMS SEND - Envio de SMS/MMS via Twilio

O que é este Node?

O TWILIO SMS SEND é o node responsável por enviar mensagens SMS e MMS usando a API do Twilio. Ele permite enviar mensagens de texto simples ou incluir arquivos de mídia (imagens, vídeos, áudio) para qualquer número de telefone no mundo.

Por que este Node existe?

Nem todas as comunicações podem ser feitas via WhatsApp ou email. O TWILIO SMS SEND existe para:

  1. Alcance Universal: SMS funciona em qualquer celular, sem necessidade de apps ou internet
  2. Confirmações Críticas: Enviar códigos de verificação, confirmações de pedidos e alertas importantes
  3. Backup de Comunicação: Garantir que mensagens importantes cheguem mesmo sem WhatsApp
  4. Compliance: Atender requisitos regulatórios que exigem SMS para notificações
  5. Marketing Direto: Campanhas promocionais com alto índice de leitura (98% dos SMS são lidos)

Como funciona internamente?

Quando o TWILIO SMS SEND é executado, o sistema:

  1. Valida Credenciais: Verifica se accountSid e authToken estão configurados
  2. Processa Variáveis: Substitui variáveis em from, to, message e mediaUrl
  3. Prepara Parâmetros: Cria formulário URL-encoded com dados da mensagem
  4. Adiciona Mídia (opcional): Se mediaUrl estiver presente, adiciona ao formulário (SMS vira MMS)
  5. Envia via API: Faz POST para https://api.twilio.com/2010-04-01/Accounts/{accountSid}/Messages.json
  6. Retorna Resposta: Salva messageSid, status, to, from e body na variável especificada
  7. Se erro: Lança exceção com detalhes do problema

Código interno (twilio.executor.ts:56-102):

private async executeSmsOperation(
  operation: string,
  config: TwilioConfig,
  data: any,
  context: ExecutionContext,
): Promise<any> {
  switch (operation) {
    case 'send':
      const from = this.replaceVariables(data.from, context.variables);
      const to = this.replaceVariables(data.to, context.variables);
      const body = this.replaceVariables(data.message, context.variables);

      const params = new URLSearchParams();
      params.append('From', from);
      params.append('To', to);
      params.append('Body', body);

      if (data.mediaUrl) {
        params.append('MediaUrl', this.replaceVariables(data.mediaUrl, context.variables));
      }

      const response = await axios.post(
        `${this.baseUrl}/Accounts/${config.accountSid}/Messages.json`,
        params,
        {
          auth: {
            username: config.accountSid,
            password: config.authToken,
          },
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
          },
        },
      );

      return {
        messageSid: response.data.sid,
        status: response.data.status,
        to: response.data.to,
        from: response.data.from,
        body: response.data.body,
      };

    default:
      throw new Error(`Unknown SMS operation: ${operation}`);
  }
}

Quando você DEVE usar este Node?

Use TWILIO SMS SEND sempre que precisar de mensagens SMS/MMS com alta confiabilidade:

Casos de uso

  1. Autenticação e Segurança: "Enviar código de verificação 2FA por SMS para login seguro"
  2. Notificações Críticas: "Alertar clientes sobre status de entrega ou atrasos em tempo real"
  3. Marketing Mobile: "Campanha promocional de Black Friday com cupom de desconto via SMS"
  4. Confirmações de Agendamento: "Lembrar pacientes de consulta médica 24h antes com link de confirmação"
  5. Alertas de Emergência: "Notificar equipe de TI sobre queda de servidor crítico"

Quando NÃO usar TWILIO SMS SEND

  • Conversas Longas: Use WhatsApp API - SMS cobra por mensagem e não é interativo
  • Mídia Pesada: Use Email - MMS tem limite de tamanho e custo maior
  • Apenas Internet: Use notificação push - é grátis e instantânea para apps
  • Spam em Massa: Respeite LGPD/GDPR - SMS requer opt-in explícito

Parâmetros Detalhados

from (string, obrigatório)

O que é: Número de telefone Twilio de origem (comprado na sua conta Twilio) ou Alphanumeric Sender ID.

Formato: - Phone Number: +5511999887766 (formato E.164 com código do país) - Alphanumeric: "MINHAEMPRESA" (até 11 caracteres, apenas alguns países)

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - From Number",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar SMS",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "Olá! Esta é uma mensagem de teste do Lumina Flow.",
        "responseVariable": "smsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar Envio",
        "parameters": {
          "message": "SMS enviado! SID: {{smsResult.messageSid}} | Status: {{smsResult.status}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Configure twilioAccountSid e twilioAuthToken nas variáveis do flow 2. Substitua from por um número Twilio válido da sua conta 3. Substitua to pelo seu número de celular 4. Execute o flow 5. Você receberá o SMS e verá a confirmação com o SID da mensagem


to (string, obrigatório)

O que é: Número de telefone do destinatário que receberá a mensagem SMS/MMS.

Formato: +5511988776655 (formato E.164: + código país + DDD + número)

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - To Number Dynamic",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Solicitar Número",
        "parameters": {
          "message": "Digite o número de telefone (com código do país, ex: +5511999887766):",
          "variable": "phoneNumber"
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar SMS",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{phoneNumber}}",
        "message": "Você recebeu esta mensagem porque solicitou um teste!",
        "responseVariable": "smsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "SMS enviado para {{smsResult.to}} com sucesso!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Execute o flow 2. Digite um número válido quando solicitado (ex: +5511988776655) 3. O SMS será enviado para o número digitado 4. Confirme recebimento no celular


message (string, obrigatório)

O que é: Conteúdo da mensagem SMS que será enviada ao destinatário.

Limite: 1600 caracteres (mensagens maiores são divididas em múltiplos SMS e cobradas proporcionalmente)

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - Message Content",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Definir Dados",
        "parameters": {
          "variables": {
            "customerName": "João Silva",
            "orderNumber": "ORD-12345",
            "deliveryDate": "20/01/2025"
          }
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar Confirmação",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "Olá {{customerName}}! Seu pedido {{orderNumber}} está confirmado e será entregue em {{deliveryDate}}. Obrigado pela preferência!",
        "responseVariable": "smsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Mensagem enviada:\n{{smsResult.body}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Execute o flow 2. Você receberá SMS: "Olá João Silva! Seu pedido ORD-12345 está confirmado e será entregue em 20/01/2025. Obrigado pela preferência!" 3. Verifique que as variáveis foram substituídas corretamente


mediaUrl (string, opcional)

O que é: URL pública de um arquivo de mídia para transformar SMS em MMS (Multimedia Messaging Service). Suporta imagens (JPG, PNG, GIF), vídeos (MP4) e áudio (MP3).

Formatos aceitos: - Imagens: JPG, PNG, GIF (até 5MB) - Vídeos: MP4 (até 5MB) - Áudio: MP3, AMR (até 5MB)

Padrão: Nenhum (opcional)

Flow completo para testar:

{
  "name": "Teste Twilio MMS - Media URL",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar MMS com Imagem",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "Confira a promoção imperdível desta semana!",
        "mediaUrl": "https://example.com/promocao-black-friday.jpg",
        "responseVariable": "mmsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar MMS",
        "parameters": {
          "message": "MMS enviado! SID: {{mmsResult.messageSid}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Substitua a URL pela URL pública de uma imagem real 2. Execute o flow 3. Você receberá um MMS com a imagem anexada 4. Atenção: MMS custa mais que SMS e nem todas operadoras suportam


config.accountSid (string, obrigatório)

O que é: Identificador único da sua conta Twilio. É como o "username" da API Twilio.

Onde encontrar: 1. Acesse https://console.twilio.com 2. No Dashboard, procure "Account SID" 3. Formato: ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (34 caracteres começando com "AC")

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - Account SID",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Solicitar Account SID",
        "parameters": {
          "message": "Cole seu Twilio Account SID:",
          "variable": "twilioAccountSid"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Solicitar Auth Token",
        "parameters": {
          "message": "Cole seu Twilio Auth Token:",
          "variable": "twilioAuthToken"
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 500, "y": 150 },
      "data": {
        "label": "Testar Credenciais",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "Teste de credenciais Twilio bem-sucedido!",
        "responseVariable": "testResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 150 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Credenciais válidas! SMS enviado com SID: {{testResult.messageSid}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 150 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "input_2" },
    { "source": "input_2", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Execute o flow 2. Cole seu Account SID quando solicitado 3. Cole seu Auth Token quando solicitado 4. Se credenciais válidas: SMS enviado e SID retornado 5. Se inválidas: Erro de autenticação


config.authToken (string, obrigatório)

O que é: Token de autenticação secreto da sua conta Twilio. É como a "senha" da API Twilio.

Onde encontrar: 1. Acesse https://console.twilio.com 2. No Dashboard, procure "Auth Token" 3. Clique no ícone de olho para revelar 4. Formato: 32 caracteres hexadecimais

Segurança: - NUNCA compartilhe seu Auth Token - NUNCA commit em repositórios públicos - Use variáveis de ambiente ou cofre de senhas

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - Segurança Auth Token",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Carregar Credenciais Seguras",
        "parameters": {
          "variables": {
            "twilioAccountSid": "{{env.TWILIO_ACCOUNT_SID}}",
            "twilioAuthToken": "{{env.TWILIO_AUTH_TOKEN}}"
          }
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar SMS Seguro",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "SMS enviado com credenciais seguras!",
        "responseVariable": "smsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "message": "SMS enviado com segurança! SID: {{smsResult.messageSid}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: 1. Configure variáveis de ambiente TWILIO_ACCOUNT_SID e TWILIO_AUTH_TOKEN 2. Execute o flow 3. As credenciais são carregadas de forma segura 4. SMS enviado sem expor tokens no código


responseVariable (string, opcional)

O que é: Nome da variável onde será armazenada a resposta da API Twilio com detalhes do SMS enviado.

Dados retornados: - messageSid: ID único da mensagem (formato: SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) - status: Status atual (queued, sent, delivered, failed) - to: Número do destinatário - from: Número de origem - body: Conteúdo da mensagem enviada

Padrão: Nenhum (opcional)

Flow completo para testar:

{
  "name": "Teste Twilio SMS - Response Variable",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar SMS",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "+5511988776655",
        "message": "SMS para testar response variable",
        "responseVariable": "twilioResponse",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Exibir Detalhes",
        "parameters": {
          "message": "📱 SMS Enviado!\n\n🆔 SID: {{twilioResponse.messageSid}}\n📊 Status: {{twilioResponse.status}}\n📤 De: {{twilioResponse.from}}\n📥 Para: {{twilioResponse.to}}\n💬 Mensagem: {{twilioResponse.body}}"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Verificar Status",
        "parameters": {
          "condition": "{{twilioResponse.status}} == 'queued' || {{twilioResponse.status}} == 'sent'"
        }
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "SMS na fila de envio ou já enviado!"
        }
      }
    },
    {
      "id": "message_error",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "Erro ao enviar SMS. Status: {{twilioResponse.status}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_success", "label": "true" },
    { "source": "condition_1", "target": "message_error", "label": "false" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_error", "target": "end_1" }
  ]
}

Teste: 1. Execute o flow 2. Veja todos os detalhes da resposta Twilio 3. Flow verifica status e mostra mensagem apropriada 4. Use twilioResponse.messageSid para rastrear SMS posteriormente

Parâmetros

Campo Tipo Obrigatório Descrição
resource string Sim Deve ser "sms"
operation string Sim Deve ser "send"
from string Sim Número Twilio de origem (formato E.164)
to string Sim Número do destinatário (formato E.164)
message string Sim Conteúdo da mensagem SMS (até 1600 caracteres)
mediaUrl string Não URL pública de mídia para MMS (imagem/vídeo/áudio)
config.accountSid string Sim Account SID da sua conta Twilio
config.authToken string Sim Auth Token secreto da sua conta Twilio
responseVariable string Não Nome da variável para armazenar resposta

Exemplo 1: Código de Verificação 2FA

Objetivo: Enviar código de autenticação de dois fatores por SMS

JSON para Importar

{
  "name": "Sistema 2FA com SMS Twilio",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Solicitar Telefone",
        "parameters": {
          "message": "Digite seu número de telefone com código do país (ex: +5511999887766):",
          "variable": "userPhone"
        }
      }
    },
    {
      "id": "random_1",
      "type": "random",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Gerar Código",
        "parameters": {
          "min": 100000,
          "max": 999999,
          "variable": "verificationCode"
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Enviar Código SMS",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{userPhone}}",
        "message": "Seu código de verificação é: {{verificationCode}}\n\nNão compartilhe este código com ninguém.\n\nVálido por 5 minutos.",
        "responseVariable": "smsResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Confirmar Envio",
        "parameters": {
          "message": "Código enviado para {{userPhone}}!\n\nSID: {{smsResult.messageSid}}"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Solicitar Código",
        "parameters": {
          "message": "Digite o código de verificação que você recebeu:",
          "variable": "inputCode"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Validar Código",
        "parameters": {
          "condition": "{{inputCode}} == {{verificationCode}}"
        }
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 1500, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "Código válido! Autenticação bem-sucedida."
        }
      }
    },
    {
      "id": "message_error",
      "type": "message",
      "position": { "x": 1500, "y": 150 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "Código inválido. Tente novamente."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "random_1" },
    { "source": "random_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "input_2" },
    { "source": "input_2", "target": "condition_1" },
    { "source": "condition_1", "target": "message_success", "label": "true" },
    { "source": "condition_1", "target": "message_error", "label": "false" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_error", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite seu número de telefone com código do país (ex: +5511999887766):
Usuário: +5511988776655
Sistema: Código enviado para +5511988776655! SID: SM1234567890abcdef
[SMS recebido no celular: "Seu código de verificação é: 782451. Não compartilhe este código com ninguém. Válido por 5 minutos."]
Sistema: Digite o código de verificação que você recebeu:
Usuário: 782451
Sistema: Código válido! Autenticação bem-sucedida.

Exemplo 2: Campanha de Marketing com MMS

Objetivo: Enviar SMS promocional com imagem de produto

JSON para Importar

{
  "name": "Campanha Black Friday - SMS + MMS",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Dados da Campanha",
        "parameters": {
          "variables": {
            "customerName": "Maria Santos",
            "customerPhone": "+5511988776655",
            "discountCode": "BF2025",
            "discountPercent": "50",
            "productImage": "https://example.com/produto-destaque.jpg"
          }
        }
      }
    },
    {
      "id": "twilio_1",
      "type": "twilio",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar MMS Promocional",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{customerPhone}}",
        "message": "Olá {{customerName}}! BLACK FRIDAY com {{discountPercent}}% OFF!\n\nUse o cupom: {{discountCode}}\n\nVálido até hoje às 23:59!\n\nCompre agora: lumina.app.br/promo",
        "mediaUrl": "{{productImage}}",
        "responseVariable": "campaignResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Log da Campanha",
        "parameters": {
          "message": "MMS enviado para {{customerName}}!\n\nTelefone: {{campaignResult.to}}\nCupom: {{discountCode}}\nSID: {{campaignResult.messageSid}}\nStatus: {{campaignResult.status}}"
        }
      }
    },
    {
      "id": "delay_1",
      "type": "delay",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Aguardar 10s",
        "parameters": {
          "delay": 10000
        }
      }
    },
    {
      "id": "twilio_2",
      "type": "twilio",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Lembrete Final",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{customerPhone}}",
        "message": "ÚLTIMA CHANCE! Seu cupom {{discountCode}} expira em 1 hora. Não perca!",
        "responseVariable": "reminderResult",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Campanha Completa",
        "parameters": {
          "message": "Campanha finalizada!\n\nMMS Inicial: {{campaignResult.messageSid}}\nLembrete: {{reminderResult.messageSid}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "twilio_1" },
    { "source": "twilio_1", "target": "message_1" },
    { "source": "message_1", "target": "delay_1" },
    { "source": "delay_1", "target": "twilio_2" },
    { "source": "twilio_2", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: MMS enviado para Maria Santos!
Telefone: +5511988776655
Cupom: BF2025
SID: SM1234567890abcdef
Status: queued

[MMS recebido no celular com imagem do produto + texto promocional]

[Aguarda 10 segundos]

Sistema: Campanha finalizada!
MMS Inicial: SM1234567890abcdef
Lembrete: SM0987654321fedcba

[SMS lembrete recebido]

Exemplo 3: Notificação de Entrega com Rastreamento

Objetivo: Enviar atualizações de status de pedido por SMS

JSON para Importar

{
  "name": "Notificações de Entrega - Twilio SMS",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Dados do Pedido",
        "parameters": {
          "variables": {
            "customerName": "Carlos Oliveira",
            "customerPhone": "+5511988776655",
            "orderNumber": "ORD-98765",
            "trackingCode": "BR123456789XZ",
            "estimatedDate": "22/01/2025",
            "carrier": "Correios"
          }
        }
      }
    },
    {
      "id": "twilio_confirmed",
      "type": "twilio",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedido Confirmado",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{customerPhone}}",
        "message": "Olá {{customerName}}! Seu pedido {{orderNumber}} foi CONFIRMADO e está sendo preparado. Em breve enviaremos o código de rastreamento.",
        "responseVariable": "smsConfirmed",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "delay_1",
      "type": "delay",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Aguardar Preparo",
        "parameters": {
          "delay": 5000
        }
      }
    },
    {
      "id": "twilio_shipped",
      "type": "twilio",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Pedido Enviado",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{customerPhone}}",
        "message": "Seu pedido {{orderNumber}} foi ENVIADO!\n\nTransportadora: {{carrier}}\nCódigo: {{trackingCode}}\nPrevisão: {{estimatedDate}}\n\nRastreie: lumina.app.br/track/{{trackingCode}}",
        "responseVariable": "smsShipped",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "delay_2",
      "type": "delay",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Aguardar Entrega",
        "parameters": {
          "delay": 8000
        }
      }
    },
    {
      "id": "twilio_delivered",
      "type": "twilio",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Pedido Entregue",
        "resource": "sms",
        "operation": "send",
        "from": "+5511999887766",
        "to": "{{customerPhone}}",
        "message": "{{customerName}}, seu pedido {{orderNumber}} foi ENTREGUE!\n\nAvalie sua experiência: lumina.app.br/review/{{orderNumber}}\n\nObrigado pela preferência!",
        "responseVariable": "smsDelivered",
        "config": {
          "accountSid": "{{twilioAccountSid}}",
          "authToken": "{{twilioAuthToken}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "Resumo",
        "parameters": {
          "message": "Ciclo de notificações completo!\n\nConfirmado: {{smsConfirmed.messageSid}}\nEnviado: {{smsShipped.messageSid}}\nEntregue: {{smsDelivered.messageSid}}\n\nTodos os SMS foram entregues com sucesso."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "twilio_confirmed" },
    { "source": "twilio_confirmed", "target": "delay_1" },
    { "source": "delay_1", "target": "twilio_shipped" },
    { "source": "twilio_shipped", "target": "delay_2" },
    { "source": "delay_2", "target": "twilio_delivered" },
    { "source": "twilio_delivered", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

[SMS 1 - Pedido Confirmado]
"Olá Carlos Oliveira! Seu pedido ORD-98765 foi CONFIRMADO e está sendo preparado. Em breve enviaremos o código de rastreamento."

[Aguarda 5 segundos]

[SMS 2 - Pedido Enviado]
"Seu pedido ORD-98765 foi ENVIADO!
Transportadora: Correios
Código: BR123456789XZ
Previsão: 22/01/2025
Rastreie: lumina.app.br/track/BR123456789XZ"

[Aguarda 8 segundos]

[SMS 3 - Pedido Entregue]
"Carlos Oliveira, seu pedido ORD-98765 foi ENTREGUE!
Avalie sua experiência: lumina.app.br/review/ORD-98765
Obrigado pela preferência!"

Sistema: Ciclo de notificações completo!
Confirmado: SM1111111111111111
Enviado: SM2222222222222222
Entregue: SM3333333333333333
Todos os SMS foram entregues com sucesso.

Resposta do Node

{
  "messageSid": "SM1234567890abcdef1234567890abcdef",
  "status": "queued",
  "to": "+5511988776655",
  "from": "+5511999887766",
  "body": "Conteúdo da mensagem SMS enviada"
}

Status possíveis: - queued: Na fila de envio - sent: Enviado para operadora - delivered: Entregue ao destinatário - undelivered: Não entregue - failed: Falha no envio

Boas Práticas

SIM:

  • Sempre use formato E.164 para números de telefone (+5511999887766)
  • Armazene credenciais Twilio em variáveis de ambiente, nunca no código
  • Use responseVariable para rastrear status e SID das mensagens
  • Respeite opt-out: não envie SMS para quem solicitou descadastro
  • Mensagens curtas: Máximo 160 caracteres para 1 SMS (mais = múltiplos SMS = mais custo)
  • Teste primeiro com seu próprio número antes de campanha em massa
  • Inclua sempre identificação da empresa e link de descadastro em campanhas

NÃO:

  • Nunca envie SMS sem consentimento (LGPD/GDPR)
  • Não use números aleatórios como from - deve ser número Twilio válido
  • Não confie apenas no status queued - implemente webhook para confirmação de entrega
  • Não envie MMS para todos - nem todas operadoras suportam (custa mais)
  • Não abuse: limite de taxa (rate limit) da Twilio pode bloquear envios massivos

Dicas

Dica 1: Para SMS em massa, use Twilio Messaging Service em vez de número único. Distribui envios e evita bloqueios.

Dica 2: Mensagens com mais de 160 caracteres são divididas em múltiplos SMS (cobrados separadamente). Use contador de caracteres.

Dica 3: Para códigos 2FA, use Twilio Verify API (mais seguro e gerencia expiração automaticamente).

Dica 4: Configure Webhooks para receber confirmação de entrega real (delivered) em vez de confiar apenas em queued.

Dica 5: Em produção, implemente retry com exponential backoff para erros temporários de rede.

Dica 6: Use shortlinks (bit.ly, etc) para economizar caracteres em URLs longas.

Próximo Node

TWILIO CALL MAKE - Realizar chamadas telefônicas automáticas → CONDITION - Validar status de envio → DELAY - Agendar SMS sequenciais