AIRTABLE UPDATE - Atualizar Registro no Airtable
O que é este Node?
O AIRTABLE UPDATE é o node responsável por atualizar campos de um registro existente no Airtable usando seu ID único.
Por que este Node existe?
Atualizar registros é fundamental para manter dados sincronizados e refletir mudanças de estado em tempo real. O AIRTABLE UPDATE existe para:
- Atualização de Status: Mudar status de pedidos, tickets, leads conforme progresso
- Enriquecimento de Dados: Adicionar informações coletadas posteriormente ao registro
- Sincronização: Manter dados do Airtable atualizados com informações do fluxo
- Gestão de Estado: Controlar ciclo de vida de registros (novo → em andamento → concluído)
Como funciona internamente?
Quando o AIRTABLE UPDATE é executado, o sistema:
- Coleta Credenciais: Obtém o API Key, Base ID e nome da tabela
- Obtém Record ID: Pega o ID do registro a ser atualizado
- Prepara Campos: Processa os campos que serão atualizados, substituindo variáveis
- Monta URL da API: Constrói
https://api.airtable.com/v0/{baseId}/{tableName}/{recordId} - Faz Requisição PATCH: Envia apenas os campos que serão modificados
- Se falha: Lança erro (registro não existe ou campos inválidos)
- Se sucesso: Armazena o registro atualizado na variável de resposta
- Continua Execução: Passa para o próximo node com resultado disponível
Código interno (airtable.executor.ts:40-46):
case 'update': {
const recordId = this.replaceVariables(node.data.recordId, context.variables);
const fields = JSON.parse(this.replaceVariables(JSON.stringify(node.data.fields), context.variables));
const response = await axios.patch(`${baseUrl}/${recordId}`, { fields }, { headers });
result = response.data;
break;
}
Quando você DEVE usar este Node?
Use AIRTABLE UPDATE sempre que precisar de modificar registro existente:
Casos de uso
- Atualizar Status de Pedido: "Quando pagamento confirmado, mudar status para 'Pago'"
- Registrar Interação: "Adicionar data/hora do último contato com lead"
- Completar Dados: "Após coleta adicional, preencher campos faltantes"
- Marcar Conclusão: "Quando tarefa finalizada, atualizar status e data de conclusão"
- Incrementar Contadores: "Aumentar número de tentativas de contato"
Quando NÃO usar AIRTABLE UPDATE
- Criar novo registro: Use
AIRTABLE CREATEao invés - Atualizar múltiplos registros: Use
AIRTABLE BATCH UPDATEao invés - Não sabe o ID: Use
AIRTABLE SEARCHpara encontrar primeiro
Parâmetros Detalhados
config.apiKey (string, obrigatório)
O que é: Token de autenticação da API do Airtable. Obtido em https://airtable.com/account
Padrão: Não há padrão (obrigatório)
Flow completo para testar:
{
"name": "Teste Airtable Update - API Key",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar Lead",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Leads"
},
"recordId": "recABC123XYZ456",
"fields": {
"Status": "Contatado"
},
"responseVariable": "leadAtualizado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Lead atualizado com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Inicie o fluxo. O sistema atualizará o status do lead.
config.baseId (string, obrigatório)
O que é: Identificador da base do Airtable. Encontrado na URL da base (app......)
Padrão: Não há padrão (obrigatório)
Flow completo para testar:
{
"name": "Teste Airtable Update - Base ID",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar em Base Específica",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Clientes"
},
"recordId": "recCLIENTE789",
"fields": {
"UltimoAcesso": "{{hoje}}"
},
"responseVariable": "clienteAtualizado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Cliente atualizado na base!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Inicie o fluxo. O sistema atualizará registro na base especificada.
config.tableName (string, obrigatório)
O que é: Nome exato da tabela no Airtable onde o registro será atualizado.
Padrão: Não há padrão (obrigatório)
Flow completo para testar:
{
"name": "Teste Airtable Update - Table Name",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar na Tabela Vendas",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Vendas"
},
"recordId": "recVENDA123",
"fields": {
"Status": "Enviado",
"CodigoRastreio": "BR123456789"
},
"responseVariable": "vendaAtualizada"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Venda atualizada na tabela!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Inicie o fluxo. O sistema atualizará registro na tabela especificada.
recordId (string, obrigatório)
O que é: ID único do registro no Airtable a ser atualizado (começa com "rec"). Aceita variáveis.
Padrão: Não há padrão (obrigatório)
Flow completo para testar:
{
"name": "Teste Airtable Update - Record ID Dinâmico",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Solicitar ID",
"parameters": {
"message": "Digite o ID do pedido para marcar como pago:",
"variable": "idPedido"
}
}
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Atualizar Status",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Pedidos"
},
"recordId": "{{idPedido}}",
"fields": {
"Status": "Pago",
"DataPagamento": "{{hoje}}"
},
"responseVariable": "pedidoAtualizado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Pedido #{{idPedido}} marcado como pago!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite um ID de pedido. O sistema atualizará o status para "Pago".
fields (object, obrigatório)
O que é: Objeto JSON com os campos a serem atualizados. Apenas campos incluídos serão modificados.
Padrão: Não há padrão (obrigatório)
Flow completo para testar:
{
"name": "Teste Airtable Update - Fields Dinâmicos",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Definir ID",
"parameters": {
"name": "idTicket",
"value": "recTICKET789"
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Solução",
"parameters": {
"message": "Digite a solução aplicada:",
"variable": "solucao"
}
}
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Resolver Ticket",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Tickets"
},
"recordId": "{{idTicket}}",
"fields": {
"Status": "Resolvido",
"Solucao": "{{solucao}}",
"DataResolucao": "{{hoje}}",
"Responsavel": "Sistema"
},
"responseVariable": "ticketResolvido"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Ticket resolvido com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 850, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "input_1" },
{ "source": "input_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite uma solução. O sistema atualizará múltiplos campos do ticket.
responseVariable (string, opcional)
O que é: Nome da variável onde o resultado da atualização será armazenado.
Padrão: "airtableResult"
Flow completo para testar:
{
"name": "Teste Airtable Update - Response Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar e Guardar",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Contatos"
},
"recordId": "recCONTATO123",
"fields": {
"UltimaInteracao": "{{hoje}}",
"TotalInteracoes": 5
},
"responseVariable": "contatoAtualizado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "Contato atualizado!\n\nID: {{contatoAtualizado.id}}\nTotal de interações: {{contatoAtualizado.fields.TotalInteracoes}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Inicie o fluxo. O sistema atualizará e mostrará campos na variável customizada.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "update" |
| config.apiKey | string | Sim | Token de autenticação do Airtable |
| config.baseId | string | Sim | ID da base do Airtable |
| config.tableName | string | Sim | Nome da tabela |
| recordId | string | Sim | ID do registro a atualizar (aceita variáveis) |
| fields | object | Sim | Campos a serem atualizados (apenas os especificados) |
| responseVariable | string | Não | Nome da variável de resposta (padrão: "airtableResult") |
Exemplo 1: Atualizar Status de Pedido Após Pagamento
Objetivo: Quando pagamento confirmado, atualizar status do pedido no Airtable
JSON para Importar
{
"name": "Atualizar Status de Pedido",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Pagamento",
"parameters": {
"message": "Processando pagamento..."
}
}
},
{
"id": "delay_1",
"type": "delay",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Aguardar",
"parameters": {
"delay": 2000
}
}
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Simular Pagamento OK",
"parameters": {
"name": "pagamentoAprovado",
"value": "true"
}
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Verificar Pagamento",
"parameters": {
"condition": "{{pagamentoAprovado}} == 'true'"
}
}
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 850, "y": 50 },
"data": {
"label": "Atualizar Pedido",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Pedidos"
},
"recordId": "{{idPedidoAtual}}",
"fields": {
"Status": "Pago",
"DataPagamento": "{{hoje}}",
"MetodoPagamento": "Pix",
"ValorPago": "{{valorTotal}}"
},
"responseVariable": "pedidoAtualizado"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1000, "y": 50 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ Pagamento aprovado!\n\nSeu pedido #{{idPedidoAtual}} foi confirmado e está sendo preparado."
}
}
},
{
"id": "message_3",
"type": "message",
"position": { "x": 850, "y": 150 },
"data": {
"label": "Falha",
"parameters": {
"message": "❌ Pagamento não foi aprovado. Tente novamente."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1150, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "delay_1" },
{ "source": "delay_1", "target": "variable_1" },
{ "source": "variable_1", "target": "condition_1" },
{ "source": "condition_1", "target": "airtable_1", "label": "true" },
{ "source": "condition_1", "target": "message_3", "label": "false" },
{ "source": "airtable_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" },
{ "source": "message_3", "target": "end_1" }
]
}
Saída esperada:
Sistema: Processando pagamento...
[aguarda 2 segundos]
Sistema: ✅ Pagamento aprovado!
Seu pedido #recPEDIDO123 foi confirmado e está sendo preparado.
Exemplo 2: Registrar Última Interação com Lead
Objetivo: Sempre que conversar com lead, atualizar data/hora da última interação
JSON para Importar
{
"name": "Registrar Interação com Lead",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Saudação",
"parameters": {
"message": "Olá! Como posso ajudar?"
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Conversa",
"parameters": {
"message": "",
"variable": "mensagemUsuario"
}
}
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Registrar Interação",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Leads"
},
"recordId": "{{idLeadAtual}}",
"fields": {
"UltimaInteracao": "{{agora}}",
"UltimaMensagem": "{{mensagemUsuario}}",
"TotalInteracoes": "{{totalInteracoes + 1}}",
"StatusEngajamento": "Ativo"
},
"responseVariable": "leadAtualizado"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resposta",
"parameters": {
"message": "Obrigado pela sua mensagem! Nossa equipe irá responder em breve."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 850, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Olá! Como posso ajudar?
Usuário: Quero saber sobre os cursos
Sistema: Obrigado pela sua mensagem! Nossa equipe irá responder em breve.
Exemplo 3: Workflow de Ticket de Suporte
Objetivo: Atualizar ticket conforme progresso do atendimento
JSON para Importar
{
"name": "Workflow de Ticket",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 250, "y": 100 },
"data": {
"label": "ID Ticket",
"parameters": {
"message": "Digite o ID do ticket:",
"variable": "idTicket"
}
}
},
{
"id": "airtable_1",
"type": "airtable",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Marcar Em Análise",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Tickets"
},
"recordId": "{{idTicket}}",
"fields": {
"Status": "Em Análise",
"DataInicioAnalise": "{{agora}}",
"Responsavel": "Sistema"
},
"responseVariable": "ticket"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Notificar",
"parameters": {
"message": "Ticket #{{idTicket}} está em análise..."
}
}
},
{
"id": "delay_1",
"type": "delay",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Simular Análise",
"parameters": {
"delay": 3000
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 850, "y": 100 },
"data": {
"label": "Solução",
"parameters": {
"message": "Digite a solução aplicada:",
"variable": "solucao"
}
}
},
{
"id": "airtable_2",
"type": "airtable",
"position": { "x": 1000, "y": 100 },
"data": {
"label": "Resolver Ticket",
"operation": "update",
"config": {
"apiKey": "patABC123456789xyz",
"baseId": "appXYZ123456",
"tableName": "Tickets"
},
"recordId": "{{idTicket}}",
"fields": {
"Status": "Resolvido",
"Solucao": "{{solucao}}",
"DataResolucao": "{{agora}}",
"TempoResolucao": "{{minutosDecorridos}}"
},
"responseVariable": "ticketResolvido"
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1150, "y": 100 },
"data": {
"label": "Finalizar",
"parameters": {
"message": "✅ Ticket #{{idTicket}} resolvido!\n\nSolução: {{solucao}}\n\nObrigado pelo contato!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "airtable_1" },
{ "source": "airtable_1", "target": "message_1" },
{ "source": "message_1", "target": "delay_1" },
{ "source": "delay_1", "target": "input_2" },
{ "source": "input_2", "target": "airtable_2" },
{ "source": "airtable_2", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite o ID do ticket:
Usuário: recTICKET789
Sistema: Ticket #recTICKET789 está em análise...
[aguarda 3 segundos]
Sistema: Digite a solução aplicada:
Usuário: Resetei a senha do usuário
Sistema: ✅ Ticket #recTICKET789 resolvido!
Solução: Resetei a senha do usuário
Obrigado pelo contato!
Resposta do Node
{
"id": "recABC123XYZ456",
"createdTime": "2025-01-15T10:30:00.000Z",
"fields": {
"Nome": "José Roberto",
"Email": "jose@exemplo.com",
"Status": "Contatado",
"UltimaInteracao": "2025-01-15T14:30:00.000Z",
"TotalInteracoes": 3
}
}
Boas Práticas
✅ SIM:
- Atualize apenas campos necessários (PATCH atualiza parcialmente)
- Use variáveis dinâmicas para valores que mudam
- Combine GET + UPDATE para atualização condicional
- Registre timestamps de ações importantes (DataPagamento, UltimaInteracao, etc)
- Use UPDATE para incrementar contadores (tentativas, interações, etc)
❌ NÃO:
- Não envie todos os campos se só precisa atualizar um
- Não atualize sem verificar se registro existe (use GET antes se incerto)
- Não use CREATE quando deveria ser UPDATE
- Não esqueça de atualizar campos de auditoria (data modificação, responsável)
Dicas
💡 Dica 1: Apenas campos especificados em fields são atualizados - outros permanecem inalterados
💡 Dica 2: Use {{hoje}} ou {{agora}} para timestamps automáticos
💡 Dica 3: Combine com CALCULATOR para incrementar contadores: "total": "{{total + 1}}"
💡 Dica 4: Para fluxos complexos, use GET → CONDITION → UPDATE para atualização condicional
💡 Dica 5: O Airtable PATCH é idempotente - pode executar múltiplas vezes com segurança
Próximo Node
→ AIRTABLE GET - Buscar registro antes de atualizar → AIRTABLE DELETE - Deletar registro → AIRTABLE SEARCH - Buscar registros para atualizar → AIRTABLE BATCH UPDATE - Atualizar múltiplos registros