Guideline 3.1.2: app bị từ chối vì gói đăng ký
Bởi Mehdi Azizi
Đăng ngày , 9 phút
Guideline 3.1.2: số tiền bị trừ phải là giá nổi bật nhất trên paywall, kèm thời hạn, gia hạn và link điều khoản. Hai lần bị từ chối thật và cách sửa.
Guideline 3.1.2 quy định về các gói đăng ký tự động gia hạn. Nếu Apple trích dẫn guideline này, bạn hãy kiểm tra hai điều: số tiền thực sự bị trừ phải là mức giá nổi bật nhất trên paywall của bạn, và cả app lẫn trang App Store phải ghi rõ thời hạn, giá và có link hoạt động được tới điều khoản sử dụng cũng như chính sách quyền riêng tư của bạn.
Mình đã nhận lời từ chối này trên hai app của mình vào tháng 10/2026: Solys ngày 10, TradaZen ngày 12. Cả hai đều vướng cùng một cách hiển thị: giá theo tuần in to, số tiền thực sự bị trừ in nhỏ. Dưới đây là nội dung quy định, hai trường hợp đó, rồi đến check-list mình đang áp dụng. Với các lý do khác, bạn đọc bài vì sao Apple từ chối app.
Guideline 3.1.2 nói gì?
Guideline 3.1.2, "Subscriptions", nằm trong mục 3 "Business" của App Review Guidelines, phần 3.1 "Payments". Vì thế tiêu đề email mới là "Guideline 3.1.2 - Business - Payments - Subscriptions". Quy định này có ba tiểu mục, và chữ cái trong ngoặc cho bạn biết cần tìm ở đâu.
| Tiểu mục | Apple yêu cầu gì | Lời từ chối điển hình |
|---|---|---|
| 3.1.2(a) Permissible uses | Giá trị liên tục, tối thiểu 7 ngày | Gói đăng ký không có nội dung thay đổi |
| 3.1.2(b) Upgrades and Downgrades | Đổi gói mà không bị trùng | Hai gói bị tính tiền cùng lúc |
| 3.1.2(c) Subscription Information | Người dùng nhận được gì, với giá nào | Giá quy đổi to hơn giá thực sự bị trừ |
Nội dung của 3.1.2(c) rất ngắn. Trước khi mời ai đó đăng ký, bạn phải "clearly describe what the user will get for the price": mô tả rõ ràng họ nhận được gì với mức giá đó. Sau đó nó dẫn tới phụ lục 2 (Schedule 2) của thỏa thuận cấp phép chương trình nhà phát triển. Phụ lục này liệt kê những gì bạn phải hiển thị "clearly and conspicuously", tức là rõ ràng và dễ thấy:
- tên gói đăng ký;
- thời hạn;
- giá, và giá theo đơn vị nếu phù hợp;
- link tới chính sách quyền riêng tư và điều khoản sử dụng của bạn, truy cập được ngay trong app.
Quy định về kích thước giá nằm trên trang của Apple về gói đăng ký. Trong luồng mua hàng, "the amount that will be billed must be the most prominent pricing element in the layout": số tiền sẽ bị trừ phải là yếu tố giá nổi bật nhất. Giá quy đổi theo tháng hay mức tiết kiệm vẫn được phép, miễn là ở vị trí phụ và nhỏ hơn. Cũng trang đó yêu cầu, với bản dùng thử miễn phí, phải ghi rõ thời hạn dùng thử và số tiền bị trừ khi hết hạn.
Hai lần bị từ chối 3.1.2(c) mình đã nhận
Solys: 0,38 € in to, 19,99 € in nhỏ
Solys là app báo thức giúp bạn tạm quên mạng xã hội. Trên paywall ở phần onboarding, thẻ "Hằng năm" hiển thị "0,38 €/tuần" cỡ chữ 21 point, in đậm. Bên dưới, cỡ 15 point: "tức 19,99 €/năm". Nhưng số tiền bị trừ là 19,99 €, không phải 0,38 €.
Ngày 10/10/2026, Apple từ chối phiên bản này và trích dẫn 3.1.2(c). Thông báo yêu cầu số tiền bị trừ phải là yếu tố giá rõ ràng và nổi bật nhất. Bản dùng thử miễn phí, giá ra mắt và các giá quy đổi phải nằm ở vị trí phụ. Apple nêu các tiêu chí của họ: font chữ, kích thước, màu sắc và vị trí.
Mình biết rõ mà vẫn giữ cách hiển thị này: một phiên bản trước của TradaZen, làm theo cùng nguyên tắc, đã được duyệt. Đó là một canh bạc, và nó tốn của mình một vòng review.
Cách sửa: "19,99 €/năm" in to, "tức 0,38 €/tuần" làm chú thích màu xám bên dưới, trong cả 30 ngôn ngữ của app. Vì paywall nằm trong code nên mình phải build lại trước khi gửi phiên bản đi.
TradaZen: cùng lý do, hai ngày sau
TradaZen là app mô phỏng giao dịch của mình. Ngày 12/10/2026, phiên bản 1.5.1 bị từ chối vì cùng quy định. Thông báo nhắc tới một giá "weekly calculated" được hiển thị "more clearly and conspicuously than the billed amount": giá quy đổi theo tuần nổi bật hơn số tiền bị trừ.
Lần sửa đầu tiên của mình chưa đủ, và mình nhận ra trước khi gửi. Mình đã thu nhỏ "0,92 €/tuần" nhưng vẫn để nó bên phải, trên dòng giá. Trong khi thẻ của gói hằng tuần lại hiển thị, ở cùng cột đó, giá thật của nó: "8,99 €/tuần". Hai con số được đọc ngang hàng nhau. Một giá quy đổi đặt trong cột giá thật sẽ bị đọc như giá bị trừ, kể cả khi in nhỏ.
Cách sửa cuối cùng: mỗi thẻ ghi số tiền bị trừ in to, bên phải. Giá theo tuần chuyển thành chú thích màu xám bên dưới. Bên trái chỉ có tên gói. Ở lần review tiếp theo, Apple không còn nhắc tới 3.1.2(c) nữa.
Những bài học khác từ app này nằm trong case study TradaZen.
Cái Apple từ chối, cái được duyệt
Đây là các cách hiển thị thật, theo thứ tự, kèm kết quả.
| Cách hiển thị giá | Kết quả |
|---|---|
| TradaZen, phiên bản cũ: giá theo tuần đặt nổi bật | Được duyệt ở một lần review trước |
| Solys: "0,38 €/tuần" in đậm, "19,99 €/năm" bên dưới | Bị từ chối ngày 10/10/2026, 3.1.2(c) |
| TradaZen 1.5.1: giá theo tuần nổi bật hơn giá bị trừ | Bị từ chối ngày 12/10/2026, 3.1.2(c) |
| TradaZen: giá theo tuần thu nhỏ nhưng vẫn ở cột giá | Mình tự loại bỏ trước khi gửi |
| TradaZen: giá bị trừ in to bên phải, giá tuần làm chú thích | Không còn bị nhắc ở lần review sau |
| Solys: "19,99 €/năm" in to, giá tuần làm chú thích xám | Đã sửa và gửi lại cho Apple |
Dòng đầu tiên là quan trọng nhất. Một lần review được duyệt không có nghĩa paywall của bạn sẽ qua ở lần sau. Mỗi phiên bản lại qua tay một reviewer, và người đó có thể đọc quy định khắt khe hơn người trước. Cách hiển thị an toàn duy nhất là cách tuân thủ đúng nội dung quy định.
Số tiền bị trừ là mức giá duy nhất được in to. Mọi giá quy đổi, theo tuần, theo tháng hay theo ngày, đều là chú thích nhỏ hơn và nhạt hơn, không bao giờ nằm ở vị trí của nó.
Check-list paywall tuân thủ 3.1.2
Đây là danh sách mình rà lại trên mọi paywall trong các app của mình, trước mỗi lần gửi:
- Trên mỗi thẻ, số tiền bị trừ là mức giá to nhất, tương phản nhất và ở vị trí đẹp nhất.
- Mọi giá quy đổi (theo tuần, theo tháng, theo ngày) đều là chú thích, nhỏ hơn và nhạt hơn, nằm dưới số tiền bị trừ.
- Không giá quy đổi nào nằm trong cột mà một gói khác hiển thị giá thật của nó.
- Thời hạn được ghi rõ: "mỗi năm", "mỗi tuần".
- Bản dùng thử miễn phí ghi rõ thời hạn và số tiền bị trừ khi hết thời gian dùng thử.
- Có một câu nói rằng gói đăng ký tự động gia hạn và có thể hủy trong phần cài đặt tài khoản Apple.
- Những gì gói đăng ký mở khóa được ghi trước nút mua.
- Nút "Restore Purchases" hiển thị trên paywall.
- Link tới điều khoản sử dụng và chính sách quyền riêng tư nằm trên paywall và mở được.
- Nếu bạn có nhiều gói, chúng nằm trong cùng một nhóm đăng ký (subscription group), như Apple khuyến nghị.
- Giao diện được kiểm tra trên iPhone nhỏ nhất và với mức giá dài nhất. Với TradaZen, mình thử giá bằng đồng Việt Nam: một con số bị xuống dòng sẽ phá vỡ thứ bậc hiển thị.
Nếu bạn dùng paywall của RevenueCat, tài liệu của RevenueCat cũng cảnh báo tương tự: chỉ một biến giá theo tháng là không đủ nếu số tiền bị trừ và chu kỳ thanh toán không xuất hiện ở chỗ khác. Cách tích hợp đầy đủ có trong RevenueCat: thiết lập gói đăng ký in-app, còn các lỗi thiết kế có trong paywall iOS: 7 lỗi của người mới.
Link điều khoản và quyền riêng tư: trong app và trên trang App Store
Dạng từ chối 3.1.2 còn lại không nhắm vào paywall mà vào metadata. Các thông báo mà nhà phát triển đăng trên diễn đàn của Apple chỉ rõ vị trí cần đặt: link chính sách quyền riêng tư ở trường dành riêng trong App Store Connect, và link điều khoản sử dụng (EULA) trong phần mô tả hoặc trong trường EULA.
Cái bẫy nằm ở thỏa thuận tiêu chuẩn. Theo trợ giúp của App Store Connect, nếu bạn không thêm thỏa thuận tùy chỉnh, thỏa thuận tiêu chuẩn của Apple sẽ được áp dụng và "the license agreement link isn't shown on your App Store product page": không có link nào xuất hiện trên trang của bạn. Nếu bạn dùng thỏa thuận tiêu chuẩn, bạn phải tự đặt link của nó vào phần mô tả, trỏ tới trang điều khoản của bạn hoặc tới thỏa thuận cấp phép tiêu chuẩn của Apple.
Trên các app có gói đăng ký, mình kết thúc phần mô tả bằng hai dòng, trong mọi ngôn ngữ của trang. Đây là mẫu, bạn chỉnh lại theo gói và tên miền của mình:
Dùng thử miễn phí 7 ngày, sau đó là gói đăng ký hằng năm hoặc hằng tuần,
có thể hủy bất cứ lúc nào.
Điều khoản: https://your-domain.com/terms
Quyền riêng tư: https://your-domain.com/privacy
Hãy mở thử cả hai link trước khi dán: một trang không tồn tại cũng như không có link. Nội dung chính sách cần có được trình bày chi tiết trong chính sách quyền riêng tư của một ứng dụng, còn phần còn lại của trang App Store ở trang ASO App Store.
Điểm này sửa được mà không cần build mới: phần mô tả và các trường trong App Store Connect là metadata.
3.1.2(a): gói đăng ký phải mang lại giá trị liên tục
Tiểu mục còn lại hay gây từ chối nhắm vào mô hình, không phải màn hình. 3.1.2(a) yêu cầu "ongoing value": giá trị kéo dài theo thời gian. Mỗi chu kỳ kéo dài ít nhất bảy ngày, và gói đăng ký hoạt động trên mọi thiết bị của người dùng. Người đăng ký nhận được thứ họ đã trả tiền mà không phải làm thêm việc gì, chẳng hạn như đăng bài lên mạng xã hội.
Nếu app của bạn chỉ cung cấp dịch vụ một lần là xong, có lẽ mua một lần sẽ hợp hơn. Hai mô hình được so sánh trong bài đăng ký hay mua một lần.
Trả lời Apple thế nào sau khi bị từ chối 3.1.2
Cuộc trao đổi diễn ra trong mục App Review của app. Quy trình trả lời App Review giống như với các quy định khác. Có hai trường hợp:
- Vấn đề nằm trong app (kích thước giá, nội dung trên paywall): cần build mới, như với Solys và TradaZen. Reviewer kiểm tra code đi kèm build, mình đã giải thích trong bài hướng dẫn về guideline 2.1.
- Vấn đề nằm trên trang App Store (link thiếu hoặc hỏng): bạn sửa metadata, trả lời, và chính bản gửi đó được xét lại.
Hãy viết bằng tiếng Anh, ngắn gọn: cái gì gây ra vấn đề, cái gì đã thay đổi, kiểm tra thế nào. Đây là mẫu mình dùng (thay số build, giá và luồng thao tác bằng của bạn):
Hello,
Thank you for your review.
Issue: on the paywall, the weekly equivalent price was displayed
more prominently than the billed amount.
Fix in build X:
- Each plan now shows its billed amount (e.g. "€19.99/year")
as the largest price on the card.
- The weekly equivalent is a smaller grey caption below it.
- The paywall states the duration, the auto-renewal, and links
to our Terms of Use and Privacy Policy.
How to verify: launch the app and complete the onboarding.
The paywall appears at the end.
Best regards,
Sửa paywall trước lần gửi tiếp theo
Nếu app của bạn vừa bị từ chối vì 3.1.2, Apple Review Kit giúp bạn tìm lại quy định bị trích dẫn, những gì nó yêu cầu, cùng ví dụ cách sửa và cách trả lời. Các skill Claude Code của kit cũng rà soát paywall và trang App Store của bạn trước khi gửi. Nếu muốn có người xem trực tiếp, đặt một buổi một tiếng với mình: mình cùng đọc thông báo của Apple và chỉnh lại paywall ngay trên màn hình của bạn. Toàn bộ quy trình có ở trang ứng dụng bị Apple từ chối, còn cách thiết lập gói đăng ký ở trang gói đăng ký in-app iOS.
Nếu bạn đang chuẩn bị ra mắt app đầu tiên, làm bài chẩn đoán miễn phí: nó sắp xếp lại các bước theo thứ tự và gửi cho bạn check-list chống bị Apple từ chối của mình. Để tạo một ứng dụng di động kiếm được tiền ngay từ khi ra mắt, iOS Kit dành bước thứ ba, "kết nối dòng tiền", cho gói đăng ký và paywall.
Không ai có thể đảm bảo Apple sẽ duyệt app của bạn. Điều mình làm được là giúp bạn tránh lời từ chối 3.1.2(c) mà mình đã trả giá hai lần.
Câu hỏi thường gặp
"Guideline 3.1.2 - Business - Payments - Subscriptions" nghĩa là gì?
Đó là tên đầy đủ của quy định về gói đăng ký. Nó báo hiệu giá được sắp xếp sai thứ bậc, thiếu thông tin trên paywall, thiếu link trên trang App Store hoặc gói đăng ký không mang lại giá trị liên tục. Chữ cái trong ngoặc, ví dụ 3.1.2(c), cho biết tiểu mục bị nhắc tới.
Còn được hiển thị giá theo tuần hoặc theo tháng không?
Được. Apple cho phép giá quy đổi theo tuần hoặc theo tháng, hoặc mức tiết kiệm, miễn là chúng nhỏ hơn và kém nổi bật hơn số tiền thực sự bị trừ. Trong các app của mình, giá quy đổi là chú thích màu xám dưới giá bị trừ, không bao giờ nằm trong cột giá thật.
Có cần build mới sau khi bị từ chối 3.1.2 không?
Có, nếu vấn đề nằm trên paywall, vì reviewer kiểm tra code đi kèm build. Không, nếu vấn đề nằm trên trang App Store, chẳng hạn thiếu link trong phần mô tả: bạn sửa metadata và chính bản gửi đó được xét lại.
Đặt link điều khoản sử dụng (EULA) ở đâu?
Trong app, trên paywall. Về phía trang App Store, đặt trong phần mô tả hoặc trong trường EULA của App Store Connect nếu bạn có thỏa thuận tùy chỉnh. Với thỏa thuận tiêu chuẩn của Apple, không có link nào hiển thị trên trang của bạn: hãy tự thêm nó vào phần mô tả, trong mọi ngôn ngữ.
Paywall của mình từng được duyệt, sao giờ lại bị từ chối?
Vì mỗi phiên bản đều được review lại, đôi khi bởi một reviewer khác. Giá theo tuần đặt nổi bật từng được duyệt trên TradaZen, rồi bị từ chối trên Solys và TradaZen vào tháng 10/2026. Chỉ có tuân thủ đúng nội dung quy định mới bảo vệ được bạn.