# Hoàn tiền App Store: nhà phát triển thấy gì

> Hoàn tiền App Store do Apple tự quyết. Nhà phát triển nhận CONSUMPTION_REQUEST, có 12 giờ để phản hồi, rồi biết kết quả qua REFUND.

Trang gốc: [Hoàn tiền App Store: nhà phát triển thấy gì](https://devoria.fr/vi/blog/hoan-tien-app-store-nha-phat-trien)
Tác giả: [Mehdi Azizi](https://devoria.fr/vi/mehdi-azizi)
Ngày đăng: 2026-11-04
Lần sửa nội dung gần nhất: 2026-11-04


Trên App Store, **Apple là bên chấp nhận hay từ chối hoàn tiền, không bao giờ là nhà phát triển.** Khách hàng gửi yêu cầu trên trang của Apple hoặc ngay trong app của bạn. Nếu bạn đã kết nối thông báo máy chủ của Apple, bạn nhận thông báo `CONSUMPTION_REQUEST` lúc khách gửi yêu cầu, rồi `REFUND` hoặc `REFUND_DECLINED` khi có quyết định. Ở giữa, bạn có 12 giờ để gửi dữ liệu sử dụng và mong muốn của mình, với điều kiện khách hàng đã đồng ý.

Một lần hoàn tiền được chấp nhận sẽ gỡ giao dịch mua khỏi quyền truy cập đang hoạt động của khách và hiện số âm trong báo cáo doanh số của bạn. Bài này đi qua từng bước, những gì bạn có thể gửi cho Apple, và những gì bạn được phép làm trước các yêu cầu lạm dụng. Các quy tắc lấy từ trang của Apple, đọc lại ngày 3 tháng 11 năm 2026. Trường hợp thực tế đến từ một cảnh báo mình gắn vào các app của mình hồi tháng 10.

## Ai quyết định hoàn tiền trên App Store?

Apple, và chỉ Apple. [Trang hỗ trợ của Apple](https://support.apple.com/en-us/118223) mô tả hành trình của khách: đăng nhập reportaproblem.apple.com, chọn "Request a refund", nêu lý do, rồi chọn giao dịch liên quan. Apple khuyên khách chờ 24 đến 48 giờ để có phản hồi.

Khách cũng có thể yêu cầu hoàn tiền ngay trong app của bạn. StoreKit cung cấp [một bảng yêu cầu](https://developer.apple.com/documentation/storekit/transaction/beginrefundrequest%28in%3A%29-9k0pj) cho việc này, có từ iOS 15. Apple khuyên gọi nó từ phần cài đặt tài khoản hoặc menu trợ giúp. Bảng này hiển thị giao dịch và danh sách lý do, và Apple mất tối đa 48 giờ để quyết định.

**Trong cả hai trường hợp, bạn không phải duyệt gì cả.** Bạn chỉ có thể cung cấp thông tin và một mong muốn, là một trong nhiều tiêu chí Apple dùng để quyết định.

## Mỗi bên thấy gì, từng bước một

| Bước              | Phía khách hàng                        | Phía nhà phát triển                                 |
| ----------------- | -------------------------------------- | --------------------------------------------------- |
| Yêu cầu           | Biểu mẫu của Apple hoặc bảng trong app | Thông báo `CONSUMPTION_REQUEST`                     |
| Trong vòng 12 giờ | Chờ                                    | Có thể gửi dữ liệu sử dụng                          |
| Trong vòng 48 giờ | Apple phản hồi                         | Thông báo `REFUND` hoặc `REFUND_DECLINED`           |
| Sau khi chấp nhận | Tiền trả về phương thức thanh toán     | Giao dịch bị gỡ khỏi quyền truy cập, số lượng âm    |
| Sau khi khiếu nại | Apple hủy lần hoàn tiền                | Thông báo `REFUND_REVERSED`, cần khôi phục truy cập |

App Store Connect chỉ cho bạn thấy các lần hoàn tiền đã được chấp nhận, trong Sales and Trends. **Bản thân yêu cầu chỉ đến qua thông báo máy chủ.** Không có chúng, bạn chỉ biết chuyện hoàn tiền sau khi nó đã xảy ra.

## Các thông báo máy chủ khi hoàn tiền

[App Store Server Notifications V2](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype) gửi năm loại hữu ích ở đây. Bạn nhận chúng trên địa chỉ HTTPS khai báo trong App Store Connect, một cho production và một cho sandbox.

| Thông báo             | Ý nghĩa                                                     | Việc bạn làm                                 |
| --------------------- | ----------------------------------------------------------- | -------------------------------------------- |
| `CONSUMPTION_REQUEST` | Khách yêu cầu hoàn tiền                                     | Phản hồi trong 12 giờ, nếu có sự đồng ý      |
| `REFUND`              | Apple đã hoàn tiền giao dịch                                | Gỡ nội dung hoặc quyền truy cập đã hoàn tiền |
| `REFUND_DECLINED`     | Apple đã từ chối yêu cầu                                    | Không làm gì, quyền truy cập giữ nguyên      |
| `REFUND_REVERSED`     | Apple hủy lần hoàn tiền sau khi khách khiếu nại             | Khôi phục những gì bạn đã gỡ                 |
| `REVOKE`              | Một giao dịch chia sẻ qua Family Sharing không còn khả dụng | Gỡ quyền truy cập của thành viên gia đình    |

Máy chủ của bạn phải phản hồi bằng mã HTTP từ 200 đến 206. Theo [trang về phản hồi thông báo](https://developer.apple.com/documentation/appstoreservernotifications/responding-to-app-store-server-notifications), nếu không, Apple thử lại năm lần, sau 1, 12, 24, 48 rồi 72 giờ kể từ lần thử trước. Trong sandbox, Apple chỉ gửi một lần.

## Consumption API: những gì bạn có thể nói với Apple

Khi yêu cầu đến, bạn có thể phản hồi bằng [Send Consumption Information](https://developer.apple.com/documentation/appstoreserverapi/send-consumption-information). Quy tắc gói trong một câu của Apple: "Respond within 12 hours of receiving the `CONSUMPTION_REQUEST` notification." Phiên bản 2 của API áp dụng cho mọi loại sản phẩm, kể cả gói đăng ký.

Các trường của [request](https://developer.apple.com/documentation/appstoreserverapi/consumptionrequest):

| Trường                  | Bắt buộc | Điều nó nói với Apple                                            |
| ----------------------- | -------- | ---------------------------------------------------------------- |
| `customerConsented`     | Có       | Khách đã đồng ý chia sẻ dữ liệu                                  |
| `deliveryStatus`        | Có       | Giao dịch đã được giao và hoạt động, hoặc lý do chưa được giao   |
| `sampleContentProvided` | Có       | Có bản dùng thử, trích đoạn hoặc mô tả trước khi mua             |
| `consumptionPercentage` | Không    | Phần đã sử dụng, từ 0 đến 100 000 tương ứng 0 đến 100 %          |
| `refundPreference`      | Không    | Mong muốn của bạn: `DECLINE`, `GRANT_FULL` hoặc `GRANT_PRORATED` |

Hai điểm quan trọng. Nếu `deliveryStatus` không phải `DELIVERED`, phần đã sử dụng phải bằng 0. Và với hoàn tiền theo tỷ lệ cho gói đăng ký, bạn bỏ trống phần đã sử dụng: Apple tự tính.

**Sự đồng ý là điều kiện của mọi thứ.** Apple viết: "You must obtain valid consent from the customer before sharing their personal data with Apple in the Send Consumption Information API." Không có sự đồng ý, bạn không phản hồi. Apple cũng cấm dùng cửa sổ theo dõi quảng cáo để xin sự đồng ý này: "Don't use the AppTrackingTransparency prompt to obtain consent".

## Nếu bạn dùng RevenueCat

Với RevenueCat, chính RevenueCat nhận thông báo của Apple và phản hồi yêu cầu, bằng [Refund Control](https://www.revenuecat.com/docs/customers/refund-control). Bạn chọn một trong bốn chính sách: ưu tiên hoàn tiền toàn phần, ưu tiên từ chối, chỉ gửi dữ liệu sử dụng, hoặc không phản hồi.

Bật chia sẻ dữ liệu đồng nghĩa với việc xác nhận bạn đã có sự đồng ý của khách hàng. RevenueCat tự nói rõ: "Enabling consumption data sharing confirms that you obtained consent from your Customers." Họ cũng khuyên chỉ dùng "Prefer no refund" cho một nhóm cụ thể, và cảnh báo khi mong muốn này áp dụng cho phần lớn khách hàng của bạn.

Để nhận thông báo cả trên máy chủ riêng, RevenueCat có trường "Apple Server Notification Forwarding URL" trong phần cài đặt app. Nó được mô tả trong [trang về thông báo của Apple](https://www.revenuecat.com/docs/platform-resources/server-notifications/apple-server-notifications) của họ. Đây là cách mình đang dùng. Cách dựng gói đăng ký với RevenueCat có trong [RevenueCat và gói đăng ký in-app iOS](https://devoria.fr/vi/blog/revenuecat-goi-dang-ky-in-app-ios).

## Ảnh hưởng đến doanh thu và gói đăng ký

**Về quyền truy cập.** Theo [tài liệu về `currentEntitlements`](https://developer.apple.com/documentation/storekit/transaction/currententitlements), "Products that the App Store has refunded or revoked don't appear in the current entitlements". Nếu app của bạn kiểm tra quyền bằng `currentEntitlements`, quyền truy cập đã hoàn tiền tự biến mất. Giao dịch mang ngày và lý do bị thu hồi, trong `revocationDate` và `revocationReason`.

**Về báo cáo.** Theo [trợ giúp báo cáo doanh số](https://developer.apple.com/help/app-store-connect/reference/reporting/summary-sales-report), một lần hoàn tiền hiện với số lượng và giá khách trả là số âm. Với gói đăng ký, [trang về dữ liệu đăng ký](https://developer.apple.com/help/app-store-connect/measure-app-performance/view-subscription-data) tính hoàn tiền toàn phần và một phần vào các sự kiện, và trừ chúng khỏi số lượng hằng ngày.

**Về uy tín.** [Guideline 5.6.4](https://developer.apple.com/app-store/review/guidelines/#5.6.4) liệt kê yêu cầu hoàn tiền quá nhiều là một dấu hiệu chất lượng kém. Tỷ lệ hoàn tiền cao không chỉ là mất tiền: Apple có thể dựa vào đó để đánh giá việc bạn tuân thủ quy tắc ứng xử.

## Trường hợp của mình: cảnh báo gắn vào các app

Ngày 12 tháng 10 năm 2026, mình gắn một cảnh báo vào các app của mình. RevenueCat chuyển tiếp thông báo của Apple đến một route trên devoria.fr. Route này kiểm tra chữ ký của Apple, rồi gửi cho mình một cảnh báo, không kèm số tiền. Mình muốn thấy yêu cầu ngay lúc nó đến, chứ không chỉ kết quả.

Ngày 18 tháng 10, yêu cầu thật đầu tiên đến từ TradaZen, app mô phỏng giao dịch của mình. Một gói đăng ký năm, thanh toán khi hết 7 ngày dùng thử miễn phí. Lý do được nêu: mua nhầm. Ba bài học:

1. **Cùng một yêu cầu có thể đến nhiều lần.** Mình nhận cùng một cảnh báo ba lần trong cùng tối. Từ đó, mỗi cảnh báo được lọc trùng theo loại thông báo và mã giao dịch.
2. **Quyết định đến trong chưa tới một ngày.** Apple từ chối khoảng 22 giờ sau khi có yêu cầu. Khách vẫn giữ quyền truy cập.
3. **Bị từ chối chưa phải là hết.** Cùng khách đó gửi lại yêu cầu hai ngày sau, trên cùng giao dịch.

> Một yêu cầu "mua nhầm" khi hết thời gian dùng thử không thắng được bằng câu trả lời gửi Apple. Nó phải được phòng ngừa trên paywall, trước lần thanh toán đầu tiên.

## Hạn chế yêu cầu lạm dụng mà không vi phạm quy tắc

**Những gì được phép:**

- **Phản hồi mỗi yêu cầu bằng dữ liệu chính xác**, khi khách đã đồng ý.
- **Nêu mong muốn có chọn lọc**, ví dụ từ chối cho một giao dịch đã sử dụng hết, thay vì từ chối với tất cả mọi người.
- **Gắn mỗi `REFUND` với một tài khoản khách hàng.** [Trang của Apple về thông báo hoàn tiền](https://developer.apple.com/documentation/storekit/handling-refund-notifications) khuyến nghị việc này để phát hiện hoàn tiền lặp lại.
- **Nói rõ khách mua gì trước khi mua.** [Guideline 3.1.2(c)](https://developer.apple.com/app-store/review/guidelines/#3.1.2) yêu cầu mô tả người dùng nhận được gì với mức giá đó, trước khi mời họ đăng ký.

**Những gì bị cấm:**

- **Gửi dữ liệu sai** để yêu cầu bị từ chối, hoặc phản hồi khi chưa có sự đồng ý.
- **Xin sự đồng ý qua cửa sổ theo dõi quảng cáo**, điều Apple loại trừ rõ ràng.
- **Gài bẫy khi mua.** [Guideline 5.6](https://developer.apple.com/app-store/review/guidelines/#5.6) cấm đẩy khách vào những giao dịch họ không muốn hoặc thu tiền cho thứ không được giao.
- **Gây áp lực lên khách** đang yêu cầu hoàn tiền. Cùng quy tắc đó đòi hỏi sự tôn trọng trong chăm sóc khách hàng, không đe dọa.

Đòn bẩy tốt nhất vẫn nằm ở phía trước: một paywall nêu rõ giá, ngày thanh toán đầu tiên và cách hủy. Các lỗi cần tránh có trong [các lỗi paywall](https://devoria.fr/vi/blog/paywall-ios-7-loi-nguoi-moi), và quy tắc dùng thử có trong [dùng thử miễn phí trên App Store](https://devoria.fr/vi/blog/introductory-offer-app-store-connect-free-trial-ios).

## Kiểm thử trước khi lên production

Theo [trang về kiểm thử yêu cầu hoàn tiền](https://developer.apple.com/documentation/storekit/testing-refund-requests), sandbox và StoreKit testing trong Xcode đều chấp nhận yêu cầu hoàn tiền. Trong sandbox, lý do nào cũng dẫn đến chấp nhận tự động. Để mô phỏng từ chối, chọn "Other" và gõ `DECLINE`. Để hoàn tiền theo tỷ lệ, gõ `GRANT_PRORATED`. Trong sandbox, phản hồi dữ liệu sử dụng của bạn phải được gửi trong vòng năm phút.

## Một gói đăng ký ít bị hoàn tiền hơn

[iOS & Android Kit](https://devoria.fr/vi/kits/ios) xuất phát từ code các app của mình, với onboarding, paywall và gói đăng ký đã được code sẵn, và đi qua bốn bước đến App Store, theo nhịp của bạn. Cách dựng đầy đủ có trên trang [gói đăng ký in-app iOS](https://devoria.fr/vi/expertise/goi-dang-ky-trong-ung-dung-ios), và quy tắc của Apple về gói đăng ký có trong [guideline 3.1.2](https://devoria.fr/vi/blog/guideline-3-1-2-app-bi-tu-choi-goi-dang-ky).

Trước khi ra mắt paywall, [làm bài chẩn đoán miễn phí](https://devoria.fr/vi/diagnostic): nó cho bạn biết điều gì thật sự đang chặn dự án, và gửi bạn checklist chống bị Apple từ chối của mình.

## Câu hỏi thường gặp

### Nhà phát triển có thể từ chối hoàn tiền App Store không?

Không. Apple tự quyết. Bạn có thể gửi dữ liệu sử dụng và một mong muốn, ví dụ `DECLINE`, là một trong nhiều tiêu chí. Apple có tiếng nói cuối cùng.

### Nhà phát triển có được báo khi có yêu cầu hoàn tiền không?

Có, nếu đã kết nối App Store Server Notifications V2. Apple gửi `CONSUMPTION_REQUEST` lúc có yêu cầu, rồi `REFUND` hoặc `REFUND_DECLINED` khi có quyết định. Không có thông báo, bạn chỉ thấy các lần hoàn tiền đã chấp nhận trong báo cáo.

### Apple mất bao lâu để xử lý yêu cầu hoàn tiền?

Apple báo khách là 24 đến 48 giờ. Tài liệu StoreKit nói tối đa 48 giờ. Về phía bạn, bạn có 12 giờ để gửi dữ liệu sử dụng.

### Quyền truy cập ra sao sau khi hoàn tiền?

Giao dịch đã hoàn tiền bị gỡ khỏi quyền truy cập đang hoạt động: StoreKit 2 không còn trả nó trong `currentEntitlements`. Nếu sau đó Apple hủy lần hoàn tiền, bạn nhận `REFUND_REVERSED` và phải khôi phục quyền truy cập.

### Có cần sự đồng ý của khách để phản hồi Apple không?

Có. Apple yêu cầu sự đồng ý hợp lệ trước mọi việc chia sẻ dữ liệu qua Consumption API. Không có nó, bạn không phản hồi thông báo. Không được dùng cửa sổ theo dõi quảng cáo để xin sự đồng ý này.

### Hoàn tiền có ảnh hưởng xấu đến app của mình không?

Có thể. Guideline 5.6.4 liệt kê yêu cầu hoàn tiền quá nhiều là dấu hiệu chất lượng kém, điều Apple có thể dựa vào để đánh giá việc tuân thủ quy tắc ứng xử.


## Dự án của bạn

[iOS & Android Kit](https://devoria.fr/vi/kits/ios): Tạo app iPhone và Android với Claude Code: code khởi đầu từ các app của mình, lộ trình đến tận store và tất cả các kit. 2.799.000 ₫.

[Chẩn đoán: điều gì ngăn bạn có app iPhone](https://devoria.fr/vi/diagnostic): 7 câu hỏi, 60 giây: bạn biết điều gì thật sự cản bạn đăng app iPhone, lộ trình 4 bước và kit phù hợp với bạn.
