Para usar Pix no n8n com a xFlow, você combina dois nós nativos: o HTTP Request, que chama a API Pix da xFlow para criar a cobrança, e o Webhook, que recebe o aviso quando o Pix é pago. A xFlow não tem um nó próprio no n8n. A API é REST, com JSON, autenticação HTTP Basic e valores em centavos, e o HTTP Request conversa com qualquer API assim.
O que você precisa
- Uma chave de API, gerada no painel em Desenvolvedores > Chaves de API. Comece pela chave de teste (
pk_test_esk_test_): ela pode ser criada antes da aprovação do cadastro. - Um n8n com endereço público em
https://, no n8n Cloud ou numa instalação própria. A xFlow só entrega webhooks para URLhttps://pública. - O segredo de assinatura do endpoint de webhook, gerado quando você cadastra a URL na xFlow.
Passo 1: criar a cobrança com o HTTP Request
Configure o nó HTTP Request:
| Campo | Valor |
|---|---|
| Method | POST |
| URL | https://app.xflowpayments.com/api/v1/charges |
| Authentication | Generic Credential Type, com Basic Auth |
| Username / Password | chave pública / segredo |
| Send Headers | Idempotency-Key com o id do seu pedido |
| Send Body | JSON, com Specify Body em Using JSON |
O corpo usa os dados do nó anterior, que pode ser um formulário, uma planilha ou o seu CRM:
{
"amountCents": {{ $json.valor_centavos }},
"customer": {
"name": "{{ $json.nome }}",
"email": "{{ $json.email }}",
"document": "{{ $json.cpf }}"
},
"external_reference": "{{ $json.pedido_id }}"
}Três regras evitam erro 400 validation: o valor vai em centavos e como número (R$ 19,90 é 1990), o documento vai só com dígitos e name, email e document são obrigatórios.
Atalho: o botão Import cURL aceita o exemplo da documentação. Segundo o n8n, os valores importados viram texto, então troque para Using JSON para manter amountCents como número.
A resposta 201 traz o id, o status pending, o pix.copyPaste (copia e cola) e o pix.qrCodeBase64 (imagem PNG em data-URL). Mapeie {{ $json.pix.copyPaste }} no nó que avisa o cliente. O header Idempotency-Key garante que uma nova tentativa devolva a mesma cobrança em vez de gerar outro Pix. Entenda em idempotência em API de pagamento.
Passo 2: receber o webhook
No nó Webhook, escolha o método POST, defina Respond como Using 'Respond to Webhook' Node e ative a opção Raw Body. Ela entrega o corpo exatamente como chegou, que é o que a assinatura exige.
O nó tem duas URLs. A Test URL escuta enquanto você testa no editor. A Production URL vale com o workflow publicado. Cadastre a Production URL na xFlow, em Integrações > Webhooks, com o evento transaction.paid.
Passo 3: validar a assinatura
Cada entrega traz o header x-webhook-signature: sha256=<hex>, que é o HMAC-SHA256 do corpo cru calculado com o segredo do endpoint. A validação usa quatro nós depois do Webhook.
Nó Code "Ler corpo cru", que lê o corpo e o header:
const item = $input.first();
const campo = Object.keys(item.binary ?? {})[0];
if (!campo) throw new Error('Ative a opção Raw Body no nó Webhook');
const buffer = await this.helpers.getBinaryDataBuffer(0, campo);
return [{ json: {
corpo: buffer.toString('utf8'),
assinatura: item.json.headers['x-webhook-signature'] ?? '',
} }];Nó Crypto, com a ação Hmac, Type SHA256, Value {{ $json.corpo }}, Property Name hmac e Encoding HEX. O segredo fica no campo Hmac Secret da credencial do Crypto, e não no código.
Nó Code "Conferir", que compara em tempo constante:
const crypto = require('crypto');
const { corpo, assinatura } = $('Ler corpo cru').first().json;
const a = Buffer.from('sha256=' + $input.first().json.hmac);
const b = Buffer.from(assinatura);
const valida = a.length === b.length && crypto.timingSafeEqual(a, b);
return [{ json: { valida, ...(valida ? JSON.parse(corpo) : {}) } }];Nó If, com a condição {{ $json.valida }} is true. No ramo falso, um Respond to Webhook com Response Code 401. No ramo verdadeiro, um Respond to Webhook com 200, seguido do seu processamento.
O require('crypto') funciona no n8n Cloud. Numa instalação própria, libere o módulo com NODE_FUNCTION_ALLOW_BUILTIN=crypto, como mostra o guia de módulos do nó Code.
Passo 4: dar baixa no pedido
Depois da validação, o item traz event e data. Antes de liberar qualquer coisa, confira:
eventétransaction.paid;data.livemodeétrue(eventos do sandbox chegam comfalse);- o pedido de
data.external_referenceainda não foi baixado.
A xFlow reenvia cada evento até 3 vezes se não receber 2xx, então o mesmo aviso pode chegar mais de uma vez. Por isso a terceira checagem importa. O formato completo do evento está no guia de webhook Pix.
Fluxo de exemplo
- Gatilho do pedido (formulário, planilha ou CRM).
- HTTP Request cria a cobrança na API.
- Um nó de mensagem envia o copia e cola ao cliente.
- Webhook recebe o
transaction.paid. - Code, Crypto, Code e If validam a assinatura.
- Respond to Webhook responde
200e o fluxo dá baixa no pedido.
Teste no sandbox antes de ir ao ar
Com a credencial de teste, crie a cobrança e adicione um segundo HTTP Request para POST /api/v1/test/charges/{id}/pay, usando o id da resposta. O webhook transaction.paid chega com livemode: false e payer: null. O passo a passo está em API Pix sandbox.
Cuidados
- Segredo nas credenciais. A chave e o segredo da API ficam na credencial Basic Auth do n8n, nunca em campos de texto do fluxo.
- Allowlist de IP. Se você restringiu as chaves por IP, inclua os IPs de saída do seu n8n. Fora da lista, a API responde
401. - Limite de requisições. Ao receber
429 rate_limited, espere os segundos do headerretry-after. - Plano B. Se o n8n ficar fora do ar além dos reenvios, recupere os pagamentos com
GET /api/v1/charges?status=paid&from=...&to=....
Prefere outra ferramenta? Veja como fazer o mesmo no Zapier e no Make. Para código pronto em Node.js, PHP e Python, abra os exemplos da API Pix, e para o mapa completo da documentação, a página Desenvolvedores.
Perguntas frequentes
Existe um nó da xFlow no n8n?
Não. A integração usa os nós genéricos do n8n: HTTP Request para chamar a API Pix e Webhook para receber os eventos. Tudo o que a API faz pode ser chamado por esse caminho.
Posso usar o módulo crypto no nó Code do n8n Cloud?
Sim. Segundo a documentação do n8n, o n8n Cloud não aceita módulos npm externos, mas deixa disponíveis o módulo crypto do Node.js e o pacote moment. Numa instalação própria, libere o crypto com a variável NODE_FUNCTION_ALLOW_BUILTIN.
Por que a assinatura do webhook não bate?
Quase sempre porque o HMAC foi calculado sobre o JSON já interpretado. Ative a opção Raw Body no nó Webhook e calcule o HMAC-SHA256 sobre o corpo cru, com o segredo do endpoint, em hexadecimal e com o prefixo sha256=.
Dá para testar o fluxo sem dinheiro real?
Sim. Use a chave de teste (pk_test_ e sk_test_) na credencial do HTTP Request e simule o pagamento com POST /api/v1/test/charges/{id}/pay. O webhook transaction.paid chega com livemode: false.