اسأل عشرة فرق عمل على iOS عن كيفية إدارتها لعمليات استرداد الأموال في Apple، وستجد أن تسعة منها يصفون الأمر نفسه: ملف CSV يُستخرج من App Store Connect في حوالي اليوم الخامس من الشهر. يُقرأ مرة واحدة، يُتنهّد عليه، ثم يُغلق.
هذه ليست إدارة، بل تشريح جثة.
تتخذ Apple كل قرار استرداد، ولا رأي لك في ذلك. ما تحصل عليه هو مجموعة من الأحداث، ونافذة زمنية قصيرة للرد على أحدها، وتاريخ إلغاء يُفترض بك التصرف بناءً عليه. الفرق التي تربط هذه الأحداث ببعضها تحتفظ بأموال لا يراها من يكتفون بقراءة ملفات CSV. بالنسبة لجانب التسجيل أولًا، ابدأ بـ كيفية تتبع طلبات استرداد الأموال في Apple والرد عليها في الوقت المناسب. أما هذا المقال فيغطي المهمة كاملة.
أبرز النقاط
إدارة طلبات استرداد الأموال في Apple مهمة تقع على عاتق الخادم (server). لا توجد أي قائمة انتظار لطلبات الاسترداد في App Store Connect.
تمنح سياسة استرداد الأموال في Apple العملاء طريقًا للخدمة الذاتية عبر reportaproblem.apple.com. ولن تعلم بالأمر إلا إذا طلبت ذلك.
أربعة أنواع من الإشعارات تغطي دورة الحياة الكاملة: CONSUMPTION_REQUEST وREFUND وREFUND_DECLINED وREFUND_REVERSED.
نافذة الرد التي مدتها 12 ساعة هي المكان الوحيد الذي يمكن فيه لمدخلاتك أن تغيّر النتيجة. أما كل ما عدا ذلك فهو مجرد تنظيف لاحق.
تُغفل معظم الفرق حدث REFUND_REVERSED. هذا الحدث يعيد الوصول إلى المستخدم، وإغفاله يُعاقب عميلًا نزيهًا.
ما تعنيه إدارة طلبات استرداد الأموال في Apple فعليًا
هي الأنظمة التي ترصد حدث الاسترداد، وتردّ عليه عند الحاجة، وتُحدّث ما يمكن للمستخدم فعله، وتُسجّل الأموال محاسبيًا. أربع مهام، لا واحدة منها اختيارية، وواحدة فقط تظهر في لوحة تحكم (dashboard) توفرها Apple.
قد تبدو سياسة استرداد الأموال في Apple وكأنها تشملك، لكنها في الغالب لا تفعل. تنص شروط خدمات الوسائط الخاصة بـ Apple على أن جميع المعاملات نهائية، لذا فإن كل عملية استرداد هي استثناء تختار Apple منحه. لا يوجد زر موافقة، ولا عنوان بريد إلكتروني للعميل، بل لا يمكنك حتى معرفة من قدّم الطلب.
ما يمكنك فعله هو إرسال أدلة أثناء اتخاذ Apple قرارها. وهذه الرافعة هي السبب في وجود هذا التخصص أصلًا.
عملية طلب استرداد الأموال في Apple للمطورين، من البداية إلى النهاية
إليك المسار الكامل، بالترتيب، من جانب العميل إلى جانبك.
يفتح العميل reportaproblem.apple.com، يسجّل الدخول، يجد عملية شراء من آخر 90 يومًا، يختار سببًا، ثم يُرسل الطلب. ومنذ iOS 15، يمكنك عرض النموذج نفسه داخل تطبيقك باستخدام refund request sheet الخاصة بـ StoreKit، ما يوجّه المستخدم غير الراضي إلى Apple مباشرة دون المرور بتذكرة دعم فني.
إذا كنت تستخدم App Store Server Notifications V2، فسيصل إشعار CONSUMPTION_REQUEST إلى نقطة النهاية (endpoint) الخاصة بك، محتويًا على المعاملة والمنتج والسبب الذي اختاره العميل.
تحصل على نحو 12 ساعة للرد ببيانات الاستهلاك. إما أن تردّ أو لا تردّ.
تصدر Apple حكمها: REFUND أو REFUND_DECLINED، أو لا شيء على الإطلاق إذا لم تكن تستمع للإشعارات.
إذا تمت الموافقة على الطلب، تحمل الحمولة (payload) تاريخ الإلغاء وسببه. يُلغى الوصول اعتبارًا من ذلك التاريخ، ويتغيّر سجل إيراداتك.
أحيانًا تُغيّر Apple قرارها بعد اعتراض من العميل. يصل حينها إشعار REFUND_REVERSED، فتُعيد الوصول إلى المستخدم.
الخطوة الثالثة هي الوحيدة التي تؤثر فيها على النتيجة. أما الخطوتان الخامسة والسادسة فهما حيث تتسرّب الأموال بصمت.
أمر ينبغي معرفته قبل بناء هذا النظام: تنصح Apple المطورين بعدم الاستعلام الدوري (polling) عن حالة الاسترداد. الإشعارات هي المسار الموصى به، مع استخدام Get Refund History للمطابقة بعد انقطاع الخدمة، لا كمصدر أساسي للبيانات.
مثال حقيقي على قيمة هذا الأمر
هناك موضوع معروف على r/iOSProgramming كتب فيه أحد المطورين عن تعامله مع CONSUMPTION_REQUEST لأول مرة. كان قد تجاهله لأشهر. وبعد أن أعدّ نظام رد، أعاد نحو 1,000 دولار إلى الإيرادات الشهرية لتطبيق صغير واحد.
دون أي تغيير في جدار الدفع (paywall)، ولا تجربة تهيئة جديدة، ولا اختبار أسعار. كل ما فعله هو أنه بدأ يُجيب عن السؤال الذي كانت Apple تطرحه عليه أصلًا.
هذا هو جوهر هذا الموضوع. العمل غير برّاق ويعيش في كود الواجهة الخلفية (backend). لكن العائد يظهر بسرعة، لأن تلك الطلبات كانت تُقبل تلقائيًا أصلًا.
الأحداث الأربعة، وما يجب فعله مع كل منها
CONSUMPTION_REQUEST
Apple هنا تسأل، لا تقرر. اسحب بيانات الاستخدام الفعلي للعميل، وتحقق من موافقته على مشاركة بياناته، ثم أدخل خمسة حقول: الموافقة (consent)، وحالة التسليم (delivery status)، وما إذا قُدّمت عيّنة (sample provided)، ونسبة الاستهلاك بوحدة الميلي (milliunits)، والنتيجة التي تفضلها. ارفض الحالات التي استُخدم فيها المنتج فعليًا، ووافق على الحوادث الحقيقية غير المقصودة.
REFUND
الأموال تعود إلى العميل، ويترتب على ذلك إجراءان منفصلان. أَلغِ الاستحقاق (entitlement) اعتبارًا من تاريخ الإلغاء. سجّل عملية الاسترداد في الفترة التي وقعت فيها عملية الشراء الأصلية، لا في الفترة التي علمت فيها بالأمر. واحفظ أيضًا سبب الإلغاء، لأنه يميّز عمليات الاسترداد الناتجة عن مشكلة في التطبيق عن الضجيج العشوائي.
REFUND_DECLINED
لا شيء عليك فعله سوى تسجيل ذلك. إما أن ردّك كان فعالًا، أو أن سجل الحساب هو ما أثّر في القرار.
REFUND_REVERSED
تراجعت Apple عن عملية استرداد بعد اعتراض. إذا كنت قد أوقفت الوصول، أعِده. وفي حالة الاشتراكات، لا يتغيّر تاريخ التجديد عند حدوث ذلك، وهو ما يُوقع كثيرين في الخطأ.
هناك حالتان استثنائيتان لا يخطط لهما أحد. عملية استرداد الاشتراك تُرفق أيضًا بإشعار DID_CHANGE_RENEWAL_STATUS مع نوع فرعي AUTO_RENEW_DISABLED، ما يعني أن التجديد قد أُوقف بالفعل. كما أنه عند تفعيل Family Sharing، تؤدي عملية الاسترداد إلى تشغيل REVOKE لكل فرد من أفراد العائلة كان يملك حق الوصول.
كيفية التعامل مع طلبات استرداد الأموال في Apple: مهمة الـ12 ساعة
النافذة الزمنية قصيرة ولا تكترث بالتوقيت. الرد الصحيح يتطلب خمس خطوات. تحقّق من توقيع JWS مقابل سلسلة شهادات Apple قبل الوثوق بأي بايت منه. اربط المعاملة بمستخدم حقيقي. احسب الاستهلاك من بيانات استخدام مسجّلة فعليًا لا من تخمين. أنشئ رمز JWT قصير الأجل باستخدام مفتاح In-App Purchase. ثم أرسل الرد.
الموافقة هي البوابة التي يمر عبرها كل شيء. توثيق Send Consumption Information الخاص بـ Apple واضح تمامًا: لا ترسل ردًا على الإطلاق إذا لم يوافق العميل على مشاركة بيانات استهلاكه. أدرج هذه الصياغة في شروط الاستخدام لديك قبل الإطلاق. أما الاشتراكات القابلة للتجديد التلقائي فترفض نسبة الاستهلاك بشكل قاطع، لأن Apple تشتقها من الوقت المنقضي.
تمنحك بيئة Sandbox خمس دقائق بدلًا من 12 ساعة. اعتبر ذلك تلميحًا: خادم (server)، لا شخص.
ماذا يحدث بعد صدور القرار
التعامل مع الطلب هو نصف المهمة فقط. أما كيفية تعامل المطورين مع عمليات استرداد App Store فتتوقف على الساعة التالية، حين يجب أن تبقى ثلاثة أمور متزامنة:
الاستحقاقات (Entitlements). يُلغى الوصول عند REFUND، ويُعاد عند REFUND_REVERSED. إذا كان المستخدم يملك ميزة Pro عبر منحتين مختلفتين، تحقق من الأخرى أولًا. لقد شرحنا هذه المسألة بالكامل في مقال إلغاء الوصول بعد عملية استرداد.
سجلات الإيرادات. تصل عمليات الاسترداد بعد أسابيع. اُنسبها إلى الفوج (cohort) الأصلي، وإلا كانت قيمة العميل مدى الحياة (LTV) لديك وهمية، وينجرّ إنفاقك الإعلاني وراءها نحو الانخفاض.
التقارير. سجّل ما طلبته Apple، وما أرسلته أنت، وما إذا تم قبوله، والمدة التي استغرقها ذلك. إرسال رد وقبول ذلك الرد حقيقتان مختلفتان، والمهم هو الثانية فقط.
تجاوَل أيًا منها، وهذا بالضبط كيف تُسيء تطبيقات الموبايل إدارة عمليات استرداد App Store بينما تظن أنها تديرها بشكل جيد.
ابنِه بنفسك، أو اشترِ برنامج إدارة استرداد الأموال من Apple للمطورين
تنحصر إدارة استرداد الأموال من Apple للمطورين في خيار واحد: الحجم، بالإضافة إلى ما إذا كان أحد راغبًا في تولّي معالج (handler) يجب ألا يتوقف عن العمل أبدًا.
بناؤه بنفسك يعني التحقق من JWS، ومفتاح In-App Purchase تُنزّله مرة واحدة فقط، وربطًا بين المعاملات والمستخدمين يصمد أمام تغييرات المخطط (schema)، وجدول مناوبات لساعة 3 فجرًا يوم السبت. أيام قليلة للحصول على نسخة بسيطة، وأشهر للحصول على نسخة موثوقة.
الشراء أسرع. تختلف أدوات إدارة استرداد أموال App Store في ثلاثة أمور: هل تردّ تلقائيًا داخل النافذة الزمنية، وهل تغطي Google Play، وهل تعرض لك الأموال التي احتفظت بها أم مجرد سجل للأحداث. لقد قارنّا الساحة في مقال أدوات إدارة استرداد الأموال من Apple: كيفية اختيار الحل المناسب.
إذا كنت تفضّل عدم تثبيت أي شيء وعدم كتابة أي كود، فإن Refund Sensor حل لإدارة استرداد أموال App Store يعمل باستخدام مفاتيح المتجر التي تملكها بالفعل. يردّ على كل طلب بأدلة المعاملة داخل النافذة الزمنية، ويتتبع نتيجة كل حالة على حدة. خمس دقائق للربط، دون SDK، ودون إعادة تقديم.
المصادر
الأسئلة الشائعة
انتقل إلى reportaproblem.apple.com، وسجّل الدخول باستخدام Apple ID الذي تم به الشراء، وابحث عن عملية الشراء ضمن آخر 90 يومًا، ثم اختر السبب. تُخبر Apple العملاء بأنهم سيتلقون ردًا خلال 48 ساعة. وداخل التطبيق، يعرض refund request sheet الخاص بـ StoreKit النموذج نفسه.
لا. Apple هي من تقرر. يمكنك إرسال أدلة الاستهلاك أثناء انتظار البت في الطلب وذكر تفضيلك، لكن القرار النهائي ليس بيدك.
تظهر عمليات الشراء التي تمت خلال آخر 90 يومًا على reportaproblem.apple.com. وتنص شروط Apple على أن جميع المعاملات نهائية، لذا فإن عملية الاسترداد هي استثناء تقديري.
في الغالب لا يمكنك ذلك، وهذا هو الواقع بصراحة. تحتاج الإشعارات إلى نقطة نهاية (endpoint). ودون خادم خاص بك، تكون الخدمة المُدارة التي تستضيف تلك النقطة هي طريقك الوحيد للرد خلال 12 ساعة.
مفتاح In-App Purchase، يُنشأ في App Store Connect ضمن قسم Users and Access، تحت Integrations. وهو ليس مفتاح App Store Connect API الخاص بك، ويُنزَّل ملف .p8 مرة واحدة فقط.
نعم. يأتي الاسترداد مصحوبًا بإشعاري DIDCHANGERENEWALSTATUS وAUTORENEW_DISABLED، بحيث يكون التجديد قد أُوقف بالفعل عند إعادة الأموال.
أيّ حل يردّ تلقائيًا على كل طلب ويوضح لك الأموال التي احتفظت بها. بالنسبة لمطور مستقل، يُعد بناء المعالج (handler) مشروعًا معقولًا لعطلة نهاية أسبوع، لكنه يحتاج بعد ذلك إلى مراقبة مستمرة إلى الأبد. وبعد تجاوز حجم معين من الطلبات، يتفوق حل إدارة استرداد أموال تطبيقات iOS على نظام المناوبات.






