{
“nodes”: [
{
“parameters”: {
“respondWith”: “json”,
“responseBody”: “={\n “results”: [\n {\n “toolCallId”: “{{ $(‘Webhook’).item.json.body.message.toolCalls[0].id }}”,\n “result”: “{{ $json.output }}”\n }\n ]\n}”,
“options”: {}
},
“type”: “n8n-nodes-base.respondToWebhook”,
“typeVersion”: 1.4,
“position”: [
448,
-48
],
“id”: “0453c6f0-f7c7-4f78-a318-4d3b6a52463f”,
“name”: “Respond to Webhook”
},
{
“parameters”: {
“description”: “Llama a esta herramienta para encontrar un registro con la fecha y hora y el tipo de mesa que quiere reservar el cliente”,
“workflowId”: {
“__rl”: true,
“value”: “HNAIg4z8K4r1TH1o”,
“mode”: “list”,
“cachedResultName”: “Verificar_horas_disponibles”
},
“workflowInputs”: {
“mappingMode”: “defineBelow”,
“value”: {},
“matchingColumns”: ,
“schema”: ,
“attemptToConvertTypes”: false,
“convertFieldsToString”: false
}
},
“type”: “@n8n/n8n-nodes-langchain.toolWorkflow”,
“typeVersion”: 2.2,
“position”: [
208,
208
],
“id”: “182d1d8d-067a-4cb0-b519-25cfbd27b521”,
“name”: “Call n8n Workflow Tool”
},
{
“parameters”: {
“promptType”: “define”,
“text”: “=Hora: {{ $json.Hora }}\nFecha:{{ $json.Fecha }}\nTipo_de_mesa:{{ $json.Tipo_de_mesa }}\nNumero_de_personas:{{ $json.Numero_de_personas }}\nNombre:{{ $json.Nombre }}\nTelefono:{{ $json.Telefono }}\nNotas:{{ $json.Notas }}\n”,
“options”: {
“systemMessage”: “Tu misión es obtener un registro con la fecha y la hora y el tipo de terraza que quiere el cliente y actualizar los datos con los datos del cliente. Finalmente tienes que notificar al cliente de que su mesa ha sido agendada con éxito.\nSi el usuario quiere reservar una mesa, usa la herramienta Update record in Airtable con los datos proporcionados”
}
},
“type”: “@n8n/n8n-nodes-langchain.agent”,
“typeVersion”: 2.2,
“position”: [
96,
-48
],
“id”: “a6168f03-a429-4954-94c3-be9afa7b87e4”,
“name”: “AI Agent”
},
{
“parameters”: {
“operation”: “update”,
“base”: {
“__rl”: true,
“value”: “apps6XgowR8Fxo80V”,
“mode”: “list”,
“cachedResultName”: “Reservas Restaurante”,
“cachedResultUrl”: “https://airtable.com/apps6XgowR8Fxo80V”
},
“table”: {
“__rl”: true,
“value”: “tbldy31X1F0bhB2P2”,
“mode”: “list”,
“cachedResultName”: “Reservas”,
“cachedResultUrl”: “https://airtable.com/apps6XgowR8Fxo80V/tbldy31X1F0bhB2P2”
},
“columns”: {
“mappingMode”: “defineBelow”,
“value”: {
“Hora”: “={{ /n8n-auto-generated-fromAI-override/ $fromAI(‘Hora’, , 'string') }}", "Fecha": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Fecha', , ‘string’) }}”,
“Nombre”: “={{ /n8n-auto-generated-fromAI-override/ $fromAI(‘Nombre’, , 'string') }}", "Telefono": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Telefono', , ‘string’) }}”,
“Tipo_de_mesa”: “={{ /n8n-auto-generated-fromAI-override/ $fromAI(‘Tipo_de_mesa’, , 'string') }}", "Numero_de_personas": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Numero_de_personas', , ‘number’) }}”,
“Notas”: “={{ /n8n-auto-generated-fromAI-override/ $fromAI(‘Notas’, , 'string') }}", "Disponibilidad": "Reservada", "id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('id__using_to_match_', , ‘string’) }}”
},
“matchingColumns”: [
“id”
],
“schema”: [
{
“id”: “id”,
“displayName”: “id”,
“required”: false,
“defaultMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: true,
“removed”: false
},
{
“id”: “Hora”,
“displayName”: “Hora”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Fecha”,
“displayName”: “Fecha”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “dateTime”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Nombre”,
“displayName”: “Nombre”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Telefono”,
“displayName”: “Telefono”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Tipo_de_mesa”,
“displayName”: “Tipo_de_mesa”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Numero_de_personas”,
“displayName”: “Numero_de_personas”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “number”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Notas”,
“displayName”: “Notas”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “string”,
“readOnly”: false,
“removed”: false
},
{
“id”: “Disponibilidad”,
“displayName”: “Disponibilidad”,
“required”: false,
“defaultMatch”: false,
“canBeUsedToMatch”: true,
“display”: true,
“type”: “options”,
“options”: [
{
“name”: “Disponible”,
“value”: “Disponible”
},
{
“name”: “Reservada”,
“value”: “Reservada”
}
],
“readOnly”: false,
“removed”: false
}
],
“attemptToConvertTypes”: false,
“convertFieldsToString”: false
},
“options”: {}
},
“type”: “n8n-nodes-base.airtableTool”,
“typeVersion”: 2.1,
“position”: [
352,
192
],
“id”: “ae50d4c5-b729-4828-9cc4-286b92934851”,
“name”: “Update record in Airtable”,
“credentials”: {
“airtableTokenApi”: {
“id”: “KULsK12nE0ouaktW”,
“name”: “Airtable Personal Access Token account”
}
}
}
],
“connections”: {
“Call n8n Workflow Tool”: {
“ai_tool”: [
[
{
“node”: “AI Agent”,
“type”: “ai_tool”,
“index”: 0
}
]
]
},
“AI Agent”: {
“main”: [
[
{
“node”: “Respond to Webhook”,
“type”: “main”,
“index”: 0
}
]
]
},
“Update record in Airtable”: {
“ai_tool”: [
[
{
“node”: “AI Agent”,
“type”: “ai_tool”,
“index”: 0
}
]
]
}
},
“pinData”: {
“Respond to Webhook”: [
{
“output”: “La mesa para la terraza a las 16:30 del día 2025-09-17 está disponible, pero he tenido un problema al guardar tu reserva en el sistema. ¿Podrías verificar los datos o si deseas, puedo intentarlo nuevamente?”
}
],
“AI Agent”: [
{
“output”: “La mesa para la terraza a las 16:30 del día 2025-09-17 está disponible, pero he tenido un problema al guardar tu reserva en el sistema. ¿Podrías verificar los datos o si deseas, puedo intentarlo nuevamente?”
}
]
},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “f60311e5337308d0f8c1efc4eb99285eaa09f21ca35ef2312c7c2dbb6e8d80b9”
}
}
Yes, unfortunately, when taken out of context, i cannot see the input for the Update Record in Airtable node. Let’s see if you can add other nodes as well.
{
“nodes”: [
{
“parameters”: {
“assignments”: {
“assignments”: [
{
“id”: “d9b65947-197d-4da7-b879-5c4ac02964ae”,
“name”: “Hora”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Hora }}”,
“type”: “string”
},
{
“id”: “af1aeea9-31d0-4d04-9f27-a30068b65aab”,
“name”: “Fecha”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Fecha }}”,
“type”: “string”
},
{
“id”: “492818d0-2a0f-41a9-b7bb-edfb6581d1af”,
“name”: “Tipo_de_mesa”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Tipo_de_mesa }}”,
“type”: “string”
},
{
“id”: “3c9705e3-feca-4305-9cb9-6570799f7ca4”,
“name”: “Numero_de_personas”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Numero_de_personas }}”,
“type”: “string”
},
{
“id”: “0a2f5c5c-6d16-4db2-8723-bcde586d0187”,
“name”: “Nombre”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Nombre }}”,
“type”: “string”
},
{
“id”: “bd0be31d-4237-47a4-a099-8120b9002576”,
“name”: “Telefono”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Telefono }}”,
“type”: “string”
},
{
“id”: “aa9ce4a7-5376-4342-b79a-76a434eed38e”,
“name”: “Notas”,
“value”: “={{ $(‘Webhook’).item.json.body.message.toolCalls[0].function.arguments.Notas }}”,
“type”: “string”
}
]
},
“options”: {}
},
“type”: “n8n-nodes-base.set”,
“typeVersion”: 3.4,
“position”: [
-112,
-48
],
“id”: “afc49e8b-a80e-411c-b9de-425fc42657c5”,
“name”: “Edit Fields”
}
],
“connections”: {
“Edit Fields”: {
“main”: [
]
}
},
“pinData”: {
“Edit Fields”: [
{
“Hora”: “16:30”,
“Fecha”: “2025-09-17”,
“Tipo_de_mesa”: “terraza”,
“Numero_de_personas”: “2”,
“Nombre”: “Rosa”,
“Telefono”: “666778899”,
“Notas”: “Muy buen restaurante.”
}
]
},
“meta”: {
“templateCredsSetupCompleted”: true,
“instanceId”: “f60311e5337308d0f8c1efc4eb99285eaa09f21ca35ef2312c7c2dbb6e8d80b9”
}
}
Nowhere in the provided nodes I can see the “id” field. Where is it coming from?
Please, if you paste the JSON here, use code blocks (pre-formatted text tags) - </>.
This is the JSON of update record in airtable:
[
{
"Hora": "16:30",
"Fecha": "2025-09-17",
"Nombre": "Rosa",
"Telefono": "666878899",
"Tipo_de_mesa": "terraza",
"Numero_de_personas": 3,
"Notas": "",
"id_using_to_match": "rec9PoW0NnjEQJ86"
}
]
And where is the ID field in this update?
I think and chatgpt too is: “id_using_to_match”: “rec9PoW0NnjEQJ86”
ok, this could be the ID if named by the agent when using fromAI() or “magic” button. So the ID is passed to the tool then, let’s take a step back then, what is the problem? If started as a problem with “tipo the mesa” and “numero de personas”, then we were talking about yellow button, and lately it shifted to the “id”. Was there a reason you tried to change from “$fromAI()” to “$json[‘id’]”?
You’re right — originally I was using $fromAI["id_using_to_match"] (coming from the AI mapping), but later I tried to replace it with $json["id"] because I thought Airtable required it.
That’s when the error started.
So to confirm: should I just keep $fromAI["id_using_to_match"] in the Airtable node as the Record ID?
What can I do?
Try to use TypeCast in options. Go to options add Typecast and enable it. See if this helps.
Let me try to create a simple example, which you could try to follow to see how it works:
I have two workflows:
- The AI agent workflow, which has two tools -
- get new/updated values (subworkflow node)
- update record in airtable (airtable node)
Subworkflow returns static data to emulate the update.
Currently my database has the record with Numero de personas equal to 3, in the updated info the value is changed to 5.
I opened the chat and asked the agent to update the record:
Everything ran successfully:
Final table state:
Thank you so much!! That was the solution!! Incredible! Could you please help me with this last problem, which is the only workflow I’m missing? It’s about canceling the order, and the one in the video doesn’t show all the code, so it doesn’t send the result correctly. It captures the screenshots: (he is the white)
Could you explain what should happen when the order is canceled?
The code must select the data that matches to identify the client and thus modify that


















