أسباب إلغاء الاشتراك تصلك عادةً قبل طلب الاسترداد، وGoogle Play يمنحك منها أكثر بكثير مما يمنحه Apple
يسجّل Google Play أسباب إلغاء الاشتراك من استبيان الإلغاء، بينما يرسل Apple رمز انتهاء فقط. إليك ما يخبرك به كل متجر، وأي الإشارات تنبئ باسترداد أو رد مبلغ (chargeback) قادم، وكم يكلّفك كل منها.

أهم الخلاصات
- يسأل Google Play المشتركين عن سبب مغادرتهم عند الإلغاء، ويصل الجواب إلى المطوّر عبر canceledStateContext.userInitiatedCancellation.cancelSurveyResult في purchases.subscriptionsv2.
- لاستبيان الإلغاء في Google Play خمس إجابات يستطيع المطوّر قراءتها: استخدام غير كافٍ، ومشكلات تقنية، وأسباب تتعلق بالتكلفة، وإيجاد تطبيق أفضل، وأخرى. ولا يُملأ النص الحر في reasonUserInput إلا عندما يختار المستخدم أخرى.
- إشعار SUBSCRIPTION_CANCELED من Google Play لا يحمل سوى رمز الشراء (purchase token). يجب جلب سبب الإلغاء عبر purchases.subscriptionsv2.get، ويمسح Google كل حقول الإلغاء إذا استعاد المستخدم اشتراكه.
- لا يتضمن App Store Server API من Apple أي استبيان للإلغاء. يعطي حقل expirationIntent واحدًا من خمسة رموز: العميل ألغى، أو خطأ في الفوترة، أو عدم الموافقة على زيادة السعر أو تحويل العرض، أو المنتج غير متاح، أو سبب آخر.
- قد يعني إشعار DID_CHANGE_RENEWAL_STATUS من Apple بالنوع الفرعي AUTO_RENEW_DISABLED أن App Store أوقف التجديد التلقائي بعد أن طلب العميل استردادًا، وليس فقط أن العميل أوقفه بنفسه.
- سبب الإلغاء لا يمنح المطوّر أي صوت في قرار الاسترداد. وحدهما يطلبان أدلة: CONSUMPTION_REQUEST من Apple ويُرد عليه خلال 12 ساعة، ومراجعة رد المبلغ في Google Play عبر orders.reviewrefund ويُرد عليها خلال 24 ساعة.
- المشترك في Google Play الذي يلغي بسبب مشكلات تقنية هو الأكثر ميلًا لطلب أمواله. وبالنسبة للطلبات المقدّمة بعد August 3, 2026، فإن رد المبلغ الذي يكسبه يكلّف المطوّر سعر الشراء مطروحًا منه رسوم خدمة Play، إضافة إلى رسوم البنك.
معظم المشتركين الذين يحصلون في النهاية على استرداد يلغون اشتراكهم أولًا. ويحمل ذلك الإلغاء سببًا، والمتجران يقدّمان لك منه كميات مختلفة جدًا. يجري Google Play استبيانًا قصيرًا ويرسل الجواب إلى خادمك، بما في ذلك النص الحر. أما Apple فيرسل رمزًا رقميًا يوضح كيف انتهى الاشتراك، لا لماذا أراد العميل المغادرة. اقرأ الاثنين جيدًا وسترى طلبات الاسترداد قادمة بينما لا يزال بإمكانك فعل شيء حيالها.
ما يخبرك به Google Play عن أسباب إلغاء الاشتراك
عندما يلغي المستخدم اشتراكه من مركز الاشتراكات في Play، يسأله Google عن السبب. ويصل الجواب إلى مورد الاشتراك الذي تحصل عليه من purchases.subscriptionsv2.get، تحت canceledStateContext. لا يوجد هذا الكائن إلا عندما يكون الاشتراك في حالة الإلغاء أو الانتهاء، وهو يوضح من أنهى الاشتراك: المستخدم، أو نظام Google، أو أنت، أو استبدال مثل تغيير الخطة.
عندما يكون المستخدم هو من ألغى، يحتوي الكائن userInitiatedCancellation على حقلين. يوضح cancelTime وقت الإلغاء. ويحمل cancelSurveyResult جواب الاستبيان.
| سبب الاستبيان | وصف Google | ما يشير إليه غالبًا |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | استخدام غير كافٍ للاشتراك | استخدام منخفض، أي تكلفة قليلة أُنفقت على الحساب |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | مشكلات تقنية أثناء استخدام التطبيق | أقوى إشارة إلى استرداد أو رد مبلغ |
| CANCEL_SURVEY_REASON_COST_RELATED | مشكلات تتعلق بالتكلفة | حساسية للسعر، وأحيانًا تجديد لم يتوقعه |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | وجد المستخدم تطبيقًا أفضل | فاز منافس، ونادرًا ما يحدث نزاع |
| CANCEL_SURVEY_REASON_OTHERS | أسباب أخرى | اقرأ reasonUserInput، كلمات المستخدم نفسه |
| CANCEL_SURVEY_REASON_UNSPECIFIED | سبب استبيان إلغاء غير محدد | لا جواب يمكن العمل عليه |
العمود الأخير هو قراءتنا نحن، لا قراءة Google. أما العمودان الأولان فمأخوذان مباشرة من مرجع API.
الإشعار لا يحمل السبب
يؤدي الاشتراك الملغى إلى إرسال إشعار المطوّر الفوري SUBSCRIPTION_CANCELED، من type 3. ويوضح Google صراحةً أن هذه الإشعارات لا تقول سوى أن حالة الشراء تغيّرت. لا تحتوي الحمولة على شيء مفيد غير رمز الشراء، لذا على معالجك أن يستدعي purchases.subscriptionsv2.get لقراءة جواب الاستبيان.
ما تعرضه Play Console
لا تحتاج إلى كتابة كود لرؤية الإجماليات. تتضمن تقارير الاشتراكات في Play Console بطاقة Cancellations التي تقسم التسرّب إلى طوعي وغير طوعي وآخر، وبطاقة Cancellation survey responses للمستخدمين الذين اختاروا الإجابة. ويمكن تنزيل الإجابات النصية الحرة من المستخدمين الذين اختاروا أخرى بصيغة CSV من بطاقة Other responses. يتطلب هذا التنزيل صلاحية View financial data، وهي الصلاحية نفسها التي تمنحها لأي أداة تقرأ طلباتك.
ما يخبرك به Apple، وما يغفله
لا يجري Apple أي استبيان إلغاء يصل إلى المطوّرين. أقرب حقل هو expirationIntent في معلومات التجديد الموقّعة، وهو يصف كيف انتهى الاشتراك، لا ما كان يفكر فيه العميل.
| expirationIntent | المعنى لدى Apple | النوع الفرعي المقابل في EXPIRED |
|---|---|---|
| 1 | ألغى العميل اشتراكه | VOLUNTARY |
| 2 | خطأ في الفوترة، مثل معلومات دفع غير صالحة | BILLING_RETRY |
| 3 | عدم الموافقة على زيادة سعر أو تحويل عرض كان يتطلب الموافقة | PRICE_INCREASE |
| 4 | لم يكن المنتج متاحًا للشراء عند التجديد | PRODUCT_NOT_FOR_SALE |
| 5 | سبب آخر | لا يوجد نوع فرعي |
الرمز 1 هو الوحيد الذي يصف قرارًا اتخذه العميل، ولا يقول شيئًا عن دافعه. العميل الذي غادر لأن التطبيق ظل يتعطل، والعميل الذي أنهى مشروعه ببساطة، يبدوان متطابقين.
الإشارة المخفية في AUTO_RENEW_DISABLED
هناك إشعار واحد من Apple يستحق نظرة أدق. فإشعار DID_CHANGE_RENEWAL_STATUS بالنوع الفرعي AUTO_RENEW_DISABLED يعني عادةً أن العميل أوقف التجديد التلقائي. لكن وثائق Apple تضيف حالة ثانية: يوقف App Store أيضًا التجديد التلقائي بعد أن يطلب العميل استردادًا.
إذن على iOS، قد يكون حدث إيقاف التجديد أول أثر لطلب استرداد. إذا كان الشراء منتجًا استهلاكيًا أو اشتراكًا يتجدد تلقائيًا، فقد يتبعه CONSUMPTION_REQUEST، ومن تلك اللحظة يكون أمامك 12 ساعة لإرسال بيانات الاستهلاك. أي حدث إيقاف تجديد يصل دون إجراء ظاهر في تطبيقك يستحق أن تعامله كتنبيه مبكر لتجهيز بيانات استخدام ذلك الحساب.
Apple وGoogle جنبًا إلى جنب
| Google Play | Apple App Store | |
|---|---|---|
| يسأل المستخدم عن السبب | نعم، استبيان إلغاء | لا يوجد استبيان مرئي للمطوّر |
| أين يوجد السبب | canceledStateContext في purchases.subscriptionsv2 | expirationIntent في معلومات التجديد |
| نص حر | reasonUserInput، فقط عند اختيار أخرى | لا يوجد |
| من ألغى | المستخدم أو النظام أو المطوّر أو استبدال | يُستنتج من الرمز والنوع الفرعي |
| الإشعار | SUBSCRIPTION_CANCELED، ثم استدعاء get | DID_CHANGE_RENEWAL_STATUS، EXPIRED |
| يضيع إذا اشترك المستخدم من جديد | نعم، يُمسح عند الاستعادة | معلومات التجديد تعكس الحالة الحالية |
| لوحة التحكم | بطاقة Cancellation survey responses | لا شيء بخصوص الأسباب |

متى يتحول الإلغاء إلى استرداد
الإلغاء يوقف الدفعة التالية. لكنه لا يعيد الدفعة الأخيرة. استرجاع المال يعتمد على مسار الاسترداد الذي يصل إليه العميل بعد ذلك، ومعظم هذه المسارات تجري من دونك.
- على Google Play، يمكن للمشتري الحصول على استرداد بنفسه خلال 48 ساعة من الشراء، وGoogle هو من يقرر.
- الاستردادات التي تتم عبر دعم Google أو Apple يقررها المتجر.
- يطلب CONSUMPTION_REQUEST من Apple بيانات الاستهلاك لديك، ضمن مهلة 12 ساعة.
- تطلب مراجعة رد المبلغ في Google Play أدلة عبر orders.reviewrefund، ضمن مهلة 24 ساعة. وقرار البنك في رد المبلغ نهائي.
سبب الإلغاء لا يغيّر أيًّا من هذه القواعد. ما يغيّره هو مدى سرعة معرفتك بالعميل غير الراضي، وما إذا كانت أدلتك جاهزة عندما يصل أحد المسارين اللذين يطلبانها.
كم يكلّفك كل سبب
جواب الاستبيان هو أيضًا مؤشر تقريبي على ما كلّفه الحساب حتى الآن لخدمته، وهو المال الذي يبقى على عاتقك بعد الاسترداد.
مشكلات تقنية
هذا هو السبب المكلف. استخدم العميل المنتج بما يكفي ليصادف مشكلات، لذا فقد دفعت ثمن الحوسبة وراء جلساته، واستدعاءات model API التي أحدثتها طلباته، وتخزين ما أنشأه، وأي مستحقات لصانع محتوى استخدم محتواه. وإذا حصل بعد ذلك على استرداد، يعود السعر وتبقى هذه التكاليف عليك. وإذا لجأ إلى بنكه على Google Play، فإن الطلب المقدّم بعد August 3, 2026 يكلّفك سعر الشراء مطروحًا منه رسوم خدمة Play، إضافة إلى رسوم البنك.
أسباب تتعلق بالتكلفة
شكوى السعر تكلّفك أقل مما تبدو، ما لم تخفِ وراءها تجديدًا غير متوقع. فهذه هي القصة المعتادة لرد المبلغ، لذا تحقّق مما إذا جاء الإلغاء مباشرة بعد دفعة تجديد، ومما إذا كانت تذكيرات التجديد قد أُرسلت.
استخدام غير كافٍ
الاستخدام المنخفض يعني تكلفة خدمة منخفضة، لذا فالاسترداد هنا يعيد في الغالب مالًا لم تنفق الكثير لكسبه. وهو أيضًا السبب الذي تُظهر فيه بيانات الاستهلاك الصادقة، إذا طلبها Apple، بالضبط ما استخدمه العميل وما لم يستخدمه.
إيجاد تطبيق أفضل
نادرًا ما يعترض هؤلاء العملاء على أي شيء. لقد انتقلوا إلى منافس. هذا السبب مفيد لقرارات المنتج، ولا يكاد يفيد أبدًا في الدفاع ضد الاسترداد.
روتين لقراءة أسباب الإلغاء
- مع كل SUBSCRIPTION_CANCELED من Google Play، استدعِ purchases.subscriptionsv2.get واحفظ canceledStateContext مع رمز الشراء وcancelTime.
- احفظ reasonUserInput حرفيًا عندما يكون السبب أخرى. فهو النص الحر الوحيد الذي يمنحك إياه أي من المتجرين.
- مع كل DID_CHANGE_RENEWAL_STATUS من Apple يحمل AUTO_RENEW_DISABLED، سجّل الحدث واسحب بيانات استخدام ذلك الحساب، تحسبًا لوصول CONSUMPTION_REQUEST.
- مع كل إشعار EXPIRED من Apple، سجّل النوع الفرعي وexpirationIntent حتى لا يختلط التسرّب الطوعي بإخفاقات الفوترة.
- بالنسبة لإلغاءات Google Play التي تذكر مشكلات تقنية، افحص سجلات الأخطاء لذلك الحساب وتواصل مع العميل قبل أن يصل إلى بنكه.
- احتفظ بسجلات استخدام لكل حساب، حتى يُرد على CONSUMPTION_REQUEST خلال 12 ساعة وعلى مراجعة رد المبلغ خلال 24.
الأسئلة الشائعة
- كيف أعرف سبب إلغاء مشترك في Google Play؟
- استدعِ purchases.subscriptionsv2.get واقرأ canceledStateContext.userInitiatedCancellation.cancelSurveyResult. يحمل حقل reason جواب الاستبيان، ويحمل reasonUserInput النص الحر عندما يختار المستخدم أخرى. كما تعرض Play Console الإجماليات في بطاقة Cancellation survey responses.
- هل يخبر Apple المطوّرين بسبب إلغاء العميل للاشتراك؟
- لا. ليس لدى Apple استبيان إلغاء مرئي للمطوّرين. يوضح حقل expirationIntent كيف انتهى الاشتراك، برموز تعني: العميل ألغى، أو خطأ في الفوترة، أو عدم الموافقة على زيادة السعر، أو المنتج غير متاح، أو سبب آخر، لكنه لا يكشف دافع العميل.
- هل يتضمن إشعار SUBSCRIPTION_CANCELED سبب الإلغاء؟
- لا. إشعارات المطوّر الفورية من Google Play لا تقول سوى أن حالة الشراء تغيّرت. اجلب الاشتراك عبر purchases.subscriptionsv2.get لقراءة السبب، واحفظه فورًا، لأن Google يمسح حقول الإلغاء إذا استعاد المستخدم اشتراكه.
- هل يمكن أن يعني إشعار AUTO_RENEW_DISABLED من Apple طلب استرداد؟
- نعم. تقول وثائق Apple إن النوع الفرعي AUTO_RENEW_DISABLED يشمل حالتين: أن يوقف العميل التجديد التلقائي، وأن يوقفه App Store بعد أن يطلب العميل استردادًا.
- هل يمكنني سحب الوصول عندما يلغي المشترك؟
- ليس على Google Play ما دام لا يزال مستحقًا. يقول Google إن المشترك الملغي يحتفظ بوصوله حتى نهاية دورة الفوترة، وإن سحب الوصول مبكرًا يخالف سياسة الاشتراكات في Google Play. استخدم expiryTime لتحديد موعد انتهاء الوصول.
المصادر وقراءات إضافية
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
الطيار الآلي للاستردادات في App Store وGoogle Play
تابع القراءة
طلبات الاسترداد المفرطة قد تكلفك أكثر من المبالغ المستردة نفسها، لأن متجري التطبيقات يعدّانها مؤشرًا على الجودة
تذكر الإرشادات 5.6.4 من Apple طلبات الاسترداد المفرطة دليلًا على أن التطبيق لا يفي بمعايير الجودة، واتفاقية التوزيع من Google تسمح لها بإزالة تطبيقات المطورين الجدد بناءً على معدلات الاسترداد. إليك ما يقوله كل متجر، وكم تكلفك الإزالة، وكيف تبقى بعيدًا عن الخطر.
تحقّق من إشعارات خادم App Store قبل أن تتصرّف بناءً على استرداد، لأن أي شخص يستطيع الإرسال إلى عنوان webhook الخاص بك
إشعار الاسترداد ليس سوى طلب HTTPS إلى أن تتحقّق من توقيعه. إليك كيف تتحقّق من إشعارات خادم App Store ورسائل Google Play RTDN، وما الذي يوقّعه كل متجر، وما الذي يكلّفك إياه استرداد مزوّر أو مرفوض خطأً.