Por que (não) construir mais um app de finanças - Parte 2: assinaturas e App Store
Cobrar por um app parece a parte simples. Coloca um botão "Assinar", integra com a loja, recebe um aviso quando alguém paga.
Na nossa cabeça, era uma tabela e uma coluna status.
Esta é a Parte 2 do diário que começamos na Parte 0. Na Parte 1, contamos o que deu trabalho no Open Finance. Agora é a vez de cobrar pelo app.
Contexto rápido: o Snabber tem plano grátis e planos pagos. Quem assina pela web paga no Stripe. Quem assina no iPhone paga para a Apple. Quem assina no Android paga para o Google.
O que a gente achou que era
- Um botão "Assinar" em cada app
- A loja avisa quando alguém paga
- Se parar de pagar, volta para o plano grátis
O que realmente era
Passar na revisão da App Store
Antes de cobrar alguém no iPhone, o app precisa ser aprovado pela Apple. E cada nova versão passa pela revisão de novo. Uma pessoa da Apple instala o app, testa as telas e confere tudo contra as regras da App Store.
As regras são públicas, e são muitas. A revisão confere cada uma com lupa. Não existe detalhe pequeno demais para ser motivo de rejeição.
Em agosto de 2026, mandamos uma versão nova com os planos reformulados. Voltou com três diretrizes citadas de uma vez:
Nenhum dos três quebrava o app. Os três bastavam para ele não ir ao ar.
E essas foram só as que apareceram de uma vez. Outras regras moldaram o app antes mesmo da primeira revisão. Quem oferece login com Google precisa oferecer também uma opção como "Entrar com a Apple". Quem deixa criar conta no app precisa deixar excluir a conta dentro do app, não só por e-mail ou pelo site.
Cada rejeição é uma rodada de dias: ler a mensagem da revisão, entender qual regra foi citada, ajustar, gerar uma versão nova, mandar de novo e esperar. Enquanto isso, a versão que estava pronta fica parada, junto com tudo o que tinha de novo.
Na web, a gente decide quando publicar. No iPhone, quem decide é a revisão.
Três lojas, três verdades
Passar na revisão é só a porta de entrada. Depois, cada loja tem o próprio jeito de dizer "ativo", "atrasado", "cancelado" e "em carência". O app precisa transformar tudo isso em uma resposta só.
A Apple não te conta que o usuário cancelou
Quando alguém desliga a renovação automática no iPhone, a assinatura continua "ativa" até o fim do período. Faz sentido para o usuário, que pagou até lá.
Para a gente, significava não saber quem estava de saída. Por meses, essa informação virava um e-mail no nosso inbox e mais nada. Só em setembro de 2026 ela passou a ser registrada de um jeito que dá para consultar.
Carência que nunca acabava
depois de vencer
Quando a cobrança falha, Apple e Stripe dão alguns dias de carência antes de cortar o acesso. A gente respeitava isso. Respeitava tanto que um usuário ficou 24 dias no plano pago depois de vencer, com a própria Apple já confirmando "expirado". Nosso código tratava "em carência" como ativo, sem prazo.
Cartão recusado, cliente no escuro
No Stripe, quando o cartão era recusado, a gente mostrava um aviso no app. Só que só vê o aviso quem abre o app. Quem não abria descobria quando perdia o acesso.
Hoje vai e-mail e push com um link direto para trocar o cartão. E como o Stripe manda o mesmo evento a cada nova tentativa de cobrança, foi preciso garantir que ninguém recebesse cinco e-mails iguais.
Perder o plano não pode apagar o banco
No plano grátis não tem Open Finance. Então, quando alguém volta para o grátis, as conexões com o banco são removidas. E isso não tem volta: para reconectar, a pessoa precisa autorizar tudo de novo no app do banco (e, como vimos na Parte 1, reconectar é o momento mais frágil).
Manter alguém num plano pago por engano é perda de receita. Apagar as conexões dele sem aviso é dano que não dá para desfazer.
Entre os dois erros, a gente escolhe o primeiro. Hoje ninguém perde conexão sem ter sido avisado antes, com pelo menos um dia para assinar de novo.
Assinatura compartilhada multiplica tudo
Quando lançamos o plano para a família, cada limite do app (conexões, agentes de IA, acesso à API) precisou passar a contar o grupo, e não a pessoa. Num dos primeiros testes, quatro membros de um plano tinham, juntos, quatro vezes os agentes que o plano vendia.
Alguns dos 84 commits com "Apple" no nome, de fevereiro a setembro de 2026.
O que fizemos
- ✓Uma tela de assinatura no iPhone pensada desde o início para as regras da App Store.
- ✓Uma regra única de "pode usar o plano pago" que traduz Stripe, Apple e Google.
- ✓Carência com prazo e confirmação da loja antes de cortar o acesso.
- ✓Registro de quem desligou a renovação no iPhone.
- ✓Aviso por e-mail e push quando a cobrança falha, sem duplicar.
- ✓Aviso obrigatório, com prazo, antes de qualquer perda de conexão bancária.
O que ainda não resolvemos
Toda versão nova do iPhone ainda é uma aposta. A gente lê as regras, testa, e mesmo assim só sabe se passou quando a resposta da revisão chega.
Excluir a conta no Snabber não cancela a assinatura da Apple. Só o próprio usuário consegue cancelar, nos Ajustes do iPhone. A gente avisa, mas sempre tem quem exclua a conta e continue sendo cobrado.
E a cada mudança de preço ou de plano, as três lojas precisam ser atualizadas e testadas separadamente. A da Apple, com revisão.
Se você vai cobrar em mais de uma loja
Leia as diretrizes da App Store antes de desenhar a tela de planos, não depois da primeira rejeição. E decida no primeiro dia qual é a sua fonte da verdade sobre quem é assinante.
Os eventos das lojas chegam atrasados, fora de ordem e repetidos. Trate todos como sugestão, não como ordem.
Quer ver como ficou? Crie sua conta no Snabber e teste o plano gratuito.
Na próxima parte: por que "a IA categoriza" é só metade da história.
