Indicadores Financeiros

Stripe e nota fiscal no SaaS: como evitar emissão duplicada?

Como relacionar cobranças da Stripe e NFS-e, tratar webhooks repetidos e conciliar pagamentos, taxas e reembolsos.

Capa da Ext. com o título Stripe e nota fiscal sem duplicar e a ilustração de carimbo grafite sobre uma almofada de tinta vermelha
Neste artigo 10 seções
  1. 01A Stripe emite nota fiscal?
  2. 02Qual evento usar na assinatura?
  3. 03Quais identificadores guardar?
  4. 04Como evitar duplicidade no webhook?
  5. 05E se a emissão der timeout?
  6. 06Como conciliar cobrança, taxas e repasse?
  7. 07Reembolso cancela a nota fiscal?
  8. 08E se o cliente estiver no exterior e pagar em dólar?
  9. 09O que conferir antes de ativar a automação?
  10. 10Como esse cuidado aparece na API da Ext.

Para evitar nota fiscal duplicada entre Stripe e NFS-e no SaaS, ligue cada operação de serviço à cobrança e à nota por identificadores persistentes, trate webhooks repetidos sem repetir a emissão e consulte pedidos com resultado desconhecido antes de reenviar. A Stripe não emite a NFS-e: a invoice organiza a cobrança, e a nota cabe à sua empresa.

Fontes e documentação técnica conferidas em 21/10/2026.

A Stripe emite nota fiscal?

Não. A invoice da Stripe não é NFS-e: a Stripe a descreve como uma lista detalhada dos serviços prestados, com custo, quantidade e impostos, usada para cobrar o cliente (como funciona o faturamento). Já o Portal Nacional define a NFS-e como documento digital que registra a prestação de serviços (o que é a NFS-e). A Stripe não emite NFS-e para o seu cliente: quem emite é a sua empresa, no emissor do município ou no Sistema Nacional NFS-e.

Também não espere nota das taxas da Stripe. A própria Stripe informa que recebeu licença de instituição de pagamento no Brasil em maio de 2022 e que, a partir das tarifas daquele mês, empresas brasileiras não recebem NFS-e pelas taxas cobradas. Os valores que antes vinham na nota ficam nos relatórios financeiros do Dashboard, conforme a página de suporte sobre tributos nas taxas da Stripe (conferida em 21/10/2026).

Para quem desenvolve o produto, a consequência é prática: o cadastro precisa ligar cliente, contratação, cobrança e documento fiscal. O e-mail de pagamento aprovado não encerra esse trabalho.

Antes de automatizar, combine com o contador qual operação será documentada e quando. Contrato, período de prestação, município, atividade e regime precisam entrar nessa decisão. Não transforme o horário de chegada de um webhook em definição universal do fato gerador ou da competência.

Qual evento usar na assinatura?

No Stripe Billing, invoice.paid informa que uma invoice passou para paga. Segundo a documentação do faturamento, isso acontece mesmo sem um pagamento bem-sucedido associado quando a fatura:

  • é de período de avaliação (trial) ou de assinatura gratuita;
  • tem o valor devido coberto pelo saldo de crédito do cliente ou abaixo do valor mínimo cobrável;
  • foi marcada como paga fora da Stripe (paid_out_of_band).

Nesses casos chega invoice.paid, mas não invoice.payment_succeeded. Antes de emitir, confira o valor efetivamente cobrado: fatura de trial ou zerada não gera NFS-e de R$ 0, e valor coberto por crédito que já foi documentado em nota anterior não deve ganhar uma segunda nota. Pagamento fora da Stripe também pode já ter nota emitida por outro fluxo. A referência de eventos confirma o caso do pagamento fora da plataforma.

O PaymentIntent acompanha o ciclo de um pagamento. Na assinatura, esse pagamento pode estar relacionado à invoice. Emitir uma nota em payment_intent.succeeded e outra em invoice.paid, sem reconhecer o vínculo, pode documentar a mesma operação duas vezes.

Escolha uma entrada principal para avaliar a operação fiscal. Os demais eventos atualizam sua situação financeira. Nas assinaturas, a documentação de webhooks do Billing ajuda a distinguir renovação, falha e pagamento; a política fiscal continua sendo uma decisão separada.

Quais identificadores guardar?

Esta é uma proposta de organização da integração. Os nomes dos estados são internos e podem mudar conforme o sistema.

RegistroIdentificador persistidoFinalidade
Notificação recebidaConta Stripe, ambiente e event.idReconhecer entrega repetida
Cobrança recorrenteInvoice e vínculo à assinaturaLocalizar a obrigação de cobrança
PagamentoPaymentIntent ou referência equivalenteAcompanhar a liquidação
Operação fiscalChave interna da prestação ou competênciaImpedir repetição do mesmo efeito fiscal
Pedido ao emissorReferência externa, protocolo ou identificador aceitoConsultar processamento sem criar novo pedido
Documento autorizadoNúmero, chave e status no emissorComprovar emissão e acompanhar alterações

Inclua a empresa prestadora na chave fiscal. Se uma invoice reunir operações com tratamentos diferentes, defina o desdobramento com o contador. Uma relação entre invoice e nota não precisa ser sempre de um para um.

Como evitar duplicidade no webhook?

A Stripe avisa que eventos podem chegar repetidos e fora de ordem; recomenda registrar seus identificadores e processar de forma assíncrona. Essas características estão nas boas práticas de webhooks.

Uma arquitetura possível é validar, persistir, confirmar o recebimento e processar:

  1. Validar a origem. Confira Stripe-Signature com o segredo do endpoint e o corpo bruto recebido, antes de transformações que alterem seu conteúdo. A orientação de assinatura detalha essa exigência.
  2. Persistir o trabalho. Grave o evento validado e a pendência de processamento duravelmente antes de responder 2xx. Uma caixa de entrada no banco, consumida por um worker, evita depender de memória volátil.
  3. Resolver a operação. O worker consulta os recursos necessários e identifica a prestação correspondente. Eventos atrasados não devem fazer o estado local regredir.
  4. Reservar a emissão. Uma restrição única da chave fiscal e uma transição atômica de estado impedem que workers concorrentes iniciem a mesma operação.
  5. Registrar o resultado. Guarde a referência enviada e a resposta do emissor; mantenha pendências recuperáveis quando a conclusão ainda não estiver confirmada.

Não basta descartar o mesmo event.id: eventos diferentes podem apontar para a mesma operação. A proteção final pertence ao efeito fiscal, preservando operações legítimas futuras.

Ao criar recursos na Stripe, use a idempotência oferecida pela API. Essa proteção vale para a chamada à Stripe; ela não protege automaticamente uma chamada ao emissor de NFS-e.

E se a emissão der timeout?

Imagine que o emissor aceite a solicitação, mas a conexão caia antes da resposta. Marcar o caso como “não emitido” e criar outro pedido pode duplicar a nota.

Proponha um estado “resultado desconhecido”. Preserve a referência original, consulte o processamento e só decida sobre reenvio após essa verificação. Se o provedor não permitir concluir a consulta, encaminhe a pendência para análise, com bloqueio de reemissão automática.

Os meios de consulta e repetição dependem da integração escolhida. Para quem emite pelo Sistema Nacional NFS-e, o Portal Nacional publica os manuais de API para contribuintes na documentação de produção e o índice das APIs de produção restrita e produção. Confira também os requisitos do município atendido e não suponha que todos os provedores aceitem a mesma chave ou o mesmo protocolo.

Como conciliar cobrança, taxas e repasse?

O payout movimenta saldo da Stripe para a conta bancária e pode reunir várias transações. A documentação de conciliação permite rastrear os movimentos que compõem repasses automáticos; os repasses manuais exigem conciliação própria.

Organize o fechamento em camadas: operações de serviço, documentos fiscais, cobranças, pagamentos e movimentos de saldo. Depois relacione esses movimentos ao banco. O repasse não representa uma nova venda e não define, sozinho, a receita do período.

Mantenha valor cobrado, taxas, reembolsos e líquido recebido em campos distintos. A base de cálculo do ISS é o preço do serviço, conforme o art. 7º da Lei Complementar nº 116/2003: a nota sai pelo valor cobrado do cliente, e a taxa da Stripe é despesa da sua empresa, que não reduz essa base. Por isso, não copie o líquido do payout para o valor da nota.

Reembolso cancela a nota fiscal?

Não. A Stripe permite reembolsos totais ou parciais, conforme a documentação de refunds, mas isso só movimenta o dinheiro. A NFS-e continua válida até que a sua empresa a cancele no emissor. E, ao contrário da invoice da Stripe, a NFS-e não tem nota de crédito: o ajuste passa pelo cancelamento, que no padrão nacional é um evento registrado sobre a nota (os leiautes de eventos estão na documentação de produção).

  • Reembolso total. Cancele a nota pelo evento de cancelamento, dentro do prazo definido pelo município.
  • Fora do prazo. O cancelamento passa a depender das regras do município e de análise fiscal com o contador; não automatize esse caso.
  • Reembolso parcial. O caminho usual é cancelar a nota e emitir outra com o valor correto, dentro do prazo. No Sistema Nacional, a substituição de nota de empresa ME/EPP só aceita corrigir a descrição: mudança de valor, tomador ou competência é rejeitada (código E0063).

A taxa de processamento da transação original não volta: a Stripe informa que não devolve essas tarifas no reembolso. Ela segue como despesa no financeiro e não altera o valor da nota cancelada ou reemitida.

A contestação do cliente com o banco (chargeback) chega como charge.dispute.created, segundo a referência de eventos. Ela pede a mesma análise fiscal do reembolso, com um cuidado a mais: a disputa ainda pode ser revertida a favor da empresa, com os fundos reintegrados. Abra a pendência na chegada do evento e decida a providência fiscal com o contador depois do desfecho.

Relacione reembolso e contestação ao pagamento e à operação original. Um status “reembolsado” no financeiro não deve virar “nota cancelada” sem confirmação no emissor.

E se o cliente estiver no exterior e pagar em dólar?

Cobrança em moeda estrangeira para tomador no exterior pode ser exportação de serviço, sobre a qual o ISS não incide (art. 2º, I, da LC 116/2003). O parágrafo único do mesmo artigo faz a ressalva: não há exportação quando o serviço é desenvolvido no Brasil e o resultado se verifica aqui, ainda que o pagamento venha do exterior.

A nota exige o valor convertido para reais, então guarde a moeda, o valor original, a taxa de câmbio e a data usadas na conversão. Valide com o contador o enquadramento de cada contrato e a regra de conversão antes de automatizar.

O que conferir antes de ativar a automação?

Teste eventos repetidos, concorrentes e fora de ordem, além de timeout após aceitação pelo emissor. Confira também fatura de trial ou zerada, valor coberto por crédito, pagamento registrado fora da Stripe, reembolso parcial, contestação e cliente no exterior. O resultado esperado é rastreabilidade: cada operação pode ser explicada sem depender de alguém comparar PDFs manualmente.

Como esse cuidado aparece na API da Ext.

A referência da API da Ext. leva essa proteção para a própria emissão. O campo reference, tipicamente o id da fatura no seu sistema, é único por empresa (em cada modo, teste ou produção) e permite buscar a nota depois. Reenviar a mesma referência devolve 409 nfse.reference_in_use, com o id da nota que já existe, sem prazo de validade. Duas notas legítimas para a mesma fatura, como na reemissão após um reembolso parcial, exigem referências diferentes.

O header Idempotency-Key complementa: dentro de 24h, o mesmo corpo com a mesma chave devolve a primeira resposta, sem emitir de novo; passada essa janela, a chave é esquecida. A documentação também distingue failed de indeterminate: no segundo caso, pode existir uma nota autorizada sem confirmação local, e a orientação é não reemitir. A página da API explica os requisitos de acesso, que dependem do plano e da liberação da empresa.

Para revisar atividade e enquadramento, comece pela consulta de CNAE. Se o problema está no fechamento entre cobrança, nota e contabilidade, conheça a Ext. e leve ao atendimento um exemplo anonimizado do fluxo: contrato, invoice, pagamento, documento fiscal e repasse.

Ficou com dúvida no seu caso?

Manda no WhatsApp: quem responde é o time da Ext., sem compromisso.

Falar no WhatsApp ou criar minha conta

Perguntas frequentes

A Stripe emite nota fiscal?

Não. A invoice da Stripe é um documento de cobrança, não uma NFS-e; a nota do serviço prestado é emitida pela sua empresa. No Brasil, a Stripe também não emite NFS-e das próprias taxas desde as tarifas de maio de 2022, e os valores ficam nos relatórios financeiros do Dashboard.

Posso emitir NFS-e sempre que chegar invoice.paid?

Não às cegas. O evento também chega quando a fatura é de trial ou gratuita, quando o valor é coberto por saldo de crédito ou fica abaixo do mínimo cobrável e quando ela é marcada como paga fora da Stripe. Confira o valor efetivamente cobrado antes de emitir: fatura de R$ 0 não gera nota.

Como evitar nota fiscal duplicada em webhook da Stripe?

Registre event.id e proteja a operação fiscal com uma chave de negócio persistente e exclusão concorrente. Assim, diferentes eventos da mesma operação também encontram o documento já solicitado ou emitido.

O que fazer quando a API de NFS-e demora e dá timeout?

Mantenha a solicitação como resultado desconhecido e consulte seu status no emissor ou provedor antes de reenviar. Ausência de resposta não comprova que a emissão falhou.

A taxa da Stripe reduz o valor da nota fiscal?

Não. A base de cálculo do ISS é o preço do serviço (LC 116/2003, art. 7º): a nota sai pelo valor cobrado do cliente, e a taxa da Stripe é despesa da sua empresa. Também não use o líquido do repasse bancário como valor da nota.

Reembolsar na Stripe cancela a NFS-e?

Não. O reembolso só movimenta o dinheiro. A nota precisa ser cancelada no emissor, por evento de cancelamento, dentro do prazo do município; no reembolso parcial, o caminho usual é cancelar e emitir outra com o valor correto. A taxa da Stripe da transação original não volta.

Cliente no exterior pagando em dólar paga ISS?

Pode ser exportação de serviço, sobre a qual o ISS não incide (LC 116/2003, art. 2º, I), mas não há exportação quando o resultado do serviço se verifica no Brasil. A nota sai em reais, com conversão do valor cobrado. Valide o enquadramento com o contador.

FontesStripe — Taxes on Stripe fees for Brazil-based businessesStripe — How invoicing worksStripe — Subscription webhooksStripe — Types of eventsStripe — WebhooksStripe — Manage webhook endpointsStripe — Idempotent requestsStripe — Payment Intents APIStripe — Payout reconciliationStripe — Refund and cancel paymentsLei Complementar nº 116/2003 (ISS)Portal NFS-e — O que é a NFS-ePortal NFS-e — Documentação atual de produçãoPortal NFS-e — APIs de produção restrita e produçãoExt. — referência pública da API de NFS-e