Pular para o conteúdo
KrokoPay

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 interativa
curl -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

  1. Período de teste iniciado

    20 de ago. de 2026
    O cliente assinou com cartão. Nada é cobrado durante o teste.subscription.created
  2. Primeira cobrança paga

    3 de set. de 2026
    Fim do teste: R$ 49,00 cobrados e a assinatura está ativa.charge.paid
  3. Renovada

    3 de out. de 2026
    R$ 49,00 cobrados pelo novo período.subscription.renewed
  4. Renovação recusada

    3 de nov. de 2026
    O cartão estava sem limite. A assinatura ficou em atraso.subscription.past_due
  5. Pagamento recuperado

    5 de nov. de 2026
    O 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.

  1. Crie os preços

    Um preço por plano e período, no painel ou pela API.

  2. Crie a assinatura

    POST /subscriptions com o cliente e o preço escolhido.

  3. Ouça os eventos

    Libere, avise ou limite o acesso a partir dos eventos subscription.*.

Seu endpoint de webhookJavaScript
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 teste

Transparê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
Veja o que já está definido em preços

Perguntas de times de SaaS

Respostas curtas, inclusive as que ainda são "ainda não".

Sim. Crie um preço por período para cada plano; a assinatura aponta para o preço que o cliente escolheu.

Ainda não existe uma ação de troca de plano com cobrança proporcional. Hoje você cancela e cria uma nova assinatura; um fluxo próprio de troca ainda será anunciado.

A assinatura passa para past_due e você recebe subscription.past_due. A agenda automática de novas tentativas ainda será anunciada.

Hoje as assinaturas são cobradas no cartão. Como funcionaria uma renovação por Pix ainda está em definição.

Não. O cartão é digitado no checkout próprio da KrokoPay, então os seus servidores nunca recebem o número do cartão.

Tarifas e prazos de repasse ainda serão anunciados. A página de preços mostra o que já está definido.

Por enquanto, não. A API é uma proposta de contrato provisória, documentada com exemplos em cURL e fetch puro.

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.