Integração Vendus: faturas automáticas a cada venda na Shelf

Atualizado a 21 de outubro de 2026

Um webhook envia cada venda paga da tua loja para um endereço teu, em segundos: produto, cliente (nome, email e NIF quando o indica), valor, cupão e método de pagamento. Com o Make (tem plano gratuito) e a API da Vendus, isso chega para emitir a fatura-recibo (FR) a cada venda. Não precisas de saber programar: é copiar, colar e mapear campos.

1. Gerar a chave da API na Vendus

  1. 1No backoffice da Vendus, no canto inferior esquerdo, abre Configuração → Integrações → API Vendus.
  2. 2Confirma que Acesso API está ligado e copia o conteúdo do campo API key. A chave pertence a um utilizador da Vendus: as faturas emitidas pela API ficam em nome dele.

Guarda a chave só no Make: quem a tiver consegue emitir documentos em teu nome. Em contas Vendus mais antigas, a opção pode aparecer em APPS → API.

2. Criar o cenário no Make e copiar o URL

  1. 1No Make, cria um cenário novo e adiciona o módulo Webhooks → Custom webhook.
  2. 2Clica em Add, dá-lhe um nome (por exemplo «Vendas Shelf») e copia o URL que o Make mostra (começa por https://hook.).

3. Ligar à Shelf

  1. 1No painel, vai a Definições → Integrações → Webhooks, cola o URL e clica em Ligar webhook.
  2. 2Clica em Enviar evento de teste.
  3. 3No Make, o webhook mostra que recebeu os dados: uma venda de exemplo (Cliente Teste, NIF 123456789) com todos os campos para mapear.

O NIF do cliente chega em data.buyer.nif: nos checkouts pagos, quem compra pode abrir Quero fatura com NIF e escrevê-lo, se quiser (ligas ou desligas em Definições → Faturação). Sem NIF, o campo vem a null e a fatura fica para consumidor final. Não é preciso criar um campo personalizado.

4. Deixar passar só as vendas pagas

  1. 1Clica na ligação a seguir ao webhook e escolhe Set up a filter: continua só se type for igual a sale.paid, se test não existir e se data.amount.total for maior que 0. Uma venda com cupão de 100% chega com total 0.00 e coupon_full: true; o evento de teste traz test: true.

5. Saber o ID do método de pagamento na Vendus

A fatura-recibo regista o pagamento com o ID de um método de pagamento da tua conta Vendus. Só precisas de o ver uma vez:

  1. 1Adiciona, só por agora, um módulo HTTP → Make a request: URL https://www.vendus.pt/ws/v1.1/documents/paymentmethods, método GET e um cabeçalho Authorization com o valor Bearer A_TUA_CHAVE.
  2. 2Corre-o com Run once e, na resposta, copia o id do método que queres usar (o de cartão ou de pagamento online, por exemplo). Depois apaga este módulo.

6. Emitir a fatura-recibo na Vendus

  1. 1A seguir ao filtro, adiciona um Router com duas rotas: Com NIF (filtro: data.buyer.nif existe) e Sem NIF (filtro: data.buyer.nif não existe). A Vendus pede que não se envie o cliente sem NIF, e nunca com 999999990.
  2. 2Em cada rota, adiciona HTTP → Make a request: URL https://www.vendus.pt/ws/v1.1/documents, método POST, cabeçalho Authorization com Bearer A_TUA_CHAVE, Body type Raw e Content type JSON (application/json).
  3. 3Cola o corpo abaixo. No Make, os campos do webhook aparecem como {{1.data…}} (o 1 é o número do módulo do webhook): escolhe-os na lista para os inserir. Troca ID_DO_METODO pelo ID do passo 5. Na rota Sem NIF, apaga o bloco client.
  4. 4O artigo vai com o preço antes do cupão (data.amount.original) e o desconto do cupão (data.amount.discount), por isso a fatura mostra, por exemplo, 15,00 − 1,50 = 13,50; o pagamento é o que o cliente pagou (data.amount.total). Sem cupão, o desconto vem a 0.00. Se quiseres o código do cupão na fatura, junta ao artigo "text": "Cupão {{1.data.amount.coupon}}" (deixa-o só numa rota para vendas com cupão, para não aparecer «Cupão» vazio).
  5. 5Faz o primeiro teste com "mode": "tests", o modo de testes da API da Vendus, e confirma o documento na Vendus. Quando estiver certo, muda para "normal" e liga o cenário com Scheduling: Immediately.
{
  "type": "FR",
  "mode": "tests",
  "external_reference": "{{1.data.order_id}}",
  "client": {
    "name": "{{1.data.buyer.name}}",
    "fiscal_id": "{{1.data.buyer.nif}}",
    "email": "{{1.data.buyer.email}}",
    "send_email": "yes"
  },
  "items": [
    {
      "reference": "{{1.data.product.id}}",
      "title": "{{1.data.product.title}}",
      "qty": 1,
      "gross_price": "{{1.data.amount.original}}",
      "discount_amount": "{{1.data.amount.discount}}",
      "type_id": "S",
      "tax_id": "NOR"
    }
  ],
  "payments": [
    {
      "id": "ID_DO_METODO",
      "amount": "{{1.data.amount.total}}"
    }
  ]
}
VendusCampo do webhook
client.namedata.buyer.name
client.emaildata.buyer.email
client.fiscal_iddata.buyer.nif (vazio: sem bloco client, consumidor final)
items.titledata.product.title
items.referencedata.product.id
items.gross_price (preço com IVA, antes do cupão)data.amount.original
items.discount_amount (desconto em euros)data.amount.discount (0.00 sem cupão)
payments.amount (o que o cliente pagou)data.amount.total
external_referencedata.order_id

Se usas order bumps: numa venda com cupão, data.amount.original é só o preço do produto principal; sem cupão, é o total da venda, já com os order bumps. Para a fatura bater certo em todas as vendas, numa venda com order bumps (data.bumps não vazio) usa uma linha com gross_price = data.amount.total e sem discount_amount, numa rota à parte do Router.

O IVA vai em tax_id: NOR (taxa normal), INT (intermédia), RED (reduzida), ISE (isento) ou NS (não sujeito). Se estiveres isento, usa ISE com o motivo em tax_exemption (por exemplo M10, regime de isenção). type_id é S para serviços e P para produtos. Confirma a taxa, o motivo e o tipo com o teu contabilista.

O evento

  • sale.paid: uma venda paga. O data.amount.total é o que o cliente pagou, com IVA e com os order bumps incluídos (cada order bump vem também em data.bumps, com título e valor). Uma venda com cupão de 100% chega com total 0.00 e coupon_full: true.
  • lead.created (alguém recebe um produto gratuito) também chega ao webhook: o filtro do passo 4 deixa-o de fora.

Perguntas frequentes

Posso usar o Zapier ou o n8n em vez do Make?+

Sim. O webhook é o mesmo e o corpo JSON também. No Zapier, usa Webhooks by Zapier → Catch Hook e depois Webhooks by Zapier → Custom Request para a API da Vendus; no n8n, o nó Webhook e o nó HTTP Request.

O que acontece se o meu cenário estiver desligado?+

Tentamos de novo até 8 vezes ao longo de cerca de 45 horas. Se o endereço responder 410 (removido), o webhook é desligado; reativa-o em Definições → Integrações.

Onde vejo se os envios estão a funcionar?+

Na Shelf, em Definições → Integrações → Webhooks, na lista Últimos envios: cada evento com o estado e o código de resposta. No Make, o histórico do cenário mostra cada execução e a resposta da Vendus.

Que taxa de IVA ou motivo de isenção devo usar?+

Depende da tua atividade e do teu regime. Confirma com o teu contabilista e escreve no corpo o tax_id (e o tax_exemption, se fores isento) que ele indicar.

O cliente recebe a fatura por email?+

Na rota Com NIF, sim: send_email: yes pede à Vendus que a envie para data.buyer.email. Sem NIF a fatura fica para consumidor final, sem dados do cliente.

Ainda não tens loja Shelf?

Cria a tua em minutos — 14 dias grátis, 0% de comissão sobre as vendas.

Criar a minha loja