الانتقال إلى المحتوى الرئيسي
كل المقالات
دليل10 دقائق قراءة

فوترة SaaS في المغرب: استخلاص الاشتراكات بالدرهم والتحكم في الولوج إلى خدمتكم

فوترة SaaS في المغرب: صمّموا باقاتكم، وأرسلوا رابط دفع بالدرهم عند كل استحقاق، وافتحوا الولوج إلى برنامجكم أو أوقفوه عبر ويب هوك موقَّع.

فوترة SaaS في المغرب تقوم على اشتراك بالدرهم: عند كل استحقاق، ترسل ChariPay إلى زبونكم بالبريد الإلكتروني رابط دفع يؤدّيه بالبطاقة في صفحة مستضافة مع ‎3-D Secure؛ وما دام لم يؤدِّ، يُرسَل إليه تذكير كل يوم بالرابط نفسه. أما برنامجكم فيستمع إلى أحداث ويب هوك موقَّعة ليمدّد الولوج مع كل أداء ناجح ويقيّده حين يبقى استحقاق غير مؤدّى. يترجم هذا الدليل باقاتكم إلى معاملات، ثم يشرح التسجيل، وإيقاف الولوج، وتغيير الباقة، والفواتير، وحالة الزبناء المهنيين الذين يفضّلون التحويل.

فوترة SaaS في المغرب: كيف يعمل الاشتراك

ChariPay منصة دفع مغربية، مزوّد خدمات دفع (PSP) تشغّله Chari Money، مؤسسة أداء مرخَّصة من بنك المغرب. ووحدة الاشتراكات والمدفوعات المتكررة فيها تغطي دورة حياة الاشتراك في برنامج، من الأداء الأول إلى الإلغاء.

يُختصر المبدأ في بضع قواعد. عند كل استحقاق، تُنشئ ChariPay رابط دفع لاستعمال واحد وترسله إلى البريد الإلكتروني لزبونكم؛ فيؤدّيه بالبطاقة في صفحة الدفع المستضافة مع ‎3-D Secure، دون أن تمرّ أي بيانات بطاقة عبر برنامجكم. وما دام الاستحقاق غير مؤدّى، يُرسَل تذكير كل يوم بالرابط نفسه، ولا تُفتح أي فترة جديدة. ولكل اشتراك حالة واضحة: في انتظار الانطلاق، نشط، موقوف مؤقتًا، منتهٍ، ملغى؛ وتُحسب الاستحقاقات على توقيت Africa/Casablanca.

أما العملة، فكل شيء بالدرهم المغربي (MAD): المستخلصات، والأرصدة، والتحويلات، والدفعات نحو البنك، دون أي تحويل للعملة. ومبالغ API بالوحدات الرئيسية (149.90 = 149,90 درهمًا).

وماذا عن Stripe؟ لا يرد المغرب في القائمة الرسمية للبلدان التي تتاح فيها Stripe، المنشورة على stripe.com/global والمقروءة مجددًا يوم 2 أكتوبر 2026؛ وتذكر الصفحة أن بلدانًا أخرى ستُضاف، دون أن تسمّيه. ولذلك لا تستطيع شركة مؤسَّسة في المغرب فتح حساب لديها باسمها. وتفاصيل الحلول البديلة وعواقبها في مقال Stripe في المغرب.

وعن التكلفة: وضع الاختبار مجاني، بلا حد زمني وبلا التزام. وتبلغ رسوم التفعيل 6 000 درهم شاملة الضريبة، تُؤدّى مرة واحدة عند الانتقال إلى الإنتاج. والعمولة نسبة مئوية عن كل أداء ناجح، تُحدَّد، مثل الكفالة، بعد دراسة ملفكم — ولا ننشر عمولة «ابتداءً من».

تصميم باقاتكم: الدورية، وتاريخ البدء، وتاريخ الانتهاء

تُترجم الباقة التجارية إلى بضعة معاملات للاشتراك. يُنشأ الزبون أولًا (POST /v1/clients)، ثم يُربط به الاشتراك (POST /v1/subscriptions) بمبلغ ووصف ودورية.

باقتكممعامل الاشتراك
شهريةfrequency: MONTHLY
سنويةfrequency: YEARLY
أسبوعية أو يومية (استعمالات خاصة)frequency: WEEKLY أو DAILY
تاريخ أول استحقاقstartDate
التزام بمدة محددة (12 شهرًا، موسم)endDate؛ وبدونه يستمر الاشتراك إلى أن يُلغى
قناة إرسال روابط الاستحقاقاتchannels: ["EMAIL"]
معرّف اشتراككم وسماتهexternalId وmetadata

المبلغ (amount) هو ثمن كل فترة، بالدرهم وبالوحدات الرئيسية. والوصف (description، 255 حرفًا على الأكثر) ينبغي أن يفهمه الزبون، «باقة Pro — شهري» بدل رمز داخلي، لأنه يظهر في كل رابط استحقاق يتلقاه. وضعوا في metadata — كائن مسطَّح لا يتجاوز 4 كيلوبايت، يُنقل في كل رابط وكل ويب هوك — معرّف فضاء الزبون في برنامجكم (مثلًا tenantId) واسم الباقة: بهما يعرف برنامجكم أي حساب يفتح أو يغلق. أما externalId، الفريد لكل حساب ولكل بيئة، فيمنع إنشاء الاشتراك نفسه مرتين إن أعاد خادمكم طلبًا: الإنشاء بـexternalId موجود يعيد الاشتراك الموجود.

النداءات الكاملة، حقلًا بحقل، في دليل دمج الاشتراكات عبر API، وتوثيق كل وحدة في فضاء المطورين.

شاهدوا باقاتكم تعمل قبل برمجة الباقي: ابدؤوا في وضع الاختبار. ثلاثة حقول (الاسم، والبريد الإلكتروني المهني، والمؤسسة)، ورابط تفعيل يصلكم بالبريد لاختيار كلمة المرور، ثم بوابة التاجر حيث تنشئون بأنفسكم مفتاح الاختبار بعد إعادة مصادقة. وفي السندبوكس، أنشئوا اشتراكًا تاريخ بدايته اليوم: يُنشأ الرابط الأول فورًا ويُعاد في currentCharge؛ أدّوه ببطاقة الاختبار (‎4918 9141 0719 5005، CVV 123، رمز ‎3-D Secure 555) فيصبح الاشتراك نشطًا. وبدورية يومية (DAILY)، يصل الاستحقاق الموالي من الغد: تعيدون دورة فوترة، وتمديد الولوج المرتبط بها، دون انتظار شهر. الأمر مجاني، بلا حد زمني ودون موافقة تنتظرونها: والتحقق من مؤسستكم (KYB) لا يشترطه إلا الانتقال إلى الإنتاج.

التسجيل والأداء الأول والفترة التجريبية

عند تسجيل زبون في برنامجكم، ينشئ خادمكم سجل الزبون ثم الاشتراك. ويبقى الاشتراك في حالة INCOMPLETE إلى حين الأداء الأول: يتلقى الزبون بالبريد الإلكتروني رابط الاستحقاق الأول ويؤدّيه في صفحة الدفع المستضافة مع ‎3-D Secure. وإن كان تاريخ البداية هو اليوم، يُعاد هذا الرابط الأول أيضًا في currentCharge: يمكنكم توجيه الزبون إلى payUrl الخاص به مباشرة بعد التسجيل، دون انتظار أن يفتح بريده. وما دام هذا الأداء لم ينجح، لا تفتحوا الولوج المؤدّى عنه.

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

لا توجد فترة تجريبية مجانية بهذا الاسم: البدء المؤجَّل، بـstartDate في نهاية الفترة المهداة، يقوم مقامها؛ ولا يُرسَل أي رابط قبل هذا التاريخ. وما يراه الزبون بين الاشتراك وذلك التاريخ يُتحقق منه في وضع الاختبار قبل الإعلان عنه في صفحة أسعاركم. وقاعدة بسيطة من جهة المنتج: خلال الفترة المهداة يمنح برنامجكم الولوج، وبعدها لا يمدّده إلا أداء ناجح.

فتح الولوج إلى الخدمة وإيقافه عبر الويب هوك

لا يحتاج برنامجكم إلى سؤال ChariPay باستمرار: الأحداث الموقَّعة تخبره بما يفعل. وثلاثة أحداث تكفي لقيادة الولوج:

الحدثما يعنيهالإجراء في برنامجكم
subscription.payment_succeededأُدّي استحقاقتمديد الولوج إلى نهاية الفترة، وإصدار الفاتورة
subscription.payment_failedفشلت محاولة أداء بالبطاقة على رابط الاستحقاق؛ ويبقى الرابط قابلًا للأداءإشعار الزبون عند الحاجة؛ فالاستحقاق ما زال ينتظر الأداء
subscription.canceledبقي الاستحقاق غير مؤدّى بعد مهلة 14 يومًا: أُلغي الاشتراك تلقائيًاإيقاف الولوج عند نهاية الفترة المؤداة، أو فورًا حسب شروطكم

يشير subscription.canceled إلى الإلغاء التلقائي لاشتراك بقي استحقاقه غير مؤدّى. وعندما تلغون أنتم — من بوابة التاجر أو عبر API — لا تنتظروا حدثًا: فردّ POST /v1/subscriptions/{reference}/cancel يحمل أصلًا الحالة CANCELED؛ حدّثوا نظامكم في تلك اللحظة. وعند بلوغ تاريخ نهايته يصبح الاشتراك «منتهيًا».

لربط حدث أداء اشتراك بفضاء الزبون الصحيح، اقرؤوا metadata الخاص بكم، الذي يعود كما هو؛ وبالنسبة إلى الاشتراكات، ولها وحدها، يوثّق عقد API أيضًا عودة externalId الخاص بكم وتاريخ الفترة المعنية (PeriodDate). واحتفظوا كذلك بـreference كل اشتراك، المُعاد عند الإنشاء: يقرأ GET /v1/subscriptions/{reference} حالته في أي وقت، ومراجعة منتظمة لاشتراكاتكم عبر GET /v1/subscriptions تستدرك أي حدث فائت.

ثلاث قواعد تقنية تمنع فتح الولوج أو إيقافه خطأً. وجّهوا المعالجة حسب الترويسة Chari-Event-Type، لا حسب تخمين في المحتوى. واحذفوا المكرَّر حسب Chari-Event-Id، لا حسب Chari-Webhook-Id: فهذا الأخير يحدد عملية التسليم، لا الحدث. وتحققوا من التوقيع (X-CHARI-SIGNATURE، X-CHARI-TIMESTAMP) قبل أي إجراء. ومنطق ربط الأداء بالعنصر المعني في نظامكم مشروح في ربط الأداء بالطلبية.

الاستحقاق غير المؤدّى: تحديد فترة السماح لديكم

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

والقرار الخاص ببرنامج SaaS هو مصير الولوج خلال هذه المهلة. ثلاث سياسات قابلة للدفاع عنها:

  1. 1ولوج مستمر إلى نهاية المهلة: الأكثر مرونة، ويناسب الزبناء القدامى والأدوات التي يعتمد عليها نشاطهم.
  2. 2ولوج مقيَّد (قراءة فقط، مع إمكانية التصدير ومنع الإنشاء): يظل الزبون يرى بياناته ويفهم أن عليه التصرف.
  3. 3ولوج موقوف بمجرد ألّا يُؤدّى الاستحقاق في تاريخه: يُترك للعروض ضعيفة الالتزام، مع خطر إزعاج زبون فاته البريد الإلكتروني فقط.

أيًّا كانت سياستكم، اكتبوها في شروطكم واعرضوها في برنامجكم ما دام استحقاق ينتظر الأداء، مع زر يقود إلى رابط الاستحقاق (payUrl في currentCharge). فبرنامجكم يعرف تاريخ كل استحقاق: وغياب subscription.payment_succeeded لتلك الفترة هو ما يُطلق سياستكم. وتفاصيل المهلة والقرارات ونماذج الرسائل في استحقاق اشتراك غير مؤدّى.

تغيير الباقة: الترقية، والتخفيض، والانتقال إلى السنوي

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

لا يوجد احتساب تناسبي ولا قسائم تخفيض: برنامجكم هو من يحدد تاريخ السريان. وطريقتان شائعتان:

  • التغيير عند نهاية الفترة المؤداة: يبدأ الاشتراك الجديد بـstartDate في اليوم الموالي لآخر فترة مسدَّدة، ويُلغى القديم قبل استحقاقه المقبل. لا أحد يؤدي الفترة نفسها مرتين.
  • الترقية الفورية: تفتحون وظائف الباقة الأعلى في الحال وتبدؤون الاشتراك الجديد عند الاستحقاق المقبل؛ والفارق عن الفترة الجارية بادرة تجارية تقررونها.

والانتقال إلى السنوي يتبع المنطق نفسه: اشتراك جديد بـYEARLY. وللتوقف المؤقت، كزبون موسمي أو إغلاق سنوي، فضّلوا الإيقاف المؤقت: فالإيقاف والاستئناف والإلغاء من بوابة التاجر أو عبر API. يُطبَّق الإيقاف المؤقت على اشتراك نشط، والاستئناف يعيد تشغيل اشتراك موقوف مؤقتًا. وخلال الإيقاف لا يُرسَل أي رابط؛ وعند الاستئناف لا تُفوتَر بأثر رجعي الفترات التي انقضت خلال الإيقاف.

فواتيركم تبقى في برنامجكم

تستخلص ChariPay وتتتبّع؛ ولا تُصدر فواتيركم. تتبّع المعاملات وإيصالات الزبناء مشمولان، لكن الفاتورة، بترقيمكم وبياناتكم، تبقى من شأن برنامجكم. والمخطط الذي ينبغي اتباعه:

  1. 1مع كل subscription.payment_succeeded، يُصدر برنامجكم فاتورة الفترة ويرسلها إلى الزبون.
  2. 2يسجّل في الفاتورة مرجع الاشتراك والفترة المؤدّاة.
  3. 3وعند الشك، يقرأ سجل استحقاقات الاشتراك عبر GET /v1/subscriptions/{reference}/charges.

وللمطابقة الشهرية، يضم تصدير CSV في بوابة التاجر كل حركة بمرجعها. أما ما يجب أن تتضمنه الفاتورة والجانب الضريبي لنشاطكم، فمستشاركم وحده من يستطيع إبداء الرأي.

الزبناء المهنيون: التحويل إلى RIB الخاص بكم

يفضّل بعض الزبناء المهنيين أداء اشتراك سنوي بالتحويل. وحسابكم في ChariPay يتيح ذلك: إنه حساب أداء حقيقي، تمسكه Chari Money، مؤسسة أداء مرخَّصة من بنك المغرب، مفتوح باسم شركتكم، بـRIB بهذا الاسم وشهادة PDF قابلة للتنزيل من بوابة التاجر أو عبر API. يستقبل مستخلصاتكم والتحويلات الواردة، ويخدم عمليات الأداء الخاصة بكم.

ChariPay ليس بنكًا: حساب الأداء الخاص بكم تمسكه Chari Money. إنه يكمّل بنككم ولا يعوّضه.

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

أسئلة شائعة

هل يمكن فوترة اشتراك SaaS بالدرهم من المغرب؟

نعم. مع ChariPay تنشئون اشتراكًا بالدرهم: عند كل استحقاق، يتلقى زبونكم بالبريد الإلكتروني رابط دفع يؤدّيه بالبطاقة في الصفحة المستضافة مع ‎3-D Secure؛ وما دام لم يؤدِّ، يُرسَل تذكير كل يوم بالرابط نفسه. كل شيء بالدرهم دون تحويل للعملة، وتختبرون الدورة كاملة في وضع الاختبار قبل الإنتاج.

هل يمكن اقتراح فترة تجريبية مجانية؟

ليس في شكل فترة تجريبية مدمجة: البدء المؤجَّل يقوم مقامها. تنشئون الاشتراك بـstartDate في نهاية الفترة المهداة — ولا يُرسَل أي رابط قبلها —، ويمنح برنامجكم الولوج خلالها. وتحققوا في وضع الاختبار مما يراه زبونكم بين الاشتراك وتاريخ البدء قبل الإعلان عن العرض في صفحة أسعاركم، واكتبوا بوضوح تاريخ بدء الاشتراك المؤدّى عنه.

كيف نتعامل مع تغيير الباقة أثناء الاشتراك؟

لا يغيّر الاشتراك باقته: ألغوا الجاري وأنشئوا اشتراكًا جديدًا للزبون نفسه. ولا يوجد احتساب تناسبي ولا قسائم، فبرنامجكم يحدد تاريخ السريان، مثلًا بـstartDate في اليوم الموالي لآخر فترة مؤداة. والانتقال إلى السنوي يتبع القاعدة نفسها، باشتراك جديد بـYEARLY، مع الحرص على ألا يؤدي الزبون الفترة نفسها مرتين.

هل تُصدر ChariPay فواتير زبنائي؟

لا. تتبّع المعاملات وإيصالات الزبناء مشمولان، لكن الفاتورة تبقى من إصدار برنامجكم، بترقيمكم وبياناتكم. أصدروها مع كل subscription.payment_succeeded، واقرؤوا السجل عند الحاجة عبر GET /v1/subscriptions/{reference}/charges. وسجّلوا في كل فاتورة مرجع الاشتراك والفترة المؤدّاة. أما محتوى الفاتورة، فمستشاركم وحده من يستطيع إبداء الرأي.

كيف أوقف ولوج زبون توقف عن الأداء؟

استمعوا إلى أحداث الويب هوك الموقَّعة. ما دام استحقاق لم يتلقَّ subscription.payment_succeeded، فهو غير مؤدّى: طبّقوا فترة السماح لديكم، بولوج مستمر أو مقيَّد أو موقوف. وخلال ذلك يتلقى الزبون تذكيرًا كل يوم، ويبقى الرابط قابلًا للأداء 14 يومًا بعد الاستحقاق؛ ودون أداء يُلغى الاشتراك تلقائيًا: عند وصول subscription.canceled، أو عند إعادة قراءة الحالة، أغلقوا الولوج.

هل يمكن الفوترة بعملة غير الدرهم؟

لا. كل شيء بالدرهم المغربي (MAD): المستخلصات، والأرصدة، والتحويلات، والدفعات نحو البنك، دون أي تحويل للعملة. وقيمة الحقل currency في الردود هي دائمًا MAD، ومبالغ API بالوحدات الرئيسية (149.90 = 149,90 درهمًا). فاعرضوا أسعاركم بالدرهم في صفحة الأسعار، كي يرى الزبون بالضبط ما سيؤدّيه عند كل استحقاق.

هل يمكن لزبون مهني الأداء بالتحويل بدل البطاقة؟

نعم. حساب الأداء الخاص بكم في ChariPay له RIB باسم شركتكم، وهو يستقبل التحويلات الواردة؛ وتُنزَّل شهادة PDF من بوابة التاجر أو عبر API. أصدروا الفاتورة من برنامجكم، وأرسلوا RIB، وافتحوا الولوج حين يصل التحويل. وأبقوا هذا الزبون خارج مسار الإيقاف التلقائي الخاص بالاشتراكات.

الخطوة التالية

افتحوا السندبوكس الخاص بكم (ابدؤوا في وضع الاختبار) وأنشئوا اشتراكًا يوميًا (DAILY) يبدأ اليوم: أدّوا الرابط الأول ببطاقة الاختبار، ثم رابط الغد، للتحقق من أن كل استحقاق مؤدّى يمدّد الولوج في برنامجكم. اربطوا بعدها فترة السماح بالاستحقاقات التي بقيت دون subscription.payment_succeeded، وإيقاف الولوج بـsubscription.canceled للإلغاء التلقائي وبردّ النداء حين تلغون أنتم، ثم انتقلوا إلى الإنتاج. يقدّم دليل دمج الاشتراكات عبر API النداءات، وتلخّص صفحة الاشتراكات والمدفوعات المتكررة العرض.

Sources

بقلم فريق ChariPay.

اقرؤوا بعده

مستعدون للتجربة بأنفسكم؟

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

  • مجاني ودون التزام
  • وضع الاختبار منذ التسجيل
  • لا موافقة تنتظرونها