إعادة حجز مواعيد العيادة الفائتة على واتساب
كل مساء، يصل المرضى الذين فاتهم موعد اليوم رسالة واتساب لطيفة تعرض عليهم موعدًا جديدًا.
كيف تعمل
المشغّل: جدول زمني — كل يوم الساعة 20:00
- اقرأ جدول Appointments.
- ابحث عن مواعيد اليوم المسجلة "no-show" التي لم يُتواصل معها.
- أرسل قالب واتساب يعرض إعادة الحجز مع نفس الطبيب.
- علّم الصف حتى لا يُراسَل المريض مرتين.
المخطط
مشغّل تطبيق كود
الكود
كود JavaScript المستخدم في خطوات Code، وهو مضمَّن بالفعل في القالب بالأسفل.
// Appointments sheet columns: date (YYYY-MM-DD) | time | patient | phone | doctor | status | rebook_sent
// Keeps today's no-shows that haven't had a rebooking message yet.
const today = new Date().toISOString().slice(0, 10);
return $input.all()
.map((item) => item.json)
.filter((a) => String(a.date).slice(0, 10) === today)
.filter((a) => String(a.status).toLowerCase() === "no-show" && !a.rebook_sent && a.phone)
.map((a) => ({
json: {
row_number: a.row_number,
phone: String(a.phone).replace(/[^0-9]/g, ""),
patient: a.patient,
doctor: a.doctor,
time: a.time,
},
}));ابنِها بأداتك
اختر أداتك — نفس الأتمتة، خطوة بخطوة.
انسخه والصقه مباشرة في مساحة عمل n8n (Ctrl+V)، أو حمّله واستخدم Import from File. بعد ذلك اربط حساباتك واستبدل كل قيمة تبدأ بـ YOUR_.
عرض الكود (199 سطر)
{
"name": "إعادة حجز مواعيد العيادة الفائتة على واتساب (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## إعادة حجز مواعيد العيادة الفائتة على واتساب\nكل مساء، يصل المرضى الذين فاتهم موعد اليوم رسالة واتساب لطيفة تعرض عليهم موعدًا جديدًا.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 20
}
]
}
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Every day 20:00",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
]
},
{
"parameters": {
"operation": "read",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Appointments",
"mode": "name"
},
"options": {}
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Read appointments",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
300,
0
]
},
{
"parameters": {
"jsCode": "// Appointments sheet columns: date (YYYY-MM-DD) | time | patient | phone | doctor | status | rebook_sent\n// Keeps today's no-shows that haven't had a rebooking message yet.\nconst today = new Date().toISOString().slice(0, 10);\n\nreturn $input.all()\n .map((item) => item.json)\n .filter((a) => String(a.date).slice(0, 10) === today)\n .filter((a) => String(a.status).toLowerCase() === \"no-show\" && !a.rebook_sent && a.phone)\n .map((a) => ({\n json: {\n row_number: a.row_number,\n phone: String(a.phone).replace(/[^0-9]/g, \"\"),\n patient: a.patient,\n doctor: a.doctor,\n time: a.time,\n },\n }));"
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Today's no-shows",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
0
]
},
{
"parameters": {
"operation": "sendTemplate",
"phoneNumberId": "YOUR_PHONE_NUMBER_ID",
"recipientPhoneNumber": "={{ $json.phone }}",
"template": "YOUR_REBOOK_TEMPLATE|ar",
"components": {
"component": [
{
"type": "body",
"bodyParameters": {
"parameter": [
{
"type": "text",
"text": "={{ $json.patient }}"
},
{
"type": "text",
"text": "={{ $json.doctor }}"
}
]
}
}
]
}
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Offer a new time",
"type": "n8n-nodes-base.whatsApp",
"typeVersion": 1,
"position": [
900,
0
]
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Appointments",
"mode": "name"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"row_number": "={{ $('Today\\'s no-shows').item.json.row_number }}",
"rebook_sent": "={{ $now.toISODate() }}"
},
"matchingColumns": [
"row_number"
]
},
"options": {}
},
"id": "2c52a72d-5332-4279-a57c-4e7c465d70f8",
"name": "Mark as sent",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1200,
0
]
}
],
"connections": {
"Every day 20:00": {
"main": [
[
{
"node": "Read appointments",
"type": "main",
"index": 0
}
]
]
},
"Read appointments": {
"main": [
[
{
"node": "Today's no-shows",
"type": "main",
"index": 0
}
]
]
},
"Today's no-shows": {
"main": [
[
{
"node": "Offer a new time",
"type": "main",
"index": 0
}
]
]
},
"Offer a new time": {
"main": [
[
{
"node": "Mark as sent",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}في Make، أنشئ سيناريو جديدًا وأضف هذه الوحدات بالترتيب:
- Schedule the scenario: Every day 20:00
- Google Sheets › Search Rows
- Tools › Set variable / Iterator + Array aggregator (same logic as the Code step)
- WhatsApp Business Cloud › Send a Template Message
- Google Sheets › Update a Row
- كل تشغيل لوحدة يستهلك عمليات (operations) في Make — والباقة المجانية تتضمن حصة شهرية.
- دوال Make المدمجة (map و sum و formatDate…) تغني عن معظم خطوات Code؛ وللمنطق المعقد استخدم وحدة كود.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
في Zapier، أنشئ Zap جديدًا وأضف هذه الخطوات بالترتيب:
- Schedule by Zapier — Every day 20:00
- Google Sheets — Lookup Spreadsheet Rows (or Code by Zapier)
- Code by Zapier — Run JavaScript (paste the code from the Code section)
- WhatsApp — Send Template Message
- Google Sheets — Update Spreadsheet Row
- الـ Zaps التي فيها أكثر من خطوتين تحتاج باقة Zapier مدفوعة.
- الـ Webhooks والفلاتر/المسارات و Code by Zapier ميزات مدفوعة في بعض باقات Zapier.
- Code by Zapier يشغّل JavaScript: أعد استخدام الكود بالأعلى، مع قراءة المدخلات من inputData بدلًا من $json.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
نصائح
- اجعل الرسالة ودودة دون لوم. اذكر اسم الطبيب فقط، لا سبب الزيارة.
أتمتات مشابهة
العيادات واللياقةسهل
اطلب رأي المرضى في اليوم التالي للزيارة
في اليوم التالي للزيارة، يصل كل مريض رسالة واتساب برابط استبيان قصير.
Google Sheets → WhatsApp3 س/شهر
العيادات واللياقةسهل
استمارات المرضى الجدد إلى جدول مع تنبيه للاستقبال
عندما يملأ مريض جديد الاستمارة الإلكترونية، احفظها في جدول ونبّه الاستقبال على تيليجرام للاتصال به.
Typeform → Google Sheets → Telegram4 س/شهر
تطبيقات المنطقةمتقدم
تحديثات شحنات بوسطة للعملاء على واتساب
يصل العميل رسالة واتساب عند استلام شحنته من بوسطة، وخروجها للتوصيل، وتسليمها.
Bosta → Google Sheets → WhatsApp10 س/شهر