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

Atualizado a 23 de outubro de 2026

Um webhook envia cada venda paga da tua loja para um endereço teu: produto, cliente (nome, email e NIF quando o indica), valor e método de pagamento. Com o Make e a API da Moloni, isso chega para criar a fatura-recibo a cada venda.

Configuração mais técnica. A API da Moloni não usa uma chave simples: pede uma conta de programador, uma autorização OAuth e os ids de alguns registos da tua conta (empresa, série, artigo, método de pagamento). Conta com cerca de uma hora. Se ainda estás a escolher programa, o InvoiceXpress e a Vendus ligam-se só com uma chave.

Antes de começar: prepara a tua conta Moloni

  1. 1Conta de programador. Pede acesso à API em moloni.pt/dev. Na área de cliente defines o Developer ID e o Redirect URI, e recebes o Client Secret. Como Redirect URI, usa o endereço de retorno do Make: https://www.integromat.com/oauth/cb/oauth2.
  2. 2Um artigo para as vendas online. Na Moloni, cria um artigo (por exemplo «Produto digital»), com a taxa de IVA ou o motivo de isenção que se aplica a ti. Cada fatura usa este artigo, com o nome do produto vendido na Shelf.
  3. 3O cliente «Consumidor final». Confirma que existe um cliente com o NIF 999999990, para as vendas sem NIF.

Ligar a Shelf à Moloni

1. A ligação OAuth à Moloni

  1. 1No Make, cria um cenário novo e adiciona o módulo HTTP → Make an OAuth 2.0 request. Em Connection, clica em Create a connection.
  2. 2Flow type Authorization Code. Authorize URI https://www.moloni.pt/ac/root/oauth/, Token URI https://api.moloni.pt/v1/grant/, Client ID o teu Developer ID e Client Secret o teu Client Secret.
  3. 3Clica em Save: abre-se a Moloni, entras e autorizas. O Make guarda a ligação e renova o acesso sozinho (o acesso dura 1 hora e a renovação 14 dias).

Se passarem mais de 14 dias sem nenhum pedido à Moloni (sem vendas), a autorização expira e o Make mostra um erro na ligação: em Connections, clica em Reauthorize.

2. Os ids da tua conta

Com o mesmo módulo, faz uma vez cada um destes pedidos (Method POST) e anota os ids da resposta. Os URLs levam ?json=true, para a Moloni aceitar o corpo em JSON (Body type Raw, JSON).

  • https://api.moloni.pt/v1/companies/getAll/?json=true, sem corpo: o company_id da tua empresa.
  • https://api.moloni.pt/v1/documentSets/getAll/?json=true com {"company_id": ID_DA_EMPRESA}: o document_set_id da série.
  • https://api.moloni.pt/v1/paymentMethods/getAll/?json=true: o payment_method_id do cartão (e do MB WAY, se o tiveres).
  • https://api.moloni.pt/v1/products/getAll/?json=true: o product_id do artigo para as vendas online.
  • https://api.moloni.pt/v1/customers/getByVat/?json=true com {"company_id": ID_DA_EMPRESA, "vat": "999999990"}: o customer_id do consumidor final.

3. O cenário das vendas

  1. 1Num cenário novo, começa com Webhooks → Custom webhook: clica em Add e copia o URL (começa por https://hook.).
  2. 2Na Shelf, vai a Definições → Integrações → Webhooks, cola o URL e clica em Ligar webhook. Depois clica em Enviar evento de teste.
  3. 3Clica na ligação a seguir ao webhook e escolhe Set up a filter. Primeira condição: type, Text operators: Equal to, sale.paid. Clica em Add AND rule; segunda condição: data → amount → total, Numeric operators: Greater than, 0. Assim ficam de fora os produtos gratuitos (lead.created) e as vendas com cupão de 100%.
  4. 4Junta um Router com duas saídas. Na primeira, filtro data → buyer → nif Exists, e um módulo HTTP → Make an OAuth 2.0 request (módulo 3) para https://api.moloni.pt/v1/customers/getByVat/?json=true, Method POST, com {"company_id": ID_DA_EMPRESA, "vat": "{{1.data.buyer.nif}}"}. Na segunda saída não há pedido: a fatura vai para o consumidor final.
  5. 5No fim de cada saída, um módulo HTTP → Make an OAuth 2.0 request para https://api.moloni.pt/v1/invoiceReceipts/insert/?json=true, Method POST, Body type Raw, JSON, com o corpo abaixo e os teus ids. Na saída sem NIF, troca o customer_id pelo id do consumidor final.
  6. 6Clica em Run once e envia o evento de teste da Shelf. Na Moloni aparece um rascunho ("status": 0): confirma o cliente, o valor e o IVA, e apaga-o.
{
  "company_id": "ID_DA_EMPRESA",
  "date": "{{formatDate(now; YYYY-MM-DD)}}",
  "expiration_date": "{{formatDate(now; YYYY-MM-DD)}}",
  "document_set_id": "ID_DA_SERIE",
  "customer_id": "{{ifempty(3.data.customer_id; ID_CONSUMIDOR_FINAL)}}",
  "our_reference": "{{1.data.order_id}}",
  "products": [
    {
      "product_id": "ID_DO_ARTIGO",
      "name": "{{1.data.product.title}}",
      "qty": 1,
      "price": "{{1.data.amount.total}}",
      "exemption_reason": "M10"
    }
  ],
  "payments": [
    {
      "payment_method_id": "ID_DO_METODO",
      "date": "{{formatDate(now; YYYY-MM-DD)}}",
      "value": "{{1.data.amount.total}}"
    }
  ],
  "status": 0
}

Se o cliente com aquele NIF ainda não existir na Moloni, o getByVat não devolve nenhum id e a fatura vai para o consumidor final. Para criar a ficha do cliente nesses casos, junta um pedido a customers/insert: a Moloni pede vários campos (morada, país, idioma, prazo de pagamento), descritos na documentação da Moloni.

4. Passar a sério

  1. 1No filtro, clica em Add AND rule e junta uma terceira condição: test, Basic operators: Does not exist. Assim, o botão de teste da Shelf nunca emite uma fatura verdadeira.
  2. 2Nos dois pedidos invoiceReceipts/insert, troca "status": 0 por "status": 1: a fatura-recibo fica fechada (emitida).
  3. 3Liga o cenário no interruptor em baixo, com Immediately as data arrives.

O corpo vem para quem está isento de IVA pelo art. 53.º (exemption_reason M10, sem taxes). Se cobras IVA, apaga o exemption_reason e junta ao artigo "taxes": [{"tax_id": ID_DO_IVA}] (o id vem de taxes/getAll); confirma no primeiro rascunho se o price fica com ou sem IVA. A taxa e o motivo de isenção confirmam-se com o teu contabilista.

Perguntas frequentes

O que acontece se a minha automação estiver desligada?+

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, no Zapier e no n8n, o histórico mostra cada execução e a resposta do programa de faturação.

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 usa a taxa ou o motivo de isenção que ele indicar.

Porque é que a Moloni dá mais trabalho do que os outros?+

Porque a API da Moloni usa OAuth em vez de uma chave, e cada fatura precisa dos ids da empresa, da série, do artigo, do cliente e do método de pagamento. Depois de configurado, funciona sozinho como os outros.

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