ขอคืนเงิน App Store: สิ่งที่นักพัฒนาเห็น
โดย Mehdi Azizi
เผยแพร่เมื่อ , 8 นาที
Apple เป็นผู้ตัดสินการคืนเงินเพียงผู้เดียว นักพัฒนาได้รับ CONSUMPTION_REQUEST ตอบได้ภายใน 12 ชั่วโมง แล้วรู้ผลผ่าน REFUND
บน App Store Apple เป็นผู้อนุมัติหรือปฏิเสธการคืนเงิน ไม่ใช่นักพัฒนาเลย ลูกค้าส่งคำขอผ่านเว็บไซต์ของ Apple หรือจากในแอปของคุณ ถ้าคุณเชื่อมต่อการแจ้งเตือนเซิร์ฟเวอร์ของ Apple ไว้ คุณจะได้รับการแจ้งเตือน CONSUMPTION_REQUEST ตอนที่มีคำขอ แล้วได้ REFUND หรือ REFUND_DECLINED เมื่อมีการตัดสิน ระหว่างนั้นคุณมีเวลา 12 ชั่วโมงในการส่งข้อมูลการใช้งานและความต้องการของคุณ โดยมีเงื่อนไขว่าลูกค้าต้องให้ความยินยอมแล้ว
การคืนเงินที่ได้รับอนุมัติจะถอดรายการซื้อออกจากสิทธิ์ที่ใช้งานอยู่ของลูกค้า และแสดงเป็นค่าติดลบในรายงานยอดขายของคุณ คู่มือนี้อธิบายทีละขั้นตอน ว่าคุณส่งอะไรให้ Apple ได้บ้าง และคุณทำอะไรได้บ้างกับคำขอที่ไม่สุจริต กฎทั้งหมดมาจากหน้าเอกสารของ Apple ที่ผมอ่านทวนเมื่อวันที่ 3 พฤศจิกายน 2026 ส่วนกรณีจริงมาจากระบบแจ้งเตือนที่ผมติดตั้งไว้กับแอปของผมในเดือนตุลาคม
ใครเป็นผู้ตัดสินการคืนเงินบน App Store?
Apple และมีแค่ Apple เท่านั้น หน้าช่วยเหลือของ Apple อธิบายขั้นตอนของลูกค้าไว้ว่า ลูกค้าเข้าสู่ระบบที่ reportaproblem.apple.com เลือก "Request a refund" ระบุเหตุผล แล้วเลือกรายการซื้อที่เกี่ยวข้อง Apple แนะนำให้รอคำตอบ 24 ถึง 48 ชั่วโมง
ลูกค้ายังขอคืนเงินจากในแอปของคุณได้ด้วย StoreKit มี หน้าต่างคำขอ สำหรับเรื่องนี้ ใช้ได้ตั้งแต่ iOS 15 Apple แนะนำให้เรียกใช้จากหน้าตั้งค่าบัญชีหรือเมนูช่วยเหลือ หน้าต่างนี้จะแสดงรายการซื้อและรายการเหตุผลให้เลือก และ Apple ใช้เวลาตัดสินไม่เกิน 48 ชั่วโมง
ไม่ว่าทางไหน คุณก็ไม่ต้องอนุมัติอะไรเลย คุณทำได้แค่ให้ข้อมูลและบอกความต้องการ ซึ่งเป็นหนึ่งในหลายเกณฑ์ที่ Apple ใช้ตัดสิน
แต่ละฝ่ายเห็นอะไร ทีละขั้นตอน
| ขั้นตอน | ฝั่งลูกค้า | ฝั่งนักพัฒนา |
|---|---|---|
| คำขอ | แบบฟอร์มของ Apple หรือหน้าต่างในแอป | การแจ้งเตือน CONSUMPTION_REQUEST |
| ภายใน 12 ชั่วโมง | รอ | ส่งข้อมูลการใช้งานได้ |
| ภายใน 48 ชั่วโมง | ได้รับคำตอบจาก Apple | การแจ้งเตือน REFUND หรือ REFUND_DECLINED |
| หลังอนุมัติ | ได้เงินคืนเข้าช่องทางชำระเงินเดิม | รายการซื้อถูกถอดออกจากสิทธิ์ที่ใช้งานอยู่ หน่วยติดลบ |
| หลังมีการโต้แย้ง | Apple ยกเลิกการคืนเงิน | การแจ้งเตือน REFUND_REVERSED ต้องคืนสิทธิ์การเข้าถึง |
App Store Connect แสดงเฉพาะการคืนเงินที่อนุมัติแล้ว ในหน้า Sales and Trends ส่วนตัวคำขอจะมาทางการแจ้งเตือนเซิร์ฟเวอร์เท่านั้น ถ้าไม่มีการแจ้งเตือน คุณจะรู้เรื่องการคืนเงินก็ต่อเมื่อมันเกิดขึ้นไปแล้ว
การแจ้งเตือนเซิร์ฟเวอร์เกี่ยวกับการคืนเงิน
App Store Server Notifications V2 ส่งการแจ้งเตือนห้าประเภทที่เกี่ยวข้องกับเรื่องนี้ คุณจะได้รับที่ที่อยู่ HTTPS ที่ลงทะเบียนไว้ใน App Store Connect หนึ่งที่อยู่สำหรับ production และอีกหนึ่งสำหรับ sandbox
| การแจ้งเตือน | สิ่งที่บอก | สิ่งที่คุณต้องทำ |
|---|---|---|
CONSUMPTION_REQUEST | ลูกค้าขอคืนเงิน | ตอบภายใน 12 ชั่วโมง หากได้รับความยินยอม |
REFUND | Apple คืนเงินสำหรับธุรกรรมแล้ว | ถอดเนื้อหาหรือสิทธิ์ที่ถูกคืนเงินออก |
REFUND_DECLINED | Apple ปฏิเสธคำขอ | ไม่ต้องทำอะไร สิทธิ์ยังใช้ได้ต่อ |
REFUND_REVERSED | Apple ยกเลิกการคืนเงินหลังลูกค้าโต้แย้ง | คืนสิ่งที่คุณถอดออกไป |
REVOKE | รายการซื้อที่แชร์ผ่าน Family Sharing ใช้ไม่ได้อีกต่อไป | ถอดสิทธิ์ของสมาชิกในครอบครัว |
เซิร์ฟเวอร์ของคุณต้องตอบกลับด้วยรหัส HTTP ระหว่าง 200 ถึง 206 ตาม หน้าเรื่องการตอบกลับการแจ้งเตือน ถ้าไม่เช่นนั้น Apple จะลองส่งใหม่ห้าครั้ง ที่ 1, 12, 24, 48 และ 72 ชั่วโมงหลังความพยายามครั้งก่อน ใน sandbox จะส่งแค่ครั้งเดียว
Consumption API: สิ่งที่คุณบอก Apple ได้
เมื่อคำขอเข้ามา คุณตอบกลับได้ด้วย Send Consumption Information กฎสรุปได้ในประโยคเดียวของ Apple: "Respond within 12 hours of receiving the CONSUMPTION_REQUEST notification." API เวอร์ชัน 2 ใช้ได้กับสินค้าทุกประเภท รวมถึงการสมัครสมาชิก
ฟิลด์ของ คำขอ:
| ฟิลด์ | จำเป็น | สิ่งที่บอก Apple |
|---|---|---|
customerConsented | ใช่ | ลูกค้ายินยอมให้แชร์ข้อมูลของตน |
deliveryStatus | ใช่ | รายการซื้อส่งมอบแล้วและใช้งานได้ หรือเหตุผลที่ส่งมอบไม่ได้ |
sampleContentProvided | ใช่ | มีการให้ทดลองใช้ ตัวอย่าง หรือคำอธิบายก่อนซื้อ |
consumptionPercentage | ไม่ | สัดส่วนที่ใช้ไป จาก 0 ถึง 100 000 สำหรับ 0 ถึง 100 % |
refundPreference | ไม่ | ความต้องการของคุณ: DECLINE, GRANT_FULL หรือ GRANT_PRORATED |
มีสองข้อที่สำคัญ ถ้า deliveryStatus ไม่ใช่ DELIVERED สัดส่วนที่ใช้ไปต้องเป็นศูนย์ และสำหรับการคืนเงินตามสัดส่วนของการสมัครสมาชิก คุณไม่ต้องใส่สัดส่วนที่ใช้ไป เพราะ Apple คำนวณเอง
ความยินยอมคือเงื่อนไขของทุกอย่าง Apple เขียนไว้ว่า: "You must obtain valid consent from the customer before sharing their personal data with Apple in the Send Consumption Information API." ถ้าไม่มีความยินยอม คุณห้ามตอบ Apple ยังห้ามใช้หน้าต่างขออนุญาตติดตามเพื่อโฆษณาในการขอความยินยอมนี้ด้วย: "Don't use the AppTrackingTransparency prompt to obtain consent"
ถ้าคุณใช้ RevenueCat
ถ้าใช้ RevenueCat ตัว RevenueCat จะเป็นผู้รับการแจ้งเตือนจาก Apple และตอบคำขอให้ ผ่าน Refund Control คุณเลือกนโยบายได้หนึ่งในสี่แบบ: เน้นคืนเงินเต็มจำนวน เน้นปฏิเสธ ส่งแค่ข้อมูลการใช้งาน หรือไม่ตอบเลย
การเปิดแชร์ข้อมูลเท่ากับการยืนยันว่าคุณได้รับความยินยอมจากลูกค้าแล้ว RevenueCat บอกไว้เองว่า: "Enabling consumption data sharing confirms that you obtained consent from your Customers." และยังแนะนำให้ใช้ "Prefer no refund" กับกลุ่มเป้าหมายเฉพาะ และจะเตือนเมื่อความต้องการนี้ครอบคลุมลูกค้าส่วนใหญ่ของคุณ
ถ้าอยากให้การแจ้งเตือนส่งมาที่เซิร์ฟเวอร์ของคุณเองด้วย RevenueCat มีฟิลด์ "Apple Server Notification Forwarding URL" ในการตั้งค่าแอป อธิบายไว้ใน หน้าเรื่องการแจ้งเตือนของ Apple ผมใช้วิธีนี้อยู่ วิธีตั้งค่าการสมัครสมาชิกด้วย RevenueCat อยู่ใน RevenueCat และการสมัครสมาชิกในแอป iOS
ผลต่อรายได้และการสมัครสมาชิกของคุณ
ด้านสิทธิ์การเข้าถึง ตาม เอกสารของ currentEntitlements ระบุว่า "Products that the App Store has refunded or revoked don't appear in the current entitlements" ถ้าแอปของคุณตรวจสิทธิ์ด้วย currentEntitlements สิทธิ์ที่ถูกคืนเงินจะหายไปเอง ธุรกรรมจะเก็บวันที่และเหตุผลของการถอนสิทธิ์ไว้ใน revocationDate และ revocationReason
ด้านรายงาน ตาม หน้าช่วยเหลือรายงานยอดขาย การคืนเงินจะแสดงเป็นหน่วยและราคาลูกค้าติดลบ สำหรับการสมัครสมาชิก หน้าเรื่องข้อมูลการสมัครสมาชิก นับการคืนเงินทั้งเต็มจำนวนและบางส่วนเป็นเหตุการณ์ และหักออกจากหน่วยรายวัน
ด้านชื่อเสียง guideline 5.6.4 ระบุว่าคำขอคืนเงินที่มากเกินไปเป็นสัญญาณหนึ่งของคุณภาพที่ไม่เพียงพอ อัตราการคืนเงินที่สูงไม่ได้แค่ทำให้เสียเงิน แต่ Apple อาจนำไปพิจารณาว่าคุณปฏิบัติตามจรรยาบรรณหรือไม่
กรณีของผม: ระบบแจ้งเตือนที่ติดตั้งกับแอปของผม
วันที่ 12 ตุลาคม 2026 ผมติดตั้งระบบแจ้งเตือนกับแอปของผม RevenueCat ส่งต่อการแจ้งเตือนของ Apple ไปยัง route หนึ่งบน devoria.fr ซึ่งจะตรวจลายเซ็นของ Apple แล้วส่งการแจ้งเตือนมาหาผม โดยไม่มียอดเงิน ผมอยากเห็นคำขอตอนที่มันเข้ามา ไม่ใช่แค่ผลลัพธ์
วันที่ 18 ตุลาคม คำขอจริงครั้งแรกเข้ามาที่ TradaZen แอปจำลองการเทรดของผม เป็นการสมัครสมาชิกรายปี ที่ถูกเรียกเก็บเงินหลังทดลองใช้ฟรี 7 วัน เหตุผลที่ระบุ: ซื้อโดยไม่ได้ตั้งใจ ได้บทเรียนสามข้อ:
- คำขอเดียวกันอาจเข้ามาหลายครั้ง ผมได้รับการแจ้งเตือนเดียวกันสามครั้งในคืนเดียว ตั้งแต่นั้นมา การแจ้งเตือนทุกรายการจะถูกกรองซ้ำตามประเภทการแจ้งเตือนและรหัสธุรกรรม
- การตัดสินมาถึงภายในไม่ถึงหนึ่งวัน Apple ปฏิเสธประมาณ 22 ชั่วโมงหลังคำขอ ลูกค้ายังคงมีสิทธิ์ใช้งาน
- การถูกปฏิเสธไม่ใช่จุดจบ ลูกค้าคนเดิมส่งคำขอใหม่อีกครั้งสองวันต่อมา สำหรับธุรกรรมเดียวกัน
คำขอแบบ "ซื้อโดยไม่ได้ตั้งใจ" หลังหมดช่วงทดลองใช้ ไม่ได้ชนะกันที่การตอบ Apple แต่ต้องป้องกันตั้งแต่ที่ paywall ก่อนการชำระเงินครั้งแรก
ลดคำขอที่ไม่สุจริตโดยไม่ผิดกฎ
สิ่งที่ทำได้:
- ตอบทุกคำขอด้วยข้อมูลที่ถูกต้อง เมื่อลูกค้าให้ความยินยอมแล้ว
- แสดงความต้องการแบบเจาะจง เช่น ปฏิเสธสำหรับรายการซื้อที่ใช้ไปแล้ว แทนที่จะปฏิเสธทุกคน
- ผูก
REFUNDแต่ละรายการกับบัญชีลูกค้า หน้าของ Apple เรื่องการแจ้งเตือนการคืนเงิน แนะนำวิธีนี้เพื่อตรวจจับการคืนเงินซ้ำๆ - บอกให้ชัดว่าซื้ออะไรก่อนซื้อ guideline 3.1.2(c) กำหนดให้อธิบายว่าผู้ใช้จะได้อะไรในราคานั้น ก่อนเสนอให้สมัครสมาชิก
สิ่งที่ห้ามทำ:
- ส่งข้อมูลเท็จ เพื่อให้คำขอถูกปฏิเสธ หรือตอบโดยไม่มีความยินยอม
- ขอความยินยอมผ่านหน้าต่างขออนุญาตติดตามเพื่อโฆษณา ซึ่ง Apple ห้ามไว้อย่างชัดเจน
- หลอกให้ซื้อ guideline 5.6 ห้ามผลักดันลูกค้าให้ซื้อสิ่งที่ไม่ต้องการ หรือเรียกเก็บเงินสำหรับสิ่งที่ไม่ได้ส่งมอบ
- กดดันลูกค้า ที่ขอคืนเงิน กฎเดียวกันนี้กำหนดให้บริการลูกค้าด้วยความเคารพ ไม่ข่มขู่
ตัวช่วยที่ดีที่สุดยังคงอยู่ที่ต้นทาง: paywall ที่บอกราคา วันที่เรียกเก็บเงินครั้งแรก และวิธียกเลิก ข้อผิดพลาดที่ควรหลีกเลี่ยงอยู่ใน ข้อผิดพลาดของ paywall และกฎของช่วงทดลองใช้อยู่ใน การทดลองใช้ฟรีบน App Store
ทดสอบก่อนขึ้น production
ตาม หน้าเรื่องการทดสอบคำขอ ทั้ง sandbox และการทดสอบ StoreKit ใน Xcode รองรับคำขอคืนเงิน ใน sandbox ไม่ว่าเลือกเหตุผลอะไรก็จะได้รับการอนุมัติอัตโนมัติ ถ้าจะจำลองการปฏิเสธ ให้เลือก "Other" แล้วพิมพ์ DECLINE ถ้าจะจำลองการคืนเงินตามสัดส่วน ให้พิมพ์ GRANT_PRORATED ใน sandbox คำตอบข้อมูลการใช้งานของคุณต้องส่งออกไปภายในห้านาที
การสมัครสมาชิกที่ถูกขอคืนเงินน้อยลง
iOS & Android Kit เริ่มจากโค้ดของแอปผม พร้อม onboarding, paywall และการสมัครสมาชิกที่เขียนไว้แล้ว และพาคุณผ่านสี่ขั้นตอนจนถึง App Store ตามจังหวะของคุณ วิธีตั้งค่าแบบครบถ้วนอยู่ในหน้า การสมัครสมาชิกในแอป iOS และกฎของ Apple เรื่องการสมัครสมาชิกอยู่ใน guideline 3.1.2
ก่อนเปิดใช้ paywall ทำแบบประเมินฟรี ซึ่งจะบอกคุณว่าอะไรที่ขวางโปรเจกต์ของคุณอยู่จริงๆ และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้คุณ
คำถามที่พบบ่อย
นักพัฒนาปฏิเสธการคืนเงินบน App Store ได้ไหม?
ไม่ได้ Apple ตัดสินเพียงผู้เดียว คุณส่งข้อมูลการใช้งานและความต้องการได้ เช่น DECLINE ซึ่งเป็นหนึ่งในหลายเกณฑ์ Apple เป็นผู้ตัดสินขั้นสุดท้าย
นักพัฒนาได้รับแจ้งเมื่อมีคำขอคืนเงินไหม?
ได้ ถ้าเชื่อมต่อ App Store Server Notifications V2 ไว้ Apple จะส่ง CONSUMPTION_REQUEST ตอนที่มีคำขอ แล้วส่ง REFUND หรือ REFUND_DECLINED เมื่อตัดสิน ถ้าไม่มีการแจ้งเตือน คุณจะเห็นเฉพาะการคืนเงินที่อนุมัติแล้วในรายงาน
Apple ใช้เวลาพิจารณาคำขอคืนเงินนานแค่ไหน?
Apple แจ้งลูกค้าว่า 24 ถึง 48 ชั่วโมง เอกสารของ StoreKit ระบุว่าไม่เกิน 48 ชั่วโมง ส่วนคุณมีเวลา 12 ชั่วโมงในการส่งข้อมูลการใช้งาน
หลังคืนเงินแล้ว สิทธิ์การเข้าถึงจะเป็นอย่างไร?
รายการซื้อที่ถูกคืนเงินจะออกจากสิทธิ์ที่ใช้งานอยู่ของลูกค้า: StoreKit 2 จะไม่ส่งกลับมาใน currentEntitlements อีก ถ้าภายหลัง Apple ยกเลิกการคืนเงิน คุณจะได้รับ REFUND_REVERSED และต้องคืนสิทธิ์การเข้าถึงให้
ต้องได้รับความยินยอมจากลูกค้าก่อนตอบ Apple ไหม?
ต้อง Apple กำหนดให้มีความยินยอมที่ถูกต้องก่อนแชร์ข้อมูลใดๆ ผ่าน Consumption API ถ้าไม่มี คุณห้ามตอบการแจ้งเตือน และห้ามใช้หน้าต่างขออนุญาตติดตามเพื่อโฆษณาในการขอความยินยอม
การคืนเงินส่งผลเสียต่อแอปของผมไหม?
อาจส่งผล guideline 5.6.4 ระบุว่าคำขอคืนเงินที่มากเกินไปเป็นสัญญาณหนึ่งของคุณภาพที่ไม่เพียงพอ ซึ่ง Apple อาจนำไปพิจารณาว่าคุณปฏิบัติตามจรรยาบรรณหรือไม่

