This workflow follows the Google Calendar → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Agente Vendas Ve\u00edculos - Completo",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "whatsapp-webhook",
"responseMode": "onReceived"
},
"name": "Webhook - Recebe Mensagens WhatsApp",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [
250,
300
]
},
{
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json[\"type\"]}}",
"operation": "equal",
"value2": "audio"
}
]
}
},
"name": "IF - Texto ou \u00c1udio",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
450,
300
]
},
{
"parameters": {
"action": "GET",
"key": "={{`human_override:${$json.sender?.id || $json.sender}`}}"
},
"name": "Redis - Verifica Bloqueio Humano",
"type": "n8n-nodes-base.redis",
"typeVersion": 1,
"position": [
650,
400
]
},
{
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json}}",
"operation": "notEmpty",
"value2": ""
}
]
}
},
"name": "IF - Bloqueio Ativo?",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [
850,
400
]
},
{
"parameters": {
"url": "https://api.openai.com/v1/audio/transcriptions",
"options": {},
"responseFormat": "json",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{OPENAI_API_KEY}}\"}]",
"bodyParametersJson": "[{\"name\":\"file\",\"value\":\"={{$json.audio_url}}\",\"type\":\"file\"}]",
"returnFullResponse": false
},
"name": "HTTP Request - Transcri\u00e7\u00e3o \u00c1udio (Whisper/OpenAI)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
650,
200
]
},
{
"parameters": {
"action": "SET",
"key": "={{`msg:${$json.id}:text`}}",
"value": "={{$json.transcript || $json.text}}",
"expire": 3600
},
"name": "Redis - Cache Texto",
"type": "n8n-nodes-base.redis",
"typeVersion": 1,
"position": [
850,
200
]
},
{
"parameters": {
"url": "{{SUPABASE_URL}}/rest/v1/vehicles?select=*",
"options": {},
"responseFormat": "json",
"headerParametersJson": "[{\"name\":\"apikey\",\"value\":\"{{SUPABASE_KEY}}\"},{\"name\":\"Authorization\",\"value\":\"Bearer {{SUPABASE_KEY}}\"}]",
"queryParametersJson": "[]",
"returnFullResponse": false
},
"name": "Supabase - Consulta Estoque Ve\u00edculos",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
1050,
300
]
},
{
"parameters": {
"functionCode": "const message = items[0].json;\nconst stock = items[1].json;\nconst prompt = `Voc\u00ea \u00e9 um assistente virtual especializado em vendas de ve\u00edculos. Aqui est\u00e1 o contexto do cliente:\\n${JSON.stringify(message)}\\n\\nEstoque atual dos ve\u00edculos:\\n${JSON.stringify(stock)}\\n\\nPor favor, responda apresentando os modelos dispon\u00edveis, calcule op\u00e7\u00f5es de financiamento com taxa de 2,2% ao m\u00eas para 36, 48 e 60 parcelas conforme a entrada informada pelo cliente. Al\u00e9m disso, ofere\u00e7a agendamento de visitas. Seja educado e objetivo.`;\nreturn [{ json: { prompt } }];"
},
"name": "Function - Preparar Prompt IA",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
1250,
300
]
},
{
"parameters": {
"url": "https://api.openai.com/v1/chat/completions",
"method": "POST",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{OPENAI_API_KEY}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "[{\"name\":\"model\",\"value\":\"gpt-4o-mini\"},{\"name\":\"messages\",\"value\":[{\"role\":\"system\",\"content\":\"Voc\u00ea \u00e9 um assistente de vendas de ve\u00edculos. Qualifique o cliente, apresente modelos e condi\u00e7\u00f5es de financiamento, e agende visita.\"},{\"role\":\"user\",\"content\":\"={{$json.prompt}}\"}]}]",
"responseFormat": "json"
},
"name": "OpenAI - Gerar Resposta IA",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
1450,
300
]
},
{
"parameters": {
"functionCode": "const data = items[0].json;\nconst valor = parseFloat(data.valorVeiculo || data.valor || 0);\nconst entrada = parseFloat(data.entrada || 0);\nconst taxa = 0.022;\nconst parcelas = [36, 48, 60];\nconst saldo = Math.max(0, valor - entrada);\nfunction pmt(v, i, n) {\n return (v * i) / (1 - Math.pow(1 + i, -n));\n}\nconst opcoes = parcelas.map(n => ({ parcelas: n, parcelaMensal: parseFloat(pmt(saldo, taxa, n).toFixed(2)) }));\nreturn [{ json: { opcoesFinanciamento: opcoes, saldo, entrada, valor } }];"
},
"name": "Function - Calcular Financiamento",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
1650,
300
]
},
{
"parameters": {
"operation": "create",
"calendarId": "primary",
"start": "={{$json.start}}",
"end": "={{$json.end}}",
"summary": "={{$json.summary}}",
"description": "={{$json.description}}",
"sendNotifications": true
},
"name": "Google Calendar - Criar Evento",
"type": "n8n-nodes-base.googleCalendar",
"typeVersion": 1,
"position": [
1850,
300
]
},
{
"parameters": {
"url": "{{CRM_API_URL}}/contacts",
"method": "POST",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{CRM_TOKEN}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "[{\"name\":\"email\",\"value\":\"={{$json.email || ''}}\"},{\"name\":\"name\",\"value\":\"={{$json.nome || ''}}\"},{\"name\":\"phone\",\"value\":\"={{$json.phone || ''}}\"}]",
"responseFormat": "json"
},
"name": "CRM - Criar/Atualizar Contato",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
2050,
300
]
},
{
"parameters": {
"waitTime": {
"amount": 15,
"timeUnit": "minutes"
}
},
"name": "Wait - Follow-up 15 minutos",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
2250,
250
]
},
{
"parameters": {
"url": "{{WHATSAPP_API_URL}}/send-message",
"method": "POST",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{WHATSAPP_TOKEN}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "[{\"name\":\"to\",\"value\":\"={{$json.sender?.phone || $json.phone}}\"},{\"name\":\"message\",\"value\":\"Ol\u00e1! Ainda est\u00e1 interessado no ve\u00edculo? Posso ajudar.\"}]",
"responseFormat": "json"
},
"name": "Send Message - Reativa\u00e7\u00e3o 15 minutos",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
2450,
250
]
},
{
"parameters": {
"waitTime": {
"amount": 1,
"timeUnit": "hours"
}
},
"name": "Wait - Follow-up 1 hora",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
2650,
250
]
},
{
"parameters": {
"url": "{{WHATSAPP_API_URL}}/send-message",
"method": "POST",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{WHATSAPP_TOKEN}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "[{\"name\":\"to\",\"value\":\"={{$json.sender?.phone || $json.phone}}\"},{\"name\":\"message\",\"value\":\"Oi de novo! Posso agendar sua visita para ver os ve\u00edculos.\"}]",
"responseFormat": "json"
},
"name": "Send Message - Reativa\u00e7\u00e3o 1 hora",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
2850,
250
]
},
{
"parameters": {
"waitTime": {
"amount": 1,
"timeUnit": "days"
}
},
"name": "Wait - Follow-up 1 dia",
"type": "n8n-nodes-base.wait",
"typeVersion": 1,
"position": [
3050,
250
]
},
{
"parameters": {
"url": "{{WHATSAPP_API_URL}}/send-message",
"method": "POST",
"headerParametersJson": "[{\"name\":\"Authorization\",\"value\":\"Bearer {{WHATSAPP_TOKEN}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "[{\"name\":\"to\",\"value\":\"={{$json.sender?.phone || $json.phone}}\"},{\"name\":\"message\",\"value\":\"Ol\u00e1! Estamos aqui para ajudar com o financiamento e agendamento. Quer continuar?\"}]",
"responseFormat": "json"
},
"name": "Send Message - Reativa\u00e7\u00e3o 1 dia",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
3250,
250
]
},
{
"parameters": {
"sheetId": "{{GOOGLE_SHEETS_PUBLIC_ID}}",
"range": "Sheet1",
"event": "valueChange"
},
"name": "Google Sheets Trigger - Sync Supabase",
"type": "n8n-nodes-base.googleSheetsTrigger",
"typeVersion": 1,
"position": [
1050,
600
]
},
{
"parameters": {
"functionCode": "const rows = items.map(i => i.json);\nreturn rows.map(r => ({ json: r }));"
},
"name": "Function - Transformar Dados Google Sheets",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
1250,
600
]
},
{
"parameters": {
"url": "{{SUPABASE_URL}}/rest/v1/vehicles",
"method": "POST",
"headerParametersJson": "[{\"name\":\"apikey\",\"value\":\"{{SUPABASE_KEY}}\"},{\"name\":\"Authorization\",\"value\":\"Bearer {{SUPABASE_KEY}}\"},{\"name\":\"Content-Type\",\"value\":\"application/json\"}]",
"bodyParametersJson": "=[]",
"options": {
"queryParameters": {
"on_conflict": "id"
}
},
"responseFormat": "json"
},
"name": "HTTP Request - Upsert Supabase",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
1450,
600
]
}
],
"connections": {
"Webhook - Recebe Mensagens WhatsApp": {
"main": [
[
{
"node": "IF - Texto ou \u00c1udio",
"type": "main",
"index": 0
}
]
]
},
"IF - Texto ou \u00c1udio": {
"main": [
[
{
"node": "HTTP Request - Transcri\u00e7\u00e3o \u00c1udio (Whisper/OpenAI)",
"type": "main",
"index": 0
}
],
[
{
"node": "Redis - Verifica Bloqueio Humano",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request - Transcri\u00e7\u00e3o \u00c1udio (Whisper/OpenAI)": {
"main": [
[
{
"node": "Redis - Cache Texto",
"type": "main",
"index": 0
}
]
]
},
"Redis - Cache Texto": {
"main": [
[
{
"node": "Redis - Verifica Bloqueio Humano",
"type": "main",
"index": 0
}
]
]
},
"Redis - Verifica Bloqueio Humano": {
"main": [
[
{
"node": "IF - Bloqueio Ativo?",
"type": "main",
"index": 0
}
]
]
},
"IF - Bloqueio Ativo?": {
"main": [
[
{
"node": "OpenAI - Gerar Resposta IA",
"type": "main",
"index": 0
}
],
[
{
"node": "CRM - Criar/Atualizar Contato",
"type": "main",
"index": 0
}
]
]
},
"Supabase - Consulta Estoque Ve\u00edculos": {
"main": [
[
{
"node": "Function - Preparar Prompt IA",
"type": "main",
"index": 0
}
]
]
},
"Function - Preparar Prompt IA": {
"main": [
[
{
"node": "OpenAI - Gerar Resposta IA",
"type": "main",
"index": 0
}
]
]
},
"OpenAI - Gerar Resposta IA": {
"main": [
[
{
"node": "Function - Calcular Financiamento",
"type": "main",
"index": 0
},
{
"node": "Google Calendar - Criar Evento",
"type": "main",
"index": 0
},
{
"node": "CRM - Criar/Atualizar Contato",
"type": "main",
"index": 0
},
{
"node": "Wait - Follow-up 15 minutos",
"type": "main",
"index": 0
}
]
]
},
"Wait - Follow-up 15 minutos": {
"main": [
[
{
"node": "Send Message - Reativa\u00e7\u00e3o 15 minutos",
"type": "main",
"index": 0
},
{
"node": "Wait - Follow-up 1 hora",
"type": "main",
"index": 0
}
]
]
},
"Wait - Follow-up 1 hora": {
"main": [
[
{
"node": "Send Message - Reativa\u00e7\u00e3o 1 hora",
"type": "main",
"index": 0
},
{
"node": "Wait - Follow-up 1 dia",
"type": "main",
"index": 0
}
]
]
},
"Wait - Follow-up 1 dia": {
"main": [
[
{
"node": "Send Message - Reativa\u00e7\u00e3o 1 dia",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets Trigger - Sync Supabase": {
"main": [
[
{
"node": "Function - Transformar Dados Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Function - Transformar Dados Google Sheets": {
"main": [
[
{
"node": "HTTP Request - Upsert Supabase",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {},
"id": "agente-vendas-veiculos-completo"
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Agente Vendas Veículos - Completo. Uses redis, httpRequest, googleCalendar, googleSheetsTrigger. Webhook trigger; 21 nodes.
Source: https://gist.github.com/darkzinxd-alt/ab8111084e8e3021cbd246cf4b95ad63 — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
My workflow 7. Uses openAi, redis, httpRequest, agent. Webhook trigger; 77 nodes.
The system collects real-time wearable health data, normalizes it, and uses AI to analyze trends and risk scores. It detects anomalies by comparing with historical patterns and automatically triggers
This n8n template demonstrates how to create a comprehensive marketing automation and booking system that combines Excel-based lead management with voice-powered customer interactions. The system util
L&D_AgentsAI_ATIVO. Uses httpRequest, agent, googleCalendarTool, toolSerpApi. Webhook trigger; 93 nodes.
Transform your salon/service business with this streamlined WhatsApp automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I