انتقل إلى المحتوى الرئيسي

مرجع الأحداث

تسرد هذه الصفحة كل حدث ويب هوك يمكن أن ترسله TakeTheme وشكل الحمولة التي يحملها. وتشترك جميع الأحداث في بنية الغلاف نفسها، ويختلف data.object باختلاف الحدث.

الغلاف

كل تسليم، ولكل نوع حدث، يأتي داخل هذا الغلاف:

{
"id": "3f1c2b9e-8a4d-4c7e-9b1a-2d6f8e0c1a34",
"type": "order.paid",
"created": 1751371200.123,
"data": {
"object": { "...": "the order object" }
}
}
  • id — معرّف الحدث الفريد (UUID). يُرسَل أيضًا في ترويسة X-TakeTheme-Delivery. استخدمه لإسقاط المكرر.
  • type — أحد أنواع الأحداث أدناه. يُرسَل أيضًا في ترويسة X-TakeTheme-Event.
  • created — طابع زمني Unix (بالثواني) للحظة إنشاء الحدث.
  • data.object — المورد؛ وهو كائن الطلب في جميع الأحداث أدناه.

أحداث الطلبات

تحمل جميع أحداث الطلبات كائن الطلب نفسه في data.object. ويخبرك type بما تغيّر، وتُظهر لك حقول الحالة في الكائن النتيجة النهائية.

الحدثالمُشغِّل
order.placedإنشاء طلب جديد (شراء من المتجر، أو طلب أنشأه المسؤول، أو إكمال طلب مسوّدة).
order.paidتحصيل المبلغ أو تعليم الطلب كمدفوع يدويًا.
order.fulfilledتعليم الطلب — أو ما تبقّى من عناصره — كمُجهَّز.
order.cancelledإلغاء الطلب.
order.returnedتعليم الطلب كمرتجع.
order.refundedاسترداد مبلغ الطلب (كليًا أو جزئيًا).
order.updatedتعديل الطلب (العناصر، العنوان، التتبع، الملاحظات، التعليق أو رفعه، الأرشفة، وغيرها). مُجمَّع في تسليم واحد لكل طلب كل نحو 5 ثوانٍ.

كائن الطلب

قيمة data.object في أحداث الطلبات:

الحقلالنوعالوصف
idنصمعرّف الطلب الفريد.
internalIdنصرقم الطلب الظاهر للبشر (مثل 1042). استخدمه في واجهتك بدل id.
trackNumberنصرقم التتبع (قد يكون فارغًا في بعض الطلبات).
statusنصحالة الطلب (مثل open وcancelled).
paymentStatusنصحالة الدفع (مثل unpaid وpaid وpartially_refunded وrefunded).
fulfillmentStatusنصحالة التجهيز (مثل unfulfilled وpartially_fulfilled وfulfilled).
totalPriceرقمإجمالي الطلب بعملة المتجر.
currencyنصرمز العملة ISO (مثل EGP وUSD).
paymentكائنتفصيل المبالغ — انظر أدناه.
discountCodeنص | nullرمز الكوبون المطبَّق إن وُجد.
appliedDiscountsمصفوفةالخصومات التلقائية وخصومات الرموز المطبَّقة على الطلب.
customerكائن{ customerId, name, email, phone } لعميل الطلب.
contactكائن{ email, phone } على مستوى الطلب (يُملأ في طلبات الضيوف والدفع عند الاستلام).
itemsمصفوفةبنود الطلب — انظر أدناه.
deliveryStatusمصفوفةالشحن والتتبع لكل بند — انظر أدناه.
shippingAddressكائنعنوان الشحن (قد يكون فارغًا في الطلبات الرقمية بالكامل).
billingAddressSameAsShippingمنطقيهل عنوان الفوترة مطابق لعنوان الشحن.
noteنصملاحظة التاجر أو العميل على الطلب.
tagsمصفوفةوسوم الطلب.
originنصقناة الطلب (مثل online_store أو لوحة الإدارة).
isDraftمنطقيهل الطلب مسوّدة.
isAllDigitalمنطقيهل كل بنود الطلب منتجات رقمية.
previousStatusنص | nullالحالة السابقة — مفيدة لاكتشاف الانتقال في order.updated.
createdAtنص (ISO 8601)وقت إنشاء الطلب.

الحقل payment:

الحقلالنوعالوصف
subTotalرقممجموع العناصر قبل الشحن والضريبة والخصومات.
shippingرقمقيمة الشحن المحتسبة.
taxرقمالضريبة المحتسبة.
discountAmountرقمإجمالي الخصم المطبَّق.
handlingFeeرقمرسوم المناولة أو الدفع عند الاستلام.
totalرقمالإجمالي الكلي (يساوي totalPrice).
methodنصطريقة الدفع (مثل cod وcard).
providerنص | nullمزوّد الدفع أو البوابة.
refundedAmountرقمالمبلغ المسترد حتى الآن (في أحداث الاسترداد والمرتجعات).
refundedShippingرقمقيمة الشحن المستردة حتى الآن.

كل عنصر في items:

الحقلالنوعالوصف
idنصمعرّف بند الطلب (يقابل deliveryStatus.itemId).
productIdنصمعرّف المنتج (null للعناصر المخصصة).
nameنصاسم المنتج وقت الطلب.
quantityرقمالكمية المطلوبة.
priceرقمسعر الوحدة المحتسب.
discountPriceرقم | nullسعر الوحدة الأصلي (المشطوب) عند وجود خصم.
imageنص | nullرابط صورة البند المصغّرة.
variantIdنص | nullمعرّف الخيار المحدد.
variantLabelنص | nullوصف الخيار للبشر (مثل Size: L • Color: Blue).
variantDetailsمصفوفة[{ optionName, value }] للخيار المحدد.
isPhysicalProductمنطقيهل يحتاج البند إلى شحن.
isCustomItemمنطقيهل هو بند مخصص.
customInputValueنص | nullتخصيص المشتري (مثل نص النقش).
removedمنطقيtrue إذا أُزيل البند بعد التجهيز — استبعد هذه البنود عند مطابقة totalPrice.
fulfillmentStatusنصحالة التجهيز لهذا البند.

كل عنصر في deliveryStatus:

الحقلالنوعالوصف
itemIdنصبند الطلب الذي تغطيه هذه الشحنة.
trackingNumberنص | nullرقم التتبع لدى شركة الشحن.
trackingUrlنص | nullرابط التتبع لدى شركة الشحن.
trackingCompanyنص | nullاسم شركة الشحن.
deliveryStatusنص | nullحالة التوصيل كما أبلغت عنها شركة الشحن.
ما يُستبعَد عن قصد

لدواعي الخصوصية والأمان، تستبعد الحمولة الحقول الداخلية والحساسة: معرّفات تتبع الإعلانات (fbc/fbp/عنوان IP/وكيل المستخدم)، وإسناد التحويلات، وتقييم الاحتيال والمخاطر، ورموز التحميل للمنتجات الرقمية، والسجل الزمني الداخلي، وإسناد الموظفين. اجلب الطلب بمعرّفه من واجهة الطلبات إذا احتجت إلى المزيد.

مثال: order.paid

{
"id": "3f1c2b9e-8a4d-4c7e-9b1a-2d6f8e0c1a34",
"type": "order.paid",
"created": 1751371200.123,
"data": {
"object": {
"id": "665f1b2c9a3e4d0012ab34cd",
"internalId": "1042",
"trackNumber": "TT-1042",
"status": "open",
"paymentStatus": "paid",
"fulfillmentStatus": "unfulfilled",
"totalPrice": 349.99,
"currency": "EGP",
"payment": {
"subTotal": 329.99,
"shipping": 20,
"tax": 0,
"discountAmount": 0,
"handlingFee": 0,
"total": 349.99,
"method": "card",
"provider": "kashier",
"refundedAmount": 0,
"refundedShipping": 0
},
"discountCode": null,
"appliedDiscounts": [],
"customer": {
"customerId": "665d9f0a9a3e4d0012a9f0aa",
"name": "Mona Adel",
"email": "mona@example.com",
"phone": "+201000000000"
},
"contact": { "email": "mona@example.com", "phone": "+201000000000" },
"items": [
{
"id": "665f1b2c9a3e4d0012ab3500",
"productId": "665e0a1b9a3e4d0012aa11bb",
"name": "Linen Shirt — Medium",
"quantity": 2,
"price": 174.995,
"discountPrice": null,
"image": "https://cdn.example.com/linen-shirt.jpg",
"variantId": "665e0a1b9a3e4d0012aa11cc",
"variantLabel": "Size: M",
"variantDetails": [{ "optionName": "Size", "value": "M" }],
"isPhysicalProduct": true,
"isCustomItem": false,
"customInputValue": null,
"removed": false,
"fulfillmentStatus": "unfulfilled"
}
],
"deliveryStatus": [],
"shippingAddress": {
"name": "Mona Adel",
"street": "12 Nile St.",
"city": "Cairo",
"state": "Cairo",
"country": "EG"
},
"billingAddressSameAsShipping": true,
"note": "",
"tags": [],
"origin": "online_store",
"isDraft": false,
"isAllDigital": false,
"previousStatus": "open",
"createdAt": "2026-07-01T12:00:00.000Z"
}
}
}

مثال: order.fulfilled

البنية نفسها؛ لاحظ تغيّر fulfillmentStatus:

{
"id": "a2b9c1d0-7e6f-4a3b-8c2d-1f0e9d8c7b6a",
"type": "order.fulfilled",
"created": 1751374800.501,
"data": {
"object": {
"id": "665f1b2c9a3e4d0012ab34cd",
"internalId": "1042",
"trackNumber": "TT-1042",
"status": "open",
"paymentStatus": "paid",
"fulfillmentStatus": "fulfilled",
"totalPrice": 349.99,
"currency": "EGP",
"customer": { "customerId": "665d9f0a9a3e4d0012a9f0aa", "name": "Mona Adel", "email": "mona@example.com", "phone": "+201000000000" },
"items": [
{ "id": "665f1b2c9a3e4d0012ab3500", "productId": "665e0a1b9a3e4d0012aa11bb", "name": "Linen Shirt — Medium", "quantity": 2, "price": 174.995, "fulfillmentStatus": "fulfilled" }
],
"deliveryStatus": [
{ "itemId": "665f1b2c9a3e4d0012ab3500", "trackingNumber": "EG123456789", "trackingUrl": "https://track.bosta.co/EG123456789", "trackingCompany": "Bosta", "deliveryStatus": "in_transit" }
],
"shippingAddress": { "city": "Cairo", "country": "EG" },
"createdAt": "2026-07-01T12:00:00.000Z"
}
}
}

معالجة الأحداث

تفرّع بحسب type واقرأ حقول الحالة التي تهمّك:

switch (event.type) {
case "order.placed":
// Reserve inventory, create a record in your system.
break;
case "order.paid":
// Trigger fulfillment / accounting.
break;
case "order.fulfilled":
// Notify the customer, close the fulfillment task.
break;
case "order.cancelled":
case "order.returned":
case "order.refunded":
// Reverse inventory / issue store credit / update ledgers.
break;
case "order.updated":
// Re-sync the order snapshot from event.data.object.
break;
default:
// Unknown/future event type — acknowledge and ignore.
break;
}
التوافق مع المستقبل

قد تُضاف أنواع أحداث جديدة مع الوقت. تعامل دائمًا مع قيم type غير المعروفة بالرد 2xx وتجاهلها بدل إصدار خطأ — فذلك يبقي عنوانك سليمًا ويتجنّب التعطيل التلقائي.