AutomationFlowsData & Sheets › Dental Clinic - Automated Reminders

Dental Clinic - Automated Reminders

Dental Clinic - Automated Reminders. Uses googleSheets, n8n-nodes-evolution-api. Scheduled trigger; 7 nodes.

Cron / scheduled trigger★★★★☆ complexity7 nodesGoogle SheetsN8N Nodes Evolution Api
Data & Sheets Trigger: Cron / scheduled Nodes: 7 Complexity: ★★★★☆ Added:

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": "Dental Clinic - Automated Reminders",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "id": "schedule_trigger",
      "name": "Run Every Hour",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        64,
        304
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "CONTROL CITAS DENTISTA",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Appointments"
        },
        "options": {}
      },
      "id": "read_sheets",
      "name": "Read Appointments",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        320,
        304
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const appointment = $input.item.json;\n\nlet message = '';\n\nif (appointment.reminder_type === '24h') {\n  message = `Hi ${appointment.Patient_Name}! \ud83d\udc4b\n\nThis is a reminder that you have an appointment tomorrow at [CLINIC NAME] Dental Clinic.\n\n\ud83d\udcc5 Date: ${appointment.Appointment_Date}\n\ud83d\udd50 Time: ${appointment.Appointment_Time}\n\ud83e\uddb7 Treatment: ${appointment.Appointment_Type}\n\n\ud83d\udccd Address: [CONFIGURE ADDRESS]\n\nPlease arrive 10 minutes early. If you need to cancel or reschedule, just reply to this message.\n\nSee you then!`;\n} else {\n  message = `Hi ${appointment.Patient_Name}! \ud83d\udc4b\n\nYour appointment is in about 1 hour.\n\n\ud83d\udd50 Time: ${appointment.Appointment_Time}\n\ud83e\uddb7 Treatment: ${appointment.Appointment_Type}\n\n\ud83d\udccd Address: [CONFIGURE ADDRESS]\n\nSee you soon!`;\n}\n\nreturn {\n  json: {\n    ...appointment,\n    message: message\n  }\n};"
      },
      "id": "generate_message",
      "name": "Build Reminder Message",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1088,
        304
      ]
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEET_ID",
          "mode": "list",
          "cachedResultName": "CONTROL CITAS DENTISTA"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Appointments"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "ID": "={{ $('Read Appointments').item.json.ID }}",
            "Reminder_1h": "TRUE",
            "row_number": 0
          },
          "matchingColumns": [
            "ID"
          ],
          "schema": [
            {
              "id": "ID",
              "displayName": "ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Google_Event_ID",
              "displayName": "Google_Event_ID",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Patient_Name",
              "displayName": "Patient_Name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Patient_Phone",
              "displayName": "Patient_Phone",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Appointment_Date",
              "displayName": "Appointment_Date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Appointment_Time",
              "displayName": "Appointment_Time",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Appointment_Type",
              "displayName": "Appointment_Type",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Notes",
              "displayName": "Notes",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Reminder_24h",
              "displayName": "Reminder_24h",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Reminder_1h",
              "displayName": "Reminder_1h",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Created_At",
              "displayName": "Created_At",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "row_number",
              "displayName": "row_number",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "number",
              "canBeUsedToMatch": true,
              "readOnly": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "cellFormat": "USER_ENTERED"
        }
      },
      "id": "update_sheet",
      "name": "Mark Reminder Sent",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1584,
        304
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "messages-api",
        "instanceName": "=YOUR_EVOLUTION_INSTANCE",
        "remoteJid": "={{ $json.Patient_Phone }}@s.whatsapp.net",
        "messageText": "={{ $json.message }}",
        "options_message": {}
      },
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "typeVersion": 1,
      "position": [
        1344,
        304
      ],
      "id": "f36a6bbf-de5e-4101-a0d8-29c3a6535b1d",
      "name": "Send Text",
      "credentials": {
        "evolutionApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "cond_status",
              "leftValue": "={{ $json.Status }}",
              "rightValue": "Pending",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            },
            {
              "id": "cond_not_sent",
              "leftValue": "={{ $json.Reminder_1h }}",
              "rightValue": "TRUE",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            },
            {
              "id": "cond_min_1h",
              "leftValue": "={{ $json.hours_until }}",
              "rightValue": 1,
              "operator": {
                "type": "number",
                "operation": "gte"
              }
            },
            {
              "id": "cond_max_2h",
              "leftValue": "={{ $json.hours_until }}",
              "rightValue": 2,
              "operator": {
                "type": "number",
                "operation": "lte"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "filter_pendientes",
      "name": "Filter Due In 1-2h",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        848,
        304
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "hours_until",
              "name": "hours_until",
              "type": "number",
              "value": "={{ (DateTime.fromFormat($json.Appointment_Date + ' ' + $json.Appointment_Time, 'd/M/yyyy HH:mm').toMillis() - Date.now()) / 3600000 }}"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "calc_horas",
      "name": "Compute Hours Until",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        592,
        304
      ]
    }
  ],
  "connections": {
    "Run Every Hour": {
      "main": [
        [
          {
            "node": "Read Appointments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Reminder Message": {
      "main": [
        [
          {
            "node": "Send Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Text": {
      "main": [
        [
          {
            "node": "Mark Reminder Sent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Due In 1-2h": {
      "main": [
        [
          {
            "node": "Build Reminder Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Appointments": {
      "main": [
        [
          {
            "node": "Compute Hours Until",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compute Hours Until": {
      "main": [
        [
          {
            "node": "Filter Due In 1-2h",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Reminder Sent": {
      "main": [
        []
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Madrid",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false
  },
  "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

Dental Clinic - Automated Reminders. Uses googleSheets, n8n-nodes-evolution-api. Scheduled trigger; 7 nodes.

Source: https://github.com/Sansepio/n8n-dental-clinic-receptionist/blob/main/workflows/automated-reminders.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo

Google Sheets, HTTP Request, Form Trigger +2
Data & Sheets

YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.

Google Sheets, Google Sheets Tool, HTTP Request +1
Data & Sheets

This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev

Google Calendar, Google Sheets, HTTP Request +1
Data & Sheets

Useful if a team is working within a single instance and you want to be notified of what workflows have changed since you last visited them. Another use-case might be monitoring your managed instances

Google Sheets, Execute Workflow Trigger, n8n
Data & Sheets

ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.

Start, HTTP Request, Function Item +3