اطلب رأي المرضى في اليوم التالي للزيارة
في اليوم التالي للزيارة، يصل كل مريض رسالة واتساب برابط استبيان قصير.
كيف تعمل
المشغّل: جدول زمني — كل يوم الساعة 11:00
- اقرأ جدول Appointments.
- ابحث عن زيارات الأمس المكتملة التي لم يُطلب رأيها بعد.
- أرسل قالب واتساب برابط استبيانك.
- علّم كل صف كمُرسَل.
المخطط
مشغّل تطبيق كود
الكود
كود JavaScript المستخدم في خطوات Code، وهو مضمَّن بالفعل في القالب بالأسفل.
// Appointments sheet columns: date (YYYY-MM-DD) | time | patient | phone | doctor | status | feedback_sent
// Keeps yesterday's completed visits that haven't been asked for feedback.
const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
return $input.all()
.map((item) => item.json)
.filter((a) => String(a.date).slice(0, 10) === yesterday)
.filter((a) => String(a.status).toLowerCase() === "done" && !a.feedback_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,
},
}));ابنِها بأداتك
اختر أداتك — نفس الأتمتة، خطوة بخطوة.
انسخه والصقه مباشرة في مساحة عمل n8n (Ctrl+V)، أو حمّله واستخدم Import from File. بعد ذلك اربط حساباتك واستبدل كل قيمة تبدأ بـ YOUR_.
عرض الكود (203 سطر)
{
"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": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 11
}
]
}
},
"id": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"name": "Every day 11: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": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"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 | feedback_sent\n// Keeps yesterday's completed visits that haven't been asked for feedback.\nconst yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\n\nreturn $input.all()\n .map((item) => item.json)\n .filter((a) => String(a.date).slice(0, 10) === yesterday)\n .filter((a) => String(a.status).toLowerCase() === \"done\" && !a.feedback_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 },\n }));"
},
"id": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"name": "Yesterday's visits",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
0
]
},
{
"parameters": {
"operation": "sendTemplate",
"phoneNumberId": "YOUR_PHONE_NUMBER_ID",
"recipientPhoneNumber": "={{ $json.phone }}",
"template": "YOUR_FEEDBACK_TEMPLATE|ar",
"components": {
"component": [
{
"type": "body",
"bodyParameters": {
"parameter": [
{
"type": "text",
"text": "={{ $json.patient }}"
},
{
"type": "text",
"text": "={{ $json.doctor }}"
},
{
"type": "text",
"text": "YOUR_FEEDBACK_FORM_LINK"
}
]
}
}
]
}
},
"id": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"name": "Ask for feedback",
"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": "={{ $('Yesterday\\'s visits').item.json.row_number }}",
"feedback_sent": "={{ $now.toISODate() }}"
},
"matchingColumns": [
"row_number"
]
},
"options": {}
},
"id": "43ef734d-6128-488d-aff4-ce1dfd7659e4",
"name": "Mark as sent",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
1200,
0
]
}
],
"connections": {
"Every day 11:00": {
"main": [
[
{
"node": "Read appointments",
"type": "main",
"index": 0
}
]
]
},
"Read appointments": {
"main": [
[
{
"node": "Yesterday's visits",
"type": "main",
"index": 0
}
]
]
},
"Yesterday's visits": {
"main": [
[
{
"node": "Ask for feedback",
"type": "main",
"index": 0
}
]
]
},
"Ask for feedback": {
"main": [
[
{
"node": "Mark as sent",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}في Make، أنشئ سيناريو جديدًا وأضف هذه الوحدات بالترتيب:
- Schedule the scenario: Every day 11: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 11: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 → WhatsApp5 س/شهر
العيادات واللياقةسهل
استمارات المرضى الجدد إلى جدول مع تنبيه للاستقبال
عندما يملأ مريض جديد الاستمارة الإلكترونية، احفظها في جدول ونبّه الاستقبال على تيليجرام للاتصال به.
Typeform → Google Sheets → Telegram4 س/شهر
تطبيقات المنطقةمتقدم
تحديثات شحنات بوسطة للعملاء على واتساب
يصل العميل رسالة واتساب عند استلام شحنته من بوسطة، وخروجها للتوصيل، وتسليمها.
Bosta → Google Sheets → WhatsApp10 س/شهر