واجهة Retention Messaging API من Apple تضع كلماتك على شاشة الإلغاء، لكن طلبات الاسترداد لا تمر بها أبدًا
تتيح لك واجهة Retention Messaging API من Apple عرض رسالة أو اقتراح تغيير الخطة أو عرض ترويجي عندما ينقر المشترك على «إلغاء». نشرح كيف تعمل، وكم تكلّف لتشغيلها، ولماذا يصل طلب الاسترداد إلى Apple دون أن يلمس تلك الشاشة إطلاقًا.

أهم الخلاصات
- تتيح واجهة Retention Messaging API من Apple للمطوّر اختيار الرسالة التي يراها مشترك iPhone بعد النقر على Cancel Subscription (إلغاء الاشتراك)، باستخدام أحد أربعة أنواع: نص، أو نص مع صورة، أو اقتراح تغيير الخطة، أو عرض ترويجي.
- لا تزال وثائق Apple تصف Retention Messaging API بأنها إصدار تجريبي مسبق يطلب المطوّرون الانضمام إليه. صدر الإصدار 1.0 في 16 يوليو 2025، وتبعه الإصدار 1.5 في 27 أبريل 2026.
- في التدفق الفوري، تستدعي Apple نقطة النهاية Get Retention Message لدى المطوّر عندما يفتح مشترك نشط صفحة تفاصيل اشتراك فيها زر الإلغاء، ويجب أن تردّ نقطة النهاية خلال 700 ms في بيئة الإنتاج، وإلا تعود Apple إلى رسالة افتراضية.
- رسالة الاستبقاء تؤثر في التجديدات المستقبلية فقط. أما طلب الاسترداد فيصل إلى Apple عبر reportaproblem.apple.com أو نافذة الاسترداد داخل التطبيق، وشاشة الإلغاء التي تظهر فيها رسائل الاستبقاء ليست جزءًا من هذا المسار.
- عندما يطلب العميل استردادًا داخل التطبيق عبر واجهة طلب الاسترداد في StoreKit، توقف Apple التجديد التلقائي بنفسها وترسل DID_CHANGE_RENEWAL_STATUS بالنوع الفرعي AUTO_RENEW_DISABLED، وهو النوع والنوع الفرعي نفسهما الناتجان عن الإلغاء من صفحة إعدادات الاشتراكات.
- المدخل الوحيد للمطوّر في قرار الاسترداد لدى Apple هو CONSUMPTION_REQUEST، ويُجاب عنه خلال 12 ساعة عبر Send Consumption Information، وفقط إذا وافق العميل على مشاركة تلك البيانات.
- لا يوجد في Google Play مقابل موثّق لرسالة يختارها المطوّر على شاشة الإلغاء. يتلقى المطوّرون إشعار SUBSCRIPTION_CANCELED بعد ذلك، ويخبرهم الحقل userInitiatedCancellation بسبب مغادرة المشترك.
صار بالإمكان الآن أن يرى المشتركون الذين ينقرون على «إلغاء» في iPhone رسالة اخترتها أنت، أو خطة أرخص، أو خصمًا، قبل أن يؤكدوا. هذه هي واجهة Retention Messaging API من Apple، وهي المرة الأولى التي يكون فيها للمطوّر رأي على شاشة الإلغاء الخاصة بـ Apple نفسها. لا تزال إصدارًا تجريبيًا مسبقًا عليك أن تطلب الانضمام إليه. ولها أيضًا حدّ صارم يهمّك إن كانت المبالغ المستردة تشغلك: إنها تخاطب من هم على وشك التوقف عن الدفع، لا من يطلبون استعادة أموالهم. تلك الطلبات تصل إلى Apple من طريق آخر.
ماذا تفعل واجهة Retention Messaging API من Apple
واجهة Retention Messaging API خدمة تعمل من خادم إلى خادم. ترفع نصوص الرسائل وصورها إلى Apple مسبقًا، فتراجعها Apple، ثم تختار أنت أي رسالة معتمدة يراها المشترك عندما يكون على وشك إلغاء اشتراك يتجدد تلقائيًا. تذكر وثائق Apple أربعة أنواع من الرسائل:
- رسالة نصية، يمكن أن تتضمن نقاطًا.
- رسالة نصية مع صورة.
- رسالة تغيير الخطة، تقترح اشتراكًا آخر ضمن مجموعة الاشتراكات نفسها.
- رسالة عرض ترويجي، تقدّم سعرًا مخفّضًا في المستوى نفسه أو في مستوى آخر، باستخدام عرض ترويجي تُعدّه في App Store Connect وتوقّعه على خادمك.
تظهر الرسالة بعد أن ينقر العميل على Cancel Subscription في صفحة تفاصيل الاشتراك. ثم تعرض Apple صفحة Confirm Cancellation (تأكيد الإلغاء). يظل بإمكان العميل الإلغاء، أو النقر على Keep Subscription (الإبقاء على الاشتراك)، أو قبول العرض أو الخطة التي اقترحتها. لا يمكنك إخفاء طريق الخروج، وتطلب Apple من المطوّرين عدم رفع محتوى مضلّل أو غير دقيق.
الرسائل الافتراضية والتدفق الفوري
هناك طريقتان للتشغيل. البسيطة هي الرسائل الافتراضية: نص، مع صورة أو نقاط أو بدونهما، يُخصَّص لكل منتج ولكل لغة وإقليم. والأغنى هي التدفق الفوري، حيث تستدعي Apple نقطة النهاية Get Retention Message على خادمك وتردّ أنت بمعرّف رسالة. التدفق الفوري وحده يستطيع عرض رسائل تغيير الخطة والعروض الترويجية.
الرسائل الافتراضية ليست اختيارية من الناحية العملية. تستخدمها Apple بديلًا احتياطيًا كلما فشل استدعاء فوري، ولا تعرض أي رسالة استبقاء إطلاقًا لمنتج في أي لغة وإقليم ليست له رسالة افتراضية.
| البند | ما تقوله وثائق Apple |
|---|---|
| الحالة | إصدار تجريبي مسبق، يُبدي المطوّرون اهتمامهم للانضمام |
| المنتجات | الاشتراكات المتجددة تلقائيًا |
| أنواع الرسائل | نص، نص مع صورة، تغيير الخطة، عرض ترويجي |
| حدّ الاستجابة الفورية | 700 ms في بيئة الإنتاج |
| الوصول إلى الإنتاج | اجتياز اختبار أداء في بيئة sandbox أولًا، نحو 700 ms |
| العنوان ونص النقاط | 66 حرفًا لكل منهما، حتى خمس نقاط |
| نص المتن | 144 حرفًا |
| النص البديل للصورة | 150 حرفًا |
| الرسائل لكل تطبيق | 2,000 |
| المراجعة | تبدأ الرسائل الجديدة بحالة PENDING ولا تظهر إلا بعد APPROVED |
| الأجهزة | iOS 15.1 وiPadOS 15.1 وvisionOS 1 وmacOS 14 أو أحدث |
ما الذي تخبر به Apple خادمك في الاستدعاء الفوري
الطلب عبارة عن JWS موقّع من App Store. بعد فك ترميزه يحمل originalTransactionId وappAppleId وproductId وuserLocale ومعرّف requestIdentifier بصيغة UUID والبيئة وsignedDate. تطلب منك Apple التحقق من أن appAppleId يطابق تطبيقك وألا تردّ إن لم يطابقه. الجزء المفيد هو originalTransactionId، لأنه يتيح لك معرفة ما فعله هذا المشترك فعلًا في تطبيقك قبل أن تختار ما تقوله.
أين تظهر رسالة الاستبقاء، وأين لا تظهر
تضع Apple الرسالة على شاشة واحدة: خطوة Confirm Cancellation بعد أن ينقر العميل على Cancel Subscription، مثلًا من Apple Account > Subscriptions أو من صفحة اشتراك في App Store. هذه الشاشة تتعلق بما إذا كان التجديد التالي سيحدث. لا شأن لها بالأموال المحصّلة من قبل.
طلب الاسترداد فعل منفصل. ترسل صفحة الدعم لدى Apple العملاء إلى reportaproblem.apple.com، حيث يختارون "Request a refund" (طلب استرداد)، ثم سببًا وعنصرًا، وينتظرون من 24 إلى 48 ساعة للحصول على تحديث. داخل تطبيقك، تفتح beginRefundRequest في StoreKit نافذة الاسترداد الخاصة بـ Apple، وتقول Apple إن App Store يستغرق ما يصل إلى 48 ساعة للموافقة أو الرفض. لا يمر أي من المسارين عبر شاشة Confirm Cancellation.
| اللحظة | أين تحدث | ما الذي على المحك | من يقرّر | مدخلك |
|---|---|---|---|---|
| الإلغاء | صفحة تفاصيل الاشتراك، ثم Confirm Cancellation | التجديدات المستقبلية | العميل | رسالة استبقاء تختارها، يُردّ بها خلال 700 ms |
| طلب الاسترداد | reportaproblem.apple.com أو نافذة الاسترداد داخل تطبيقك | أموال مدفوعة بالفعل | Apple | بيانات CONSUMPTION_REQUEST خلال 12 ساعة، إذا وافق العميل |
هل يمكن لرسالة استبقاء أن توقف طلب استرداد؟
لا. طلب الاسترداد لا يصل أبدًا إلى الشاشة التي توجد فيها الرسالة. وهناك تفصيل في وثائق الإشعارات لدى Apple يجعل ذلك ملموسًا. عندما يطلب العميل استردادًا عبر تطبيقك باستخدام واجهة طلب الاسترداد، توقف Apple التجديد التلقائي من تلقاء نفسها وترسل DID_CHANGE_RENEWAL_STATUS بالنوع الفرعي AUTO_RENEW_DISABLED. والعميل الذي يلغي من صفحة إعدادات الاشتراكات يُنتج النوع والنوع الفرعي نفسيهما. يرى خادمك إشعارًا واحدًا لعميلين مختلفين تمامًا، وواحد منهما فقط رأى رسالة الاستبقاء الخاصة بك.
إذا مضى طلب الاسترداد قدمًا، فقناة الأدلة هي CONSUMPTION_REQUEST. ترسلها Apple لطلبات الاسترداد على أي نوع من المنتجات، ولديك 12 ساعة للرد عبر Send Consumption Information. لا يجوز لك الرد إلا إذا أعطى العميل موافقته. بعد ذلك يصل قرار Apple في صورة إشعار REFUND، أو REFUND_DECLINED إذا رفضت Apple استردادًا بدأه العميل داخل تطبيقك.
هل لدى Google Play واجهة برمجية لرسائل الإلغاء؟
ليس في وثائق Google عن دورة حياة الاشتراك. يلغي مشترك Google Play من مركز الاشتراكات في Play، ويحتفظ بالوصول حتى نهاية دورة الفوترة الحالية، ويمكنه النقر على Resubscribe (إعادة الاشتراك) للتراجع عن الإلغاء قبل ذلك، وهو ما تسميه Google استعادة. تعلم أنت بالأمر لاحقًا عبر إشعار SUBSCRIPTION_CANCELED، ويخبرك الحقل userInitiatedCancellation في مورد الاشتراك بسبب مغادرة المستخدم. أما الإيقاف المؤقت، الذي تقول Google إنه مفعّل افتراضيًا لجميع الاشتراكات، فهو وسيلتها المدمجة الرئيسية لخفض التسرّب الطوعي.
على جانب الاسترداد، لدى Google Play قناة أدلة خاصة بها. يصل PendingRefundReviewNotification عندما يحتاج رد مبلغ (chargeback) إلى مراجعة من المطوّر، ولديك 24 ساعة للرد عبر orders.reviewrefund. وبالنسبة للطلبات المُنشأة بعد 3 أغسطس 2026، تحمّل Google المطوّرَ سعر الشراء مخصومًا منه رسوم خدمة Play، إضافة إلى رسوم رد المبلغ لدى البنك، عندما يُقبل رد المبلغ.
كم تكلّفك شاشة الإلغاء من المال
تبدو رسائل الاستبقاء مجانية. لكنها ليست كذلك، والفواتير تأتي من ثلاثة أماكن.
الحوسبة مع كل مشاهدة للصفحة
تستدعي Apple نقطة النهاية لديك عندما يفتح مشترك نشط صفحة تفاصيل اشتراك فيها زر الإلغاء، لا فقط عندما يلغي. كل زيارة طلب يجب على خادمك مصادقته والبحث عن بياناته والرد عليه خلال 700 ms، وإلا تعود Apple إلى الرسالة الافتراضية. هذا يستبعد دالة ذات بدء بارد تستغرق أحيانًا ثانيتين. أنت تدفع مقابل سعة تبقى جاهزة دائمًا، إضافة إلى كل قراءات قاعدة البيانات واستدعاءات واجهات الطرف الثالث المدفوعة التي يجريها منطق القرار لديك مع كل طلب.

الخصم إيراد اخترت ألا تحصّله
العرض الترويجي الذي يحتفظ بمشترك هو مال حقيقي محفوظ. أما العرض الذي يذهب إلى شخص كان سيبقى على أي حال فهو خصم خالص. إليك مثالًا توضيحيًا، لا معيارًا. خطة شهرية بسعر $9.99 تُعرض بنصف السعر لمدة ثلاثة أشهر تتنازل عن $14.99 لكل عرض مقبول. إذا كان واحد من كل ثلاثة ممن قبلوا العرض سيبقى بالسعر الكامل، فإن ألف قبول تكلّف نحو $5,000 خصمًا مُنح لأشخاص لم يحتاجوه قط. وعلى الجانب الآخر من الميزان المشتركون الذين كانوا يغادرون فعلًا.
الاسترداد الذي يستدعيه خروج مزعج
تُبقي Apple زر Cancel Subscription على الصفحة، فلا يمكنك حبس أحد، لكن يظل بإمكانك أن تكون مزعجًا. العميل الذي يشعر بالضغط لديه خيار آخر، وهو أن يطلب من Apple استرداد آخر دفعة. عندما يحدث الاسترداد، تعود الأموال، بينما تبقى تكاليف الحوسبة والتخزين واستدعاءات الواجهات البرمجية وأي عمولات للشركاء مرتبطة بذلك المشترك مصروفة. هذه تكاليف لا تستعيدها أي رسالة استبقاء.
كيف تستخدم رسائل الاستبقاء دون رفع معدل الاسترداد لديك
تعامل مع شاشة الإلغاء كمكان للدقة، لا للدهاء. بضع قواعد تبقيها في الجانب الصحيح من خط الاسترداد:
- قرّر لكل مشترك على حدة. استخدم originalTransactionId في طلب Apple لمراجعة الاستخدام الأخير. قدّم خصمًا أو خطة أرخص لمن يستخدمون المنتج. وأعطِ رسالة قصيرة وصادقة لمن لم يفتحوه منذ أسابيع.
- اجعل الرد سريعًا. احسب القرار مسبقًا عندما تتغير بيانات الاستخدام لديك، كي يكون الطلب نفسه عملية بحث واحدة تقع بسهولة ضمن 700 ms.
- اكتب رسالة افتراضية لكل منتج ولكل لغة وإقليم. من دونها، يعني الاستدعاء الفاشل عدم ظهور أي رسالة على الإطلاق.
- راقب AUTO_RENEW_DISABLED عن كثب. إذا تبعه CONSUMPTION_REQUEST لنفس originalTransactionId، فأنت أمام طلب استرداد لا إلغاء، وقد بدأت مهلة الـ 12 ساعة.
- أجب عن كل CONSUMPTION_REQUEST يُسمح لك بالرد عليه. يرسل RefundHalt إلى Apple بيانات استهلاك دقيقة ضمن مهلة الـ 12 ساعة، ويردّ على مراجعة رد المبالغ في Google Play خلال 24 ساعة، لأن هاتين هما اللحظتان الوحيدتان اللتان يطلب فيهما أي من المتجرين روايتك.
هل يستحق الأمر أن تطلب الوصول من Apple؟
إذا كنت تبيع اشتراكات متجددة تلقائيًا وتتعامل بالفعل مع App Store Server Notifications V2، فالأرجح نعم. شاشة الإلغاء هي آخر مكان يمكنك فيه الوصول إلى المشترك قبل رحيله، وتغيير الخطة يكلّفك أقل من خسارته كليًا. فقط خصّص ميزانية لنقطة نهاية تردّ مع كل مشاهدة لصفحة الاشتراك، وأبقِ دفاعاتك ضد الاسترداد حيث تحدث الاستردادات فعلًا.
الأسئلة الشائعة
- ما هي واجهة Retention Messaging API من Apple؟
- هي واجهة برمجية تعمل من خادم إلى خادم، تتيح للمطوّر اختيار الرسالة التي يراها المشترك بعد النقر على Cancel Subscription في اشتراك متجدد تلقائيًا. تدعم Apple أربعة أنواع: نص، ونص مع صورة، واقتراح تغيير الخطة، وعرض ترويجي. ولا تزال وثائق Apple تصفها بأنها إصدار تجريبي مسبق يطلب المطوّرون الانضمام إليه.
- ما مدى السرعة المطلوبة لرد نقطة النهاية Get Retention Message لديّ؟
- خلال 700 ms في بيئة الإنتاج. إذا كان خادمك أبطأ أو تعطّل، تعرض Apple الرسالة الافتراضية المضبوطة لذلك المنتج واللغة والإقليم، ولا تعرض شيئًا إن لم توجد رسالة افتراضية. وعليك أيضًا اجتياز اختبار أداء في بيئة sandbox، عند نحو 700 ms، قبل أن تسمح لك Apple بتعيين عنوان URL للإنتاج.
- هل تظهر رسالة الاستبقاء عندما يطلب العميل استردادًا؟
- لا. تعرض Apple رسائل الاستبقاء على شاشة Confirm Cancellation بعد أن ينقر العميل على Cancel Subscription. أما طلبات الاسترداد فتمر عبر reportaproblem.apple.com أو نافذة الاسترداد داخل التطبيق التي تفتحها beginRefundRequest، والمدخل الوحيد للمطوّر هناك هو CONSUMPTION_REQUEST، ويُجاب عنه خلال 12 ساعة إذا وافق العميل.
- كيف أميّز طلب الاسترداد من الإلغاء في App Store Server Notifications؟
- لا يمكن ذلك من إشعار التجديد وحده. فالإلغاء من صفحة إعدادات الاشتراكات وطلب الاسترداد المُقدَّم عبر تطبيقك يُنتجان كلاهما DID_CHANGE_RENEWAL_STATUS بالنوع الفرعي AUTO_RENEW_DISABLED. أما وصول CONSUMPTION_REQUEST للمعاملة نفسها، ثم لاحقًا إشعار REFUND أو REFUND_DECLINED، فيدلّ على وجود طلب استرداد.
- هل يتيح Google Play للمطوّرين عرض رسالة عندما يلغي المستخدمون؟
- لا تصف وثائق Google عن دورة حياة الاشتراك شيئًا كهذا. يتلقى المطوّرون إشعار SUBSCRIPTION_CANCELED بعد وقوع الإلغاء، ويمكنهم قراءة الحقل userInitiatedCancellation لمعرفة سبب إلغاء المستخدم. أما الإيقاف المؤقت، المفعّل افتراضيًا لجميع الاشتراكات، فهو الأداة المدمجة الرئيسية في Google Play لمواجهة التسرّب الطوعي.
المصادر وقراءات إضافية
- Apple Developer Documentation: Retention Messaging API
- Apple Developer Documentation: Setting up your Get Retention Message endpoint
- Apple Developer Documentation: Upload Message
- Apple Developer Documentation: Retention Messaging API changelog
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: Send Consumption Information
- Apple Support: Request a refund for apps or content that you bought from Apple
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
الطيار الآلي للاستردادات في App Store وGoogle Play
تابع القراءة
ما زال ROAS تطبيقك يحتسب المشتريات التي ردّت Apple وGoogle قيمتها، لذا ابنِ عروض أسعارك على ROAS الصافي
نادرًا ما تصل المبالغ المستردة إلى منصات الإعلانات، فيظل ROAS ينسب إلى الحملات مشتريات سبق أن ردّت Apple وGoogle قيمتها. نوضح هنا أين تفقد Firebase وGoogle Ads وAdAttributionKit المبالغ المستردة، وكم يكلفك ذلك، وكيف تبني ROAS الصافي لتطبيقك.
يخبرك App Store order ID المطبوع على إيصال العميل بما اشتراه، وما إذا كانت Apple قد ردّت له المبلغ بالفعل
تحوّل نقطة النهاية Look Up Order ID من Apple رقم order ID الموجود في إيصال App Store الخاص بالعميل إلى signed transactions، بما فيها تواريخ الاسترداد وأسبابه. إليك كيف تستخدمها مع رسائل طلب الاسترداد، وما الذي لا تستطيع فعله، وكيف يختلف order ID في Google Play.