This workflow follows the Agent → Airtabletool 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": "Presupuesto Modelo",
"nodes": [
{
"parameters": {
"promptType": "define",
"text": "=## Entrada\n\"modelo\" es: {{ $json.body.modeloInput }}\n\"modeloLimpio\" es: {{ $json.modelClean }}\n\"reparacionInput\" es: {{ $json.body.reparacionInput }}",
"hasOutputParser": true,
"options": {
"systemMessage": "=## ROL\nEres un agente especializado en buscar precios de reparaci\u00f3n de modelos de m\u00f3viles, tablets y smartwatches en nuestra base de datos de Airtable.\n\n## OBJETIVO\nDevolver un JSON estructurado con informaci\u00f3n sobre precios de esa reparaci\u00f3n de ese modelo obtenido de Airtable\n\n## HERRAMIENTAS\n1. BuscarModelo: para buscar el \"modelo\" (usando \"modeloLimpio\") y as\u00ed obtener su RECORD_ID\n2. BuscarReparacionesModelo: para obtener todas las reparaciones disponibles para ese \"modelo\", buscando por su RECORD_ID obtenido del paso anterior.\n3. Structured Output Parser: va a devolver en ese formato la reparaci\u00f3n espec\u00edfica del modelo (s\u00f3lo una reparaci\u00f3n)\n\n## PASOS\n1. Primero buscamos el modelo en Airtable. Para buscar la informaci\u00f3n, vas a usar la herramienta \"BuscarModelos\", en la que vas a buscar por el campo \"modeloLimpio\", que lo recibes del paso anterior. Si no encuentras nada, tienes que ir acotando el modelo para obtener m\u00e1s resultados, hasta que te quedes con el que corresponda.\n\n2. Segundo: Una vez tengas ya el id de airtable del resultado anterior (\"modeloId\", algo estilo recv1Dn5WHIwngW9H), usa la herramienta \"BuscarReparacionesModelo\", dicho resultado te dar\u00e1 todas las reparaciones disponibles de ese modelo. \n\n3. Vas a estructurar la salida con el parser. Para saber si hay stock disponible o no de esa reparaci\u00f3n, obtendr\u00e1s del paso anterior algo tal que as\u00ed \"(2, DISP: 2, PEDIDO: 1)\" o bien un n\u00famero suelto. En el primer tipo equivale a (stockTotal, DISP: stockDisponible, PEDIDO: stockPedido) o si es un n\u00famero suelto equivale a stockDisponible. Ese es el valor que importa, stockDisponible. Si es > 0 devuelves true, y si no, false. Cita diagn\u00f3stico va a \"URLCita\". Si una reparaci\u00f3n devuelve PRESUPUESTO es que todav\u00eda no est\u00e1 creada y va a urlPresupuesto, luego Stock es false, precio es PRESUPUESTO y devuelves el campo urlPresupuesto. urlDiagnostico va a ser el campo \"Cita diagn\u00f3stico\" obtenido de \"BuscarModelo\". UrlSantifer del parser es el campo campo UrlSantiferNueva (de BuscarModelo). El campo n8nPiezasRecordsIds incluye todas las piezas de ese modelo con su recordID entre par\u00e9ntesis, pero s\u00f3lo vas a obtener el recordId de la pieza en cuesti\u00f3n y lo devuelves al parser\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2,
"position": [
-48,
-64
],
"id": "87733868-9502-4f02-94c5-7e9a716d79e2",
"name": "AI Agent"
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "=prueba"
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
-128,
208
],
"id": "1c702fe1-1b35-4e81-a73e-feb386b5ebea",
"name": "Simple Memory"
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Busca modelos en airtable",
"operation": "search",
"base": {
"__rl": true,
"value": "appXXXXXXXXXXXXXXX",
"mode": "list",
"cachedResultName": "santifer iRepair",
"cachedResultUrl": "https://airtable.com/appXXXXXXXXXXXXXXX"
},
"table": {
"__rl": true,
"value": "tblXXXXXXXXXXXXXXX",
"mode": "list",
"cachedResultName": "Modelos",
"cachedResultUrl": "https://airtable.com/appXXXXXXXXXXXXXXX/tblXXXXXXXXXXXXXXX"
},
"filterByFormula": "=SEARCH('{{ $fromAI(\"modelolimpio\") }}',modelolimpio)",
"options": {
"fields": [
"Name",
"Modelo compacto",
"Nomenclatura",
"URLSantiferNueva",
"Cita diagn\u00f3stico"
]
}
},
"type": "n8n-nodes-base.airtableTool",
"typeVersion": 2.1,
"position": [
32,
208
],
"id": "456741ca-8991-439e-919a-835418dcec07",
"name": "BuscarModelos",
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// Recorre todos los items de entrada\nfor (const item of $input.all()) {\n // Obtenemos el modelo original (puede venir en otro campo; aqu\u00ed 'model')\n const original = $input.first().json.body.modeloInput || '';\n // Eliminamos todo lo que no sea letra (A\u2013Z) o n\u00famero (0\u20139) y pasamos a min\u00fasculas\n const limpio = original\n .replace(/[^A-Za-z0-9]/g, '') // quita espacios, par\u00e9ntesis, guiones, etc.\n .toLowerCase();\n // A\u00f1adimos el campo limpio al JSON\n item.json.modelClean = limpio;\n}\n// Devolvemos todos los items modificados\nreturn $input.all();\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-416,
-64
],
"id": "02a180f8-ffca-430f-8164-a7feaacc76f8",
"name": "Code"
},
{
"parameters": {
"jsonSchemaExample": "{\n \"modelo\": \"Apple iPhone XS Max\",\n \"reparacion\": \"Bater\u00eda\",\n \"precio\": \"65.9 \u20ac\",\n \"stock\": true,\n \"urlSantifer\": \"https://santiferirepair.es/reparar-iphone/xs-max\",\n \"urlCita\": \"https://santifer-citav2-componentes.youcanbook.me/?MOD=Apple%20iPhone%20XS%20Max&REP=Bater%C3%ADa\",\n \"urlPresupuesto\": \"https://airtable.com/embed/shrXXXXXXXXXXXXXXX?prefill_Modelo=Apple%20iPhone%2015%20Plus&prefill_Averia=Vibrador\",\n \"urlDiagnostico\":\"https://santifer-citadiag.youcanbook.me/?MOD=Apple%20iPhone%20XS%20Max\",\n \"idPiezaAirtableParaPedido\": \"rec12312iajsdkj9123\",\n \"idModeloAirtableParaPedido\": \"receRdxJPz8QwWXzo\"\n}\n"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.2,
"position": [
432,
160
],
"id": "361b76d6-1713-44fe-b252-cebff58706b2",
"name": "Structured Output Parser"
},
{
"parameters": {
"httpMethod": "POST",
"path": "00000000-0000-0000-0000-000000000000",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-688,
-64
],
"id": "e0f3dd4c-c2e5-4fa4-a16a-8b3978caafd0",
"name": "Webhook"
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.3,
"position": [
960,
-64
],
"id": "60cf21f0-4e3e-41c5-9797-1fec6f0b5092",
"name": "Respond to Webhook"
},
{
"parameters": {
"jsCode": "const items = $input.all();\n\nconst filteredItems = items.map(item => {\n // Clonamos s\u00f3lo el contenido de output\n const data = { ...item.json.output };\n\n // 1) Validaci\u00f3n de urlSantifer\n if (!data.urlSantifer || !data.urlSantifer.includes('santiferirepair.es')) {\n data.urlSantifer = 'NO DISPONIBLE EN WEB AUN';\n }\n\n // 2) Reglas de eliminaci\u00f3n de campos\n if (data.precio === 'PRESUPUESTO') {\n // Caso PRESUPUESTO: borramos urlCita e idPieza\n delete data.urlCita;\n delete data.idPiezaAirtableParaPedido;\n\n } else if (data.stock === true) {\n // Caso stock disponible: borramos urlPresupuesto e idPieza\n delete data.urlPresupuesto;\n delete data.idPiezaAirtableParaPedido;\n delete data.idModeloAirtableParaPedido;\n\n } else if (data.stock === false) {\n // Caso sin stock: borramos urlCita y urlPresupuesto\n delete data.urlCita;\n delete data.urlPresupuesto;\n }\n\n // 3) Devolvemos el resultado, manteniendo el wrapper `output`\n return { json: { output: data } };\n});\n\nreturn filteredItems;\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
464,
-64
],
"id": "d0b1f528-3c3d-4f8d-9114-7c1cad0553e7",
"name": "FiltrarRespuesta"
},
{
"parameters": {
"model": "openai/gpt-4.1",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
-304,
160
],
"id": "ab0511b0-c8db-43ba-8540-b7f8b65328da",
"name": "4.1 mini",
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"descriptionType": "manual",
"toolDescription": "Busca reparaciones de un modelos en airtable",
"operation": "search",
"base": {
"__rl": true,
"value": "appXXXXXXXXXXXXXXX",
"mode": "list",
"cachedResultName": "santifer iRepair",
"cachedResultUrl": "https://airtable.com/appXXXXXXXXXXXXXXX"
},
"table": {
"__rl": true,
"value": "tblXXXXXXXXXXXXXXX",
"mode": "list",
"cachedResultName": "Modelos",
"cachedResultUrl": "https://airtable.com/appXXXXXXXXXXXXXXX/tblXXXXXXXXXXXXXXX"
},
"filterByFormula": "=RECORD_ID() = '{{$fromAI(\"modeloId\")}}'",
"returnAll": false,
"limit": 1,
"options": {
"fields": [
"Pantalla (frontal) (Original) - Precio, stock y cita",
"N8nPiezasRecordIds",
"Pantalla (frontal) (Compatible) - Precio, stock y cita",
"Bater\u00eda - Precio, stock y cita",
"Micr\u00f3fono - Precio, stock y cita",
"Altavoz - Precio, stock y cita",
"Puerto de carga - Precio, stock y cita",
"C\u00e1mara trasera - Precio, stock y cita",
"C\u00e1mara delantera - Precio, stock y cita",
"Auricular - Precio, stock y cita",
"Lente de c\u00e1mara trasera - Precio, stock y cita",
"Electr\u00f3nica de botones de volumen - Precio, stock y cita",
"Tapa trasera - Precio, stock y cita",
"Electr\u00f3nica de bot\u00f3n de encendido - Precio, stock y cita",
"Sensor de proximidad - Precio, stock y cita",
"Vibrador - Precio, stock y cita",
"Lector de huellas / bot\u00f3n de inicio - Precio, stock y cita copy",
"Cristal digitalizador - Precio y stock",
"LCD - Precio y stock",
"Cristal - Precio y stock"
]
}
},
"type": "n8n-nodes-base.airtableTool",
"typeVersion": 2.1,
"position": [
192,
208
],
"id": "c0812bbc-8c8a-4d0d-91d0-4fcdea36b06f",
"name": "BuscarReparacionesModelo",
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"type": "@n8n/n8n-nodes-langchain.toolThink",
"typeVersion": 1,
"position": [
288,
160
],
"id": "f4334003-8eee-42fe-9958-d5c2c835f6fc",
"name": "Think"
}
],
"connections": {
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"BuscarModelos": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "FiltrarRespuesta",
"type": "main",
"index": 0
}
]
]
},
"FiltrarRespuesta": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"4.1 mini": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"BuscarReparacionesModelo": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Think": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "00000000-0000-0000-0000-000000000000",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "WORKFLOW_ID",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApiopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Presupuesto Modelo. Uses agent, memoryBufferWindow, airtableTool, outputParserStructured. Webhook trigger; 11 nodes.
Source: https://github.com/santifer/cv-santiago/blob/0e5e92954bbd41a06e72bdd23db4b812d80799fa/public/jacobo/workflows/presupuesto-modelo.json — 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.
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
🧠 Gwen – The AI Voice Marketing Agent Gwen is your intelligent voice-powered marketing assistant built in n8n. She combines the power of OpenAI, ElevenLabs, and automation workflows to handle content
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Multi Agent System Benefits. Uses gmailTool, lmChatOpenAi, agent, googleCalendarTool. Event-driven trigger; 46 nodes.