> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# اشتر الآن وادفع لاحقاً BNPL: كيف يعمل من الداخل
- URL: https://arabroot.io/articles/اشتر-الان-وادفع-لاحقا-bnpl-كيف-يعمل-من-الداخل/
- Published: 2026-10-27T16:19:49.000Z
- Updated: 2026-10-27T17:19:24.000Z
- Description: كيف يعمل التقسيط دون تكلفة على العميل، وما تطلبه قواعد البنك المركزي، ومن أين تربح الشركة ومتى تخسر، مع نموذج Python لمحفظة أقساط.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, التقنية المالية والمدفوعات

لنفرض أن الشركة الناشئة التي تبيع اشتراكات الأندية الرياضية، والتي تتبعنا أموالها في مقالات هذا القسم، لاحظت في لوحة التحليلات رقماً أزعج المؤسس: نسبة كبيرة من الزوار يفتحون صفحة الاشتراك السنوي بسعر 1,200 ريال، ثم يرجعون ويختارون الاشتراك الشهري الأغلى على المدى الطويل، أو يغلقون الصفحة. وفي اجتماع الفريق اقترح مدير المنتج حلاً يراه في كل متجر إلكتروني: زر «قسمها على 4 دفعات» تحت السعر، فيدفع العضو 300 ريال اليوم و300 في كل شهر من الأشهر الثلاثة التالية، ويحصل على سعر الاشتراك السنوي كاملاً. واقترح أحد المطورين أن تبني الشركة الفكرة بنفسها، فلديها بطاقات الأعضاء محفوظة كتوكن عند مزود الدفع، والخصم الشهري موجود أصلاً في نظام الاشتراكات، فما الصعب في أربعة خصومات بدلاً من واحد؟

والإجابة عن هذا السؤال هي موضوع هذا المقال، لأن الزر الصغير تحت السعر يخفي نشاطاً مالياً كاملاً اسمه اشتر الآن وادفع لاحقاً Buy Now Pay Later، واختصاراً BNPL، وتسميه قواعد البنك المركزي السعودي «الدفع الآجل». فالعضو الذي يحصل على اشتراك سنة كاملة ويدفع ربع ثمنه اليوم أصبح مديناً بالباقي، ومن يعطيه هذا الدين يمول، ومن يمول في المملكة يحتاج ترخيصاً، ويتحمل خطر من لا يسدد، ويدفع تكلفة المال الذي ينتظر عودته. وفي مقال [المحافظ الرقمية](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D9%81%D8%B8-%D8%A7%D9%84%D8%B1%D9%82%D9%85%D9%8A%D8%A9-digital-wallets-%D8%A7%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D9%88%D8%AA%D8%B1%D8%AE%D9%8A%D8%B5%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A%D9%87%D8%A7/) رأينا كيف يحول قرار تصميم صغير فكرة الرصيد المسبق إلى نقود إلكترونية تحتاج ترخيصاً، وهنا نرى نفس الشيء في الاتجاه المعاكس: من الدفع المسبق إلى الدفع المؤجل.

وسوف نناقش في هذا المقال ما يلي:

- ما هو الدفع الآجل، وأطرافه، ومن يدفع لمن، ولماذا لا يدفع العميل تكلفة أجل.
- ما تطلبه [قواعد تنظيم شركات الدفع الآجل](https://rulebook.sama.gov.sa/en/rules-regulating-buy-now-pay-later-bnpl-companies-0?ref=arabroot.io) في دليل قواعد البنك المركزي: الترخيص، والحدود، والرسوم الممنوعة، والتحقق، والعقد.
- شاشة الدفع من الداخل: الهوية، والقرار الائتماني، والإقرارات، والقسط الأول.
- جدول الأقساط بالهللة، والاسترداد الجزئي، والإلغاء، والسداد المبكر.
- التأخر في السداد، وأيام التأخر DPD، وما تقوله ضوابط التحصيل عن الاتصالات والغرامات والتعثر.
- اقتصاديات الشركة: من أين تربح، وأين تخسر، ولماذا تغير مدة التقسيط كل شيء.
- مختبر في Python: جدول أقساط، وسياستا استرداد، ونموذج محفظة على عشرين ألف طلب مولد بافتراضات معلنة.
- ماذا تحتاج الشركة الناشئة لتقبل الدفع الآجل كتاجر: التكامل، والقيود في دفترها، والمطابقة.

## ما هو الدفع الآجل BNPL بالضبط؟

تعرف قواعد البنك المركزي نشاط الدفع الآجل بأنه نوع من التمويل يسمح للمستهلك بشراء سلع أو خدمات دون تكلفة أجل يدفعها المستهلك. وفي هذا التعريف كلمتان تحملان الفكرة كلها: «تمويل»، أي أن هناك من يدفع ثمن السلعة اليوم وينتظر ماله، و«دون تكلفة أجل يدفعها المستهلك»، أي أن العميل يدفع ثمن السلعة فقط مقسماً على دفعات، ولا يدفع ربحاً مقابل التأجيل كما في التمويل الشخصي أو بطاقة الائتمان. والسؤال الطبيعي الذي يأتي بعد ذلك: إذا كان العميل لا يدفع مقابل التأجيل، فمن يدفع؟ والإجابة أن التاجر يدفع، لأن التقسيط يرفع مبيعاته ويقلل الطلبات المتروكة في سلة الشراء، فيقبل أن يدفع لشركة الدفع الآجل نسبة من كل عملية، وهذه النسبة هي الدخل الرئيسي للشركة.

والتقسيط فكرة قديمة قدم التجارة نفسها، فالمحلات كانت تبيع بالأقساط لعملائها الذين تعرفهم، وبطاقات الائتمان جعلت التأجيل متاحاً في كل مكان مقابل ربح على الرصيد غير المسدد. والجديد في الدفع الآجل بشكله الحالي أنه يأتي في لحظة الشراء نفسها، داخل صفحة الدفع، بقرار ائتماني يأخذ ثواني، دون بطاقة ائتمان ودون تكلفة يراها العميل، وأنه يكون غالباً على مبالغ صغيرة ومدد قصيرة. وهذا ما جعله ينتشر في التجارة الإلكترونية، وما جعل الجهات المنظمة في دول كثيرة تضع له قواعد خاصة، لأن سهولة الحصول عليه تعني أيضاً سهولة أن يتراكم على العميل دين صغير من عشرة متاجر لا يرى مجموعه.

وقد يتساءل البعض: ما الفرق بين الدفع الآجل والاشتراك الشهري الذي تقدمه الشركة الناشئة أصلاً؟ والفرق في من حصل على ماذا ومتى. ففي الاشتراك الشهري يدفع العضو ثمن شهر ويحصل على شهر، فإذا توقف عن الدفع توقف الاشتراك، ولا أحد مدين لأحد. أما في الدفع الآجل فيحصل العضو على السعر السنوي والاشتراك السنوي من اليوم الأول، ويبقى مديناً بالأقساط الباقية، فإذا توقف عن الدفع بقي الدين. وهذا الفرق هو ما جعل فكرة المطور «أربعة خصومات بدلاً من واحد» أخطر مما تبدو: الكود نفسه بسيط، ولكن النشاط الذي ينتجه هو منح ائتمان لعملاء لم يدرس أحد قدرتهم على السداد.

## أطراف العملية: من يدفع لمن؟

في عملية الدفع الآجل أربعة أطراف، والصورة التالية تبينهم بترتيب حركة الطلب:

![أربع بطاقات من اليمين إلى اليسار: العضو Consumer يشتري الاشتراك اليوم ويدفع 4 أقساط، ثم التاجر Merchant تطبيق الاشتراكات يقبض المبلغ ناقص الرسوم، ثم شركة الدفع الآجل BNPL Provider تدفع للتاجر الآن وتحصل الأقساط من العضو، ثم الممول رأس المال والتسهيلات يمول الفرق حتى السداد، وتحتها أن العضو لا يدفع تكلفة أجل ولا رسوماً والتاجر يدفع رسوم الخدمة والشركة تتحمل التمويل والتعثر](https://arabroot.io/content/images/2026/10/bnpl-01-parties.webp)

التاجر يقبض اليوم، والعضو يدفع على أشهر، والشركة في المنتصف تتحمل الفرق

- **العضو Consumer:** يختار التقسيط في صفحة الدفع، ويمر بالتحقق والقرار الائتماني، ويدفع القسط الأول غالباً عند الشراء ببطاقته، ثم تخصم الأقساط التالية في مواعيدها.
- **التاجر Merchant:** الشركة الناشئة في قصتنا، توقع عقداً مع شركة الدفع الآجل، وتضيف خيار التقسيط في صفحة الدفع، وتستلم ثمن الاشتراك كاملاً ناقص رسوم الخدمة، ولا تتحمل في الغالب خطر عدم سداد العضو، وهذا من أهم بنود العقد الذي تقرؤه قبل التوقيع.
- **شركة الدفع الآجل BNPL Provider:** الجهة المرخصة التي تدرس العميل وتقرر قبوله، وتدفع للتاجر، وتحصل الأقساط، وتتابع المتأخرين، وتتحمل الخسارة إذا لم يسدد العميل.
- **الممول:** الشركة تدفع للتاجر اليوم وتنتظر أشهراً لتسترد المبلغ، فتحتاج مالاً يملأ هذه الفجوة، يأتي من رأس مالها ومن تسهيلات تحصل عليها من البنوك أو غيرها، ولهذا المال تكلفة تدفعها الشركة لا العميل.

ولاحظ أن الأموال تتحرك في اتجاهين بتوقيتين مختلفين: في يوم الشراء تخرج من الشركة إلى التاجر، وعلى مدى الأشهر التالية تدخل إليها من العضو. وكل ما سنراه في المقال، من الترخيص إلى المختبر، يدور حول هذه الفجوة بين خروج المال وعودته: من يمولها، وكم تكلف، وماذا يحدث إذا لم يعد جزء منها.

### أشكال التقسيط التي ستراها

تحت اسم الدفع الآجل أشكال تختلف في المدة وعدد الدفعات، وأشهرها التقسيم إلى أربع دفعات Pay in 4، يدفع العميل الأولى عند الشراء والباقي على فترات منتظمة، والتقسيط الشهري على مدة أطول لمبالغ أكبر، والدفع بعد فترة Pay Later يدفع فيه العميل المبلغ كاملاً بعد أيام من استلام السلعة. وفي المملكة تضع القواعد سقفاً لهذا التنوع، فعدد الأقساط لا يزيد على 12 قسطاً كما سنرى، والعقد يحدد مبلغ كل قسط وعدده ومدته. وما يهم المطور أن نوع المنتج يحدد شكل جدول الأقساط ومنطق الاسترداد والتأخر، فلا تبن النظام على افتراض شكل واحد إذا كانت الشركة ستقدم أكثر من منتج، لأن القرار الذي يبدو تفصيلاً في المنتج الأول يصبح إعادة كتابة في المنتج الثاني.

## ما تطلبه قواعد البنك المركزي

أصدر البنك المركزي السعودي قواعد تنظيم شركات الدفع الآجل بالتعميم رقم 450360390000 بتاريخ 17 ديسمبر 2023، وتنص القواعد على أنها تسري بعد 30 يوماً من نشرها في موقع البنك المركزي. وهي جزء من منظومة التمويل، فتعريفاتها ترجع إلى نظام مراقبة شركات التمويل، وتربط الشركة بمجموعة من الأنظمة الأخرى مثل مبادئ الإقراض المسؤول وضوابط التحصيل وإطار الأمن السيبراني. والصورة التالية تلخص أهم ما يمس فريق المنتج والفريق التقني:

![خمس بطاقات: الترخيص Licence شركة مساهمة مرخصة برأس مال 5 ملايين ريال وترخيص لخمس سنوات، ولا رسوم على العميل Article 20 لا رسوم للشركة ولا للتاجر ولا لطرف ثالث عدا ما تجيزه لائحة التحصيل، والحدود Article 22 عشرة آلاف ريال قائمة للعميل و12 قسطاً كحد أقصى وتحصيل إلكتروني لا نقدي، والتحقق Articles 19 و21 السجل الائتماني بموافقته ورمز تحقق للجوال والعنوان الوطني، والعقد والإفصاح Articles 25 و26 الأقساط ومواعيدها وأثر التأخر والإلغاء والسداد المبكر، وتحتها مرجع القواعد بتعميم 17 ديسمبر 2023 والحد المحدث بتعميم 24 ديسمبر 2025](https://arabroot.io/content/images/2026/10/bnpl-02-rules.webp)

خمسة أبواب في القواعد يتحول كل منها إلى ميزة أو فحص في النظام

### الترخيص Licence: من يحق له أن يقسط؟

تنص المادة الثالثة على أن نشاط الدفع الآجل لا يمارس إلا بعد الحصول على ترخيص من البنك المركزي، وتعرف القواعد شركة الدفع الآجل بأنها شركة مساهمة مرخصة من البنك المركزي لممارسة هذا النشاط. والحد الأدنى لرأس المال في المادة الخامسة 5 ملايين ريال، ويصلح الترخيص في المادة العاشرة لخمس سنوات، ويقدم طلب تجديده قبل انتهائه بثلاثة أشهر على الأقل، ورسوم إصداره في المادة الثانية عشرة 5,000 ريال، ورسوم تجديده أو تعديله 2,000 ريال. ويوضح [دليل التقدم بطلب الترخيص](https://rulebook.sama.gov.sa/en/guidelines-applying-license-practice-bnpl-activity?ref=arabroot.io) بتاريخ 24 يناير 2024 المستندات المطلوبة، ومنها دراسة الجدوى وخطة العمل والهيكل التنظيمي وضمان بنكي، وأن البنك المركزي يرد بالموافقة المبدئية أو الرفض المسبب خلال 60 يوم عمل من إشعار اكتمال الطلب، وأن الموافقة المبدئية ليست ترخيصاً، وأن الشركة تقدم ما يثبت حصولها على معرف الكيان القانوني LEI، ثم يزورها موظفو البنك المركزي ليتحققوا من جاهزية أنظمتها وإجراءاتها قبل إصدار الترخيص.

وهذا يجيب عن سؤال المطور في بداية القصة: الشركة الناشئة لا تستطيع أن تقسط الاشتراك السنوي بنفسها وتؤجل باقي ثمنه، لأن هذا هو النشاط الذي يحتاج الترخيص، وشركة اشتراكات أندية ليست شركة مساهمة مرخصة للتمويل. والطريق الواقعي لها هو أن تكون تاجراً لدى شركة دفع آجل مرخصة، أو أن تبقى على الاشتراك الشهري الذي لا يمنح العضو شيئاً قبل أن يدفع ثمنه. وقبل التعاقد مع أي شركة دفع آجل تحقق من وجودها في قائمة الجهات المرخصة التي ينشرها البنك المركزي، والسبب أن العقد مع جهة غير مرخصة يجعل التاجر شريكاً في نشاط غير نظامي، ويضع أموال أعضائه وبياناتهم عند جهة لا يراقبها أحد.

### لا رسوم على العميل: المادة العشرون

أكثر مادة تحدد شكل هذا السوق في المملكة هي المادة العشرون، فهي تمنع الشركة من فرض رسوم على المستهلك، بما فيها الرسوم المستحقة للشركة أو للمتاجر المتعاقدة أو لطرف ثالث، وتستثني فقط غرامات التأخير ورسوم التحصيل التي تفرض وفق ضوابط وإجراءات التحصيل. وفي حاشية المادة أن البنك المركزي قرر بتاريخ 14/02/1446هـ تعليق تطبيق الرسوم الإدارية التي كان يجوز للشركة فرضها في حدود 1% من مبلغ التمويل أو 50 ريالاً أيهما أقل. وتلزم المادة التاسعة عشرة الشركة بأن تمنع المتاجر المتعاقدة معها من تحميل العميل أي رسوم إضافية، وأن تراقب ممارساتها لتتأكد من التزامها.

ولهذه المادة أثران مباشران على الشركة الناشئة كتاجر. الأول أنها لا تستطيع رفع سعر الاشتراك لمن يختار التقسيط لتعوض رسوم الخدمة، فإذا كان الاشتراك السنوي 1,200 ريال فهو 1,200 ريال بالتقسيط أو بدونه، والرسوم تتحملها الشركة من هامشها. والثاني أن نموذج الربح الذي تعتمد عليه بعض شركات التمويل خارج المملكة، أي الربح من رسوم التأخير، ليس متاحاً هنا بنفس الشكل، لأن ضوابط التحصيل تضع سقفاً لغرامات التأخير ورسوم التحصيل كما سنرى، فيبقى دخل شركة الدفع الآجل الأساسي من رسوم التاجر، وهذا ما يجعل الاقتصاديات التي يقيسها المختبر حساسة جداً لمدة التقسيط ونسبة التعثر.

وتمنع المادة العشرون أيضاً التعامل مع من هو دون 18 سنة هجرية، والتعامل مع الأجنبي غير المقيم إلا بعدم ممانعة مكتوبة من البنك المركزي، والشراء بعملة غير الريال إلا بعدم ممانعة، وإطلاق أي منتج جديد دون عدم ممانعة مكتوبة مسبقة. والحد العمري بالسنوات الهجرية تفصيل يخطئ فيه المطور الذي يحسب العمر من تاريخ الميلاد الميلادي بالطريقة المعتادة، فالسنة الهجرية أقصر من الميلادية بأيام، ومن يكون عمره 18 سنة هجرية قد لا يكون أكمل 18 سنة ميلادية بعد. لذلك احسب العمر بالتقويم الهجري، واختبر الحالات القريبة من الحد بتواريخ معروفة.

### الحدود: عشرة آلاف ريال واثنا عشر قسطاً

تضع المادة الثانية والعشرون حدوداً رقمية مباشرة: إجمالي التمويل القائم لكل مستهلك فرد لا يتجاوز 10,000 ريال، مع عدم الإخلال بنسب الاستقطاع في مبادئ الإقراض المسؤول، وعدد الأقساط لا يتجاوز 12 قسطاً، والتحصيل يتم عبر قنوات إلكترونية ويمنع طلب النقد، وإجمالي التمويل القائم للشركة كلها لا يتجاوز 20 ضعف رأس مالها واحتياطياتها إلا بعدم ممانعة من البنك المركزي. والحد الفردي مذكور في [تعميم البنك المركزي رقم 472038475 بتاريخ 24 ديسمبر 2025](https://rulebook.sama.gov.sa/en/circular-re-increase-maximum-limit-stipulated-paragraph-1-article-twenty-second-rules-regulating?ref=arabroot.io) الذي رفع الحد الأعلى للتمويل القائم لكل مستهلك إلى مبلغ لا يتجاوز 10,000 ريال، والنص الحالي للمادة في الدليل يحمل هذا الرقم.

ولاحظ أن الحد على «التمويل القائم» Outstanding لا على مبلغ العملية الواحدة، وهذا فرق يغير التصميم. فالعضو الذي اشترى بالتقسيط بـ 9,000 ريال قبل شهر، وسدد منها 2,250، عليه 6,750 قائمة، فلا يستطيع أن يشتري الآن بأكثر من 3,250\. وهذا يعني أن القرار في شاشة الدفع يحتاج رصيد العميل القائم في لحظتها، أي مجموع الأقساط غير المسددة من كل طلباته السابقة لدى الشركة، محسوباً من الدفتر لا من نسخة قديمة، وأن الاسترداد الذي يلغي أقساطاً يرفع المتاح للعميل فوراً. وسوف نرى في المختبر أن 532 طلباً من عشرين ألفاً رفضت بهذا الحد وحده.

وأما نسب الاستقطاع فتأتي من [مبادئ الإقراض المسؤول للأفراد](https://rulebook.sama.gov.sa/en/responsible-lending-principles-individual-customers-0?ref=arabroot.io)، وفيها مثلاً أن العميل الذي دخله الشهري 15,000 ريال أو أقل لا تتجاوز التزاماته الائتمانية الشهرية المرتبطة بالاستقطاع من الراتب 33.33% من الراتب الإجمالي للموظف، ولا تتجاوز التزاماته عدا التمويل العقاري 45% من دخله الشهري الإجمالي. ولكن [تعميم إصدار القواعد](https://rulebook.sama.gov.sa/en/circular-re-rules-regulating-buy-now-pay-later-bnpl-companies?ref=arabroot.io) نفسه استثنى شركات الدفع الآجل، وشركات التمويل الأخرى عند ممارستها هذا النشاط، من تطبيق نسب الاستقطاع عندما لا يتجاوز إجمالي التمويل 2,000 ريال، دون الإخلال ببقية أحكام المبادئ. ومعنى ذلك في النظام أن هناك مسارين للقرار: طلبات صغيرة لا تحتاج حساب نسبة الاستقطاع، وطلبات أكبر تحتاج معرفة دخل العميل والتزاماته، وفي المختبر كان 15,837 طلباً في المسار الأول و3,631 في الثاني.

### التحقق: من هو العميل، وهل يستطيع السداد؟

تلزم المادة التاسعة عشرة الشركة بالتحقق من السجل الائتماني للعميل وتوثيقه بموافقته، وتسجيل معلوماته الائتمانية بموافقته لدى شركة أو أكثر من الشركات المرخصة لجمع المعلومات الائتمانية وتحديثها طوال فترة التعامل، واعتماد طريقة علمية موثقة وواضحة لتقييم جدارة العميل الائتمانية وقدرته على السداد، والتحقق من هويته عبر مصدر موثوق ومستقل. وتطلب المادة أيضاً أن تعرض الموافقات والإقرارات على العميل ليقرأها ويوافق عليها قبل التعامل، وأن تظهر في نافذة منبثقة Pop-up. وتضيف المادة الحادية والعشرون التحقق من رقم جوال العميل برموز التحقق، والتحقق من صحة عنوانه الوطني، وبرنامج العناية الواجبة بالعميل CDD الذي يشمل معرفة العميل KYC وأمن المعلومات وخصوصية البيانات.

وكل سطر من هذه السطور خطوة في شاشة الدفع، وتسجيل المعلومات في الشركات الائتمانية يعني أن تقسيط اشتراك النادي سيظهر في سجل العضو الائتماني، وأن تأخره سيظهر أيضاً. وهذا ما يجعل الدفع الآجل في المملكة مختلفاً عن «تقسيط بلا التزام» كما يتخيله بعض الناس، وما يجعل على التاجر مسؤولية أن يشرح لأعضائه ما يختارون، لأن العضو الغاضب من أثر تأخر قسط النادي على سجله سيلوم النادي أولاً.

### العقد والسجلات والإعلانات

تحدد المادة السادسة والعشرون محتوى العقد مع العميل، ومنه مبلغ الأقساط وعددها ومدتها، والتزام الشركة بإشعار العميل بموعد القسط الشهري مسبقاً، وأثر التأخر في السداد، وطريقة إلغاء الطلب وإجراءات الاسترداد وشروطه ومدته، وإجراءات السداد المبكر، وطريقة التعامل مع المتعثرين، وموافقة العميل على إدخال معلوماته في السجل الائتماني. وتطلب المادة الثالثة عشرة الاحتفاظ بمستندات العملاء وسجلاتهم عشر سنوات على الأقل من تاريخ انتهاء العلاقة، وتصميم الأنظمة بما يضمن توفر البيانات وسلامتها وسريتها واختبارها قبل أول استخدام وبعد أي تغيير. وتمنع المادة الثالثة والعشرون الإعلانات المضللة، والإعلانات المفرطة في الإقناع التي تشجع على الاقتراض لأغراض استهلاكية غير ضرورية، وتلزم الشركة بسحب الإعلان المخالف خلال يوم عمل من إشعار البنك المركزي.

وللمادة الأخيرة أثر على التاجر أيضاً، فعبارة مثل «لماذا تدفع الآن؟ خذه واترك الحساب لبعدين» على صفحة الاشتراك قد تقرأ كتشجيع على اقتراض غير ضروري، وشركة الدفع الآجل تراجع عادة كيف يعرض التاجر خدمتها، لأن المسؤولية أمام البنك المركزي عليها. والأسلم أن يعرض التقسيط كمعلومة واضحة: المبلغ، وعدد الأقساط، ومواعيدها، وأنه دون رسوم، مع رابط للشروط.

وأخيراً، يضع [إطار مكافحة الاحتيال في القسم الرابع](https://rulebook.sama.gov.sa/en/4-control-requirements-%E2%80%93-products-and-services-elevated-risk?ref=arabroot.io) خدمات الدفع الآجل في قائمة المنتجات والخدمات ذات المخاطر المرتفعة التي تلزمها متطلبات إضافية لمكافحة الاحتيال، والسبب واضح لمن قرأ مقال [كشف الاحتيال](https://arabroot.io/articles/%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%8A%D8%A7%D9%84-fraud-detection-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%85-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A9/): المحتال الذي يحصل على سلعة اليوم بهوية مسروقة ولا يدفع إلا القسط الأول يحقق ربحاً بثلاثة أرباع قيمة السلعة، فالدفع الآجل هدف مغر لسرقة الهوية والاستيلاء على الحسابات.

## شاشة الدفع من الداخل

من جهة العضو، الدفع الآجل زر وبضع ثوان، ومن جهة الشركة سلسلة قرارات تحدث في تلك الثواني، والصورة التالية تبينها بالترتيب:

![خمس خطوات من اليمين إلى اليسار: اختيار التقسيط Checkout المبلغ وعدد الأقساط قبل الدفع، ثم الهوية والجوال KYC وOTP من مصدر موثوق مستقل ورمز تحقق للجوال، ثم القرار الائتماني Credit decision بالسجل الائتماني والحد القائم 10,000، ثم العقد والإقرارات Pop-up consent في نافذة منبثقة يقرؤها ويوافق، ثم القسط الأول First instalment بتفويض البطاقة ثم تأكيد الطلب للتاجر، وتحتها أن كل خطوة تترك سجلاً يحفظ عشر سنوات على الأقل بعد انتهاء العلاقة مع العميل](https://arabroot.io/content/images/2026/10/bnpl-03-checkout.webp)

خمس خطوات في ثوان، وكل خطوة سجل يبقى سنوات

1. **اختيار التقسيط:** يرى العضو في صفحة التاجر خيار الدفع الآجل مع مبلغ كل قسط، فيختاره، فينشئ التاجر طلب دفع عند الشركة بالمبلغ ومعرف الطلب، وينتقل العضو إلى صفحة الشركة أو نافذتها.
2. **الهوية والجوال:** العميل الجديد يمر بالتحقق من هويته من مصدر موثوق ومستقل كما تطلب المادة التاسعة عشرة، ومن رقم جواله برمز تحقق كما تطلب المادة الحادية والعشرون، والعميل المعروف يسجل دخوله ويمر بالتحقق الذي تراه الشركة مناسباً لمستوى الخطر.
3. **القرار الائتماني:** النظام يحسب التمويل القائم للعميل لدى الشركة، ويضيف إليه مبلغ الطلب، ويقارنه بالحد 10,000 ريال، ويستعلم عن السجل الائتماني بموافقة العميل، ويطبق نموذج الجدارة الائتمانية، وإذا تجاوز المبلغ 2,000 ريال حسب نسبة الاستقطاع.
4. **العقد والإقرارات:** يعرض العقد بجدول الأقساط ومواعيدها وشروط الإلغاء والتأخر في نافذة منبثقة، ويوافق العميل، ويحفظ النظام النسخة التي وافق عليها ووقت الموافقة.
5. **القسط الأول:** يفوض النظام بطاقة العميل بمبلغ القسط الأول ويحصله، ويحفظ توكن البطاقة لخصم الأقساط التالية، ثم يرسل للتاجر تأكيد الطلب، فيفعل التاجر الاشتراك.

وفي هذا المسار قرار تصميم مهم يخص الترتيب: لماذا يأتي القسط الأول بعد الموافقة الائتمانية لا قبلها؟ والسبب أن تحصيل القسط الأول قبل القرار يعني أن العميل المرفوض دفع مالاً يجب أن يعاد له، وهذا استرداد إضافي وشكوى محتملة. وفي المقابل، القسط الأول بعد الموافقة يقلل خطر الاحتيال، لأن البطاقة التي ترفض في القسط الأول إشارة واضحة على أن الطلب لا يجب أن يكتمل. ولكل خطوة مهلة Timeout، فإذا تأخر الاستعلام الائتماني أو تعطل، فالقرار الصحيح أن يرفض الطلب برسالة واضحة ويعرض على العضو وسيلة دفع أخرى، لا أن يقبل دون استعلام لأن العميل ينتظر.

### كيف يتخذ القرار الائتماني في ثوان؟

القواعد تطلب «طريقة علمية واضحة وشفافة وموثقة» لتقييم الجدارة الائتمانية، ولا تحدد نموذجاً بعينه، وهذا متروك للشركة وسياستها الائتمانية المعتمدة. وفي الواقع يجمع القرار عادة ثلاثة أنواع من المعلومات: ما يقوله السجل الائتماني عن التزامات العميل وسلوكه في السداد، وما تعرفه الشركة عن العميل من تعاملاته السابقة معها، وخصائص الطلب نفسه مثل مبلغه ونوع التاجر. وأخطر ما في هذا القرار أن الشركة لا ترى نتيجته إلا بعد أشهر، فالعميل الذي قبل اليوم يظهر تعثره بعد ثلاثة أشهر، وهذه مشكلة تأخر التصنيف Label Delay التي شرحناها في مقال كشف الاحتيال، فالنموذج يتعلم دائماً من سلوك عملاء قبلوا قبل أشهر في ظروف قد تكون تغيرت.

ومن هنا تأتي قاعدة يعرفها كل من عمل في الائتمان: ابدأ بحدود صغيرة للعملاء الجدد وارفعها مع السداد المنتظم. فالعميل الجديد الذي لا تعرف عنه الشركة إلا سجله الائتماني يحصل على حد صغير، والعميل الذي سدد ستة طلبات في مواعيدها يحصل على حد أكبر، دون أن يتجاوز الحد النظامي. وهذا يحمي الشركة من المحتال الذي يأتي بهوية جديدة ليشتري مرة واحدة بمبلغ كبير، ويكافئ العميل الجيد، وهو منطق تحتاج أن تحفظه في النظام كبيانات: حد لكل عميل، وسبب تغييره، ومن غيره، ومتى.

## جدول الأقساط: أين تختبئ الهللات؟

بعد الموافقة ينشئ النظام جدول الأقساط Instalment Schedule: لكل قسط رقم، وتاريخ استحقاق، ومبلغ، ومبلغ مسدد. ويبدو هذا أبسط جزء في النظام، فالمبلغ مقسوم على العدد، ولكن ثلاثة أسئلة تظهر بسرعة. الأول: ماذا تفعل بالباقي من القسمة؟ فالـ 1,000 ريال على ثلاثة أقساط لا تقسم بالتساوي بالهللة، وسوف نرى في المختبر أن أول نسخة كتبناها خسرت هللة في كل طلب من هذا النوع. والثاني: متى تستحق الأقساط؟ فالشهر ليس ثلاثين يوماً دائماً، والقسط المستحق في 31 من الشهر يحتاج قاعدة للأشهر الأقصر. والثالث: ماذا يحدث للجدول عندما يسترد العضو جزءاً من المبلغ أو يلغي الطلب كله؟

وفي موعد الاستحقاق تنص [ضوابط وإجراءات التحصيل](https://rulebook.sama.gov.sa/en/debt-collection-regulations-and-procedures?ref=arabroot.io) الصادرة في 6 مارس 2025 على أن الجهة الدائنة تحدد موعد الخصم بحسب موعد إيداع الراتب للموظفين أو بحسب الاتفاق مع العميل لغيرهم، وتمنع خصم القسط قبل موعده المتفق عليه، وتمنع خصم أكثر من قسط لكل عقد في دورة راتب واحدة إلا بأمر قضائي أو بموافقة العميل، وإذا تجاوز الخصم موعده بسبب يعود للدائن دون موافقة العميل فيضاف للعميل مدة مماثلة في آخر فترة التمويل دون تكلفة أو رسوم. وهذه القواعد تتحول في النظام إلى قيود واضحة: لا يعمل الخصم الآلي قبل تاريخ الاستحقاق ولو كان العميل سيقبض راتبه قبله، ولا تجمع إعادة المحاولة قسطين في محاولة واحدة، وتأخر الخصم بسبب عطل في نظام الشركة يحرك الجدول لا يحمل العميل أثره.

### الاسترداد والإلغاء: من يعود له المال؟

لنفرض أن العضو اشترى الاشتراك السنوي بالتقسيط، ودفع القسط الأول 300 ريال، ثم قرر بعد أسبوع أن ينتقل إلى باقة أقل فاستحق استرداد 450 ريالاً. السؤال: من أين يخرج هذا الاسترداد؟ فالعضو لم يدفع إلا 300 ريال، والتاجر قبض 1,200 ناقص الرسوم من شركة الدفع الآجل. والإجابة المتبعة أن التاجر يرسل الاسترداد إلى شركة الدفع الآجل لا إلى العضو، والشركة تخفض ما على العضو من أقساط قادمة، وإذا كان الاسترداد أكبر من الأقساط غير المسددة يعود الفرق إلى بطاقة العضو. ولكن طريقة تخفيض الأقساط القادمة ليست واحدة، والصورة التالية تبين سياستين بنفس الأرقام:

![ثلاث لوحات: الجدول الأصلي 1,200 على 4 أقساط 300 لكل قسط والأول مدفوع عند الشراء والمتبقي 900، ثم الإلغاء من الآخر Policy A بأقساط 300 و300 و150 وصفر فالقسط القادم كما هو وتنتهي الأقساط أبكر، ثم التوزيع النسبي Policy B بأقساط 300 و150 و150 و150 فكل قسط قادم يصغر والمدة كما هي، وتحتها أن الاسترداد 450 والمجموع 750 في الحالتين والتجربة مختلفة للعضو](https://arabroot.io/content/images/2026/10/bnpl-04-refund.webp)

نفس المبلغ ونفس المجموع، وتجربتان مختلفتان للعضو

في السياسة الأولى يلغي الاسترداد الأقساط الأخيرة أولاً، فيبقى القسط القادم 300 ريال كما هو، وتنتهي الأقساط أبكر بشهر. وفي الثانية يوزع الاسترداد على كل الأقساط القادمة بنسبة مبالغها، فيصبح كل قسط 150 ريالاً وتبقى المدة كما هي. والسياستان صحيحتان حسابياً، ولكن العضو الذي يرى قسطه القادم 300 ريال بعد أن استرد 450 سيتصل بخدمة العملاء غالباً، لأنه يتوقع أن يرى أثر الاسترداد في الدفعة القادمة. والأهم أن المادة السادسة والعشرين تطلب أن يذكر العقد طريقة الإلغاء والاسترداد وشروطه ومدته، فالسياسة قرار يكتب في العقد ويعرض للعميل، لا تفصيل يختاره المطور في دالة. وسنرى السياستين تعملان في المختبر بنفس الأرقام.

وأما الإلغاء الكامل بعد دفع القسط الأول، فيلغي كل الأقساط القادمة ويعيد القسط الأول إلى البطاقة، وتعيد شركة الدفع الآجل حسابها مع التاجر: التاجر يعيد المبلغ الذي قبضه، وفي رسوم الخدمة على عملية ألغيت تفصيل يحدده عقد التاجر، هل تعاد أم لا، وهذا سؤال يسأله المؤسس قبل التوقيع لأن أثره يظهر في كل استرداد.

### السداد المبكر

العميل الذي يريد أن يسدد كل الأقساط الباقية اليوم يدفع ما عليه فقط، لأن الدفع الآجل دون تكلفة أجل أصلاً، فلا يوجد ربح مستقبلي يخصم منه كما في التمويل الشخصي. ومع ذلك تطلب المادة السادسة والعشرون أن يذكر العقد إجراءات السداد المبكر وتعويض الشركة إن لزم وطريقة تحديده، فاقرأ العقد ولا تفترض. ومن الناحية التقنية، السداد المبكر حركة دفع واحدة تغطي عدة أقساط، فيجب أن يعرف النظام كيف يوزعها على الأقساط بالترتيب، وأن يحدث التمويل القائم للعميل فوراً، فيرتفع المتاح له في شاشة الدفع التالية.

## التأخر في السداد وأيام التأخر DPD

في موعد كل قسط يحاول النظام الخصم من البطاقة أو الحساب، وأغلب الأقساط تنجح، وبعضها يفشل لأن الرصيد لا يكفي أو البطاقة انتهت أو أوقفها العميل. ومن لحظة الفشل يبدأ عداد يسمى أيام التأخر Days Past Due، واختصاراً DPD، وهو أهم رقم في إدارة أي محفظة ائتمان، لأن القسط المتأخر خمسة أيام غالباً سيسدد، والمتأخر تسعين يوماً غالباً لن يسدد. والصورة التالية تبين مراحل القسط بعد موعده كما نقسمها في المختبر:

![خمس مراحل من اليمين إلى اليسار: مستحق اليوم Due محاولة الخصم وإشعار مسبق قبلها، ثم 1 إلى 30 يوماً DPD 1-30 تذكير وإعادة محاولة وإيقاف الشراء الجديد، ثم 31 إلى 60 تواصل مباشر وخطة سداد، ثم 61 إلى 90 تحصيل وفق اللائحة وتحديث السجل الائتماني، ثم أكثر من 90 مخصص وشطب محاسبي والتحصيل قد يستمر، وتحتها أن المراحل هنا تقسيم المختبر وسياسة التحصيل في كل شركة تحدد الإجراء ومدته في كل مرحلة](https://arabroot.io/content/images/2026/10/bnpl-05-dpd.webp)

القسط يتقدم في المراحل كل يوم لا يسدد فيه، والإجراء يتغير مع كل مرحلة

والتقسيم إلى شرائح 30 يوماً تقسيم نستخدمه في المختبر لأنه يجعل الأرقام سهلة القراءة، أما تعريف التعثر نفسه في المملكة فتحدده ضوابط التحصيل: في الأقساط الشهرية يعد العميل متعثراً إذا ثبت أنه لم يلتزم بسداد الأقساط كلياً أو جزئياً لثلاثة أشهر متتالية، أو تأخر في سداد خمسة أقساط منفصلة سبعة أيام عمل أو أكثر لكل منها خلال مدة العقد. وتلزم الضوابط الدائن بالبحث عن حلول استباقية عندما تظهر مؤشرات تغير في وضع العميل الائتماني قد تؤدي إلى التعثر، وتلزمه بإعادة جدولة الدين دون رسوم إضافية إذا ثبت تغير قسري في ظروف العميل، مثل فقدان العمل أو التقاعد الإجباري، خلال مدة لا تتجاوز 20 يوم عمل من تقديم المستندات.

### ما تقوله ضوابط التحصيل عن المتابعة

نظام المتابعة في شركة الدفع الآجل هو في الحقيقة محرك قواعد يقرر لكل قسط متأخر: هل نرسل تذكيراً؟ هل نعيد محاولة الخصم؟ هل يتصل موظف؟ وضوابط التحصيل تضع حدوداً صريحة لهذا المحرك، منها:

- لا تتجاوز محاولات الاتصال الهاتفي بالعميل أو كفيله عشر مكالمات كحد أقصى كل ثلاثين يوماً لكل منتج تمويلي، وفي ساعات العمل الرسمية، مع تمكين العميل من معاودة الاتصال على الرقم الذي اتصل منه.
- لا يتصل الدائن بأحد غير العميل أو كفيله، ويتحقق من هوية من يرد في بداية المكالمة، ويبلغه أن المكالمة مسجلة.
- توثق كل الاتصالات الواردة والصادرة وتحفظ عشر سنوات على الأقل من تاريخ الاتصال.
- لا يزور الدائن العميل أو كفيله في سكنه أو مقر عمله بأي حال.
- لا تتجاوز غرامات التأخير أو رسوم التحصيل المبلغ المستحق، وبحد أقصى قيمة قسط واحد طوال فترة التمويل.

ولاحظ أن البند الأول ليس توصية، وإنما عداد يجب أن يحسبه النظام: لكل عميل ولكل منتج عدد محاولات الاتصال في آخر ثلاثين يوماً، ويمنع المحاولة الحادية عشرة قبل أن تخرج أقدم محاولة من النافذة. وهذا نفس نمط تحديد المعدل Rate Limiting بنافذة منزلقة الذي تستخدمه في الواجهات البرمجية، ولكن خطأه هنا مخالفة نظامية لا رسالة خطأ 429\. والبند الأخير يعني أن مجموع ما تأخذه الشركة من غرامات ورسوم تحصيل من عميل اشترى بـ 1,200 ريال على أربعة أقساط لا يتجاوز 300 ريال طوال العقد، أياً كان عدد مرات التأخر، فالنظام يحتاج أن يعرف ما أخذه سابقاً من هذا العقد قبل أن يضيف أي مبلغ.

### المخصصات: الخسارة قبل أن تقع

تلزم المادة التاسعة عشرة الشركة بالاحتفاظ بمخصصات للخسائر المحتملة والتعثر والمخاطر بما يتفق مع معايير المحاسبة الدولية، وتلزمها المادة الثامنة والعشرون بإبلاغ البنك المركزي فوراً بأي خسائر تتجاوز 15% من رأس مالها المدفوع. والمعيار المعروف في هذا المجال هو [IFRS 9 للأدوات المالية](https://www.ifrs.org/issued-standards/list-of-standards/ifrs-9-financial-instruments/?ref=arabroot.io)، وفكرته الأساسية للمهندس أن الشركة لا تنتظر حتى يتعثر العميل فعلاً لتسجل الخسارة، وإنما تقدر الخسائر الائتمانية المتوقعة Expected Credit Loss على المحفظة وتسجل لها مخصصاً، وتزيده عندما تتدهور حالة القسط من مرحلة إلى أخرى. وتفاصيل حساب المخصص قرار المحاسبين ومدققي الحسابات، أما ما يحتاجه النظام فبيانات دقيقة ونظيفة: لكل قسط تاريخ استحقاقه ومبلغه وما سدد منه وأيام تأخره في كل يوم، لأن نموذج الخسائر المتوقعة يبنى على تاريخ انتقال الأقساط بين مراحل التأخر، ومن لا يحفظ هذا التاريخ لا يستطيع أن يحسبه لاحقاً.

## اقتصاديات الشركة: من أين تربح ومتى تخسر؟

شركة الدفع الآجل في المملكة لا تأخذ من العميل تكلفة أجل ولا رسوماً، فدخلها الأساسي رسوم التاجر Merchant Fee، وهي نسبة من قيمة كل طلب يحددها العقد مع كل تاجر. ومن هذا الدخل تدفع أربعة أنواع من التكاليف:

- **تكلفة التمويل Funding Cost:** الشركة تدفع للتاجر اليوم وتسترد على أشهر، والمال الذي ينتظر عودته له تكلفة، سواءً كان من تسهيلات بنكية بربح معين أو من رأس مال كان يمكن أن يستثمر في شيء آخر، وهذه التكلفة تكبر مع المبلغ ومع المدة.
- **الخسائر الائتمانية Credit Losses:** ما لا يسدده العملاء المتعثرون بعد كل محاولات التحصيل، ناقص ما يسترد منه لاحقاً.
- **تكلفة التحصيل:** رسوم مزود الدفع على كل محاولة خصم، ومحاولات إعادة الخصم للمتأخرين، وفريق المتابعة.
- **تكلفة التشغيل:** الفريق، والأنظمة، والاستعلامات الائتمانية، والتحقق من الهوية، والامتثال، والتدقيق.

وهنا يظهر سؤال لا يطرحه أغلب الناس: لماذا لا تقسط الشركة كل شيء على 12 شهراً إذا كان العميل يفضل الأقساط الصغيرة والقواعد تسمح بها؟ والإجابة في تكلفة التمويل: رسوم التاجر تؤخذ مرة واحدة، أما المال الذي تنتظره الشركة فيبقى خارجها ثلاثة أضعاف المدة في التقسيط على 12 شهراً مقارنة بأربعة أشهر، فتتضاعف تكلفته بينما يبقى الدخل كما هو. وهذا ما سوف يقيسه المختبر بالأرقام، تحت افتراضات نكتبها صراحة، لأن رسوم التجار وتكلفة التمويل ونسب التعثر الحقيقية أرقام تجارية لا تنشرها الشركات، ولا نريد أن نخترع أرقاماً ونقدمها كحقائق.

## المختبر: جدول الأقساط ومحفظة الشركة

المختبر برنامجان في Python بالمكتبة القياسية فقط، شغلناهما داخل Container من الـ Docker Image الرسمية `python:3.13.17-slim`، والبيانات كلها مولدة ببذرة ثابتة لا تمثل أي شركة أو عميل. البرنامج الأول يبني جدول الأقساط ويطبق سياستي الاسترداد، والثاني يبني محفظة شركة دفع آجل من عشرين ألف طلب ويحسب دخلها وتكاليفها. والمبالغ كلها بالهللة كأعداد صحيحة، للسبب الذي شرحناه في مقال [المحفظة الرقمية من الداخل](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%85%D8%AD%D9%81%D8%B8%D8%A9-%D8%B1%D9%82%D9%85%D9%8A%D8%A9-ledger/): الكسور العشرية في `float` لا تمثل الهللات بدقة.

### البرنامج الأول: جدول الأقساط والاسترداد

الملف التالي فيه دالتان للتقسيم، الأولى هي أول ما كتبناه، والثانية هي الإصلاح، ثم دالة الجدول، وسياستا الاسترداد:

```python
# schedule.py: instalment schedules in halalas, the rounding remainder, and two refund policies
from datetime import date
import calendar

def add_months(d, k):
    m = d.month - 1 + k
    y, m = d.year + m // 12, m % 12 + 1
    return date(y, m, min(d.day, calendar.monthrange(y, m)[1]))

def split_simple(total, n):
    # the first version we wrote: every instalment is total // n
    return [total // n] * n

def split(total, n):
    # the remainder halalas go to the first instalment, paid at checkout
    base, rem = divmod(total, n)
    return [base + rem] + [base] * (n - 1)

def schedule(total, n, start):
    return [{"k": i + 1, "due": add_months(start, i), "amount": a, "paid": 0}
            for i, a in enumerate(split(total, n))]

def refund_from_last(sched, refund):
    # policy A: the refund cancels the last unpaid instalments first
    left = refund
    for row in reversed(sched):
        open_ = row["amount"] - row["paid"]
        cut = min(open_, left)
        row["amount"] -= cut
        left -= cut
    return left            # money to send back to the card (already paid part)

def refund_pro_rata(sched, refund):
    # policy B: every unpaid instalment shrinks in proportion
    unpaid = [r for r in sched if r["amount"] > r["paid"]]
    open_total = sum(r["amount"] - r["paid"] for r in unpaid)
    cut_total = min(refund, open_total)
    done = 0
    for i, r in enumerate(unpaid):
        open_ = r["amount"] - r["paid"]
        cut = cut_total - done if i == len(unpaid) - 1 else open_ * cut_total // open_total
        r["amount"] -= cut
        done += cut
    return refund - cut_total

def show(title, sched):
    print(title)
    for r in sched:
        print(f"  #{r['k']} due {r['due']}  amount {r['amount']/100:>8.2f}  paid {r['paid']/100:>8.2f}")
    print(f"  total {sum(r['amount'] for r in sched)/100:.2f}")

if __name__ == "__main__":
    total = 100000                                   # 1,000.00 SAR in halalas
    print("simple split of 1,000.00 into 3:", [a / 100 for a in split_simple(total, 3)],
          "sum", sum(split_simple(total, 3)) / 100)
    print("fixed split of 1,000.00 into 3:", [a / 100 for a in split(total, 3)],
          "sum", sum(split(total, 3)) / 100)

    sub = schedule(120000, 4, date(2026, 11, 3))     # annual club subscription 1,200.00 SAR in 4
    sub[0]["paid"] = sub[0]["amount"]                # first instalment taken at checkout
    show("annual subscription, 4 instalments, first paid at checkout:", sub)

    a = schedule(120000, 4, date(2026, 11, 3)); a[0]["paid"] = a[0]["amount"]
    back = refund_from_last(a, 45000)                # member downgrades: 450.00 SAR refund
    show("refund 450.00, policy A (last instalments first):", a)
    print("  back to card now:", back / 100)

    b = schedule(120000, 4, date(2026, 11, 3)); b[0]["paid"] = b[0]["amount"]
    back = refund_pro_rata(b, 45000)
    show("refund 450.00, policy B (pro rata):", b)
    print("  back to card now:", back / 100)

    c = schedule(120000, 4, date(2026, 11, 3)); c[0]["paid"] = c[0]["amount"]
    back = refund_from_last(c, 120000)               # full cancellation
    show("full refund 1,200.00 after the first instalment:", c)
    print("  back to card now:", back / 100)
```

والأمر الذي شغلنا به البرنامج، من مجلد المختبر في Git Bash على Windows، كما يلي:

```bash
export MSYS_NO_PATHCONV=1
docker run --rm --name sfc-bnpl -v "$(pwd -W)":/lab -w /lab python:3.13.17-slim sh -c "python --version; python schedule.py"
```

والمخرج سوف يكون كما يلي:

```text
Python 3.13.17
simple split of 1,000.00 into 3: [333.33, 333.33, 333.33] sum 999.99
fixed split of 1,000.00 into 3: [333.34, 333.33, 333.33] sum 1000.0
annual subscription, 4 instalments, first paid at checkout:
  #1 due 2026-11-03  amount   300.00  paid   300.00
  #2 due 2026-12-03  amount   300.00  paid     0.00
  #3 due 2027-01-03  amount   300.00  paid     0.00
  #4 due 2027-02-03  amount   300.00  paid     0.00
  total 1200.00
refund 450.00, policy A (last instalments first):
  #1 due 2026-11-03  amount   300.00  paid   300.00
  #2 due 2026-12-03  amount   300.00  paid     0.00
  #3 due 2027-01-03  amount   150.00  paid     0.00
  #4 due 2027-02-03  amount     0.00  paid     0.00
  total 750.00
  back to card now: 0.0
refund 450.00, policy B (pro rata):
  #1 due 2026-11-03  amount   300.00  paid   300.00
  #2 due 2026-12-03  amount   150.00  paid     0.00
  #3 due 2027-01-03  amount   150.00  paid     0.00
  #4 due 2027-02-03  amount   150.00  paid     0.00
  total 750.00
  back to card now: 0.0
full refund 1,200.00 after the first instalment:
  #1 due 2026-11-03  amount   300.00  paid   300.00
  #2 due 2026-12-03  amount     0.00  paid     0.00
  #3 due 2027-01-03  amount     0.00  paid     0.00
  #4 due 2027-02-03  amount     0.00  paid     0.00
  total 300.00
  back to card now: 300.0
```

في المخرج أعلاه لاحظ التالي:

- السطر الثاني هو المشكلة التي ظهرت لنا فعلاً: الدالة الأولى `split_simple` قسمت 1,000 ريال على ثلاثة فأعطت 333.33 ثلاث مرات، والمجموع 999.99\. هللة واحدة ضاعت، وفي محفظة فيها مئات الآلاف من الطلبات تصبح الهللة مبالغ لا تطابق بين ما دفعته الشركة للتاجر وما تحصله من العملاء، وتظهر في المطابقة كفرق لا يعرف أحد مصدره. والإصلاح في `split`: نحسب القسمة الصحيحة والباقي بـ `divmod`، ونضيف الباقي إلى القسط الأول، فيصبح 333.34 والمجموع 1,000 بالضبط.
- لماذا القسط الأول تحديداً؟ لأنه يدفع عند الشراء، فيحمل الهللة الزائدة أقل مخاطرة، والأقساط التالية متساوية فيسهل على العميل تذكرها. وبعض الشركات تضع الباقي في القسط الأخير، والمهم أن تختار قاعدة واحدة وتكتبها في العقد وتختبرها، فالعميل يرى المبالغ في العقد والنظام يجب أن يطابقها هللة بهللة.
- جدول الاشتراك السنوي أربعة أقساط بـ 300 ريال، في الثالث من كل شهر، والقسط الأول مدفوع. ودالة `add_months` تتعامل مع الأشهر الأقصر، فالطلب في 31 يناير يستحق قسطه التالي في آخر فبراير لا في 3 مارس، وهذه حالة تكتب لها اختباراً قبل أن يكتبها لك عميل غاضب.
- الاسترداد 450 ريالاً بالسياسة الأولى ألغى القسط الرابع كله ونصف الثالث، فأصبح الجدول 300 و300 و150 وصفراً، وبالسياسة الثانية خفض كل قسط قادم بـ 150، فأصبح 300 و150 و150 و150\. والمجموع في الحالتين 750 ريالاً، ولا شيء يعود إلى البطاقة الآن، لأن الاسترداد أقل من الأقساط غير المسددة.
- الإلغاء الكامل بعد القسط الأول أصفر كل الأقساط القادمة، وأعاد 300 ريال إلى البطاقة، وهي القسط الذي دفعه العضو فعلاً. ولاحظ أن الدالة ترجع المبلغ الذي يعود إلى البطاقة كقيمة منفصلة، لأن هذا المبلغ حركة دفع حقيقية تحتاج تنفيذاً عند مزود الدفع، بينما تخفيض الأقساط مجرد تعديل في الجدول.

### البرنامج الثاني: محفظة من عشرين ألف طلب

البرنامج الثاني يولد 20,000 طلب من 6,000 عميل على مدى أربعة أشهر، بمبالغ من ست سلال بين 300 و9,000 ريال، ولكل طلب يطبق حد التمويل القائم 10,000 ريال لكل عميل، ويحدد هل يحتاج حساب نسبة الاستقطاع، ثم يحاكي سداد كل قسط: في الموعد، أو متأخراً بين يوم و45 يوماً، أو يتوقف العميل عن السداد. ويحسب لكل طلب رسوم التاجر، وتكلفة تمويل المال الذي دفعته الشركة يوماً بيوم حتى يعود، وتكلفة محاولات التحصيل، والمبلغ المشطوب وما يسترد منه. والأرقام في `ASSUME` افتراضات للتجربة نكتبها صراحة، وليست أسعار سوق ولا نسب تعثر حقيقية لأي شركة:

```python
# portfolio.py: a BNPL provider's book on synthetic orders, with stated assumptions (not market prices)
import random, sys
from collections import Counter
from schedule import split

ASSUME = {
    "merchant_fee": 0.05,       # share of the order the merchant pays the provider (assumption)
    "funding_rate": 0.07,       # yearly cost of the money the provider lends (assumption)
    "collect_cost": 50,         # halalas per collection attempt, card or bank fees (assumption)
    "p_late": 0.08,             # chance an instalment is paid late but paid (assumption)
    "pd": 0.02,                 # chance an order stops paying after the first instalment (assumption)
    "recovery": 0.20,           # share of a written-off balance collected later (assumption)
    "n": 4,                     # number of monthly instalments
}
LIMIT_TOTAL = 1_000_000         # SAR 10,000 outstanding per consumer (SAMA BNPL rules, Article 22)
LIMIT_N = 12                    # at most 12 instalments (Article 22)
NO_RATIO_UP_TO = 200_000        # deductible ratios not applied up to SAR 2,000 (SAMA circular, 17/12/2023)

def run(a, seed=2026, orders=20_000, customers=6_000, snapshot=150):
    assert a["n"] <= LIMIT_N
    rnd = random.Random(seed)
    baskets = [30000, 60000, 120000, 240000, 480000, 900000]   # halalas
    weights = [30, 25, 25, 12, 6, 2]
    owed = {}                                   # customer -> list of (pay_day, amount) still unpaid at a given day
    book = Counter(); dpd = Counter(); rejected = Counter()
    for _ in range(orders):
        day = rnd.randrange(0, 120)             # orders arrive over four months
        cust = rnd.randrange(customers)
        amount = rnd.choices(baskets, weights)[0]
        outstanding = sum(x for d, x in owed.get(cust, []) if d > day)
        if outstanding + amount > LIMIT_TOTAL:
            rejected["over SAR 10,000 outstanding"] += 1
            continue
        book["checks_with_ratio" if amount > NO_RATIO_UP_TO else "checks_no_ratio"] += 1
        parts = split(amount, a["n"])
        book["orders"] += 1; book["gmv"] += amount
        fee = round(amount * a["merchant_fee"]); book["fee"] += fee
        cash = -(amount - fee); last = day; events = []
        stop = rnd.randrange(1, a["n"]) if rnd.random() < a["pd"] else None
        for k, part in enumerate(parts):
            due = day + 30 * k
            if stop is not None and k >= stop:
                unpaid = sum(parts[k:])
                book["written_off"] += unpaid
                book["recovered"] += round(unpaid * a["recovery"])
                owed.setdefault(cust, []).append((10**9, unpaid))   # stays on the customer until settled
                for j in range(k, a["n"]):
                    late = snapshot - (day + 30 * j)
                    if late > 0: dpd[bucket(late)] += parts[j]
                last = due + 90
                break
            delay = rnd.randint(1, 45) if k and rnd.random() < a["p_late"] else 0
            pay = due + delay
            book["attempts"] += 1 + (delay // 7)                  # weekly retries while late
            events.append((pay, part))
            owed.setdefault(cust, []).append((pay, part))
            if due < snapshot <= pay: dpd[bucket(snapshot - due)] += part
            elif pay <= snapshot: dpd["paid"] += part
            else: dpd["not due"] += part
            last = max(last, pay)
        # funding cost: interest on cash the provider has out, day by day
        bal, t, cost = cash, day, 0.0
        for pay, part in sorted(events):
            if bal < 0: cost += -bal * a["funding_rate"] * (pay - t) / 365
            bal += part; t = pay
        if bal < 0: cost += -bal * a["funding_rate"] * (last - t) / 365
        book["funding"] += round(cost)
    book["collect"] = book["attempts"] * a["collect_cost"]
    book["loss"] = book["written_off"] - book["recovered"]
    book["net"] = book["fee"] - book["funding"] - book["collect"] - book["loss"]
    return book, dpd, rejected

def bucket(d):
    return "1-30" if d <= 30 else "31-60" if d <= 60 else "61-90" if d <= 90 else "90+"

def sar(h): return f"{h/100:>14,.2f}"

def report(name, a):
    b, dpd, rej = run(a)
    print(f"== {name}")
    print(f"orders {b['orders']:,}  rejected {sum(rej.values()):,} {dict(rej)}  no-ratio checks {b['checks_no_ratio']:,}  ratio checks {b['checks_with_ratio']:,}")
    for k in ["gmv", "fee", "funding", "collect", "written_off", "recovered", "loss", "net"]:
        print(f"  {k:<12}{sar(b[k])}  {100*b[k]/b['gmv']:6.2f}% of GMV")
    print("  day-150 book:", {k: f"{v/100:,.0f}" for k, v in sorted(dpd.items())})

if __name__ == "__main__":
    report("base (assumptions above)", ASSUME)
    report("defaults x2 (pd 4%)", {**ASSUME, "pd": 0.04})
    report("funding 10%", {**ASSUME, "funding_rate": 0.10})
    report("12 instalments, same fee", {**ASSUME, "n": 12})
    if "--break-even" in sys.argv:
        for pd in [0.02, 0.04, 0.06, 0.08]:
            b, _, _ = run({**ASSUME, "pd": pd})
            print(f"pd {pd:.0%}: net {100*b['net']/b['gmv']:.2f}% of GMV")
```

وشغلناه بنفس الطريقة مع الخيار `--break-even`:

```bash
docker run --rm --name sfc-bnpl -v "$(pwd -W)":/lab -w /lab python:3.13.17-slim python portfolio.py --break-even
```

والمخرج سوف يكون كما يلي:

```text
== base (assumptions above)
orders 19,468  rejected 532 {'over SAR 10,000 outstanding': 532}  no-ratio checks 15,837  ratio checks 3,631
  gmv          23,383,500.00  100.00% of GMV
  fee           1,169,175.00    5.00% of GMV
  funding         189,852.18    0.81% of GMV
  collect          44,979.50    0.19% of GMV
  written_off     219,225.00    0.94% of GMV
  recovered        43,845.00    0.19% of GMV
  loss            175,380.00    0.75% of GMV
  net             758,963.32    3.25% of GMV
  day-150 book: {'1-30': '275,775', '31-60': '81,450', '61-90': '26,400', '90+': '7,050', 'not due': '4,332,600', 'paid': '18,581,400'}
== defaults x2 (pd 4%)
orders 19,473  rejected 527 {'over SAR 10,000 outstanding': 527}  no-ratio checks 15,827  ratio checks 3,646
  gmv          23,400,300.00  100.00% of GMV
  fee           1,170,015.00    5.00% of GMV
  funding         193,048.41    0.82% of GMV
  collect          44,501.50    0.19% of GMV
  written_off     469,425.00    2.01% of GMV
  recovered        93,885.00    0.40% of GMV
  loss            375,540.00    1.60% of GMV
  net             556,925.09    2.38% of GMV
  day-150 book: {'1-30': '328,725', '31-60': '138,600', '61-90': '61,350', '90+': '19,425', 'not due': '4,176,075', 'paid': '18,510,375'}
== funding 10%
orders 19,468  rejected 532 {'over SAR 10,000 outstanding': 532}  no-ratio checks 15,837  ratio checks 3,631
  gmv          23,383,500.00  100.00% of GMV
  fee           1,169,175.00    5.00% of GMV
  funding         271,261.17    1.16% of GMV
  collect          44,979.50    0.19% of GMV
  written_off     219,225.00    0.94% of GMV
  recovered        43,845.00    0.19% of GMV
  loss            175,380.00    0.75% of GMV
  net             677,554.33    2.90% of GMV
  day-150 book: {'1-30': '275,775', '31-60': '81,450', '61-90': '26,400', '90+': '7,050', 'not due': '4,332,600', 'paid': '18,581,400'}
== 12 instalments, same fee
orders 19,419  rejected 581 {'over SAR 10,000 outstanding': 581}  no-ratio checks 15,834  ratio checks 3,585
  gmv          23,069,400.00  100.00% of GMV
  fee           1,153,470.00    5.00% of GMV
  funding         663,875.84    2.88% of GMV
  collect         139,381.50    0.60% of GMV
  written_off     220,900.00    0.96% of GMV
  recovered        44,180.00    0.19% of GMV
  loss            176,720.00    0.77% of GMV
  net             173,492.66    0.75% of GMV
  day-150 book: {'1-30': '106,475', '31-60': '14,150', '61-90': '2,475', '90+': '675', 'not due': '16,106,775', 'paid': '6,634,125'}
pd 2%: net 3.25% of GMV
pd 4%: net 2.38% of GMV
pd 6%: net 1.72% of GMV
pd 8%: net 1.06% of GMV
```

### قراءة الحالة الأساسية سطراً بسطر

لنبدأ بالحالة الأولى، وهي الافتراضات كما هي في الكود:

- **orders 19,468 و rejected 532:** من عشرين ألف طلب قبل 19,468 ورفض 532 لأن التمويل القائم للعميل مع الطلب الجديد يتجاوز 10,000 ريال. والرفض هنا بالحد النظامي وحده، دون أي نموذج ائتماني، فالشركة الحقيقية ترفض أكثر من ذلك بقرارها الائتماني. ولاحظ أن العميل المتعثر يبقى مبلغه قائماً عليه في النموذج، فلا يستطيع أن يشتري مرة أخرى، وهذا جزء من الرفض.
- **no-ratio checks و ratio checks:** 15,837 طلباً بمبلغ 2,000 ريال أو أقل لا تحتاج حساب نسبة الاستقطاع بحسب التعميم، و3,631 طلباً أكبر تحتاجه. وهذا رقم يهم فريق المنتج: أربعة أخماس الطلبات في هذه السلال تمر بمسار أخف، والخمس الباقي يحتاج معلومات الدخل والالتزامات، أي خطوة أطول في شاشة الدفع ونسبة ترك أعلى.
- **gmv:** قيمة المبيعات الإجمالية Gross Merchandise Value للطلبات المقبولة 23,383,500 ريال، وهي المرجع الذي نقسم عليه كل رقم بعده.
- **fee:** رسوم التاجر بالافتراض 5%، أي 1,169,175 ريالاً، وهي كل دخل الشركة في النموذج.
- **funding:** تكلفة التمويل 189,852.18 ريالاً، أي 0.81% من المبيعات. والحساب أن الشركة تدفع للتاجر 95% من المبلغ في يوم الطلب، ثم تدخل الأقساط شهراً بعد شهر، وفي كل فترة تدفع 7% سنوياً على المبلغ الذي ما زال خارجها، وهذا يصغر مع كل قسط حتى يصبح موجباً بعد القسط الأخير.
- **collect:** تكلفة محاولات التحصيل 0.19%، بافتراض 50 هللة لكل محاولة، ومحاولة إضافية كل أسبوع للقسط المتأخر.
- **written\_off و recovered و loss:** المشطوب 219,225 ريالاً من الطلبات التي توقف أصحابها عن السداد، استرد منها 20% بالافتراض، فالخسارة الصافية 175,380 ريالاً، أي 0.75% من المبيعات.
- **net:** الصافي 758,963.32 ريالاً، أي 3.25% من المبيعات، قبل تكاليف التشغيل من رواتب وأنظمة واستعلامات، فهذا هامش المساهمة Contribution Margin لا الربح.
- **day-150 book:** صورة المحفظة في اليوم 150: 18.58 مليون مسددة، و4.33 مليون لم يحن موعدها، ومبالغ متأخرة موزعة على الشرائح: 275,775 ريالاً متأخرة حتى 30 يوماً، و81,450 بين 31 و60، و26,400 بين 61 و90، و7,050 أكثر من 90\. وهذا التوزيع هو ما يراه فريق المخاطر كل صباح، والأرقام في الشرائح المبكرة تشمل أقساطاً ستسدد لاحقاً، فالتأخر ليس تعثراً بالضرورة.

### ماذا لو تضاعف التعثر؟ وماذا لو طالت المدة؟

بقية المخرج تجارب «ماذا يحدث إذا…؟» على نفس البيانات المولدة، كل منها يغير افتراضاً واحداً، والصورة التالية تجمع الصافي في الحالات الأربع:

![أعمدة أفقية لصافي الشركة كنسبة من قيمة المبيعات: الحالة الأساسية 3.25%، والتعثر ضعفان 4% صافي 2.38%، وتكلفة التمويل 10% صافي 2.90%، و12 قسطاً بنفس الرسوم صافي 0.75%، وتحتها أن الصافي من رسوم التاجر بعد التمويل والتحصيل والخسائر بافتراضات المختبر](https://arabroot.io/content/images/2026/10/bnpl-06-lab.webp)

نفس رسوم التاجر في الحالات الأربع، وأكبر أثر للمدة لا للتعثر

- **التعثر ضعفان:** عندما رفعنا احتمال توقف العميل عن السداد من 2% إلى 4%، تضاعف المشطوب تقريباً من 0.94% إلى 2.01% من المبيعات، ونزل الصافي من 3.25% إلى 2.38%. والمثير أن الأثر أقل من المتوقع، والسبب أن العميل المتعثر في النموذج دفع القسط الأول على الأقل، وأحياناً الثاني والثالث، فالخسارة جزء من الطلب لا كله. وسطر `--break-even` في آخر المخرج يكمل الصورة: كل نقطتين مئويتين في احتمال التعثر تأخذان بين 0.66 و0.87 نقطة من الصافي، ففي 8% يصبح الصافي 1.06% فقط.
- **تكلفة التمويل 10%:** رفع تكلفة المال من 7% إلى 10% سنوياً زاد تكلفة التمويل من 0.81% إلى 1.16%، ونزل الصافي إلى 2.90%. والأثر محدود لأن مدة الطلب أربعة أشهر فقط، فالمال لا يبقى خارج الشركة طويلاً.
- **12 قسطاً بنفس الرسوم:** هذه أكبر صدمة في المختبر. نفس الطلبات ونفس رسوم التاجر ونفس احتمال التعثر، ولكن على 12 قسطاً شهرياً بدلاً من أربعة، فارتفعت تكلفة التمويل من 0.81% إلى 2.88%، وتكلفة التحصيل من 0.19% إلى 0.60% لأن عدد محاولات الخصم ثلاثة أضعاف، ونزل الصافي من 3.25% إلى 0.75%. وصورة المحفظة في اليوم 150 تبين السبب: 16.1 مليون لم يحن موعدها بعد، مقابل 4.3 مليون في الحالة الأساسية، فالمال ينتظر ثلاثة أضعاف المدة.

والدرس من التجربة الثالثة أن المدة الطويلة لا تصلح بنفس رسوم المدة القصيرة، فالشركة التي تقدم 12 قسطاً تحتاج رسوماً أعلى من التاجر، أو تمويلاً أرخص، أو تقتصر على تجار ومبالغ تبرر ذلك. ولهذا ترى في السوق رسوماً تختلف بحسب المدة، وتاجراً يقدم لعملائه أربعة أقساط على كل المنتجات و12 قسطاً على المنتجات الغالية فقط.

### حدود النموذج: ما الذي لا يقوله المختبر؟

النموذج صغير عمداً لنرى أثر كل افتراض وحده، ولذلك له حدود يجب أن تعرفها قبل أن تبني عليه قراراً:

- احتمال التعثر ثابت لكل طلب مهما كانت مدته، وفي الواقع المدة الأطول تعطي العميل وقتاً أطول ليتغير وضعه، فالتعثر يزيد غالباً مع المدة، فنتيجة الـ 12 قسطاً في المختبر متفائلة.
- التأخر والتعثر عشوائيان ومستقلان عن مبلغ الطلب والعميل، والمحفظة الحقيقية فيها عملاء أخطر من غيرهم، وهذا ما يحاول القرار الائتماني فصله.
- لا يوجد في النموذج احتيال، ولا استرداد ولا إلغاء، ولا غرامات تأخير، ولا تكاليف تشغيل، ولا مخصصات محاسبية، وكل منها يغير الصافي.
- التاجر يقبض في يوم الطلب في النموذج، وفي العقود الحقيقية تسوية التاجر بعد أيام، وهذا يخفض تكلفة التمويل قليلاً.

ومع ذلك فقيمة النموذج ليست في رقم 3.25%، وإنما في أنه يجعل العلاقة بين المدة والرسوم والتعثر وتكلفة المال واضحة، ويعطي فريق المنتج أداة يجرب بها سؤالاً مثل «هل نقدم ستة أقساط لهذا التاجر بهذه الرسوم؟» قبل أن يوقع عقداً. والشركة الحقيقية تبني نفس النموذج على بياناتها الفعلية، وتراجعه كل شهر بالأرقام التي ظهرت.

## الشركة الناشئة كتاجر: التكامل والقيود والمطابقة

بعد كل ما سبق قرر فريق الشركة الناشئة أن يضيف الدفع الآجل عبر شركة دفع آجل مرخصة، لا أن يبنيه بنفسه. والتكامل من جهة التاجر يشبه كثيراً التكامل مع مزود الدفع بالبطاقة الذي شرحناه في مقال [كيف يعمل الدفع بالبطاقة](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%B9%D9%85%D9%84-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AF%D9%81%D8%B9-%D8%A8%D8%A7%D9%84%D8%A8%D8%B7%D8%A7%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%88%D9%8A%D8%B6-%D9%88%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D8%B1%D8%A7%D8%B6/): ينشئ التطبيق جلسة دفع عند الشركة بمبلغ الطلب ومعرفه، ويحول العضو إلى صفحتها، ثم تصل الأحداث من الشركة إلى نقطة في تطبيق النادي تقول إن الطلب قبل أو رفض أو ألغي، ويرسل التطبيق طلبات الاسترداد عبر واجهة الشركة، وتصل في النهاية تسويات دورية بصافي المبالغ. وكل قواعد معالجة الأحداث التي شرحناها هناك تنطبق هنا: التحقق من توقيع الحدث، والحفظ قبل المعالجة، والمعالجة الآمنة عند التكرار، وعدم الثقة بترتيب الوصول.

والفرق الأهم عن البطاقة أن التاجر لا يرى أقساط العضو، فبالنسبة للنادي العملية انتهت عندما قبلت الشركة الطلب، والعضو المتأخر في قسطه الثالث مشكلة الشركة لا النادي، ما لم ينص العقد على غير ذلك. ولكن خدمة العملاء في النادي ستتلقى الأسئلة على كل حال: «لماذا خصم مني قسطان هذا الشهر؟» و«ألغيت اشتراكي فلماذا ما زالت الأقساط قائمة؟»، فالنادي يحتاج أن يعرف حالة الطلب عند الشركة، وأن يعرف متى أرسل الاسترداد ومتى قبلته الشركة، وأن يوجه العضو إلى الشركة في ما يخص أقساطه.

### القيود في دفتر الشركة الناشئة

الاشتراك السنوي خدمة تقدم على اثني عشر شهراً، فلا يصبح الـ 1,200 ريال إيراداً في يوم البيع، وإنما إيراداً مؤجلاً Deferred Revenue يتحقق شهراً بشهر. والدفع الآجل يضيف إلى ذلك أن المال لا يأتي من العضو وإنما من شركة الدفع الآجل، بعد خصم رسومها، وفي موعد التسوية لا في يوم البيع. والقيود في دفتر الشركة الناشئة، بنفس طريقة القيد المزدوج التي شرحناها في [المحفظة الرقمية من الداخل](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%85%D8%AD%D9%81%D8%B8%D8%A9-%D8%B1%D9%82%D9%85%D9%8A%D8%A9-ledger/#double-entry)، تكون كما يلي بافتراض رسوم 5%:

| الحدث                   | مدين                                                        | دائن                            |
| ----------------------- | ----------------------------------------------------------- | ------------------------------- |
| قبول الطلب              | مستحق من شركة الدفع الآجل 1,140، ومصروف رسوم الدفع الآجل 60 | إيراد مؤجل 1,200                |
| وصول التسوية            | البنك 1,140                                                 | مستحق من شركة الدفع الآجل 1,140 |
| نهاية كل شهر            | إيراد مؤجل 100                                              | إيراد الاشتراكات 100            |
| استرداد 450 بعد التسوية | إيراد مؤجل 450                                              | مستحق لشركة الدفع الآجل 450     |

ولاحظ في القيد الأول أن رسوم الدفع الآجل مصروف على الشركة الناشئة، لا خصم من سعر الاشتراك، فالعضو اشترى بـ 1,200 والشركة دفعت 60 لتبيع بالتقسيط، وهذا ما يسمح للمؤسس أن يقارن تكلفة قبول الدفع الآجل بتكلفة البطاقة لكل اشتراك. وفي القيد الأخير، الاسترداد بعد التسوية يجعل الشركة الناشئة مدينة لشركة الدفع الآجل بالمبلغ، تخصمه الشركة عادة من التسوية التالية، فيظهر في ملف التسوية سطر سالب. وأما رسوم الـ 60 على الجزء المسترد، هل تعاد أم لا، فيحددها العقد كما ذكرنا، والقيد يتبع العقد.

### المطابقة مع ملف التسوية

ملف التسوية من شركة الدفع الآجل يحمل لكل طلب معرفه عند الشركة ومعرف التاجر، والمبلغ الإجمالي، والرسوم، والصافي، وأسطراً سالبة للاستردادات والإلغاءات. والمطابقة اليومية بين هذا الملف وطلبات النادي هي نفس عملية [المطابقة بين كشف البنك ونظامك](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B7%D8%A7%D8%A8%D9%82%D8%A9-reconciliation-%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D8%A8%D9%86%D9%83-%D9%85%D9%82%D8%A7%D8%A8%D9%84-%D9%86%D8%B8%D8%A7%D9%85%D9%83/): كل طلب قبلته الشركة يجب أن يظهر في تسوية، وكل سطر في التسوية يجب أن يطابق طلباً، والفرق بين الرسوم المحسوبة من العقد والرسوم في الملف يجب أن يكون صفراً، وأي استثناء يذهب إلى قائمة يراجعها شخص. والخطأ الشائع أن يفعل التطبيق الاشتراك عند وصول حدث «قبل الطلب» ثم لا يتابع وصول المال، فتمر أشهر قبل أن يكتشف أحد أن طلبات ألغتها الشركة لسبب ما بقيت اشتراكات فعالة دون مقابل.

### ما تسأله قبل توقيع العقد

عقد التاجر مع شركة الدفع الآجل تحدد عناصره المادة السابعة والعشرون من القواعد، ومنها هيكل التسعير، وإجراءات الانسحاب، وسرية المعلومات وأمنها، وأحكام حماية العملاء، وآلية تسوية النزاعات. ومن الناحية العملية يسأل فريق الشركة الناشئة الأسئلة التالية قبل التوقيع:

- هل الشركة مرخصة من البنك المركزي لنشاط الدفع الآجل؟ تحقق من القائمة الرسمية بنفسك.
- ما الرسوم لكل مدة تقسيط ولكل شريحة مبلغ، وهل تعاد الرسوم عند الاسترداد أو الإلغاء؟
- متى تصل التسوية، وبأي صيغة يأتي ملفها، وهل فيه معرف الطلب الذي يرسله النادي؟
- من يتحمل خسارة عدم السداد، ومن يتحمل خسارة الاحتيال، وفي أي حالات يرجع المبلغ على التاجر؟
- كيف يعامل الاسترداد الجزئي، وبأي سياسة تخفض الأقساط، وكم يستغرق؟
- ما شروط عرض الخدمة في صفحات النادي، وما العبارات المسموحة في الإعلانات؟
- كيف يعرف النادي حالة طلب العضو عندما يتصل بخدمة العملاء، وإلى أين يوجهه؟
- هل توجد بيئة اختبار بأرقام وهويات اختبار، حتى لا يجرب الفريق بهويات وبطاقات حقيقية؟

## وإذا كنت تبني شركة دفع آجل؟

قد يكون القارئ في الجهة الأخرى، مهندساً في شركة تحصل على ترخيص الدفع الآجل أو حصلت عليه. والمكونات التي يحتاجها النظام تظهر من كل ما سبق: خدمة قرار ائتماني تستعلم من السجل الائتماني وتحسب التمويل القائم والنسب وتحفظ سبب كل قرار، ودفتر قيود مزدوج لكل طلب وقسط وتحصيل واسترداد وشطب كما في مقال [النظام المصرفي الأساسي](https://arabroot.io/articles/%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D8%B1%D9%81%D9%8A-%D8%A7%D9%84%D8%A7%D8%B3%D8%A7%D8%B3%D9%8A-core-banking-%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%A8%D9%86%D9%83-%D9%85%D9%86-%D8%A7%D9%84%D8%AF%D8%A7%D8%AE%D9%84/)، ومحرك جداول أقساط يعرف قواعد التقريب والأشهر القصيرة والاسترداد، ومحرك تحصيل يجدول محاولات الخصم ولا يخصم قبل الموعد ولا يجمع قسطين، ومحرك متابعة يحسب أيام التأخر وعداد الاتصالات ويحترم سقف الغرامات، وخدمة تسويات للتجار، وتقارير للبنك المركزي بالنماذج والمواعيد التي يحددها، ونظام لمكافحة الاحتيال بمتطلبات الإطار للمنتجات عالية المخاطر، وسجلات تحفظ عشر سنوات.

وأغلب هذه المكونات تعمل بتاريخ عمل ودورة ليلية كما في النظام المصرفي الأساسي: كل ليلة تحسب أيام التأخر لكل قسط، وتنقل الأقساط بين المراحل، وتجدول محاولات الخصم لليوم التالي، وتحدث المخصصات، وتنتج ملفات تسوية التجار. وكل خطوة منها يجب أن تكون آمنة عند إعادة التشغيل، لأن تشغيل خطوة الخصم مرتين لنفس اليوم يعني خصم قسط مرتين من عميل، وهذه مخالفة لضوابط التحصيل قبل أن تكون خطأ تقنياً، وقد شرحنا الفكرة في [Idempotency: كيف تجعل العملية آمنة عند تكرارها](https://arabroot.io/articles/idempotency-%D9%83%D9%8A%D9%81-%D8%AA%D8%AC%D8%B9%D9%84-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%85%D9%86%D8%A9-%D8%B9%D9%86%D8%AF-%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%87%D8%A7/).

## أخطاء شائعة

| الخطأ                                          | لماذا يضر                                   | البديل                                       |
| ---------------------------------------------- | ------------------------------------------- | -------------------------------------------- |
| تقسيط الاشتراك السنوي من التاجر نفسه دون ترخيص | منح ائتمان دون ترخيص ودون دراسة قدرة العميل | شركة دفع آجل مرخصة، أو اشتراك شهري حقيقي     |
| رفع السعر لمن يختار التقسيط                    | رسوم على العميل تمنعها القواعد              | الرسوم مصروف على التاجر من هامشه             |
| تقسيم المبلغ دون معالجة الباقي                 | هللات تضيع ومطابقة لا تتوازن                | الباقي في قسط محدد بقاعدة مكتوبة في العقد    |
| الحد على مبلغ الطلب لا على التمويل القائم      | عميل يتجاوز 10,000 ريال بعدة طلبات          | حساب القائم من الدفتر في لحظة القرار         |
| حساب العمر بالتقويم الميلادي                   | قبول من لم يبلغ 18 سنة هجرية                | حساب العمر بالهجري واختبار الحالات القريبة   |
| خصم القسط قبل موعده أو جمع قسطين               | مخالفة لضوابط التحصيل                       | قيود في محرك الخصم ومعالجة آمنة عند التكرار  |
| محرك متابعة دون عداد للاتصالات وسقف للغرامات   | مخالفات تتراكم دون أن يراها أحد             | عداد بنافذة 30 يوماً وسجل لما أخذ من كل عقد  |
| التقسيط الطويل بنفس رسوم القصير                | تكلفة التمويل تأكل الهامش كما في المختبر    | تسعير بحسب المدة ونموذج اقتصاديات قبل العقد  |
| تفعيل الاشتراك دون مطابقة التسوية              | اشتراكات فعالة لطلبات ألغيت                 | مطابقة يومية مع ملف التسوية وقائمة استثناءات |

## قائمة تحقق قبل إطلاق الدفع الآجل

- الشريك مرخص لنشاط الدفع الآجل، وتحققت من ذلك في القائمة الرسمية.
- سعر المنتج واحد بالتقسيط وبدونه، ولا توجد رسوم إضافية على العضو في أي مكان في المسار.
- صفحة المنتج تعرض المبلغ وعدد الأقساط ومواعيدها وأنها دون رسوم، دون عبارات تشجع على الاقتراض غير الضروري.
- التطبيق يرسل معرف الطلب مع كل جلسة دفع، ويستلم الأحداث بتوقيع متحقق منه، ويعالجها آمناً عند التكرار.
- سياسة الاسترداد الجزئي والإلغاء مكتوبة ومعروفة لخدمة العملاء، ومطابقة لما يذكره عقد الشريك.
- القيود في الدفتر تفصل الإيراد المؤجل عن المستحق من الشريك وعن مصروف الرسوم.
- المطابقة اليومية مع ملف التسوية تعمل، وأي طلب قبل دون تسوية أو ألغي بعد التفعيل يظهر في قائمة استثناءات.
- خدمة العملاء تعرف كيف ترى حالة الطلب عند الشريك، ومتى توجه العضو إليه.
- إذا كنت الشركة المرخصة: الحد على التمويل القائم، والعمر بالهجري، والتحقق من الجوال والعنوان، والعقد في نافذة منبثقة، والخصم لا يسبق الموعد، وعداد الاتصالات وسقف الغرامات في المحرك، وكل خطوة ليلية آمنة عند الإعادة.
- نموذج الاقتصاديات يجرب كل مدة تقسيط ورسومها قبل عرضها على التجار، ويراجع بالأرقام الفعلية كل شهر.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- الدفع الآجل تمويل دون تكلفة أجل على العميل، والتاجر يدفع الرسوم، والشركة تتحمل التمويل والتعثر، ولذلك يحتاج ترخيصاً من البنك المركزي لشركة مساهمة برأس مال لا يقل عن 5 ملايين ريال.
- القواعد تمنع أي رسوم على العميل عدا ما تجيزه ضوابط التحصيل، وتضع حداً للتمويل القائم 10,000 ريال لكل عميل و12 قسطاً كحد أقصى، وتستثني الطلبات حتى 2,000 ريال من نسب الاستقطاع.
- شاشة الدفع سلسلة قرارات: الهوية والجوال، والقرار الائتماني على التمويل القائم، والعقد في نافذة منبثقة، ثم القسط الأول.
- ضوابط التحصيل تمنع الخصم قبل الموعد، وتحدد عشر مكالمات في كل ثلاثين يوماً، وتجعل سقف الغرامات ورسوم التحصيل قيمة قسط واحد طوال العقد، وتعرف التعثر بثلاثة أشهر متتالية أو خمسة أقساط متأخرة.
- في المختبر ضاعت هللة في أول تقسيم كتبناه، وأصلحناها بوضع الباقي في القسط الأول، ورأينا سياستين للاسترداد بنفس المجموع وتجربة مختلفة.
- بافتراضات المختبر كان الصافي 3.25% من المبيعات، ونزل إلى 2.38% بتضاعف التعثر، وإلى 0.75% بالتقسيط على 12 شهراً بنفس الرسوم، فالمدة تغير الاقتصاديات أكثر من أي عامل آخر.
- للتاجر: الرسوم مصروف عليه، والاشتراك إيراد مؤجل، والمطابقة اليومية مع ملف التسوية تمنع اشتراكات دون مقابل.

وفي مقالات قادمة بإذن الله في هذا القسم سوف نشرح معرفة العميل KYC ومكافحة غسل الأموال بأدوات مفتوحة المصدر، وهي الخطوة التي تسبق أي قرار ائتماني، والتمويل الإسلامي في الأنظمة المصرفية بمثال المرابحة وقيودها.

وبقية مقالات قسم التقنية المالية والمدفوعات:

[![](https://arabroot.io/content/images/2026/10/digital-wallets-cover-cover.webp)دليلالمحافظ الرقمية Digital Wallets: الأنواع والترخيص والبناءأنواع المحافظ الرقمية وتراخيص النقود الإلكترونية في المملكة وحدودها، وحماية أموال العملاء، مع مختبر للحدود والمطابقة اليومية.](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D9%81%D8%B8-%D8%A7%D9%84%D8%B1%D9%82%D9%85%D9%8A%D8%A9-digital-wallets-%D8%A7%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-%D9%88%D8%AA%D8%B1%D8%AE%D9%8A%D8%B5%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A%D9%87%D8%A7/)[![](https://arabroot.io/content/images/2026/10/open-banking-cover-cover.webp)دليلالمصرفية المفتوحة Open Banking: إطار البنك المركزي والواجهاتما تتيحه المصرفية المفتوحة في المملكة وما تفرضه لائحتها، والموافقة من الطلب إلى الحذف، مع مختبر لتطبيق يقرأ بموافقة العميل فقط.](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B5%D8%B1%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-open-banking-%D8%A7%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%A8%D9%86%D9%83-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A-%D9%88%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA/)[![](https://arabroot.io/content/images/2026/10/card-payment-flow-cover-cover.webp)دليلكيف يعمل الدفع بالبطاقة؟ التفويض Authorization والتسويةمن ضغطة «ادفع» إلى آخر اعتراض: التفويض و3D Secure والتحصيل والتسوية والاسترداد والاعتراض، مع مختبر لأحداث مزود الدفع ومطابقتها.](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%B9%D9%85%D9%84-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AF%D9%81%D8%B9-%D8%A8%D8%A7%D9%84%D8%A8%D8%B7%D8%A7%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%88%D9%8A%D8%B6-%D9%88%D8%A7%D9%84%D8%AA%D8%B3%D9%88%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D8%B1%D8%A7%D8%B6/)[![](https://arabroot.io/content/images/2026/10/wallet-ledger-cover-cover.webp)دليلالمحفظة الرقمية من الداخل: دفتر القيد المزدوج Ledgerكيف تبني محفظة رقمية لا يضيع فيها ريال ولا يخصم مرتين، بالقيد المزدوج والمعاملات والمطابقة مع مزود الدفع.](https://arabroot.io/articles/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D9%86%D9%8A-%D9%85%D8%AD%D9%81%D8%B8%D8%A9-%D8%B1%D9%82%D9%85%D9%8A%D8%A9-ledger/)[![](https://arabroot.io/content/images/2026/10/fraud-detection-cover-cover.webp)دليلكشف الاحتيال Fraud Detection: قواعد أم تعلم آلة؟قارنا القواعد بنموذجين لتعلم الآلة على بيانات دفع مولدة بنفس سعة المراجعة، ورأينا من يمسك الأنماط المعروفة ومن يتأخر عن النمط الجديد.](https://arabroot.io/articles/%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D9%8A%D8%A7%D9%84-fraud-detection-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%85-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A9/)[![](https://arabroot.io/content/images/2026/10/reconciliation-cover-cover.webp)دليلالمطابقة Reconciliation: كشف البنك مقابل نظامككيف تقابل كل حركة في كشف البنك بقيد في دفترك على مراحل، ولماذا قد يتساوى الرصيدان وتحتهما دفع مكرر لا يكشفه إلا المرجع.](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B7%D8%A7%D8%A8%D9%82%D8%A9-reconciliation-%D9%83%D8%B4%D9%81-%D8%A7%D9%84%D8%A8%D9%86%D9%83-%D9%85%D9%82%D8%A7%D8%A8%D9%84-%D9%86%D8%B8%D8%A7%D9%85%D9%83/)

## سجل التحديثات

- أكتوبر 2026: كتابة المقال، وتشغيل مختبر جدول الأقساط ونموذج المحفظة على Python 3.13.17 داخل Docker ببيانات مولدة وافتراضات معلنة، والتحقق من قواعد تنظيم شركات الدفع الآجل وتعميميها ودليل الترخيص ومبادئ الإقراض المسؤول وضوابط التحصيل وإطار مكافحة الاحتيال في دليل قواعد البنك المركزي بتاريخ 27 أكتوبر 2026.