Guideline 3.1.2: app rejeitado por causa da assinatura
Por Mehdi Azizi
Publicado em , 9 min
Guideline 3.1.2: o valor cobrado deve ser o preço mais visível do paywall, com duração, renovação e links dos termos. Duas rejeições reais e a correção.
A guideline 3.1.2 regula as assinaturas com renovação automática. Se a Apple citou essa regra, confira duas coisas: o valor realmente cobrado precisa ser o preço mais visível do seu paywall, e tanto o app quanto a página dele na loja precisam informar a duração, o preço e links que funcionem para os seus termos de uso e a sua política de privacidade.
Recebi essa rejeição em dois dos meus apps em outubro de 2026: Solys no dia 10, TradaZen no dia 12. O problema era a mesma forma de mostrar o preço: um preço por semana em destaque e o valor de verdade, o que é cobrado, pequenininho. Aqui está o texto da regra, os dois casos e depois o checklist que eu uso agora. Para os outros motivos, leia por que a Apple rejeita um app.
O que diz a guideline 3.1.2?
A 3.1.2, “Subscriptions”, fica na seção 3 “Business” das App Review Guidelines, parte 3.1 “Payments”. Daí o título do e-mail: “Guideline 3.1.2 - Business - Payments - Subscriptions”. Ela tem três alíneas, e a letra entre parênteses diz onde procurar.
| Alínea | O que a Apple exige | A rejeição típica |
|---|---|---|
| 3.1.2(a) Permissible uses | Valor contínuo, mínimo de 7 dias | Assinatura sem conteúdo que evolui |
| 3.1.2(b) Upgrades and Downgrades | Trocar de plano sem cobrança dupla | Dois planos pagos ao mesmo tempo |
| 3.1.2(c) Subscription Information | O que a pessoa recebe e por qual preço | Preço calculado maior que o cobrado |
O texto da 3.1.2(c) é curto. Antes de pedir que alguém assine, você precisa “clearly describe what the user will get for the price”: descrever com clareza o que a pessoa recebe por esse preço. Depois ele remete ao anexo 2 (Schedule 2) da licença do programa de desenvolvedor. Esse anexo lista o que você precisa mostrar “clearly and conspicuously”, de forma clara e visível:
- o título da assinatura;
- a duração;
- o preço, e o preço por unidade quando fizer sentido;
- links para a sua política de privacidade e os seus termos de uso, acessíveis dentro do app.
A regra sobre o tamanho dos preços está na página da Apple dedicada às assinaturas. No fluxo de compra, “the amount that will be billed must be the most prominent pricing element in the layout”: o valor que será cobrado precisa ser o elemento de preço mais visível. Um equivalente mensal ou uma economia continuam permitidos, desde que fiquem em posição secundária e menores. A mesma página pede, no caso de um teste gratuito, que você informe a duração dele e o preço cobrado no final.
As duas rejeições 3.1.2(c) que eu recebi
Solys: 0,38 € grande, 19,99 € pequeno
Solys é o meu despertador que bloqueia suas redes sociais. No paywall do onboarding, o card “Anual” mostrava “0,38 €/sem.” em 21 pontos e em negrito. Embaixo, em 15 pontos: “ou seja, 19,99 €/ano”. Só que o valor cobrado é 19,99 €, não 0,38 €.
Em 10 de outubro de 2026, a Apple rejeita a versão citando a 3.1.2(c). A mensagem pede que o valor cobrado seja o elemento de preço mais claro e mais visível. O teste gratuito, o preço de lançamento e os preços calculados precisam ficar subordinados a ele. A Apple cita os critérios: fonte, tamanho, cor e posição.
Eu tinha mantido esse layout sabendo do risco: uma versão anterior do TradaZen, construída com a mesma lógica, tinha sido aprovada. Foi uma aposta, e ela custou um ciclo de revisão.
A correção: “19,99 €/ano” grande, “ou seja, 0,38 €/sem.” como legenda cinza embaixo, nos 30 idiomas do app. Como o paywall está no código, precisei gerar um novo build antes de reenviar a versão.
TradaZen: o mesmo motivo, dois dias depois
TradaZen é o meu simulador de trading. Em 12 de outubro de 2026, a versão 1.5.1 é rejeitada pela mesma regra. A mensagem fala de um preço “weekly calculated” exibido “more clearly and conspicuously than the billed amount”: o equivalente semanal estava mais visível que o valor cobrado.
Minha primeira correção não bastou, e eu percebi isso antes de enviar. Eu tinha diminuído “0,92 €/sem”, mas deixei à direita, na linha do preço. Só que o card da assinatura semanal mostrava, na mesma coluna, o preço real dela: “8,99 €/sem”. Os dois valores eram lidos no mesmo nível. Um preço calculado colocado na coluna dos preços reais é lido como preço cobrado, mesmo pequeno.
A correção final: cada card mostra o valor cobrado grande, à direita. O preço por semana vira uma legenda cinza embaixo. À esquerda, só o nome do plano. Na revisão seguinte, a Apple não apontou mais a 3.1.2(c).
As outras lições desse app estão no estudo de caso do TradaZen.
O que a Apple rejeitou e o que passou
Aqui estão os layouts reais, em ordem, com o resultado de cada um.
| Exibição do preço | Resultado |
|---|---|
| TradaZen, versão anterior: preço por semana em destaque | Aprovado em uma revisão anterior |
| Solys: “0,38 €/sem.” em negrito, “19,99 €/ano” embaixo | Rejeitado em 10/10/2026, 3.1.2(c) |
| TradaZen 1.5.1: preço por semana mais visível que o cobrado | Rejeitado em 12/10/2026, 3.1.2(c) |
| TradaZen: preço por semana menor, mas na coluna dos preços | Descartado por mim antes do envio |
| TradaZen: cobrado grande à direita, semana como legenda | Não citado na revisão seguinte |
| Solys: “19,99 €/ano” grande, semana como legenda cinza | Corrigido e reenviado à Apple |
A primeira linha é a mais importante. Uma revisão aprovada não valida o seu paywall para a próxima. Cada versão passa de novo por um revisor, que pode interpretar a regra de forma mais rígida que o anterior. O único layout seguro é o que respeita o texto.
O valor cobrado é o único preço grande. Qualquer equivalente, por semana, por mês ou por dia, é uma legenda menor e mais apagada, nunca no lugar dele.
O checklist do paywall em conformidade com a 3.1.2
Esta é a lista que eu passo agora em cada paywall dos meus apps, antes de cada envio:
- Em cada card, o valor cobrado é o preço maior, com mais contraste e na melhor posição.
- Todo preço calculado (por semana, por mês, por dia) é uma legenda, menor e mais apagada, abaixo do valor cobrado.
- Nenhum preço calculado ocupa a coluna em que outro plano mostra o seu preço real.
- A duração está escrita por extenso: “por ano”, “por semana”.
- O teste gratuito informa a duração e o valor cobrado no fim do teste.
- Uma frase diz que a assinatura é renovada automaticamente e pode ser cancelada nos ajustes da conta Apple.
- O que a assinatura libera está escrito antes do botão de compra.
- Um botão “Restaurar compras” está visível no paywall.
- Os links para os termos de uso e a política de privacidade estão no paywall e abrem.
- Se você oferece vários planos, eles estão em um único grupo de assinaturas, como a Apple recomenda.
- A tela foi conferida no menor iPhone e com o preço mais longo. No TradaZen, eu testo o preço em dong vietnamita: um valor que quebra a linha destrói a hierarquia.
Se você usa os paywalls do RevenueCat, a documentação do RevenueCat faz o mesmo alerta: uma variável de preço mensal sozinha não basta se o valor cobrado e a periodicidade dele não aparecem em outro lugar. A integração completa está em RevenueCat: como configurar uma assinatura in-app, e os erros de design em paywall iOS: 7 erros de iniciante.
Os links dos termos e da privacidade: no app e na página da loja
A outra forma de rejeição 3.1.2 não mira o paywall, e sim os metadados. As mensagens publicadas por desenvolvedores nos fóruns da Apple dizem onde a Apple espera os links: o da política de privacidade no campo próprio do App Store Connect, e o dos termos de uso (EULA) na descrição ou no campo EULA.
A armadilha vem do contrato padrão. Segundo a ajuda do App Store Connect, se você não adicionar um contrato personalizado, vale o contrato padrão da Apple e “the license agreement link isn't shown on your App Store product page”: nenhum link aparece na sua página. Se você usa o contrato padrão, cabe a você colocar o link dele na descrição, apontando para a sua página de termos ou para o contrato de licença padrão da Apple.
Nos meus apps com assinatura, eu termino a descrição com duas linhas, em cada idioma da página. Aqui está o modelo, para adaptar à sua oferta e ao seu domínio:
Teste gratuito de 7 dias, depois assinatura anual ou semanal,
cancelável a qualquer momento.
Termos: https://seu-dominio.com/termos
Privacidade: https://seu-dominio.com/privacidade
Abra os dois links antes de colar: uma página que não existe equivale a um link ausente. O que a política precisa conter está detalhado em política de privacidade de um aplicativo, e o resto da página da loja em ASO App Store.
Esse ponto se corrige sem novo build: a descrição e os campos do App Store Connect são metadados.
3.1.2(a): uma assinatura precisa entregar valor contínuo
A outra alínea que gera rejeição mira o modelo, não a tela. A 3.1.2(a) pede “ongoing value”: um valor que continua ao longo do tempo. O período dura pelo menos sete dias, e a assinatura funciona em todos os aparelhos do usuário. O assinante recebe o que pagou sem precisar fazer nada a mais, como postar numa rede social.
Se o seu app presta um serviço uma vez só, talvez uma compra única faça mais sentido. Os dois modelos são comparados em assinatura ou compra única.
O que responder à Apple depois de uma rejeição 3.1.2
A conversa acontece na seção App Review do seu app. O procedimento para responder ao App Review é o mesmo das outras regras. Há dois casos:
- O problema está no app (tamanho dos preços, informações do paywall): precisa de um novo build, como no Solys e no TradaZen. O revisor testa o código embarcado, explico isso no guia sobre a guideline 2.1.
- O problema está na página da loja (links ausentes ou quebrados): você corrige os metadados, responde, e a mesma submissão volta para a fila.
Escreva em inglês, de forma objetiva: o que estava errado, o que mudou, como verificar. Este é o modelo que eu uso (troque o número do build, os preços e o fluxo pelos seus):
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,
Corrija seu paywall antes do próximo envio
Se o seu app acabou de ser rejeitado na 3.1.2, o Apple Review Kit ajuda você a encontrar a regra citada, o que ela exige e um exemplo de correção e de resposta. As skills de Claude Code dele também revisam o seu paywall e a sua página da loja antes do envio. Se quiser um olhar humano, reserve uma hora comigo: a gente lê a mensagem da Apple e revisa o seu paywall na sua tela. O processo completo está na página aplicativo rejeitado pela Apple, e a configuração da assinatura na página assinatura in-app iOS.
Se você está preparando o seu primeiro lançamento, faça o seu diagnóstico gratuito: ele coloca as etapas na ordem certa e manda para você o meu checklist anti-rejeição da Apple. Para criar um aplicativo que fature desde o lançamento, o iOS Kit dedica a terceira etapa, “ligar o dinheiro”, à assinatura e ao paywall.
Ninguém pode garantir que a Apple vai aprovar o seu app. O que eu posso fazer é poupar você da rejeição 3.1.2(c) que eu paguei duas vezes.
Perguntas frequentes
O que significa “Guideline 3.1.2 - Business - Payments - Subscriptions”?
É o título completo da regra sobre assinaturas. Ele indica um preço com hierarquia errada, uma informação faltando no paywall, um link ausente na página da loja ou uma assinatura sem valor contínuo. A letra entre parênteses, por exemplo 3.1.2(c), indica a alínea em questão.
Ainda dá para mostrar um preço por semana ou por mês?
Sim. A Apple permite um equivalente semanal ou mensal, ou uma economia, desde que fiquem menores e menos visíveis que o valor realmente cobrado. Nos meus apps, o equivalente é uma legenda cinza abaixo do preço cobrado, nunca na coluna dos preços reais.
Preciso de um novo build depois de uma rejeição 3.1.2?
Sim, se o problema está no paywall, já que o revisor testa o código embarcado. Não, se está na página da loja, como um link ausente na descrição: você corrige os metadados e a mesma submissão volta para a fila.
Onde colocar o link para os termos de uso (EULA)?
No app, no paywall. Na página da loja, na descrição ou no campo EULA do App Store Connect se você tiver um contrato personalizado. Com o contrato padrão da Apple, nenhum link aparece na sua página: adicione você mesmo na descrição, em cada idioma.
Meu paywall já foi aprovado, por que está sendo rejeitado agora?
Porque cada versão passa de novo pela revisão, às vezes com outro revisor. Um preço por semana em destaque tinha sido aprovado no TradaZen, depois foi rejeitado no Solys e no TradaZen em outubro de 2026. Só o texto da regra protege você.