Skip to main content
Criou uma assinatura pela API e ela voltou com status: "incomplete"? Está tudo certo. Isso acontece quando a primeira cobrança ainda precisa ser resolvida: faltou um payment method, a tentativa foi recusada com allow_incomplete, ou você escolheu default_incomplete. Este guia mostra como levar essa primeira invoice até o pagamento e o que acontece se a janela de recuperação terminar.
incomplete é transitório, não um erro. Ele significa “assinatura registrada, aguardando o primeiro pagamento”. Não libere produto nem acesso enquanto ela estiver assim. Quando a invoice for paga, a assinatura muda para active e o subscription.updated traz a transição.
Este guia é para quando você cria a assinatura, via POST /v1/subscriptions — venda assistida, backoffice, fluxo custom. Se o cliente assina pelo checkout hospedado, a session cuida da primeira cobrança por você: comece por Crie assinaturas para seu SaaS. Como nos outros guias, tudo aqui roda em test mode (ch_test_...).

1. O resultado do create depende da primeira cobrança

Sem trial e com cobrança automática, o create monta a primeira invoice e o payment intent. O payment_behavior decide o que a API faz quando essa cobrança não pode ser concluída: pending_if_incomplete é exclusivo de updates e retorna 400 no create. Em trial, send_invoice ou invoice de valor zero, não existe pagamento inicial para esse campo bloquear.

2. Caminho feliz: cartão salvo e resposta active

1

Crie a assinatura com um método de pagamento padrão

Passe default_payment_method no create. Com o comportamento padrão, a primeira cobrança é tentada dentro do mesmo request:
POST /v1/subscriptions
Se o pagamento passar, a resposta 200 já traz status: "active". Se for recusado, o mesmo allow_incomplete retorna 200 com status: "incomplete" para você recuperar a invoice.
2

Use error_if_incomplete quando o create precisar ser tudo ou nada

Troque o campo para payment_behavior: "error_if_incomplete". Pagamento aprovado continua retornando 200 com a subscription active; pagamento recusado ou ausência de método retorna 402, sem deixar uma subscription pública para abandonar depois.
3

Sincronize o acesso pelos webhooks

Na criação paga imediatamente, subscription.created já carrega status: "active". Quando uma subscription que estava incomplete é paga depois, subscription.updated traz o diff incomplete → active:

3. Sem cartão salvo? Mande a fatura hospedada

Criou sem default_payment_method? Nada é cobrado sozinho — mas a primeira fatura já existe e tem uma página de pagamento pronta. São duas consultas: busque a assinatura (GET /v1/subscriptions/sub_iQbv6AKoRVPNH8QE) e pegue no campo latest_invoice o ID da primeira fatura; depois busque a fatura (GET /v1/invoices/inv_gAMqMQJABoeG7jPk) — a resposta traz hosted_invoice_url, uma página de pagamento hospedada, pronta para WhatsApp ou e-mail. Quando o cliente pagar por ela, o fluxo é o mesmo da seção anterior: invoice.paid, subscription.updated e a assinatura active.
O importante é o prazo: a primeira cobrança tem 23 horas para fechar. A página hospedada continua funcionando durante essa janela.

4. Cartão recusado? Tente pagar a invoice de novo

Enquanto a subscription estiver incomplete, não é necessário criar outra. Troque ou salve o payment method, pegue a invoice em latest_invoice e faça uma nova tentativa explícita:
POST /v1/invoices/inv_gAMqMQJABoeG7jPk/pay
Esse endpoint cria uma nova tentativa para a invoice aberta. Quando ela passa, chegam payment.intent.succeeded, invoice.paid e subscription.updated; a subscription vira active. O contrato completo está em POST /v1/invoices/{id}/pay.

5. Reaja ao estado atual de cada evento

A criação e a ativação disparam uma sequência previsível de webhooks: Com error_if_incomplete, uma falha retorna 402 e não emite eventos dos recursos provisórios, porque eles não passaram a existir publicamente. Se o seu receiver ainda não existe, o guia de primeiro pagamento monta um em dez linhas.

Quando a primeira cobrança não fecha

Se a primeira cobrança não for paga em até 23 horas, a Chargefy expira a assinatura — em cadeia:
1

A assinatura vira incomplete_expired

incomplete → incomplete_expired, com subscription.updated trazendo o diff. Esse estado é terminal.
2

A primeira fatura é anulada

A fatura subscription_create que estava open passa para void e dispara invoice.voided.
3

A cobrança pendente é cancelada

O payment_intent em aberto vira canceled e dispara payment.intent.canceled.
Duas pegadinhas aqui:
  • Falha não é atraso. Com allow_incomplete, cartão recusado na primeira cobrança não leva a assinatura para past_due: a fatura continua open e a assinatura continua incomplete até ser paga ou a janela vencer. Com error_if_incomplete, a mesma recusa encerra o create com 402 e não cria a assinatura pública.
  • incomplete_expired não volta. Para o cliente assinar de novo, crie uma assinatura nova.

incomplete, past_due e unpaid não são a mesma coisa

É comum confundir o estado da primeira cobrança com o das renovações. A régua é direta: past_due e unpaid pertencem ao mundo das renovações — com retentativas e régua de cobrança automáticas por conta da Chargefy. Esse lado da história está em Crie assinaturas para seu SaaS. O mapa completo de estados:

E o trial?

Assinatura criada com trial_period_days ou trial_end não passa por incomplete: ela nasce trialing e a primeira cobrança só acontece no fim do trial. Sem cartão salvo, a resposta do create traz pending_setup_intent para você coletar o cartão durante o período gratuito, e trial_settings.end_behavior decide o que acontece se ele terminar sem método de pagamento. Detalhes em Trial.

Próximos passos

Crie assinaturas para seu SaaS

O guia completo da recorrência: trial, renovações, régua de cobrança, pró-rata e portal do cliente.

Criar assinatura (API)

O contrato do POST /v1/subscriptions, incluindo trial e importação.

Payment Intents

A cobrança que confirma a primeira fatura e leva a assinatura a active.

Objeto subscription

Schema público completo, todos os status e os campos retornados.