AutomationFlowsAI & RAG › Clinicbot

Clinicbot

ClinicBot. Uses whatsAppTrigger, whatsApp, agent, memoryPostgresChat. Event-driven trigger; 22 nodes.

Event trigger★★★★☆ complexityAI-powered22 nodesWhatsApp TriggerWhatsAppAgentMemory Postgres ChatOpenAI ChatGoogle SheetsPostgres
AI & RAG Trigger: Event Nodes: 22 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Google Sheets 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 →

Download .json
{
  "name": "ClinicBot",
  "nodes": [
    {
      "parameters": {
        "updates": [
          "messages"
        ],
        "options": {}
      },
      "type": "n8n-nodes-base.whatsAppTrigger",
      "typeVersion": 1,
      "position": [
        -448,
        0
      ],
      "id": "744ca61c-764c-4914-ae17-5f436228889a",
      "name": "01 \u00b7 Trigger \u2014 WhatsApp Entrante",
      "credentials": {
        "whatsAppTriggerApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 3
          },
          "conditions": [
            {
              "id": "f66d6e3d-1876-4362-8136-97e50dec055a",
              "leftValue": "={{ $json.messages[0].from }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "exists",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        -224,
        0
      ],
      "id": "15ab96e1-69af-4351-b954-4105ea5a5d5a",
      "name": "02 \u00b7 Filtro \u2014 Mensaje v\u00e1lido"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        -224,
        256
      ],
      "id": "a0f73acc-7f18-4233-b06f-7a1fda87317b",
      "name": "03 \u00b7 End \u2014 Mensaje inv\u00e1lido"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c252e8dd-1040-4371-a571-9eb2f4c4fcb2",
              "name": "telefono",
              "value": "={{ $json.contacts[0].wa_id }}",
              "type": "string"
            },
            {
              "id": "e4b57120-6ef0-46cd-aa1a-6fa333181d85",
              "name": "mensaje",
              "value": "={{ $json.messages[0].text?.body ?? '[Mensaje no textual]' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        0,
        -16
      ],
      "id": "8f48743b-599a-49e4-b63d-3531a439eef6",
      "name": "04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 3
          },
          "conditions": [
            {
              "id": "e6ac38de-b740-440e-94cf-75548597e848",
              "leftValue": "=={{ $json.mensaje }}",
              "rightValue": "[Mensaje no textual]",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        224,
        -16
      ],
      "id": "e20e4ef3-70a6-4414-ad70-0efbadd50a8f",
      "name": "05 \u00b7 Filtro \u2014 \u00bfEs texto?"
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "=YOUR_WHATSAPP_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "=={{ $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono }}",
        "textBody": "Por el momento solo podemos procesar mensajes de texto.  Si necesita ayuda, comun\u00edquese al (011) 4902-8800 o  escr\u00edbanos su consulta. \ud83d\ude4f",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1.1,
      "position": [
        224,
        304
      ],
      "id": "bcf164ab-c447-48f9-aa4d-b93eb5e70813",
      "name": "06 \u00b7 Fallback \u2014 Mensaje no textual",
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.mensaje }}",
        "options": {
          "systemMessage": "Sos el asistente virtual del Centro M\u00e9dico Integral Austral, una cl\u00ednica privada \nubicada en Caballito, Buenos Aires. Tu nombre es \"Asistente de Austral\".\n\n\ud83c\udfad TONO Y ESTILO:\nHabl\u00e1s de usted. Tono c\u00e1lido pero profesional: no fr\u00edo ni burocr\u00e1tico, pero tampoco \ncoloquial. M\u00e1ximo 1 emoji por mensaje, solo cuando suma calidez. NUNCA uses frases \ncomo \"\u00a1Estoy aqu\u00ed para ayudarle!\", \"\u00a1Con gusto lo asisto!\" o cualquier cosa que \nsuene a chatbot de call center o traducci\u00f3n del ingl\u00e9s. Si el paciente usa un tono \ninformal, mantenga el \"usted\" pero adapt\u00e1 la calidez.\n\n\ud83c\udfe5 INFORMACI\u00d3N DE LA CL\u00cdNICA:\nNombre: Centro M\u00e9dico Integral Austral\nDirecci\u00f3n: Av. Rivadavia 5240, Caballito, CABA (a media cuadra del subte A, estaci\u00f3n \nAcoyte)\nTel\u00e9fono: (011) 4902-8800\nHorario de atenci\u00f3n: lunes a viernes de 8 a 20hs, s\u00e1bados de 8 a 13hs.\nFeriados: consultar disponibilidad antes de concurrir.\n\n\ud83d\udccb ESPECIALIDADES:\nCl\u00ednica m\u00e9dica, Cardiolog\u00eda, Traumatolog\u00eda, Ginecolog\u00eda, Pediatr\u00eda, Neurolog\u00eda, \nDermatolog\u00eda, Oftalmolog\u00eda, Kinesiolog\u00eda, Psicolog\u00eda, Nutrici\u00f3n.\n\n\ud83d\udcb3 OBRAS SOCIALES Y PREPAGAS:\nOSDE, Swiss Medical, Galeno, Medicus, IOMA, PAMI, OSPACA, Accord Salud, Omint, \ny las principales obras sociales sindicales. Para casos espec\u00edficos o dudas sobre \ncobertura, confirmar directamente con administraci\u00f3n.\nPacientes particulares: se atiende sin inconvenientes. Se informa el arancel al \nmomento de reservar el turno.\n\n\ud83c\udfaf TU OBJETIVO:\nCalificar al paciente recopilando estos 4 datos:\n1. Nombre completo\n2. Motivo de consulta (s\u00edntoma o especialidad que busca)\n3. Obra social o prepaga (o si es particular)\n4. Tipo de atenci\u00f3n: urgente o turno programado\n\nHacelo de forma natural, nunca como un formulario. Pod\u00e9s preguntar los 4 juntos o \nde a uno seg\u00fan el contexto. Si el paciente ya dio alg\u00fan dato en su primer mensaje, \nno lo repitas.\n\n\u2705 CUANDO TENGAS LOS 4 DATOS:\nRespond\u00e9 EXACTAMENTE con este mensaje, sin modificarlo ni agregarle nada:\n\"Perfecto, ya tenemos todo lo que necesitamos. \ud83d\ude4c Le paso los datos a nuestro \nequipo de admisi\u00f3n, que se va a comunicar con usted a la brevedad para confirmar \nel turno.\"\n\nLuego agreg\u00e1 al final (sin markdown, sin backticks):\nPATIENT_DATA:{\"nombre\":\"valor\",\"motivo\":\"valor\",\"obra_social\":\"valor\",\"urgencia\":\"valor\",\"resumen\":\"resumen breve en una l\u00ednea\"}\n\nEl campo \"urgencia\" debe ser \"urgente\" o \"programado\".\n\n\u26a0\ufe0f DERIVAR A HUMANO:\nDeriv\u00e1 inmediatamente si el paciente:\n- Describe s\u00edntomas de emergencia (dolor en el pecho, dificultad para respirar, \n  p\u00e9rdida de conciencia, etc.)\n- Solicita hablar con un m\u00e9dico o con una persona\n- Hace preguntas sobre diagn\u00f3sticos o tratamientos en curso\n- Expresa angustia o urgencia emocional marcada\n\nEn esos casos:\n1. Respond\u00e9 brevemente si hizo alguna pregunta puntual (direcci\u00f3n, horario, etc.)\n2. Cerr\u00e1 SIEMPRE con EXACTAMENTE este texto, sin modificarlo:\n\"Entiendo. Para este tipo de situaci\u00f3n es mejor que lo asista directamente una \npersona de nuestro equipo. En breve se van a comunicar con usted. \ud83d\ude4f\"\n3. NO agregues nada despu\u00e9s de esa frase.\n\n\u2753 PREGUNTAS FRECUENTES:\nRespond\u00e9 con precisi\u00f3n y brevedad. No des informaci\u00f3n que no figura arriba. Si \nno sab\u00e9s algo, dec\u00ed que lo puede confirmar llamando al (011) 4902-8800.\n\n\u274c L\u00cdMITES:\n- No d\u00e9 diagn\u00f3sticos ni interprete s\u00edntomas.\n- No confirme turnos (eso lo hace el equipo de admisi\u00f3n).\n- No informe aranceles espec\u00edficos (derivar a administraci\u00f3n)."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        640,
        -32
      ],
      "id": "b8c742d7-2288-4a72-be89-2e309b821879",
      "name": "07 \u00b7 Agente \u2014 GPT-4o-mini",
      "retryOnFail": true,
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono }}",
        "contextWindowLength": 20
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        736,
        240
      ],
      "id": "046b42d7-a86f-41c3-8422-a8e147c3df73",
      "name": "08 \u00b7 Memoria \u2014 PostgreSQL",
      "retryOnFail": false,
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "gpt-4o-mini"
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [
        640,
        384
      ],
      "id": "d389c81f-0af4-41c7-b360-78f9507ac36a",
      "name": "09 \u00b7 Modelo \u2014 OpenAI",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 3
          },
          "conditions": [
            {
              "id": "bbae85ca-b2b9-412f-bbb7-acdcad037084",
              "leftValue": "=={{ $json.output }}",
              "rightValue": "={{ null }}",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        992,
        -32
      ],
      "id": "a181ed7e-7302-44c6-ae7a-85e8cb25222b",
      "name": "10 \u00b7 Filtro \u2014 \u00bfError en agente?"
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "=YOUR_WHATSAPP_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "=YOUR_SUPPORT_TEAM_NUMBER",
        "textBody": "=Lamentablemente estamos teniendo una dificultad t\u00e9cnica \nen este momento. Nuestro equipo ya fue notificado y \nalguien se va a comunicar con usted a la brevedad. \nDisculpe las molestias. \ud83d\ude4f",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1.1,
      "position": [
        1680,
        -320
      ],
      "id": "aa0df2d5-40b9-4912-8ea4-3742e279e097",
      "name": "11 \u00b7 Fallback \u2014 Disculpa al paciente",
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "=YOUR_WHATSAPP_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "=YOUR_SUPPORT_TEAM_NUMBER",
        "textBody": "==\u26a0\ufe0f ClinicBot \u2014 Falla en AI Agent (OpenAI).\nTel\u00e9fono del paciente: ={{ $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono }}\nRevisar y contactar manualmente.",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1.1,
      "position": [
        1680,
        -496
      ],
      "id": "d5b74d3e-cd54-4154-b978-21d0214f8233",
      "name": "12 \u00b7 Alerta \u2014 Falla OpenAI",
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const output = $('07 \u00b7 Agente \u2014 GPT-4o-mini').item.json.output;\n\nif (!output || output.trim() === '') {\n  return [{\n    json: {\n      nombre: '', motivo: '', obra_social: '', urgencia: '', resumen: '',\n      telefono: $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono,\n      fecha: new Date().toISOString(),\n      mensaje: '',\n      guardar_en_sheets: false,\n      error: 'output_vacio'\n    }\n  }];\n}\n\ntry {\n  const match = output.match(/PATIENT_DATA:(\\{.*\\})/);\n\n  if (match) {\n    const patientData = JSON.parse(match[1]);\n    const mensaje = output.replace(/PATIENT_DATA:\\{.*\\}/, '').trim();\n    const leadCompleto = patientData.nombre\n      && patientData.motivo\n      && patientData.obra_social\n      && patientData.urgencia;\n\n    return [{\n      json: {\n        nombre:      patientData.nombre      || '',\n        motivo:      patientData.motivo      || '',\n        obra_social: patientData.obra_social || '',\n        urgencia:    patientData.urgencia    || '',\n        resumen:     patientData.resumen     || '',\n        telefono:    $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono,\n        fecha:       new Date().toISOString(),\n        mensaje:     mensaje,\n        guardar_en_sheets: leadCompleto ? true : false,\n        error: null\n      }\n    }];\n  } else {\n    return [{\n      json: {\n        nombre: '', motivo: '', obra_social: '', urgencia: '', resumen: '',\n        telefono: $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono,\n        fecha: new Date().toISOString(),\n        mensaje: output,\n        guardar_en_sheets: false,\n        error: null\n      }\n    }];\n  }\n} catch (e) {\n  return [{\n    json: {\n      nombre: '', motivo: '', obra_social: '', urgencia: '', resumen: '',\n      telefono: $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono,\n      fecha: new Date().toISOString(),\n      mensaje: '',\n      guardar_en_sheets: false,\n      error: 'parse_error'\n    }\n  }];\n}"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1360,
        -16
      ],
      "id": "60c3b17e-181e-44fb-bcfc-06fdf7aeeff9",
      "name": "13 \u00b7 Parser \u2014 PATIENT_DATA"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 3
          },
          "conditions": [
            {
              "id": "3f2cbf09-1eea-4ba9-9d71-7167969cbefe",
              "leftValue": "=={{ $json.error }}",
              "rightValue": "=={{ null }}",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        1360,
        384
      ],
      "id": "5dd67352-7abe-4974-bf65-872dc4288129",
      "name": "14 \u00b7 Filtro \u2014 \u00bfError en parser?"
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "=YOUR_WHATSAPP_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "YOUR_SUPPORT_TEAM_NUMBER",
        "textBody": "={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.mensaje }}",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1.1,
      "position": [
        1648,
        -16
      ],
      "id": "d6c761e5-261c-4ae3-b417-b8dae312203c",
      "name": "15 \u00b7 Respuesta \u2014 WhatsApp al paciente",
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "3f2cbf09-1eea-4ba9-9d71-7167969cbefe",
              "leftValue": "={{ $json.guardar_en_sheets }}",
              "rightValue": "is true",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        1680,
        272
      ],
      "id": "028931ab-5611-4592-8138-d36f10c124de",
      "name": "16 \u00b7 Filtro \u2014 \u00bfLead completo?"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        1888,
        480
      ],
      "id": "d28dbdd6-69af-4648-89db-df6166654bdd",
      "name": "17 \u00b7 End \u2014 Lead incompleto"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
          "mode": "list",
          "cachedResultName": "Leads ClinicBot",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Hoja 1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "FECHA": "={{ $json.fecha }}",
            "TELEFONO": "={{ $json.telefono }}",
            "NOMBRE": "={{ $json.nombre }}",
            "MOTIVO": "={{ $json.motivo }}",
            "OBRA SOCIAL": "={{ $json.obra_social }}",
            "URGENCIA": "={{ $json.urgencia }}",
            "RESUMEN": "={{ $json.resumen }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "FECHA",
              "displayName": "FECHA",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "TELEFONO",
              "displayName": "TELEFONO",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "NOMBRE",
              "displayName": "NOMBRE",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "MOTIVO",
              "displayName": "MOTIVO",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "OBRA SOCIAL",
              "displayName": "OBRA SOCIAL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "URGENCIA",
              "displayName": "URGENCIA",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "RESUMEN",
              "displayName": "RESUMEN",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        1888,
        256
      ],
      "id": "f0d69027-967f-40d6-8db1-0b828fd46e23",
      "name": "18 \u00b7 CRM \u2014 Guardar lead en Sheets",
      "executeOnce": false,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 3
          },
          "conditions": [
            {
              "id": "3f2cbf09-1eea-4ba9-9d71-7167969cbefe",
              "leftValue": "=={{ $json.sheets_ok }}",
              "rightValue": "=={{ true }}",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        2336,
        256
      ],
      "id": "dafe9b95-add0-4053-a022-79ea44877641",
      "name": "19 \u00b7 Filtro \u2014 \u00bfError en Sheets?"
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "=YOUR_WHATSAPP_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "=YOUR_SUPPORT_TEAM_NUMBER",
        "textBody": "=\u26a0\ufe0f ClinicBot \u2014 Falla al guardar en Sheets.\nCargar manualmente:\nNombre: ={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.nombre }}\nMotivo: ={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.motivo }}\nObra social: ={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.obra_social }}\nUrgencia: ={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.urgencia }}\nTel\u00e9fono: ={{ $('13 \u00b7 Parser \u2014 PATIENT_DATA').item.json.telefono }}",
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1.1,
      "position": [
        2544,
        0
      ],
      "id": "93ca1594-c301-42ea-86c6-d86d737c7a62",
      "name": "20 \u00b7 Alerta \u2014 Falla Sheets",
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "DELETE FROM n8n_chat_histories WHERE session_id = $1",
        "options": {
          "queryReplacement": "=={{ $('04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje').item.json.telefono }}"
        }
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        2608,
        272
      ],
      "id": "3920aae6-4e53-4190-ac34-d4306c1b328b",
      "name": "21 \u00b7 Memoria \u2014 Reset sesi\u00f3n PostgreSQL",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "return [{\n  json: {\n    sheets_ok: true\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2096,
        256
      ],
      "id": "348dce4a-e69e-4abf-be24-41d71a980296",
      "name": "Code in JavaScript"
    }
  ],
  "connections": {
    "01 \u00b7 Trigger \u2014 WhatsApp Entrante": {
      "main": [
        [
          {
            "node": "02 \u00b7 Filtro \u2014 Mensaje v\u00e1lido",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "02 \u00b7 Filtro \u2014 Mensaje v\u00e1lido": {
      "main": [
        [
          {
            "node": "04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "03 \u00b7 End \u2014 Mensaje inv\u00e1lido",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "04 \u00b7 Extracci\u00f3n \u2014 Tel\u00e9fono y mensaje": {
      "main": [
        [
          {
            "node": "05 \u00b7 Filtro \u2014 \u00bfEs texto?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05 \u00b7 Filtro \u2014 \u00bfEs texto?": {
      "main": [
        [
          {
            "node": "07 \u00b7 Agente \u2014 GPT-4o-mini",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "06 \u00b7 Fallback \u2014 Mensaje no textual",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "07 \u00b7 Agente \u2014 GPT-4o-mini": {
      "main": [
        [
          {
            "node": "10 \u00b7 Filtro \u2014 \u00bfError en agente?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "08 \u00b7 Memoria \u2014 PostgreSQL": {
      "ai_memory": [
        [
          {
            "node": "07 \u00b7 Agente \u2014 GPT-4o-mini",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "09 \u00b7 Modelo \u2014 OpenAI": {
      "ai_languageModel": [
        [
          {
            "node": "07 \u00b7 Agente \u2014 GPT-4o-mini",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "10 \u00b7 Filtro \u2014 \u00bfError en agente?": {
      "main": [
        [
          {
            "node": "13 \u00b7 Parser \u2014 PATIENT_DATA",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "11 \u00b7 Fallback \u2014 Disculpa al paciente",
            "type": "main",
            "index": 0
          },
          {
            "node": "12 \u00b7 Alerta \u2014 Falla OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13 \u00b7 Parser \u2014 PATIENT_DATA": {
      "main": [
        [
          {
            "node": "15 \u00b7 Respuesta \u2014 WhatsApp al paciente",
            "type": "main",
            "index": 0
          },
          {
            "node": "14 \u00b7 Filtro \u2014 \u00bfError en parser?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "14 \u00b7 Filtro \u2014 \u00bfError en parser?": {
      "main": [
        [
          {
            "node": "11 \u00b7 Fallback \u2014 Disculpa al paciente",
            "type": "main",
            "index": 0
          },
          {
            "node": "12 \u00b7 Alerta \u2014 Falla OpenAI",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "16 \u00b7 Filtro \u2014 \u00bfLead completo?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "16 \u00b7 Filtro \u2014 \u00bfLead completo?": {
      "main": [
        [
          {
            "node": "18 \u00b7 CRM \u2014 Guardar lead en Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "17 \u00b7 End \u2014 Lead incompleto",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "18 \u00b7 CRM \u2014 Guardar lead en Sheets": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "19 \u00b7 Filtro \u2014 \u00bfError en Sheets?": {
      "main": [
        [
          {
            "node": "20 \u00b7 Alerta \u2014 Falla Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "21 \u00b7 Memoria \u2014 Reset sesi\u00f3n PostgreSQL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "19 \u00b7 Filtro \u2014 \u00bfError en Sheets?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "versionId": "9a223972-3ba5-4c91-901c-e81a35b384fa",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "knsih6Ns5nkHzQyV",
  "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

ClinicBot. Uses whatsAppTrigger, whatsApp, agent, memoryPostgresChat. Event-driven trigger; 22 nodes.

Source: https://github.com/fabrogarrido/clinicbot-whatsapp-n8n/blob/main/ClinicBot.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

CashMate – Your AI-Powered WhatsApp Finance Agent Turn WhatsApp into a smart finance assistant that auto-registers you, logs transactions in natural language, extracts data from receipts and voice not

Tool Code, Output Parser Structured, Tool Calculator +6
AI & RAG

This workflow creates a complete AI-powered restaurant ordering system through WhatsApp. It receives customer messages, processes multimedia content (text, voice, images, PDFs, location), uses GPT-4 t

OpenAI Chat, Memory Postgres Chat, HTTP Request +6
AI & RAG

⚠️ EDUCATIONAL DEMONSTRATION ONLY - NOT FOR PRODUCTION MEDICAL USE ⚠️

Agent, Memory Postgres Chat, OpenAI Chat +7
AI & RAG

Streamline restaurant reservations on WhatsApp

WhatsApp, WhatsApp Trigger, Agent +5
AI & RAG

This n8n workflow automates lead engagement and qualification for real estate buyers. When someone submits a form on your real estate website, the system instantly responds via SMS, starting a convers

Form Trigger, Memory Postgres Chat, OpenAI Chat +6