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. Opayment_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 Se o pagamento passar, a resposta
default_payment_method no create. Com o comportamento padrão, a
primeira cobrança é tentada dentro do mesmo request:POST /v1/subscriptions
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 semdefault_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.
4. Cartão recusado? Tente pagar a invoice de novo
Enquanto a subscription estiverincomplete, 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
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.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 comtrial_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.

