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 →
{
"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.
evolutionApigoogleSheetsOAuth2Api
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.
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
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
ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.