SUPABASE_INSERT - Inserir Registro no Supabase
O que é este Node?
O SUPABASE_INSERT é o node responsável por inserir um novo registro em uma tabela Supabase. Ele cria uma nova linha com os dados fornecidos e retorna o registro criado com seu ID.
Por que este Node existe?
Criar dados é uma operação fundamental em qualquer aplicação. O SUPABASE_INSERT existe para:
- Cadastrar novos registros: Criar usuários, pedidos, produtos, etc.
- Capturar dados de usuário: Salvar informações coletadas em fluxos de conversação
- Registrar eventos: Gravar logs, histórico, interações do usuário
- Integrar com banco: Persistir dados coletados no WhatsApp direto no Supabase
- Automação de cadastros: Criar registros automaticamente baseado em ações do fluxo
Como funciona internamente?
Quando o SUPABASE_INSERT é executado, o sistema:
- Valida configuração: Verifica se host e serviceRole do Supabase estão configurados
- Cria cliente: Inicializa conexão com Supabase usando credenciais fornecidas
- Substitui variáveis: Processa o objeto
rowsubstituindo variáveis do contexto (ex:{{userName}}) - Executa INSERT: Insere novo registro na tabela especificada
- Se erro: Retorna erro indicando problema (campo obrigatório faltando, constraint violada, etc.)
- Se sucesso: Retorna registro criado completo incluindo ID gerado pelo banco
- Salva em variável: Armazena registro criado na variável especificada em responseVariable
Código interno (supabase.executor.ts:126-145):
private async insertRow(
supabase: SupabaseClient,
table: string,
row: Record<string, any>,
context: ExecutionContext,
): Promise<any> {
const replacedRow = this.replaceObjectVariables(row, context.variables);
const { data, error } = await supabase
.from(table)
.insert(replacedRow)
.select()
.single();
if (error) {
throw new Error(`Supabase insert error: ${error.message}`);
}
return data;
}
Quando você DEVE usar este Node?
Use SUPABASE_INSERT sempre que precisar de criar um novo registro no banco:
Casos de uso
- Cadastro de usuário: "Salvar dados do novo cliente no banco"
- Criar pedido: "Registrar novo pedido feito pelo WhatsApp"
- Log de interação: "Salvar histórico de conversação do usuário"
- Agendar compromisso: "Criar novo agendamento na tabela de appointments"
- Feedback de usuário: "Salvar avaliação ou comentário do cliente"
Quando NÃO usar SUPABASE_INSERT
- Atualizar registro existente: Use SUPABASE_UPDATE para modificar dados
- Inserir múltiplos registros de uma vez: Atualmente suporta apenas 1 registro por execução
- Duplicar registro: Verifique se registro já existe com SUPABASE_GETALL antes de inserir
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Tipo da operação Supabase a ser executada. Para este node, sempre deve ser "insert".
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase Insert - Operation",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Criar Usuário",
"operation": "insert",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "users",
"row": {
"name": "Novo Usuário",
"email": "novo@example.com"
},
"responseVariable": "novoUsuario"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Usuário criado com ID: {{novoUsuario.id}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Configure suas credenciais Supabase. O sistema deve criar um novo usuário e retornar o ID gerado.
config (object, obrigatório)
O que é: Objeto contendo as credenciais de conexão com Supabase (host e serviceRole).
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase Insert - Config",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Testar Insert",
"operation": "insert",
"config": {
"host": "https://xyzcompany.supabase.co",
"serviceRole": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"table": "test_logs",
"row": {
"message": "Teste de conexão",
"timestamp": "2025-01-15T10:00:00Z"
},
"responseVariable": "logCriado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "Log registrado: {{logCriado.message}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Use suas credenciais reais do Supabase. Se a configuração estiver correta, deve criar o log.
table (string, obrigatório)
O que é: Nome da tabela no Supabase onde inserir o novo registro.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase Insert - Table",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Criar Pedido",
"operation": "insert",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "orders",
"row": {
"customer_name": "Cliente Teste",
"total": 99.90,
"status": "pending"
},
"responseVariable": "novoPedido"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Pedido criado! Número: {{novoPedido.order_number}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Use uma tabela existente no seu banco Supabase. O sistema deve criar o pedido.
row (object, obrigatório)
O que é: Objeto contendo os dados a serem inseridos. Cada chave é um campo da tabela e cada valor é o dado a salvar. Aceita variáveis (ex: {{userName}}).
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase Insert - Row Dinâmico",
"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": "Pedir Nome",
"parameters": {
"message": "Qual seu nome?",
"variableName": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Email",
"parameters": {
"message": "Qual seu email?",
"variableName": "email"
}
}
},
{
"id": "phone_1",
"type": "phone",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Pedir Telefone",
"parameters": {
"message": "Qual seu telefone?",
"variableName": "telefone"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Salvar Contato",
"operation": "insert",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "contacts",
"row": {
"name": "{{nome}}",
"email": "{{email}}",
"phone": "{{telefone}}",
"source": "whatsapp",
"created_at": "{{_timestamp}}"
},
"responseVariable": "contatoSalvo"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "Cadastro realizado com sucesso!\n\nNome: {{contatoSalvo.name}}\nEmail: {{contatoSalvo.email}}\nTelefone: {{contatoSalvo.phone}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "phone_1" },
{ "source": "phone_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite nome, email e telefone. O sistema deve criar contato com todos os dados informados.
responseVariable (string, obrigatório)
O que é: Nome da variável onde o registro criado será armazenado para uso posterior no fluxo.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste Supabase Insert - ResponseVariable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Criar Cliente",
"operation": "insert",
"config": {
"host": "https://seu-projeto.supabase.co",
"serviceRole": "sua-service-role-key"
},
"table": "customers",
"row": {
"name": "João Silva",
"email": "joao@example.com",
"plan": "premium"
},
"responseVariable": "clienteCriado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Bem-vindo, {{clienteCriado.name}}!"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Detalhes",
"parameters": {
"message": "Seu ID de cliente é: {{clienteCriado.id}}\nPlano: {{clienteCriado.plan}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_1" },
{ "source": "message_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Teste: O registro criado deve ser armazenado em clienteCriado e acessível em múltiplos nodes subsequentes.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Tipo de operação: "insert" |
| config | object | Sim | Credenciais Supabase (host, serviceRole) |
| config.host | string | Sim | URL do projeto Supabase |
| config.serviceRole | string | Sim | Service Role Key do Supabase |
| table | string | Sim | Nome da tabela |
| row | object | Sim | Dados a serem inseridos (campo: valor) |
| responseVariable | string | Sim | Nome da variável para armazenar registro criado |
Exemplo 1: Cadastro Completo de Cliente
Objetivo: Coletar dados do cliente em um fluxo e salvar tudo no Supabase.
JSON para Importar
{
"name": "Cadastro de Cliente - Supabase Insert",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Olá! Vamos fazer seu cadastro. Por favor, responda algumas perguntas:"
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Qual seu nome completo?",
"variableName": "nomeCliente"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Qual seu melhor email?",
"variableName": "emailCliente"
}
}
},
{
"id": "phone_1",
"type": "phone",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Telefone",
"parameters": {
"message": "Qual seu telefone?",
"variableName": "telefoneCliente"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Empresa",
"parameters": {
"message": "Qual o nome da sua empresa?",
"variableName": "empresaCliente"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Salvar Cliente",
"operation": "insert",
"config": {
"host": "https://empresa.supabase.co",
"serviceRole": "service-role-key"
},
"table": "customers",
"row": {
"name": "{{nomeCliente}}",
"email": "{{emailCliente}}",
"phone": "{{telefoneCliente}}",
"company": "{{empresaCliente}}",
"status": "active",
"source": "whatsapp_flow",
"created_at": "{{_timestamp}}"
},
"responseVariable": "novoCliente"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1500, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Cadastro realizado com sucesso!\n\nID: {{novoCliente.id}}\nNome: {{novoCliente.name}}\nEmail: {{novoCliente.email}}\n\nEm breve entraremos em contato!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "phone_1" },
{ "source": "phone_1", "target": "input_2" },
{ "source": "input_2", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Olá! Vamos fazer seu cadastro. Por favor, responda algumas perguntas:
Sistema: Qual seu nome completo?
Usuário: Maria Santos
Sistema: Qual seu melhor email?
Usuário: maria@empresa.com
Sistema: Qual seu telefone?
Usuário: +5511999999999
Sistema: Qual o nome da sua empresa?
Usuário: Tech Solutions
Sistema: Cadastro realizado com sucesso!
ID: uuid-12345
Nome: Maria Santos
Email: maria@empresa.com
Em breve entraremos em contato!
Exemplo 2: Criar Pedido a partir de Conversa
Objetivo: Coletar informações do pedido via WhatsApp e criar registro no Supabase.
JSON para Importar
{
"name": "Criar Pedido - Supabase Insert",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Menu",
"parameters": {
"message": "Olá! Vamos registrar seu pedido."
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Produto",
"parameters": {
"message": "Qual produto você deseja?",
"variableName": "produto"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Quantidade",
"parameters": {
"message": "Quantas unidades?",
"variableName": "quantidade"
}
}
},
{
"id": "number_2",
"type": "number",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Valor",
"parameters": {
"message": "Qual o valor unitário?",
"variableName": "valorUnitario"
}
}
},
{
"id": "calculator_1",
"type": "calculator",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Calcular Total",
"parameters": {
"expression": "{{quantidade}} * {{valorUnitario}}",
"variableName": "valorTotal"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Criar Pedido",
"operation": "insert",
"config": {
"host": "https://loja.supabase.co",
"serviceRole": "service-role-key"
},
"table": "orders",
"row": {
"product_name": "{{produto}}",
"quantity": "{{quantidade}}",
"unit_price": "{{valorUnitario}}",
"total_amount": "{{valorTotal}}",
"status": "pending",
"customer_phone": "{{_from}}",
"created_at": "{{_timestamp}}"
},
"responseVariable": "pedidoCriado"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1500, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Pedido registrado com sucesso!\n\nNúmero do Pedido: {{pedidoCriado.id}}\nProduto: {{pedidoCriado.product_name}}\nQuantidade: {{pedidoCriado.quantity}} un\nValor Total: R$ {{pedidoCriado.total_amount}}\n\nEntraremos em contato para confirmar o pagamento."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "number_1" },
{ "source": "number_1", "target": "number_2" },
{ "source": "number_2", "target": "calculator_1" },
{ "source": "calculator_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Olá! Vamos registrar seu pedido.
Sistema: Qual produto você deseja?
Usuário: Mouse Gamer RGB
Sistema: Quantas unidades?
Usuário: 2
Sistema: Qual o valor unitário?
Usuário: 89.90
Sistema: Pedido registrado com sucesso!
Número do Pedido: uuid-98765
Produto: Mouse Gamer RGB
Quantidade: 2 un
Valor Total: R$ 179.80
Entraremos em contato para confirmar o pagamento.
Exemplo 3: Registrar Feedback do Cliente
Objetivo: Coletar e salvar avaliação do atendimento no banco de dados.
JSON para Importar
{
"name": "Feedback do Cliente - Supabase Insert",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Solicitar Feedback",
"parameters": {
"message": "Obrigado por utilizar nosso serviço! Gostaríamos de saber sua opinião."
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Nota",
"parameters": {
"message": "Em uma escala de 1 a 10, como você avalia nosso atendimento?",
"variableName": "nota",
"min": 1,
"max": 10
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Comentário",
"parameters": {
"message": "Deixe um comentário sobre sua experiência (opcional):",
"variableName": "comentario"
}
}
},
{
"id": "supabase_1",
"type": "supabase",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Salvar Feedback",
"operation": "insert",
"config": {
"host": "https://app.supabase.co",
"serviceRole": "service-role-key"
},
"table": "feedback",
"row": {
"customer_phone": "{{_from}}",
"rating": "{{nota}}",
"comment": "{{comentario}}",
"flow_id": "{{_flowId}}",
"created_at": "{{_timestamp}}"
},
"responseVariable": "feedbackSalvo"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Nota Alta?",
"parameters": {
"variable": "{{nota}}",
"operator": "greater_than_or_equal",
"value": "8"
}
}
},
{
"id": "message_alta",
"type": "message",
"position": { "x": 1300, "y": 50 },
"data": {
"label": "Agradecimento Positivo",
"parameters": {
"message": "Ficamos muito felizes com sua avaliação! Obrigado pela confiança!"
}
}
},
{
"id": "message_baixa",
"type": "message",
"position": { "x": 1300, "y": 150 },
"data": {
"label": "Agradecimento e Desculpas",
"parameters": {
"message": "Agradecemos seu feedback. Vamos trabalhar para melhorar nosso atendimento!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "number_1" },
{ "source": "number_1", "target": "input_1" },
{ "source": "input_1", "target": "supabase_1" },
{ "source": "supabase_1", "target": "condition_1" },
{ "source": "condition_1", "target": "message_alta", "label": "yes" },
{ "source": "condition_1", "target": "message_baixa", "label": "no" },
{ "source": "message_alta", "target": "end_1" },
{ "source": "message_baixa", "target": "end_1" }
]
}
Saída esperada (nota alta):
Sistema: Obrigado por utilizar nosso serviço! Gostaríamos de saber sua opinião.
Sistema: Em uma escala de 1 a 10, como você avalia nosso atendimento?
Usuário: 9
Sistema: Deixe um comentário sobre sua experiência (opcional):
Usuário: Excelente atendimento, muito rápido!
Sistema: Ficamos muito felizes com sua avaliação! Obrigado pela confiança!
Resposta do Node
{
"id": "uuid-generated-by-supabase",
"name": "João Silva",
"email": "joao@example.com",
"phone": "+5511999999999",
"status": "active",
"created_at": "2025-01-15T10:30:00.000Z",
"updated_at": "2025-01-15T10:30:00.000Z"
}
Boas Práticas
✅ SIM:
- Use variáveis para dados dinâmicos (
{{userName}}) - Sempre defina responseVariable para acessar ID do registro criado
- Adicione campos de tracking (source, created_at, flow_id)
- Valide dados antes de inserir (use nodes de validação)
- Trate possíveis erros (constraint violations, campos obrigatórios)
❌ NÃO:
- Não insira dados sensíveis sem criptografia
- Não assuma que insert sempre funciona (trate erros)
- Não use valores hardcoded quando deveria ser dinâmico
- Não exponha Service Role Key em código front-end
- Não insira registros duplicados (verifique antes com getAll)
Dicas
💡 Dica 1: O Supabase gera automaticamente campos id, created_at e updated_at se configurados na tabela. Não precisa passar esses valores no row.
💡 Dica 2: Use variáveis especiais do sistema: {{_from}} (telefone do usuário), {{_timestamp}} (timestamp atual), {{_flowId}} (ID do fluxo).
💡 Dica 3: Se inserção falhar por constraint (ex: email único já existe), o erro será retornado. Use CONDITION após insert para verificar sucesso.
💡 Dica 4: Para inserir dados relacionados (ex: pedido + itens), faça múltiplas inserções em sequência, usando o ID retornado do primeiro insert.
💡 Dica 5: Configure Row Level Security (RLS) no Supabase para proteger dados mesmo usando Service Role Key.
Próximos Nodes
→ SUPABASE_GETROW - Buscar registro específico por ID → SUPABASE_GETALL - Buscar múltiplos registros com filtros → SUPABASE_UPDATE - Atualizar registro existente → SUPABASE_DELETE - Deletar registro da tabela