تحديثات شحنات بوسطة للعملاء على واتساب
يصل العميل رسالة واتساب عند استلام شحنته من بوسطة، وخروجها للتوصيل، وتسليمها.
كيف تعمل
المشغّل: Webhook — تحديث حالة الشحنة من بوسطة
- استقبل تحديث الحالة من بوسطة.
- حوّل كود الحالة إلى حالة مفهومة بالعربية.
- ابحث عن هاتف العميل في ورقة Orders برقم الطلب.
- أرسل قالب واتساب بالحالة الجديدة ورقم التتبع.
المخطط
مشغّل تطبيق منطق كود
الكود
كود JavaScript المستخدم في خطوات Code، وهو مضمَّن بالفعل في القالب بالأسفل.
// Mode: Run Once for Each Item
// Bosta delivery webhook → clean fields with a readable status in English and Arabic.
// Confirm the state codes in Bosta's webhook documentation and adjust this map if needed.
const STATES = {
21: { en: "Picked up", ar: "تم استلام الشحنة من المتجر", kind: "progress" },
24: { en: "At Bosta warehouse", ar: "الشحنة في مخزن بوسطة", kind: "progress" },
41: { en: "Out for delivery", ar: "الشحنة خرجت للتوصيل", kind: "progress" },
45: { en: "Delivered", ar: "تم التوصيل", kind: "delivered" },
46: { en: "Returned to business", ar: "تم إرجاع الشحنة", kind: "problem" },
47: { en: "Exception", ar: "مشكلة في التوصيل", kind: "problem" },
};
const b = $json.body || {};
const code = Number(b.state?.code ?? b.state);
const state = STATES[code] || { en: `Status ${code}`, ar: `الحالة ${code}`, kind: "other" };
return {
json: {
tracking: b.trackingNumber || "",
order_id: b.businessReference || "",
code,
status_en: state.en,
status_ar: state.ar,
kind: state.kind,
cod: b.cod || 0,
reason: b.exceptionReason || "",
},
};ابنِها بأداتك
اختر أداتك — نفس الأتمتة، خطوة بخطوة.
انسخه والصقه مباشرة في مساحة عمل n8n (Ctrl+V)، أو حمّله واستخدم Import from File. بعد ذلك اربط حساباتك واستبدل كل قيمة تبدأ بـ YOUR_.
عرض الكود (208 سطر)
{
"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": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"httpMethod": "POST",
"path": "bosta-status",
"options": {}
},
"id": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Bosta update",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
],
"webhookId": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee"
},
{
"parameters": {
"jsCode": "// Mode: Run Once for Each Item\n// Bosta delivery webhook → clean fields with a readable status in English and Arabic.\n// Confirm the state codes in Bosta's webhook documentation and adjust this map if needed.\nconst STATES = {\n 21: { en: \"Picked up\", ar: \"تم استلام الشحنة من المتجر\", kind: \"progress\" },\n 24: { en: \"At Bosta warehouse\", ar: \"الشحنة في مخزن بوسطة\", kind: \"progress\" },\n 41: { en: \"Out for delivery\", ar: \"الشحنة خرجت للتوصيل\", kind: \"progress\" },\n 45: { en: \"Delivered\", ar: \"تم التوصيل\", kind: \"delivered\" },\n 46: { en: \"Returned to business\", ar: \"تم إرجاع الشحنة\", kind: \"problem\" },\n 47: { en: \"Exception\", ar: \"مشكلة في التوصيل\", kind: \"problem\" },\n};\n\nconst b = $json.body || {};\nconst code = Number(b.state?.code ?? b.state);\nconst state = STATES[code] || { en: `Status ${code}`, ar: `الحالة ${code}`, kind: \"other\" };\n\nreturn {\n json: {\n tracking: b.trackingNumber || \"\",\n order_id: b.businessReference || \"\",\n code,\n status_en: state.en,\n status_ar: state.ar,\n kind: state.kind,\n cod: b.cod || 0,\n reason: b.exceptionReason || \"\",\n },\n};",
"mode": "runOnceForEachItem"
},
"id": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Read status",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
300,
0
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ ['progress', 'delivered'].includes($json.kind) }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Tell customer?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
600,
0
]
},
{
"parameters": {
"operation": "read",
"documentId": {
"__rl": true,
"value": "YOUR_SPREADSHEET_ID",
"mode": "id"
},
"sheetName": {
"__rl": true,
"value": "Orders",
"mode": "name"
},
"options": {},
"filtersUI": {
"values": [
{
"lookupColumn": "order_id",
"lookupValue": "={{ $json.order_id }}"
}
]
}
},
"id": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Find order",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
900,
0
]
},
{
"parameters": {
"operation": "sendTemplate",
"phoneNumberId": "YOUR_PHONE_NUMBER_ID",
"recipientPhoneNumber": "={{ String($json.phone).replace(/[^0-9]/g, '') }}",
"template": "YOUR_SHIPPING_TEMPLATE|ar",
"components": {
"component": [
{
"type": "body",
"bodyParameters": {
"parameter": [
{
"type": "text",
"text": "={{ $json.customer || 'عميلنا العزيز' }}"
},
{
"type": "text",
"text": "={{ $('Read status').item.json.status_ar }}"
},
{
"type": "text",
"text": "={{ $('Read status').item.json.tracking }}"
}
]
}
}
]
}
},
"id": "2de5c18f-5c8e-4bfb-a9ba-9118f6766aee",
"name": "Send status update",
"type": "n8n-nodes-base.whatsApp",
"typeVersion": 1,
"position": [
1200,
0
]
}
],
"connections": {
"Bosta update": {
"main": [
[
{
"node": "Read status",
"type": "main",
"index": 0
}
]
]
},
"Read status": {
"main": [
[
{
"node": "Tell customer?",
"type": "main",
"index": 0
}
]
]
},
"Tell customer?": {
"main": [
[
{
"node": "Find order",
"type": "main",
"index": 0
}
]
]
},
"Find order": {
"main": [
[
{
"node": "Send status update",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}في Make، أنشئ سيناريو جديدًا وأضف هذه الوحدات بالترتيب:
- Webhooks › Custom webhook
- Tools › Set variable / Iterator + Array aggregator (same logic as the Code step)
- Filter on the next route: “Tell customer?”
- إذا نعمGoogle Sheets › Search Rows (by order_id)
- إذا نعمWhatsApp Business Cloud › Send a Template Message
- كل تشغيل لوحدة يستهلك عمليات (operations) في Make — والباقة المجانية تتضمن حصة شهرية.
- دوال Make المدمجة (map و sum و formatDate…) تغني عن معظم خطوات Code؛ وللمنطق المعقد استخدم وحدة كود.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
في Zapier، أنشئ Zap جديدًا وأضف هذه الخطوات بالترتيب:
- Webhooks by Zapier — Catch Hook
- Code by Zapier — Run JavaScript (paste the code from the Code section)
- Filter by Zapier: “Tell customer?”
- إذا نعمGoogle Sheets — Lookup Spreadsheet Row
- إذا نعمWhatsApp — Send Template Message
- الـ Zaps التي فيها أكثر من خطوتين تحتاج باقة Zapier مدفوعة.
- الـ Webhooks والفلاتر/المسارات و Code by Zapier ميزات مدفوعة في بعض باقات Zapier.
- Code by Zapier يشغّل JavaScript: أعد استخدام الكود بالأعلى، مع قراءة المدخلات من inputData بدلًا من $json.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
نصائح
- اجعل رقم طلبك هو المرجع (business reference) عند إنشاء شحنات بوسطة.
- أعطِ بوسطة رابط الـ webhook (في طلبات الشحن أو إعدادات الحساب).
أتمتات مشابهة
تطبيقات المنطقةمتوسط
اطلب تقييمًا بعد يومين من التوصيل
عندما توصّل بوسطة الطلب، انتظر يومين ثم اطلب من العميل تقييمًا على واتساب.
Bosta → Google Sheets → WhatsApp4 س/شهر
تطبيقات المنطقةمتوسط
علّم شحنات بوسطة المسلَّمة في جدولك
عند تسليم بوسطة لطلب، يُحدَّث صفه في الجدول بالحالة ومبلغ التحصيل.
Bosta → Google Sheets4 س/شهر
تطبيقات المنطقةمتقدم
أنشئ شحنات بوسطة من طلبات Shopify المدفوعة
كل طلب مدفوع يتحول إلى شحنة في بوسطة تلقائيًا — بدون كتابة العناوين يدويًا.
Shopify → Bosta → Google Sheets10 س/شهر