การคืนเงินผ่าน Advanced Commerce API คือช่องทางเดียวที่นักพัฒนา iOS เริ่มคืนเงินได้เอง และ Apple ยังเป็นผู้ตัดสินขั้นสุดท้าย
นักพัฒนา iOS ส่วนใหญ่คืนเงินให้ลูกค้าไม่ได้ แอปที่ใช้ Advanced Commerce API ของ Apple ขอคืนเงิน เพิกถอนการสมัครสมาชิก หรือคืนเงินตามจำนวนที่กำหนดเองได้ บทความนี้อธิบายว่าแต่ละ endpoint ทำงานอย่างไร Apple ยังปฏิเสธอะไรได้บ้าง และเงินรั่วไหลตรงไหน

ประเด็นสำคัญ
- วิศวกรของ Apple ระบุเมื่อเดือนมิถุนายน 2026 ว่านักพัฒนาไม่สามารถออกเงินคืนโดยตรงสำหรับการซื้อใน App Store ทั่วไป สิ่งเดียวที่นักพัฒนาส่งได้คือข้อมูลการใช้งานและ refundPreference ที่ตอบกลับ CONSUMPTION_REQUEST
- แอปที่ได้รับอนุมัติให้ใช้ Advanced Commerce API ของ Apple จะได้ endpoint Request Transaction Refund สำหรับขอให้ App Store คืนเงินค่าซื้อครั้งเดียวหรือธุรกรรมการสมัครสมาชิก พร้อม endpoint Revoke Subscription และ Cancel a Subscription
- การเรียก endpoint คืนเงิน เพิกถอน และยกเลิกของ Advanced Commerce API นั้น Account Holder ของนักพัฒนาต้องลงนามใน Advanced Commerce API Addendum และ Apple ระบุว่าการเรียกจะคืนค่า error หากยังไม่ได้ยอมรับฉบับล่าสุด
- endpoint Request Transaction Refund รับ refundType เป็น FULL, PRORATED หรือ CUSTOM และใส่ refundAmount เป็นหน่วยหนึ่งในพันของสกุลเงินได้เฉพาะเมื่อใช้ CUSTOM เท่านั้น Apple ระบุว่าจำนวนเงินต้องรวมภาษีในทุกภูมิภาค ยกเว้นแคนาดาและสหรัฐอเมริกา
- ฟิลด์ refundRiskingPreference ของ Apple มีค่าเริ่มต้นเป็น true ซึ่งทำให้ App Store ส่ง CONSUMPTION_REQUEST เกี่ยวกับคำขอคืนเงินของนักพัฒนาเองได้ Apple ขอให้ตอบกลับภายใน 12 ชั่วโมง
- endpoint คืนเงิน เพิกถอน และยกเลิกของ Advanced Commerce API จำกัดที่ 5 คำขอต่อวินาทีต่อแอปในระบบ production ส่วน sandbox ได้ 10 เปอร์เซ็นต์ของค่านั้น
- หลังเรียก Revoke Subscription สำเร็จ Apple จะส่งการแจ้งเตือน REFUND และให้นักพัฒนายุติบริการ ณ revocationDate ในการแจ้งเตือนนั้น ไม่ใช่ก่อนที่การแจ้งเตือนจะมาถึง
นักพัฒนา iOS ทั่วไปคืนเงินให้ลูกค้าไม่ได้ เมื่อเดือนมิถุนายน 2026 App Store Commerce Engineer คนหนึ่งตอบคำถามในฟอรัมนักพัฒนาด้วยประโยคเดียว ว่าในขณะนี้นักพัฒนาไม่สามารถออกเงินคืนได้โดยตรง มีข้อยกเว้นอยู่หนึ่งข้อ และอยู่ใน Advanced Commerce API แอปที่ Apple อนุมัติให้ใช้ API นี้ส่งคำขอคืนเงินผ่าน Advanced Commerce API เพิกถอนการสมัครสมาชิกพร้อมคืนเงิน หรือขอคืนเงินตามจำนวนที่กำหนดเองได้ แต่ Apple ยังเป็นผู้ตัดสินว่าเงินจะถูกโอนหรือไม่
Advanced Commerce API คืออะไร และใครใช้ได้
Apple เปิดตัว Advanced Commerce API เมื่อวันที่ 23 มกราคม 2025 API นี้รองรับ In-App Purchase ของ Apple สำหรับแคตตาล็อกขนาดใหญ่มากที่มีสินค้าซื้อครั้งเดียวแบบกำหนดเอง การสมัครสมาชิก และการสมัครสมาชิกที่มี add-on เสริม คุณไม่ต้องสร้างสินค้าทุกรายการใน App Store Connect คุณกำหนด SKU บนเซิร์ฟเวอร์ของคุณเองแล้วส่งให้ Apple ตอนที่มีการซื้อ
สิทธิ์การเข้าถึงอนุมัติเป็นรายแอป คุณกรอกแบบฟอร์มคำขอ และหน้าคุณสมบัติของ Apple ระบุโมเดลธุรกิจสามแบบที่ต้องเป็นแกนหลักของแอป:
- แคตตาล็อกขนาดใหญ่มากของสินค้าซื้อครั้งเดียว เช่น หนังสือเสียง คลาสเรียน คอร์ส หรือ mini app
- แคตตาล็อกขนาดใหญ่มากของเนื้อหาแบบสมัครสมาชิก โดยข้อเสนอของครีเอเตอร์แต่ละรายเป็นการสมัครสมาชิกแยกกัน
- การสมัครสมาชิกที่มี add-on เสริมซึ่งต่ออายุพร้อมกันเป็นการซื้อครั้งเดียว เช่น ช่องพรีเมียมหรือกีฬา
Apple ยังให้แอปสมัครได้เมื่อโปรแกรมอื่นกำหนดให้ต้องใช้ API นี้ Mini Apps Partner Program ซึ่งจ่ายให้สมาชิก 85% ของยอดขาย In-App Purchase ที่เข้าเกณฑ์ใน mini app ที่โฮสต์ไว้ กำหนดให้ต้องใช้
endpoint คืนเงินมาทีหลัง และต้องมีการลงนาม
เวอร์ชัน 1.1 ลงวันที่ 24 มีนาคม 2025 เพิ่ม Request Transaction Refund และ Revoke Subscription หน้าโปรแกรมของ Apple ระบุว่าแอปที่มีเนื้อหาแบบสมัครสมาชิกอาจมีสิทธิ์ใช้ API Cancel, Revoke และ Refund เพื่อจัดการการยกเลิก ตรวจสอบเนื้อหาหลังการซื้อ และบริหารแคตตาล็อกด้วย หน้าของทุก endpoint มีเงื่อนไขเดียวกัน คือ Account Holder ของคุณต้องลงนามใน Advanced Commerce API Addendum และหากยังไม่ได้ยอมรับฉบับล่าสุด การเรียกจะคืนค่า error ตัว Addendum ไม่ใช่เอกสารประกอบ เป็นผู้ระบุกรณีการใช้งานของแต่ละ endpoint
เทียบสาม endpoint แบบเคียงกัน
| Cancel a Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| พาธ | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| ครอบคลุม | การสมัครสมาชิกแบบต่ออายุอัตโนมัติ | การสมัครสมาชิกหนึ่งรายการและทุกไอเท็มในนั้น | ค่าซื้อครั้งเดียวและธุรกรรมการสมัครสมาชิก |
| เงินคืน | ไม่มี | FULL หรือ PRORATED | FULL, PRORATED หรือ CUSTOM ราย SKU |
| สิทธิ์เข้าถึง | ใช้ต่อได้จนจบรอบ | สิ้นสุดที่ revocationDate | กำหนดรายไอเท็มด้วยแฟล็ก revoke |
| ขีดจำกัดอัตราใน production | 5 ต่อวินาที | 5 ต่อวินาที | 5 ต่อวินาที |
Cancel a Subscription หยุดการเรียกเก็บครั้งถัดไป
Cancel ปิดการต่ออายุอัตโนมัติ Apple ระบุว่าลูกค้ายังเข้าถึงได้จนจบรอบปัจจุบัน ไม่มีการคืนเงินใดๆ เป็นทางเลือกที่ถูกเมื่อลูกค้าต้องการเลิก และได้ใช้เวลาที่จ่ายไปแล้วครบ
Revoke Subscription ยุติทุกอย่างทันที
Revoke ตั้งค่าการต่ออายุอัตโนมัติเป็น false และเพิกถอนการสมัครสมาชิกพร้อมคืนเงินเต็มจำนวนหรือตามสัดส่วน body รับ refundReason, refundRiskingPreference, refundType และ requestInfo จากนั้น Apple จะส่งการแจ้งเตือน REFUND ไปยัง endpoint App Store Server Notifications V2 ของคุณ คำสั่งของ Apple ชัดเจน คือให้ปิดบริการ ณ revocationDate ในการแจ้งเตือนนั้น และอย่าปิดก่อนที่การแจ้งเตือนจะมาถึง
Request Transaction Refund ทำงานทีละไอเท็ม
นี่คือเครื่องมือที่แม่นยำ คุณส่งรายการไอเท็ม แต่ละรายการระบุ SKU, refundReason, refundType และแฟล็ก revoke ถ้าใช้ CUSTOM คุณต้องส่ง refundAmount เป็นหน่วยหนึ่งในพันของสกุลเงินด้วย ดังนั้น 4990 หมายถึง 4.99 ถ้าส่งจำนวนเงินมาพร้อม FULL หรือ PRORATED Apple จะปฏิเสธด้วย error 4000155 response จะมีธุรกรรมที่ลงนามแล้ว และสำหรับการสมัครสมาชิก จะมีข้อมูลการต่ออายุที่ลงนามแล้วด้วย
Apple รับค่า refundReason ดังนี้ UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER และ MODIFY_ITEMS_REFUND ค่าที่เจ็ดคือ SIMULATE_REFUND_DECLINE ใช้ทดสอบใน sandbox และ TestFlight เท่านั้น และที่มีค่านี้ก็เพราะ App Store ปฏิเสธได้
Apple ยังปฏิเสธคำขอคืนเงินของคุณเองได้
ชื่อ endpoint บอกตรงๆ ว่านี่คือคำขอ มีสองฟิลด์ที่แสดงว่าอำนาจตัดสินจริงอยู่ที่ใคร
refundRiskingPreference เปิดทางให้ตรวจสอบการใช้งาน
Apple อธิบาย refundRiskingPreference ว่าเป็นตัวกำหนดว่า App Store จะขอข้อมูลการใช้งานจากคุณเพื่อประกอบการตัดสินใจคืนเงินหรือไม่ ค่าเริ่มต้นคือ true เมื่อเป็น true คุณจะได้รับ CONSUMPTION_REQUEST สำหรับคำขอคืนเงินของคุณเอง และตอบผ่าน Send Consumption Information Apple ขอให้นักพัฒนาตอบภายใน 12 ชั่วโมงหลังได้รับ CONSUMPTION_REQUEST ถ้าตั้งเป็น false การแจ้งเตือนนั้นจะไม่มา
error ที่บอกว่าไม่ผ่าน
| Error | รหัส | Apple ระบุว่า |
|---|---|---|
| AlreadyRefundedError | 4030021 | ธุรกรรมนี้คืนเงินไปแล้ว |
| PendingRefundError | 4000181 | ธุรกรรมนี้มีการคืนเงินที่รอดำเนินการ |
| TransactionNotRefundableError | 4030024 | ธุรกรรมนี้คืนเงินไม่ได้ |
| TransactionCannotBeRefundedContactSupportError | 4030025 | ลูกค้าติดต่อ Apple Support ได้ |
| RefundAmountWithoutCustomError | 4000155 | ส่งจำนวนเงินมาโดยไม่มี CUSTOM |
PendingRefundError คือตัวที่ต้องเตรียมรับมือ สาเหตุที่น่าจะเป็นคือลูกค้าขอกับ Apple ผ่าน Report a Problem ไปก่อนที่ทีมซัพพอร์ตของคุณจะลงมือ กฎคุณสมบัติของ Apple ยังกำหนดให้แอปเหล่านี้ต้องมีช่องทางขอคืนเงินในแอปอยู่ดี จะเป็นลิงก์ Report a Problem หรือ API beginRefundRequest ก็ได้ ประตูทั้งสองบานจึงเปิดอยู่พร้อมกัน

การคืนเงินผ่าน Advanced Commerce API ทำให้คุณเสียเงินเท่าไร
การคืนเงินเองดูเหมือนถูกกว่าการสู้ข้อพิพาท แต่ก็ยังเป็นเงินที่ไหลออก และ API นี้ทำให้ความผิดพลาดบางอย่างเกิดซ้ำได้ง่ายในระดับใหญ่
ภาษีที่อยู่ในจำนวนเงินกำหนดเอง
Apple ระบุว่า refundAmount ที่ขอต้องรวมภาษีในทุกภูมิภาค ยกเว้นแคนาดาและสหรัฐอเมริกา ทีมที่คำนวณเงินคืนแบบ CUSTOM จากราคา SKU ก่อนภาษีจะคืนเงินให้ลูกค้าขาดในทุก storefront อื่น แล้วต้องเสียเวลาซัพพอร์ตแก้ไขทีละราย
ต้นทุนที่ไม่ได้กลับคืน
- ส่วนแบ่งที่จ่ายออกไป: ในแคตตาล็อกของครีเอเตอร์หรือแพลตฟอร์มที่โฮสต์ mini app ส่วนแบ่งของครีเอเตอร์มักจ่ายตอนขาย การคืนเงินให้ลูกค้าไม่ได้ดึงเงินนั้นกลับมา
- ค่าลิขสิทธิ์เนื้อหา: ค่าธรรมเนียมรายเรื่องที่ต้องจ่ายให้เจ้าของสิทธิ์สำหรับหนังสือเสียงหรือคอร์ส อาจเกิดขึ้นเมื่อมีการเข้าถึง ขึ้นอยู่กับสัญญาของคุณ และการคืนเงินไม่ได้ยกเลิกค่าธรรมเนียมนั้น
- ค่าประมวลผล: การสตรีม การแปลงไฟล์ และงานฝั่งเซิร์ฟเวอร์ใดๆ ที่ทำให้การซื้อนั้น อยู่ในบิลของคุณไปแล้ว
- การเรียก API: บริการภายนอกที่คิดเงินตามคำขอ ตั้งแต่เสียงพูดจนถึงการอนุมานโมเดล ยังถูกเรียกเก็บเงินหลังการคืนเงิน
คืนเต็มจำนวนทั้งที่ตั้งใจคืนแค่ไอเท็มเดียว
Revoke Subscription คืนเงินและยุติการสมัครสมาชิกทั้งหมด รวมถึง add-on ถ้าลูกค้าโต้แย้งแค่ add-on เดียว Request Transaction Refund ให้คุณคืนเงินเฉพาะ SKU นั้น โดยตั้ง revoke ไว้แค่ไอเท็มนั้น การเรียก Revoke Subscription เพราะคำร้องเรียนเรื่องไอเท็มเดียวจะคืนรายได้ของแพ็กเกจหลักไปด้วย
เช็กลิสต์ก่อนเปิดใช้งานฟีเจอร์เหล่านี้
- ยืนยันว่า Account Holder ของคุณยอมรับ Advanced Commerce API Addendum ฉบับปัจจุบันแล้ว และตั้งการแจ้งเตือนสำหรับ error ที่กลับมาเมื่อหมดอายุ
- สร้าง UUID requestReferenceId ใหม่สำหรับทุกคำขอ และใช้ค่าเดิมซ้ำเฉพาะเมื่อลองเรียกใหม่หลังหมดเวลารอ
- จัดคิวการเรียกคืนเงิน ขีดจำกัดคือ 5 ต่อวินาทีต่อแอป และ response 429 จะมี header Retry-After เป็นมิลลิวินาทีแบบ UNIX
- ทดสอบการถูกปฏิเสธใน sandbox ด้วย SIMULATE_REFUND_DECLINE และจำไว้ว่าขีดจำกัดของ sandbox คือ 10 เปอร์เซ็นต์ของ production
- ตัดสินใจเรื่อง refundRiskingPreference เป็นรายกรณี และเตรียมตัวตอบข้อมูลการใช้งานให้พร้อมสำหรับกรอบเวลา 12 ชั่วโมงเมื่อยังเป็น true
- ยุติสิทธิ์เข้าถึงเฉพาะเมื่อการแจ้งเตือน REFUND มาถึง โดยนับ ณ revocationDate ในการแจ้งเตือนนั้น
- บันทึกเหตุผล จำนวนเงิน และ SKU ของทุกคำขอ เพื่อให้คุณเห็นอัตราการคืนเงินของตัวเองก่อนที่ Apple จะเห็น
คำถามที่พบบ่อย
- นักพัฒนา iOS คืนเงินให้ลูกค้าโดยตรงได้ไหม
- ไม่ได้ สำหรับการซื้อใน App Store ทั่วไป วิศวกรของ Apple ระบุเมื่อเดือนมิถุนายน 2026 ว่านักพัฒนาไม่สามารถออกเงินคืนได้โดยตรง แอปที่ได้รับอนุมัติให้ใช้ Advanced Commerce API และลงนามใน Addendum แล้ว ขอคืนเงินได้ผ่าน endpoint Request Transaction Refund และ Apple ยังเป็นผู้ตัดสิน
- Cancel กับ Revoke ใน Advanced Commerce API ต่างกันอย่างไร
- Cancel ปิดการต่ออายุอัตโนมัติ และลูกค้ายังเข้าถึงได้จนจบรอบ โดยไม่มีการคืนเงิน Revoke ยุติการสมัครสมาชิกและทุกไอเท็มในนั้นทันที และคืนเงินเต็มจำนวนหรือตามสัดส่วน Apple จะส่งการแจ้งเตือน REFUND หลังการเพิกถอน
- คืนเงินตามจำนวนที่กำหนดเองด้วย Advanced Commerce API ได้ไหม
- ได้ ตั้ง refundType เป็น CUSTOM และส่ง refundAmount เป็นหน่วยหนึ่งในพันของสกุลเงิน Apple ระบุว่าจำนวนเงินต้องรวมภาษีในทุกภูมิภาค ยกเว้นแคนาดาและสหรัฐอเมริกา และการส่งจำนวนเงินพร้อม FULL หรือ PRORATED จะได้ error 4000155
- ฉันจะได้รับ CONSUMPTION_REQUEST สำหรับเงินคืนที่ฉันขอเองหรือไม่
- อาจได้รับ refundRiskingPreference มีค่าเริ่มต้นเป็น true ซึ่งทำให้ App Store ขอข้อมูลการใช้งานจากคุณผ่าน CONSUMPTION_REQUEST ได้ และ Apple ขอให้ตอบภายใน 12 ชั่วโมง ถ้าตั้งเป็น false Apple ระบุว่าจะไม่ส่งการแจ้งเตือนนั้น
- ทำไมคำขอคืนเงินผ่าน Advanced Commerce API ของฉันจึงล้มเหลว
- ดูที่รหัส error 4030021 หมายถึงธุรกรรมคืนเงินไปแล้ว 4000181 หมายถึงมีการคืนเงินที่รอดำเนินการอยู่ 4030024 หมายถึงคืนเงินไม่ได้ และ 4030025 หมายถึงลูกค้าควรติดต่อ Apple Support Addendum ที่ยังไม่ได้ลงนามหรือล้าสมัยก็ทำให้ได้ error เช่นกัน
แหล่งข้อมูลและเนื้อหาเพิ่มเติม
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
RefundHalt
ระบบอัตโนมัติสำหรับการคืนเงินบน App Store และ Google Play
อ่านต่อ
คำขอคืนเงินที่มากเกินไปอาจทำให้คุณเสียมากกว่ายอดคืนเงิน เพราะทั้งสองสโตร์มองว่าเป็นสัญญาณด้านคุณภาพ
แนวทาง 5.6.4 ของ Apple ระบุว่าคำขอคืนเงินที่มากเกินไปเป็นสัญญาณว่าแอปไม่ได้มาตรฐานคุณภาพ และข้อตกลงการจัดจำหน่ายสำหรับนักพัฒนาของ Google ก็เปิดให้ถอดแอปของนักพัฒนารายใหม่ได้จากอัตราการคืนเงิน บทความนี้สรุปว่าแต่ละสโตร์เขียนไว้อย่างไร การถูกถอดแอปมีต้นทุนเท่าไร และจะอยู่ให้ห่างจากความเสี่ยงได้อย่างไร
ตรวจสอบการแจ้งเตือนจากเซิร์ฟเวอร์ App Store ก่อนดำเนินการกับการคืนเงิน เพราะใครก็ส่งคำขอมายัง URL webhook ของคุณได้
การแจ้งเตือนการคืนเงินเป็นเพียงคำขอ HTTPS ธรรมดาจนกว่าคุณจะตรวจสอบลายเซ็นของมัน บทความนี้อธิบายวิธีตรวจสอบการแจ้งเตือนจากเซิร์ฟเวอร์ App Store และข้อความ RTDN ของ Google Play แต่ละสโตร์ลงลายเซ็นอะไรบ้าง และการคืนเงินที่ถูกปลอมแปลงหรือถูกปฏิเสธโดยผิดพลาดทำให้คุณเสียเงินเท่าใด