Help Airtable Update Record Error with n8n

{
“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”
}
}

I sent you this nodes, if you need the others or the subworkflow please let me know! :blush:

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?

Aside from the output function and the workflow, when working on the AirTable table it deletes the data as you can see in these images from the guy’s video:

The code must select the data that matches to identify the client and thus modify that

This would work exactly the same way - you need to have a way to get the record id or ids for the records which need to be deleted, then you add the Airtable tool with Resource: Record, Operation: Delete and feed record ids from to that tool

Why is this happening to me? I should cancel it, and it doesn’t go to those three tools. By the way, the chat is more for call agents, only it’s being tested from a chat, so I think a webhook is better. Also, in some workflows, it ignores Airtable. How is that possible? Thanks.

Ai agents:
Cancelar mesa

Comprobar_mesa

Maybe you should do it like the one in the video so Vapi can understand it better with the tools