Skip to main content
Um pagamento na Chargefy não é um objeto único — é a colaboração de vários objetos, cada um com uma responsabilidade. Esta página é o mapa que liga todos eles: do clique de compra até o dinheiro liquidado. Os detalhes de cada objeto vivem nas páginas dedicadas; aqui o foco é como eles se conectam e quem é fonte da verdade em cada etapa.
Um princípio acima de tudo: separe contexto de compra de resultado financeiro.A experiência do comprador (a checkout.session) é descartável e só reflete o que aconteceu. Quem é o livro-razão da cobrança é o payment_intent. Quem registra cada tentativa concreta de mover dinheiro é a charge. Não trate a session — nem qualquer callback de frontend — como prova de pagamento.

Os objetos e seus papéis

ObjetoResponsabilidadeQuem criaFonte da verdade para
checkout.sessionA tentativa de compra: coleta o comprador, mostra os métodos, confirma a escolha. Descartável e com expiração.Seu backend (ou um clique em payment link).Contexto e progresso da compra (status, payment_status).
payment_intentO ciclo de vida da cobrança: valor, moeda, método, status, próxima ação e desfecho.Seu backend, a session ou uma invoice.Estado financeiro da cobrança.
chargeCada tentativa concreta de mover dinheiro. Somente leitura.O sistema, ao confirmar um intent.O que foi cobrado e o que entrou.
invoiceDocumento de cobrança de assinatura (e de cobrança avulsa quando pedida).O ciclo de assinatura ou a API.Cobrança recorrente e contábil.
payment_methodInstrumento salvo ou tokenizado.Tokenização no checkout ou setup intent.Como cobrar de novo no futuro.
A Chargefy também registra movimentações internas de processamento para conciliação e suporte. Esses IDs internos não fazem parte do contrato público e não devem ser o objeto de sucesso da sua integração. Integre por checkout.session, payment_intent, charge, invoice e webhooks.

O caminho completo

O fluxo padrão vai de uma intenção de compra até dinheiro liquidado, atravessando os objetos em ordem. Nem todo fluxo passa por todos — uma cobrança server-to-server pula a session; uma compra avulsa pula a invoice.
OrigemComo a cobrança nasceGera invoice?
Payment linkCada clique materializa uma checkout.session nova.Só se a session pedir (invoice_creation=true).
Checkout session (backend)Seu servidor cria a session sob demanda; a confirmação dispara o payment_intent.Recorrente: sempre. Avulso: só com invoice_creation=true.
Payment intent diretoServer-to-server, sem session — você já sabe valor, customer e método.Não (a menos que o intent venha de uma invoice).
AssinaturaCada ciclo materializa uma invoice, que cobra o método salvo via payment_intent.Sempre.
Compra avulsa não gera invoice por padrão. Em mode=payment, o payment_intent é o documento financeiro. A invoice só materializa se a session foi criada com invoice_creation=true. Em assinatura, a invoice é sempre o documento de cada ciclo.

Síncrono vs. assíncrono

A grande bifurcação do ciclo é o método de pagamento. Cartão costuma resolver na hora; PIX e boleto ficam pendentes até a compensação chegar de forma assíncrona — e é aí que mora o erro mais comum de integração.
MétodoConfirmaçãoEstado intermediárioQuando o dinheiro entra
credit_cardSíncronaprocessingNormalmente na própria resposta do confirm.
pixAssíncronapending + next_action (QR code)Quando o comprador paga no banco/app.
boletoAssíncronapending + next_action (linha digitável)Na compensação, dias depois.
next_action ausente não é pagamento confirmado. Uma checkout.session de PIX/boleto pode ficar status: "complete" com payment_status: "unpaid" até a compensação. Quem confirma o sucesso é o webhook — nunca a resposta síncrona do confirm.

Como os status se alinham

Cada objeto tem o próprio vocabulário de status. O quadro abaixo mostra como eles se movem juntos ao longo de uma compra. Os nomes são exatamente os do contrato público de cada objeto.
Etapacheckout.session.statuscheckout.session.payment_statuspayment_intent.statuscharge.status
Sessão criadaopenunpaidrequires_payment_method / requires_confirmation
Comprador confirma (cartão)completeunpaidpaidprocessingsucceededprocessingsucceeded
Comprador confirma (PIX/boleto)completeunpaidpendingpending
Pagamento assíncrono liquidacompletepaidsucceededsucceeded
Recusa de cartãocompleteunpaidrequires_payment_methodfailed
Sessão sem confirmação por 24hexpiredunpaidcanceled
Total zero (ex.: trial ou preço recorrente gratuito)completeno_payment_required
status e payment_status da session são eixos independentes: complete significa que o comprador terminou o formulário; paid significa que o dinheiro entrou. Em PIX/boleto eles divergem temporariamente.

Ciclo de vida do payment intent

O payment_intent é o objeto que carrega o estado financeiro do início ao fim. Seus status:
StatusSignificado
requires_payment_methodFalta definir o método, ou o anterior falhou.
requires_confirmationMétodo definido; pronto para confirmar.
pendingAguardando ação do comprador ou compensação assíncrona (PIX/boleto).
processingPagamento em processamento.
requires_captureCartão autorizado; falta capturar (somente captura manual).
succeededPagamento concluído.
failedPagamento falhou.
canceledCobrança cancelada.
Boleto não pago expira sozinho. Um intent de boleto que passa de expires_at sem compensar vira canceled automaticamente, com cancellation_reason: "abandoned", e emite payment.intent.canceled.

Charge: cada tentativa

Um payment_intent pode produzir mais de uma charge (uma recusa seguida de nova tentativa). O intent aponta sempre a mais recente em latest_charge. A charge é somente leitura e percorre pending → processing → succeeded | failed | canceled. Use paid/captured/amount_captured para saber se o dinheiro de fato entrou — status: "succeeded" indica aprovação, não necessariamente captura.

Invoices no ciclo recorrente

Para assinaturas, a invoice é o documento de cada ciclo: ela congela os valores, cobra o método salvo via payment_intent e registra o resultado contábil.
StatusSignificado
openCriada, pagável e com valores congelados.
paidPaga (ou marcada como paga fora do fluxo automático).
voidAnulada.
uncollectibleBaixa contábil manual: você marca a fatura como incobrável. Tentativas automáticas esgotadas deixam a fatura open e a assinatura unpaid — não vêm parar aqui sozinhas.
O billing_reason explica por que a invoice nasceu:
ValorQuando aparece
subscription_createCriação da assinatura. Trial gratuito, desconto total ou preço recorrente gratuito podem vir com total 0; caso contrário, vem com o valor da primeira cobrança.
subscription_cycleRenovação periódica (inclui a primeira cobrança real após um trial).
subscription_updateMudança no meio do ciclo.
manualCobrança avulsa via API ou admin.

Como os webhooks sinalizam cada transição

Webhooks são a fonte confiável para reagir ao ciclo. Cada transição importante emite um evento cujo data.object carrega o objeto público completo no estado atual; eventos de update trazem data.previous_attributes com os valores anteriores dos campos alterados. A lista completa está em Webhook Events. Mapa de evento por fluxo:
FluxoEvento de referência para liberar produto
Checkout hospedado concluído (cartão)checkout.session.completed
Método assíncrono pago depoischeckout.session.async.payment.succeeded
Método assíncrono falhou ou expiroucheckout.session.async.payment.failed
Cobrança direta pagapayment.intent.succeeded
Cobrança direta falhoupayment.intent.failed
Cobrança direta cancelada / boleto expiradopayment.intent.canceled
Tentativa de cobrança aprovadacharge.succeeded
Tentativa de cobrança recusadacharge.failed
Invoice de assinatura pagainvoice.paid
Invoice com tentativa falhainvoice.payment.failed
Não libere produto, acesso ou serviço por callback de frontend. O comprador pode fechar a aba antes do redirect, e PIX/boleto liquidam fora da página. Use o webhook como gatilho de fulfillment.

Idempotência e reconciliação

Webhooks podem ser reenviados, e a mesma transição pode chegar mais de uma vez. Trate cada evento como idempotente:
1

Persista o id do evento

Guarde o id (evt_*) de cada webhook recebido. Se ele já foi processado, ignore — é uma reentrega.
2

Correlacione pelo seu próprio identificador

Use metadata (ex.: metadata.order_id) para ligar o evento ao seu pedido, sem depender de IDs internos da Chargefy. O metadata é ecoado em todos os webhooks do recurso.
3

Confirme o estado pelo objeto, não pelo evento

Em caso de dúvida, consulte o payment_intent ou a charge pelo id do payload para ler o estado atual antes de agir.

Próximos passos

Checkout Sessions

A tentativa de compra e seus dois eixos de estado.

Payment Intents

O livro-razão da cobrança ao longo do ciclo.

Charges

Cada tentativa concreta de mover dinheiro.

Webhook Events

A lista completa de eventos e o formato do payload.