AutomationFlowsAI & RAG › Triage Telehealth Appointments with Gpt-4o-mini, Telegram, Google Calendar

Triage Telehealth Appointments with Gpt-4o-mini, Telegram, Google Calendar

ByRahul Joshi @rahul08 on n8n.io

This workflow collects telehealth appointment details via an n8n Form, uses OpenAI (GPT-4o-mini) to score no-show risk, then sends Telegram reminders and confirmations and updates Google Calendar based on the patient’s response, with Slack alerts on workflow errors. Receives a…

Event trigger★★★★☆ complexityAI-powered26 nodesForm TriggerAgentOpenAI ChatTelegramGoogle CalendarError TriggerSlack
AI & RAG Trigger: Event Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16605 — we link there as the canonical source.

This workflow follows the Agent → Error Trigger 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
{
  "id": "1flMAuoR4CmQOLH5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Telehealth Appointment Confirmation & Rescheduling Assistant",
  "tags": [],
  "nodes": [
    {
      "id": "a4606b4f-161e-4c13-84e6-5100ca2a4657",
      "name": "\ud83d\udccb Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1760,
        1376
      ],
      "parameters": {
        "width": 620,
        "height": 444,
        "content": "## \ud83c\udfe5 Patient Appointment No-Show Prevention\n\n### How it works\nWhen a new appointment is booked via the n8n form, this workflow uses GPT-4o-mini to predict the patient's no-show risk based on their history, booking channel, insurance type, and appointment details. High-risk patients (score \u2265 70) receive escalating Telegram reminders, including a final confirmation prompt. Based on their reply, the workflow either confirms their slot in Google Calendar or cancels and opens the slot for waitlisted patients. Low-risk patients get a simple friendly reminder.\n\n### Setup steps\n1. Connect your **Telegram Bot** credentials (used for all patient messages)\n2. Connect your **OpenAI** API key (GPT-4o-mini for risk scoring)\n3. Connect your **Google Calendar** OAuth2 account for slot management\n4. Update the form path and calendar ID to match your environment\n5. Test with the pinned sample patient data before going live\n6. Adjust the risk score threshold (default: 70) in the IF node if needed"
      },
      "typeVersion": 1
    },
    {
      "id": "99b5bedd-d4e4-4edc-a8b2-39edee9fd7fa",
      "name": "Section: Intake & AI Scoring",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1088,
        1648
      ],
      "parameters": {
        "color": 7,
        "width": 644,
        "height": 644,
        "content": "## \ud83d\udccb Intake & AI Risk Scoring\nCollects appointment details from the booking form, then passes them to GPT-4o-mini to produce a 0\u2013100 no-show risk score. The parsed score and patient data flow into the routing decision."
      },
      "typeVersion": 1
    },
    {
      "id": "50d5fee9-37f6-44f7-905f-2acc4d5486ee",
      "name": "Section: High-Risk Outreach",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        1696
      ],
      "parameters": {
        "color": 7,
        "width": 1228,
        "height": 608,
        "content": "## \ud83d\udce3 High-Risk Outreach\nSends escalating Telegram messages: first a reminder, then a high-priority alert, then a final confirmation request. Waits up to 2 hours for the patient to respond before proceeding."
      },
      "typeVersion": 1
    },
    {
      "id": "21f23c9d-63f0-499a-bf43-5ed57c8402a9",
      "name": "Section: Calendar & Slot Management",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1632,
        1568
      ],
      "parameters": {
        "color": 7,
        "width": 1000,
        "height": 832,
        "content": "## \ud83d\udcc5 Calendar & Slot Management\nIf the patient cancels, a reschedule slot is created in Google Calendar and the admin is notified of the freed-up slot. If they confirm, the original event is updated with a confirmation note."
      },
      "typeVersion": 1
    },
    {
      "id": "75dd5b95-d65c-4af8-8fb9-2f2a9925782d",
      "name": "Security Notes",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2736,
        2224
      ],
      "parameters": {
        "color": 3,
        "width": 316,
        "height": 188,
        "content": "## \ud83d\udd10 Credentials & Security\nUse named credential sets for Telegram Bot, OpenAI, and Google Calendar OAuth2. Never paste raw tokens into node fields. Replace all sample email/calendar IDs with your own before publishing."
      },
      "typeVersion": 1
    },
    {
      "id": "0316c4d3-a98e-40b9-b6e8-1bbbf0421a34",
      "name": "Appointment Booked (n8n Form)",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -1024,
        1904
      ],
      "parameters": {
        "path": "854db136-de34-45cf-a35b-6cb109d94ad4",
        "options": {},
        "formTitle": "New Appointment Booking",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Patient Name",
              "requiredField": true
            },
            {
              "fieldLabel": "Telegram Chat ID",
              "placeholder": "e.g. 123456789",
              "requiredField": true
            },
            {
              "fieldType": "date",
              "fieldLabel": "Appointment Date",
              "requiredField": true
            },
            {
              "fieldLabel": "Appointment Time",
              "placeholder": "e.g. 10:30 AM",
              "requiredField": true
            },
            {
              "fieldLabel": "Appointment Type",
              "placeholder": "e.g. General Checkup",
              "requiredField": true
            },
            {
              "fieldType": "number",
              "fieldLabel": "Previous No-Shows"
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Booking Channel",
              "fieldOptions": {
                "values": [
                  {
                    "option": "online"
                  },
                  {
                    "option": "phone"
                  },
                  {
                    "option": "walk-in"
                  }
                ]
              }
            },
            {
              "fieldLabel": "Insurance Type",
              "placeholder": "e.g. Private / Government"
            },
            {
              "fieldLabel": "Google Calendar Event ID",
              "placeholder": "Paste Google Calendar Event ID if existing"
            }
          ]
        },
        "responseMode": "lastNode",
        "formDescription": "Please fill in the patient appointment details below."
      },
      "typeVersion": 2
    },
    {
      "id": "13d1f8f5-c529-42dd-bf29-572751909055",
      "name": "AI: Predict No-Show Risk",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "onError": "continueErrorOutput",
      "position": [
        -720,
        1904
      ],
      "parameters": {
        "text": "=Predict the no-show risk for this patient appointment:\n\n- Patient Name: {{ $json['Patient Name'] }}\n- Appointment Date: {{ $json['Appointment Date'] }}\n- Appointment Time: {{ $json['Appointment Time'] }}\n- Appointment Type: {{ $json['Appointment Type'] }}\n- Previous No-Shows: {{ $json['Previous No-Shows'] }}\n- Booking Channel: {{ $json['Booking Channel'] }}\n- Insurance Type: {{ $json['Insurance Type'] }}\n\nRisk score rules:\n- 0\u201339 = low risk\n- 40\u201369 = medium risk\n- 70\u2013100 = high risk\n\nReturn ONLY this JSON object, nothing else:\n{\n  \"risk_score\": <integer 0-100>,\n  \"risk_level\": \"<low | medium | high>\",\n  \"reason\": \"<one sentence explanation>\"\n}",
        "options": {
          "systemMessage": "You are a medical appointment no-show risk predictor. Always return valid JSON only \u2014 no extra text, no markdown fences, no code blocks."
        },
        "promptType": "define"
      },
      "retryOnFail": false,
      "typeVersion": 3
    },
    {
      "id": "55bdba1b-344e-4edd-a650-b147f39430fe",
      "name": "OpenAI GPT-4o-mini",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -800,
        2128
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "1ad899d3-5fba-4e1a-a8e1-41f6d2644bbe",
      "name": "Parse AI Risk Score",
      "type": "n8n-nodes-base.code",
      "position": [
        -320,
        1904
      ],
      "parameters": {
        "jsCode": "const raw = $input.first().json.text || $input.first().json.content?.[0]?.text || '{}';\nlet parsed;\ntry {\n  parsed = JSON.parse(raw.replace(/```json|```/g, '').trim());\n} catch(e) {\n  parsed = { risk_score: 50, risk_level: 'medium', reason: 'parse error' };\n}\nreturn [{ json: { ...parsed, patient: $('Appointment Booked (n8n Form)').first().json } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "15f50eb4-e5b8-4a35-a2e5-b3939e4cc04e",
      "name": "High Risk? (score >= 70)",
      "type": "n8n-nodes-base.if",
      "position": [
        -112,
        1904
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json.risk_score }}",
              "value2": 70,
              "operation": "largerEqual"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a724197a-528d-465d-8b05-a2f9c825ffa5",
      "name": "Telegram: Send Appointment Reminder",
      "type": "n8n-nodes-base.telegram",
      "position": [
        368,
        1888
      ],
      "parameters": {
        "text": "=\ud83d\udc4b *Appointment Reminder*\n\nHi  {{ $json.patient['Patient Name'] }}, just a friendly reminder about your upcoming appointment:\n\n\ud83d\udcc5 *Date:* {{ $json.patient['Appointment Date'] }}\n\ud83d\udd50 *Time:* {{ $json.patient['Appointment Time'] }}\n\ud83c\udfe5 *Type:* {{ $json.patient['Appointment Type'] }}\n\nSee you then! \ud83d\ude0a",
        "chatId": "={{ $json.patient[\"Telegram Chat ID\"] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2c0b22cb-740d-4f7e-8a7f-d2534585d35d",
      "name": "Telegram: High-Risk Follow-Up Alert",
      "type": "n8n-nodes-base.telegram",
      "position": [
        608,
        1888
      ],
      "parameters": {
        "text": "=\ud83d\udce2 *High Priority Reminder*\n\nHello {{ $('High Risk? (score >= 70)').item.json.patient['Patient Name'] }},\n\nOur system has flagged your appointment as at risk of being missed. Please confirm:\n\n\ud83d\udcc5 *Date:* {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Date'] }}\n\ud83d\udd50 *Time:* {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Time'] }}\n\nReply *YES* to confirm or *RESCHEDULE* if you cannot attend.\n\nRisk reason: {{ $('High Risk? (score >= 70)').item.json.reason }}",
        "chatId": "={{ $('High Risk? (score >= 70)').item.json.patient[\"Telegram Chat ID\"] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "774e055f-4dcd-454e-b242-4299ae3d1785",
      "name": "Telegram: Final Urgent Confirmation Request",
      "type": "n8n-nodes-base.telegram",
      "position": [
        848,
        1888
      ],
      "parameters": {
        "chatId": "={{ $('High Risk? (score >= 70)').item.json.patient[\"Telegram Chat ID\"] }}",
        "message": "=\ud83d\udcde *Final Reminder \u2014 Action Required*\n\nDear {{ $('High Risk? (score >= 70)').item.json.patient['Patient Name'] }},\n\nThis is your final reminder for your appointment on * {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Date'] }}* at * {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Time'] }}*.\n\nIf you do not confirm, your slot may be given to another patient.\n\nReply *CONFIRM* or *CANCEL* now.",
        "options": {},
        "operation": "sendAndWait"
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5aeae1ee-a053-4b0e-b36d-28e28d4710a5",
      "name": "Wait 2 Hours for Patient Response",
      "type": "n8n-nodes-base.wait",
      "position": [
        1104,
        1888
      ],
      "parameters": {
        "unit": "seconds",
        "amount": 2
      },
      "typeVersion": 1
    },
    {
      "id": "8f5ea4c6-e54a-4843-9171-e9b186324adb",
      "name": "Patient Cannot Attend?",
      "type": "n8n-nodes-base.if",
      "position": [
        1376,
        1888
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.data.approved }}",
              "value2": "true",
              "operation": "contains"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "69f70043-774b-4237-83e7-f30b3f83c838",
      "name": "Google Calendar: Create Reschedule Slot",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        1744,
        1808
      ],
      "parameters": {
        "end": "={{ $('High Risk? (score >= 70)').item.json.patient['Appointment Date'] }}T09:30:00",
        "start": "={{ $('High Risk? (score >= 70)').item.json.patient['Appointment Date'] }}T09:00:00",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "user@example.com"
        },
        "additionalFields": {
          "summary": "=Rescheduled: {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Type'] }} \u2014 {{ $('High Risk? (score >= 70)').item.json.patient['Patient Name'] }}",
          "description": "=Appointment rescheduled via automated outreach system.\nPatient: {{ $('High Risk? (score >= 70)').item.json.patient['Patient Name'] }}\nOriginal slot was released by patient."
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3b8e5b2b-ed06-4f27-94b2-f77eebb20bca",
      "name": "Telegram: Send Reschedule Confirmation",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2000,
        1808
      ],
      "parameters": {
        "text": "=\u2705 *Reschedule Confirmed*\n\nHi  {{ $('High Risk? (score >= 70)').item.json.patient['Patient Name'] }}, your appointment has been cancelled and a new slot is being prepared for you.\n\nOur team will contact you shortly to confirm your new appointment time.\n\nThank you for letting us know! \ud83d\ude4f",
        "chatId": "={{ $('High Risk? (score >= 70)').item.json.patient['Telegram Chat ID'] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "31febf4d-d899-4927-851d-d326651651e7",
      "name": "Google Calendar: Check Waitlist Slots",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        2256,
        1808
      ],
      "parameters": {
        "limit": 5,
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "user@example.com"
        },
        "operation": "getAll"
      },
      "typeVersion": 1
    },
    {
      "id": "0b9f81ab-dce2-43d8-87a1-f22bd61013b4",
      "name": "Telegram: Notify Admin of Free Slot",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2512,
        1808
      ],
      "parameters": {
        "text": "=\ud83d\udd14 *Waitlist Alert \u2014 Slot Available!*\n\nA slot has opened up:\n\ud83d\udcc5 *Date:* {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Date'] }}\n\ud83d\udd50 *Time:* {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Time'] }}\n\ud83c\udfe5 *Type:* {{ $('High Risk? (score >= 70)').item.json.patient['Appointment Type'] }}\n\nPlease contact the next waitlist patient and book them via Google Calendar.\n\n",
        "chatId": "={{ $('High Risk? (score >= 70)').item.json.patient[\"Telegram Chat ID\"] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "840baad3-cfde-4cd0-b708-21d7c3ae9dc9",
      "name": "Google Calendar: Mark Event as Confirmed",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        1856,
        2224
      ],
      "parameters": {
        "eventId": "={{ $json.patient.event_id }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "user@example.com"
        },
        "operation": "update",
        "updateFields": {
          "description": "=Patient confirmed attendance via Telegram automated outreach.\nPatient: {{ $json.patient.patient_name }}"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2e798c57-334e-4073-9183-5f75ee791bc5",
      "name": "Telegram: Send Confirmed Appointment Message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2160,
        2224
      ],
      "parameters": {
        "text": "=\ud83c\udf89 *You're All Set!*\n\nThank you {{ $json.patient.patient_name }}!\n\nYour appointment is *confirmed*:\n\ud83d\udcc5 *Date:* {{ $json.patient.appointment_date }}\n\ud83d\udd50 *Time:* {{ $json.patient.appointment_time }}\n\ud83c\udfe5 *Type:* {{ $json.patient.appointment_type }}\n\nSee you then! If anything changes, please let us know. \ud83d\ude0a",
        "chatId": "={{ $('High Risk? (score >= 70)').item.json.patient[\"Telegram Chat ID\"] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1e3ac478-a5a4-4d6a-af1e-5f73222b4e2d",
      "name": "Telegram: Send Low-Risk Reminder",
      "type": "n8n-nodes-base.telegram",
      "position": [
        112,
        2144
      ],
      "parameters": {
        "text": "=\ud83d\udc4b *Appointment Reminder*\n\nHi  {{ $json.patient['Patient Name'] }}, just a friendly reminder about your upcoming appointment:\n\n\ud83d\udcc5 *Date:* {{ $json.patient['Appointment Date'] }}\n\ud83d\udd50 *Time:* {{ $json.patient['Appointment Time'] }}\n\ud83c\udfe5 *Type:* {{ $json.patient['Appointment Type'] }}\n\nSee you then! \ud83d\ude0a",
        "chatId": "={{ $json.patient[\"Telegram Chat ID\"] }}",
        "additionalFields": {
          "parse_mode": "Markdown"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8db20c66-4e57-4106-b029-135d5ee3fecb",
      "name": "Section: Risk Routing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        1712
      ],
      "parameters": {
        "color": 7,
        "width": 708,
        "height": 656,
        "content": "## \ud83d\udd00 Risk Routing\nSplits patients into two tracks: high-risk (score \u2265 70) goes through escalated outreach; low-risk receives a single friendly reminder. Adjust the threshold in the IF node to tune sensitivity."
      },
      "typeVersion": 1
    },
    {
      "id": "6a1422f6-ad51-4c4d-ac66-87ddc1e761b2",
      "name": "On Workflow Error",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        -992,
        2624
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "beb1a15a-96f9-419c-85b7-657368d54d88",
      "name": "Slack: Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        -736,
        2624
      ],
      "parameters": {
        "text": "=Error occured ",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AN1UGL0RM",
          "cachedResultName": "all-n8n-automations"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "6c69f216-d679-4370-95c8-193898f88fad",
      "name": "Section: Error Handler",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1072,
        2480
      ],
      "parameters": {
        "color": 7,
        "width": 540,
        "height": 360,
        "content": "## \u26a0\ufe0f Error Handler\nCatches any failure across the entire workflow and immediately sends a Slack alert to the ops channel. Wire this to every sub-workflow or critical node to ensure no silent failures."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "e85cb0d3-7ec3-4d85-ae66-437a9e6f8190",
  "connections": {
    "On Workflow Error": {
      "main": [
        [
          {
            "node": "Slack: Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI GPT-4o-mini": {
      "ai_languageModel": [
        [
          {
            "node": "AI: Predict No-Show Risk",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Risk Score": {
      "main": [
        [
          {
            "node": "High Risk? (score >= 70)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Patient Cannot Attend?": {
      "main": [
        [
          {
            "node": "Google Calendar: Create Reschedule Slot",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Google Calendar: Mark Event as Confirmed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Predict No-Show Risk": {
      "main": [
        [
          {
            "node": "Parse AI Risk Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "High Risk? (score >= 70)": {
      "main": [
        [
          {
            "node": "Telegram: Send Appointment Reminder",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Telegram: Send Low-Risk Reminder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Telegram: Send Appointment Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Appointment Booked (n8n Form)": {
      "main": [
        [
          {
            "node": "AI: Predict No-Show Risk",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 2 Hours for Patient Response": {
      "main": [
        [
          {
            "node": "Patient Cannot Attend?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram: High-Risk Follow-Up Alert": {
      "main": [
        [
          {
            "node": "Telegram: Final Urgent Confirmation Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram: Send Appointment Reminder": {
      "main": [
        [
          {
            "node": "Telegram: High-Risk Follow-Up Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar: Check Waitlist Slots": {
      "main": [
        [
          {
            "node": "Telegram: Notify Admin of Free Slot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram: Send Reschedule Confirmation": {
      "main": [
        [
          {
            "node": "Google Calendar: Check Waitlist Slots",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar: Create Reschedule Slot": {
      "main": [
        [
          {
            "node": "Telegram: Send Reschedule Confirmation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Calendar: Mark Event as Confirmed": {
      "main": [
        [
          {
            "node": "Telegram: Send Confirmed Appointment Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram: Final Urgent Confirmation Request": {
      "main": [
        [
          {
            "node": "Wait 2 Hours for Patient Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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

This workflow collects telehealth appointment details via an n8n Form, uses OpenAI (GPT-4o-mini) to score no-show risk, then sends Telegram reminders and confirmations and updates Google Calendar based on the patient’s response, with Slack alerts on workflow errors. Receives a…

Source: https://n8n.io/workflows/16605/ — 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

This workflow is an AI-powered virtual cinematography and previs generation pipeline designed for film and VFX production. It transforms a director’s shot description into multiple camera choreography

Agent, Lm Chat Azure Open Ai, HTTP Request +7
AI & RAG

Door-to-door HVAC companies seeking automated lead capture and appointment scheduling.

Form Trigger, Google Sheets, Agent +7
AI & RAG

This workflow analyzes meeting transcripts using AI to understand team sentiment, engagement, and morale. The results are saved in Google Sheets for easy tracking and review. It receives meeting data

Error Trigger, Gmail, HTTP Request +4
AI & RAG

BoomerBobBot.TP. Uses agent, telegramTrigger, telegram, memoryBufferWindow. Event-driven trigger; 95 nodes.

Agent, Telegram Trigger, Telegram +10
AI & RAG

Agent Nodes. Uses lmChatOpenAi, slack, stopAndError, errorTrigger. Event-driven trigger; 72 nodes.

OpenAI Chat, Slack, Stop And Error +12