Para SaaS
Cobrança recorrente que o seu backend consegue acompanhar
O difícil de cobrar por software não é o primeiro pagamento. É saber, todo mês, quem renovou, de quem o cartão falhou e quem cancelou. A KrokoPay transforma cada um desses momentos em um status de assinatura e um evento de webhook.
Escolha um plano ao lado: a requisição muda junto.
Rota Certa · escolha seu plano
Demo interativacurl -X POST https://api.krokopay.app/v1/subscriptions \ -H "Authorization: Bearer kp_test_sk_4f9a2c7e1b8d4a6f9c3e5d7b" \ -H "Idempotency-Key: signup_cus_7Hq2LmN4pZx8Wd_starter" \ -H "Content-Type: application/json" \ -d '{ "customer_id": "cus_7Hq2LmN4pZx8Wd", "price_id": "price_2Rc8StMnTh4Qa1", "method": "card" }'Mensal ou anual é só outro price_id. Preços fictícios definidos pela empresa do exemplo.
O mês depois da assinatura
Cada momento da cobrança tem um nome
Nada de adivinhar pelo extrato. Cada situação abaixo muda o status da assinatura e envia um evento; o seu app decide o que isso significa para o acesso.
- O que aconteceu
- Um cliente assina
- Evento e status
subscription.createdAtiva- O que o seu app costuma fazer
- Criar a conta e liberar os recursos do plano.
- O que aconteceu
- O período renova e é pago
- Evento e status
subscription.renewedAtiva- O que o seu app costuma fazer
- Estender o acesso até o fim do novo período.
- O que aconteceu
- O pagamento da renovação falha
- Evento e status
subscription.past_dueEm atraso- O que o seu app costuma fazer
- Mostrar um aviso pedindo para atualizar a forma de pagamento.
- O que aconteceu
- Você pausa a assinatura
- Evento e status
subscription.pausedPausada- O que o seu app costuma fazer
- Manter os dados e limitar o acesso durante a pausa.
- O que aconteceu
- Você retoma a assinatura
- Evento e status
subscription.resumedAtiva- O que o seu app costuma fazer
- Liberar o plano de novo a partir do próximo período.
- O que aconteceu
- A assinatura é cancelada
- Evento e status
subscription.canceledCancelada- O que o seu app costuma fazer
- Limitar o acesso ao fim do período já pago.
Veja acontecer
Simule uma assinatura da adesão à recuperação
Escolha um cenário e acompanhe o status, as cobranças e os eventos de uma assinatura fictícia. É o mesmo modelo que o seu backend recebe.
- Status: trialing, active, past_due, paused, canceled.
- Pause e retome sem perder o cliente.
- Tudo aparece também no seu painel, sem precisar de código para conferir.
Clube de membros
Plano mensal · R$ 49,00/mês
sub_5Hn2RtK8wPz4Bq- Status atual
- Ativa
- Próxima cobrança
- 3 de dez. de 2026
Histórico da assinatura
Período de teste iniciado
20 de ago. de 2026O cliente assinou com cartão. Nada é cobrado durante o teste.subscription.createdPrimeira cobrança paga
3 de set. de 2026Fim do teste: R$ 49,00 cobrados e a assinatura está ativa.charge.paidRenovada
3 de out. de 2026R$ 49,00 cobrados pelo novo período.subscription.renewedRenovação recusada
3 de nov. de 2026O cartão estava sem limite. A assinatura ficou em atraso.subscription.past_duePagamento recuperado
5 de nov. de 2026O cliente atualizou o cartão e a renovação foi paga.subscription.renewed
Integração
Três passos, um webhook
Crie a assinatura quando o cliente escolher o plano, deixe o checkout hospedado coletar o cartão e mantenha o acesso sincronizado a partir de um único endpoint.
Crie os preços
Um preço por plano e período, no painel ou pela API.
Crie a assinatura
POST /subscriptions com o cliente e o preço escolhido.
Ouça os eventos
Libere, avise ou limite o acesso a partir dos eventos subscription.*.
export async function POST(request) { const payload = await request.text(); const signature = request.headers.get("KrokoPay-Signature"); if (!verifySignature(payload, signature, process.env.KROKOPAY_WEBHOOK_SECRET)) { return new Response(null, { status: 400 }); } const event = JSON.parse(payload); const subscription = event.data.object; switch (event.type) { case "subscription.created": case "subscription.renewed": case "subscription.resumed": await accounts.grantAccess(subscription.customer_id, subscription.current_period_end); break; case "subscription.past_due": await accounts.showPaymentBanner(subscription.customer_id); break; case "subscription.paused": case "subscription.canceled": await accounts.limitAccess(subscription.customer_id); break; } return new Response(null, { status: 200 });}verifySignature representa a verificação de assinatura descrita na documentação de webhooks. Proposta de contrato, sujeita a mudanças.
Proposta provisória de contrato de API — não é um endpoint em operação.
Documentação de webhooksAmbiente de testeTransparência
O que está pronto e o que ainda não está
Preferimos mostrar as lacunas a prometer que elas não existem. Se alguma delas trava o seu lançamento, conte para a gente.
Já está no produto
- Preços mensais e anuais por plano.
- Status e eventos de webhook para cada mudança do ciclo de vida.
- Pausar, retomar e cancelar pelo painel ou pela API.
- Modo de teste com chaves de teste e dados fictícios.
Ainda em definição
- Upgrade e downgrade com cobrança proporcional.A definir
- Agenda automática de novas tentativas após uma renovação recusada.A definir
- Renovação por Pix.A definir
- Tarifas e prazos de repasse.A definir
Perguntas de times de SaaS
Respostas curtas, inclusive as que ainda são "ainda não".
Continue explorando
Os produtos por trás desta página, a documentação para integrá-los e os outros segmentos.
Comece a cobrar o seu primeiro plano
Crie sua conta, configure um preço de teste e veja os eventos chegando.
Nenhum pagamento real é feito.
