บทความทั้งหมด
คู่มือปฏิบัติใช้เวลาอ่าน 8 นาที

เหตุผลการยกเลิกการสมัครสมาชิกมักมาถึงคุณก่อนคำขอคืนเงิน และ 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 ที่มี subtype เป็น AUTO_RENEW_DISABLED อาจหมายความว่า App Store ปิดการต่ออายุอัตโนมัติหลังจากลูกค้าขอคืนเงิน ไม่ได้หมายความแค่ว่าลูกค้าปิดเอง
  • เหตุผลการยกเลิกไม่เคยทำให้นักพัฒนามีสิทธิ์ออกเสียงเรื่องการคืนเงิน มีเพียงสองช่องทางที่ขอหลักฐาน: CONSUMPTION_REQUEST ของ Apple ซึ่งต้องตอบภายใน 12 ชั่วโมง และการตรวจสอบ chargeback ของ Google Play ผ่าน orders.reviewrefund ซึ่งต้องตอบภายใน 24 ชั่วโมง
  • สมาชิก Google Play ที่ยกเลิกเพราะปัญหาทางเทคนิคคือกลุ่มที่มีแนวโน้มขอเงินคืนมากที่สุด และสำหรับคำสั่งซื้อหลัง August 3, 2026 หากพวกเขาชนะ chargeback นักพัฒนาจะเสียราคาซื้อหักค่าบริการของ Play บวกค่าธรรมเนียมของธนาคาร

สมาชิกส่วนใหญ่ที่ได้เงินคืนในท้ายที่สุดมักยกเลิกการสมัครก่อน การยกเลิกนั้นมาพร้อมเหตุผล และสองสโตร์ให้ข้อมูลส่วนนี้แก่คุณในปริมาณที่ต่างกันมาก Google Play ทำแบบสำรวจสั้นๆ และส่งคำตอบไปยังเซิร์ฟเวอร์ของคุณ รวมถึงข้อความอิสระด้วย ส่วน Apple ส่งรหัสตัวเลขที่บอกว่าการสมัครสมาชิกสิ้นสุดอย่างไร ไม่ได้บอกว่าทำไมลูกค้าถึงอยากเลิก หากอ่านทั้งสองแบบให้ถูก คุณจะเห็นคำขอคืนเงินกำลังมาในขณะที่ยังพอทำอะไรได้

Google Play บอกอะไรคุณบ้างเกี่ยวกับเหตุผลการยกเลิกการสมัครสมาชิก

เมื่อผู้ใช้ยกเลิกในศูนย์การสมัครสมาชิกของ Play ทาง Google จะถามเหตุผล คำตอบจะอยู่ใน subscription resource ที่คุณได้จาก purchases.subscriptionsv2.get ภายใต้ canceledStateContext ออบเจ็กต์นี้มีอยู่เฉพาะตอนที่การสมัครสมาชิกอยู่ในสถานะยกเลิกแล้วหรือหมดอายุแล้ว และบอกว่าใครเป็นผู้สิ้นสุดการสมัคร: ผู้ใช้, ระบบของ Google, คุณ หรือการแทนที่ เช่น การเปลี่ยนแพ็กเกจ

เมื่อผู้ใช้เป็นคนยกเลิก ออบเจ็กต์ userInitiatedCancellation จะมีสองฟิลด์ cancelTime บอกเวลาที่ยกเลิก cancelSurveyResult เก็บคำตอบของแบบสำรวจ

เหตุผลในแบบสำรวจคำอธิบายของ Googleสิ่งที่มักบ่งบอก
CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGEใช้การสมัครสมาชิกไม่มากพอใช้งานน้อย จึงมีต้นทุนที่จมไปกับบัญชีไม่มาก
CANCEL_SURVEY_REASON_TECHNICAL_ISSUESปัญหาทางเทคนิคระหว่างใช้แอปสัญญาณการคืนเงินและ chargeback ที่ชัดที่สุด
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 ระบุชัดเจนว่าการแจ้งเตือนเหล่านี้บอกเพียงว่าสถานะการซื้อเปลี่ยนไป payload ให้แค่ purchase token และไม่มีข้อมูลที่มีประโยชน์อื่น ดังนั้น handler ของคุณต้องเรียก purchases.subscriptionsv2.get เพื่ออ่านคำตอบของแบบสำรวจ

มุมมองใน Play Console

คุณไม่ต้องเขียนโค้ดเพื่อดูยอดรวม รายงานการสมัครสมาชิกใน Play Console มีการ์ด Cancellations ที่แบ่ง churn เป็นแบบสมัครใจ ไม่สมัครใจ และอื่นๆ และมีการ์ด Cancellation survey responses สำหรับผู้ใช้ที่เลือกตอบ คำตอบแบบข้อความอิสระจากผู้ใช้ที่เลือกอื่นๆ ดาวน์โหลดเป็น CSV ได้จากการ์ด Other responses การดาวน์โหลดนี้ต้องใช้สิทธิ์ View financial data ซึ่งเป็นสิทธิ์เดียวกับที่คุณให้เครื่องมือที่อ่านคำสั่งซื้อของคุณ

Apple บอกอะไรคุณ และอะไรที่ไม่บอก

Apple ไม่มีแบบสำรวจการยกเลิกที่รายงานกลับมาให้นักพัฒนา ฟิลด์ที่ใกล้เคียงที่สุดคือ expirationIntent ในข้อมูลการต่ออายุที่ลงนามแล้ว และฟิลด์นี้อธิบายว่าการสมัครสมาชิกสิ้นสุดอย่างไร ไม่ใช่ว่าลูกค้าคิดอะไร

expirationIntentความหมายตาม Applesubtype ของ EXPIRED ที่ตรงกัน
1ลูกค้ายกเลิกการสมัครสมาชิกVOLUNTARY
2ข้อผิดพลาดในการเรียกเก็บเงิน เช่น ข้อมูลการชำระเงินไม่ถูกต้องBILLING_RETRY
3ไม่ยินยอมการขึ้นราคาหรือการแปลงข้อเสนอที่ต้องได้รับความยินยอมPRICE_INCREASE
4ผลิตภัณฑ์ไม่พร้อมจำหน่ายในตอนต่ออายุPRODUCT_NOT_FOR_SALE
5เหตุผลอื่นไม่มี subtype

รหัส 1 เป็นรหัสเดียวที่อธิบายการตัดสินใจของลูกค้า และก็ไม่ได้บอกอะไรเกี่ยวกับแรงจูงใจเลย ลูกค้าที่เลิกเพราะแอปแครชบ่อยกับลูกค้าที่แค่ทำโปรเจกต์เสร็จแล้ว จะดูเหมือนกันทุกประการ

สัญญาณที่ซ่อนอยู่ใน AUTO_RENEW_DISABLED

มีการแจ้งเตือนหนึ่งของ Apple ที่ควรดูให้ละเอียด DID_CHANGE_RENEWAL_STATUS ที่มี subtype เป็น AUTO_RENEW_DISABLED มักหมายความว่าลูกค้าปิดการต่ออายุอัตโนมัติ แต่เอกสารของ Apple ระบุกรณีที่สองไว้ด้วย: App Store ก็ปิดการต่ออายุอัตโนมัติเช่นกันหลังจากลูกค้าขอคืนเงิน

ดังนั้นบน iOS เหตุการณ์ปิดการต่ออายุอาจเป็นร่องรอยแรกของคำขอคืนเงิน หากรายการซื้อเป็น consumable หรือการสมัครสมาชิกแบบต่ออายุอัตโนมัติ อาจมี CONSUMPTION_REQUEST ตามมา และนับจากนั้นคุณมีเวลา 12 ชั่วโมงในการส่งข้อมูลการใช้งาน เหตุการณ์ปิดการต่ออายุที่เข้ามาโดยไม่มีการกระทำใดที่มองเห็นได้ในแอปของคุณ ควรถือเป็นสัญญาณเตือนล่วงหน้าให้เตรียมข้อมูลการใช้งานของบัญชีนั้นไว้

Apple และ Google แบบเทียบกัน

Google PlayApple App Store
ถามเหตุผลจากผู้ใช้ใช่ ผ่านแบบสำรวจการยกเลิกไม่มีแบบสำรวจที่นักพัฒนามองเห็น
เหตุผลอยู่ที่ไหนcanceledStateContext ใน purchases.subscriptionsv2expirationIntent ในข้อมูลการต่ออายุ
ข้อความอิสระreasonUserInput เฉพาะเมื่อเลือกอื่นๆไม่มี
ใครเป็นผู้ยกเลิกผู้ใช้ ระบบ นักพัฒนา หรือการแทนที่อนุมานจากรหัสและ subtype
การแจ้งเตือนSUBSCRIPTION_CANCELED แล้วเรียก getDID_CHANGE_RENEWAL_STATUS, EXPIRED
หายไปถ้าผู้ใช้สมัครใหม่ใช่ ถูกล้างเมื่อกู้คืนข้อมูลการต่ออายุแสดงสถานะปัจจุบัน
แดชบอร์ดการ์ด Cancellation survey responsesไม่มีสำหรับเหตุผล
การ์ดแบบสำรวจที่พิมพ์ออกมาถูกแยกเป็นกองเล็กๆ บนโต๊ะไม้ข้างโทรศัพท์และแก้วกาแฟ เหมือนกับที่นักพัฒนาจัดกลุ่มเหตุผลการยกเลิกการสมัครสมาชิก

จุดที่การยกเลิกกลายเป็นการคืนเงิน

การยกเลิกหยุดการเรียกเก็บเงินครั้งถัดไป แต่ไม่ได้คืนเงินครั้งล่าสุด เงินจะได้คืนหรือไม่ขึ้นอยู่กับว่าลูกค้าไปเจอช่องทางคืนเงินไหนต่อ และช่องทางส่วนใหญ่ดำเนินไปโดยไม่ต้องผ่านคุณ

  • บน Google Play ผู้ซื้อขอคืนเงินได้เองภายใน 48 ชั่วโมงหลังซื้อ และ Google เป็นผู้ตัดสิน
  • การคืนเงินผ่านฝ่ายสนับสนุนของ Google หรือ Apple จะตัดสินโดยสโตร์
  • CONSUMPTION_REQUEST ของ Apple ขอข้อมูลการใช้งานจากคุณ โดยมีกรอบเวลา 12 ชั่วโมง
  • การตรวจสอบ chargeback ของ Google Play ขอหลักฐานผ่าน orders.reviewrefund โดยมีกรอบเวลา 24 ชั่วโมง คำตัดสินของธนาคารเรื่อง chargeback ถือเป็นที่สิ้นสุด

เหตุผลการยกเลิกไม่ได้เปลี่ยนกฎข้อใดเลย สิ่งที่เปลี่ยนคือคุณรู้ได้เร็วแค่ไหนว่าลูกค้าคนไหนไม่พอใจ และหลักฐานของคุณพร้อมหรือยังเมื่อหนึ่งในสองช่องทางที่ขอหลักฐานมาถึง

แต่ละเหตุผลทำให้คุณเสียเท่าไร

คำตอบในแบบสำรวจยังบอกคร่าวๆ ได้ว่าบัญชีหนึ่งใช้ต้นทุนในการให้บริการไปแล้วเท่าไร ซึ่งก็คือเงินที่คุณต้องแบกรับหลังการคืนเงิน

ปัญหาทางเทคนิค

นี่คือเหตุผลที่แพงที่สุด ลูกค้าใช้ผลิตภัณฑ์มากพอที่จะเจอปัญหา คุณจึงจ่ายค่า compute เบื้องหลังเซสชันของพวกเขา ค่าเรียก model API จากคำขอของพวกเขา ค่าพื้นที่จัดเก็บสิ่งที่พวกเขาสร้าง และเงินที่ต้องจ่ายให้ครีเอเตอร์ที่พวกเขาใช้เนื้อหาไปแล้ว หากพวกเขาได้เงินคืนในภายหลัง ราคาจะกลับไปหาลูกค้าแต่ต้นทุนเหล่านั้นยังอยู่กับคุณ หากพวกเขาไปหาธนาคารบน Google Play คำสั่งซื้อหลัง August 3, 2026 จะทำให้คุณเสียราคาซื้อหักค่าบริการของ Play บวกค่าธรรมเนียมของธนาคาร

เรื่องราคา

คำบ่นเรื่องราคาทำให้คุณเสียน้อยกว่าที่เห็น เว้นแต่จะมีการต่ออายุที่ไม่คาดคิดซ่อนอยู่ นั่นคือเรื่องราว chargeback แบบคลาสสิก ดังนั้นให้ตรวจดูว่าการยกเลิกเกิดขึ้นทันทีหลังการเรียกเก็บเงินต่ออายุหรือไม่ และการแจ้งเตือนก่อนต่ออายุของคุณถูกส่งออกไปหรือยัง

ใช้งานไม่มากพอ

ใช้งานน้อยหมายถึงต้นทุนการให้บริการต่ำ การคืนเงินในกรณีนี้จึงส่วนใหญ่เป็นการคืนเงินที่คุณไม่ได้ลงทุนมากในการหามา และเป็นเหตุผลที่ข้อมูลการใช้งานที่ตรงไปตรงมา หาก Apple ขอ จะแสดงได้ชัดเจนว่าลูกค้าใช้อะไรไปและไม่ได้ใช้อะไร

เจอแอปที่ดีกว่า

ลูกค้ากลุ่มนี้แทบไม่โต้แย้งอะไร พวกเขาย้ายไปหาคู่แข่ง เหตุผลนี้มีประโยชน์สำหรับการตัดสินใจด้านผลิตภัณฑ์ แต่แทบไม่เคยช่วยในการป้องกันการคืนเงิน

ขั้นตอนประจำสำหรับอ่านเหตุผลการยกเลิก

  • ทุกครั้งที่ได้รับ SUBSCRIPTION_CANCELED จาก Google Play ให้เรียก purchases.subscriptionsv2.get แล้วบันทึก canceledStateContext พร้อม purchase token และ cancelTime
  • บันทึก reasonUserInput แบบคำต่อคำเมื่อเหตุผลคืออื่นๆ เพราะนี่เป็นข้อความอิสระเพียงอย่างเดียวที่ทั้งสองสโตร์ให้คุณ
  • ทุกครั้งที่ได้รับ DID_CHANGE_RENEWAL_STATUS ที่มี AUTO_RENEW_DISABLED จาก Apple ให้บันทึกเหตุการณ์และดึงข้อมูลการใช้งานของบัญชีนั้น เผื่อมี CONSUMPTION_REQUEST ตามมา
  • ทุกครั้งที่ได้รับการแจ้งเตือน EXPIRED จาก Apple ให้บันทึก subtype และ expirationIntent เพื่อไม่ให้ churn แบบสมัครใจปะปนกับการเรียกเก็บเงินที่ล้มเหลว
  • สำหรับการยกเลิกบน Google Play ที่ระบุว่าเป็นปัญหาทางเทคนิค ให้ตรวจ error log ของบัญชีนั้นและติดต่อลูกค้าก่อนที่พวกเขาจะไปหาธนาคาร
  • เก็บ log การใช้งานแยกตามบัญชี เพื่อให้ตอบ CONSUMPTION_REQUEST ได้ภายใน 12 ชั่วโมง และตอบการตรวจสอบ chargeback ได้ภายใน 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 ระบุว่า subtype AUTO_RENEW_DISABLED ครอบคลุมทั้งกรณีที่ลูกค้าปิดการต่ออายุอัตโนมัติเอง และกรณีที่ App Store ปิดให้หลังจากลูกค้าขอคืนเงิน
ตัดสิทธิ์เข้าถึงเมื่อสมาชิกยกเลิกได้ไหม
บน Google Play ทำไม่ได้ตราบใดที่พวกเขายังมีสิทธิ์อยู่ Google ระบุว่าสมาชิกที่ยกเลิกแล้วยังเข้าถึงได้จนสิ้นสุดรอบการเรียกเก็บเงิน และการตัดสิทธิ์ก่อนกำหนดถือเป็นการละเมิดนโยบายการสมัครสมาชิกของ Google Play ให้ใช้ expiryTime เพื่อตัดสินว่าการเข้าถึงสิ้นสุดเมื่อใด

แหล่งข้อมูลและเนื้อหาเพิ่มเติม

RefundHalt

ระบบอัตโนมัติสำหรับการคืนเงินบน App Store และ Google Play

อ่านต่อ

คู่มือปฏิบัติใช้เวลาอ่าน 8 นาที

คำขอคืนเงินที่มากเกินไปอาจทำให้คุณเสียมากกว่ายอดคืนเงิน เพราะทั้งสองสโตร์มองว่าเป็นสัญญาณด้านคุณภาพ

แนวทาง 5.6.4 ของ Apple ระบุว่าคำขอคืนเงินที่มากเกินไปเป็นสัญญาณว่าแอปไม่ได้มาตรฐานคุณภาพ และข้อตกลงการจัดจำหน่ายสำหรับนักพัฒนาของ Google ก็เปิดให้ถอดแอปของนักพัฒนารายใหม่ได้จากอัตราการคืนเงิน บทความนี้สรุปว่าแต่ละสโตร์เขียนไว้อย่างไร การถูกถอดแอปมีต้นทุนเท่าไร และจะอยู่ให้ห่างจากความเสี่ยงได้อย่างไร

เจาะลึกใช้เวลาอ่าน 8 นาที

ตรวจสอบการแจ้งเตือนจากเซิร์ฟเวอร์ App Store ก่อนดำเนินการกับการคืนเงิน เพราะใครก็ส่งคำขอมายัง URL webhook ของคุณได้

การแจ้งเตือนการคืนเงินเป็นเพียงคำขอ HTTPS ธรรมดาจนกว่าคุณจะตรวจสอบลายเซ็นของมัน บทความนี้อธิบายวิธีตรวจสอบการแจ้งเตือนจากเซิร์ฟเวอร์ App Store และข้อความ RTDN ของ Google Play แต่ละสโตร์ลงลายเซ็นอะไรบ้าง และการคืนเงินที่ถูกปลอมแปลงหรือถูกปฏิเสธโดยผิดพลาดทำให้คุณเสียเงินเท่าใด

คำขอคืนเงินครั้งต่อไปกำลังมา

ตั้งค่า RefundHalt ได้ในเวลาพอ ๆ กับการอ่านอีเมลฝ่ายช่วยเหลืออีกฉบับเกี่ยวกับการคืนเงินที่คุณไม่มีโอกาสโต้แย้ง