Webhooks de saída
Os webhooks permitem-te ligar o Fotostudio a ferramentas externas como Make, Zapier, n8n ou o teu próprio backend. A cada evento importante (novo contacto, fatura paga, contrato assinado...), o Fotostudio envia automaticamente os dados para o URL que escolheres.
Configurar um webhook
Os webhooks são um módulo a ativar, disponível em todas as assinaturas. Vai a Módulos > Todos os módulos, categoria Avançado, e ativa o módulo Webhooks. Se já tinhas criado um webhook, o módulo já está ativado para ti.
Depois, vai a Módulos > Webhooks de saída e clica em Adicionar webhook.
Preenche os seguintes campos:
Campo | Descrição |
|---|---|
Etiqueta (opcional) | Um nome para te orientares (ex.: "Make faturas") |
URL de destino | O URL HTTPS fornecido pela tua ferramenta (Make, Zapier...) |
Eventos a subscrever | Os eventos a escutar (podes marcar vários) |
É gerada automaticamente uma Chave secreta HMAC na criação. Copia-a imediatamente: não voltará a ser mostrada desta forma. Serve para verificar que as chamadas vêm mesmo do Fotostudio.
Eventos disponíveis
Evento | Acionado quando... |
|---|---|
| Um novo contacto é criado |
| Um contacto é alterado (dados, informações...) |
| Uma nova sessão é criada |
| O estado de uma sessão muda |
| Uma sessão é confirmada |
| Uma fatura é criada |
| Uma fatura é marcada como paga |
| Um pagamento é registado |
| Um orçamento é aceite pelo cliente |
| Um orçamento é recusado pelo cliente |
| Um contrato é assinado |
Formato dos dados enviados
Cada chamada é um POST em JSON com a seguinte estrutura:
{
"event": "invoice.paid",
"timestamp": "2026-06-12T10:30:00Z",
"data": {
...
}
}Cabeçalhos HTTP
Header | Valor |
|---|---|
|
|
| Nome do evento (ex.: |
|
|
| Identificador único da entrega |
Verificar a assinatura
A assinatura em X-FS-Signature é calculada assim:
HMAC-SHA256(secret, body_json)Em Node.js, por exemplo:
const crypto = require('crypto')
const sig = 'sha256=' + crypto.createHmac('sha256', SECRET).update(rawBody).digest('hex')
if (sig !== req.headers['x-fs-signature']) throw new Error('Assinatura inválida')
Detalhe dos dados por evento
contact.created / contact.updated
{
"id": 123,
"firstname": "Maria",
"lastname": "Santos",
"email": "maria@example.com",
"phone": "+351 912 345 678",
"company": "Studio Foto",
"street": "Rua Augusta 12",
"zipcode": "1100-053",
"city": "Lisboa",
"country": "Portugal",
"created_at": "2026-01-15T09:00:00Z",
"url": "https://www.fotostudio.io/app/contacts/123"
}project.created / project.status_changed / project.confirmed
{
"id": 456,
"name": "Casamento Santos",
"start_time": "2026-07-20T14:00:00Z",
"end_time": "2026-07-20T18:00:00Z",
"project_type": "Casamento",
"status": "Confirmado",
"validated": true,
"location": "Palácio da Pena",
"contact_id": 123,
"created_at": "2026-01-15T09:00:00Z",
"url": "https://www.fotostudio.io/app/projects/456"
}invoice.created / invoice.paid
{
"id": 789,
"numero": "F2026-042",
"title": "Casamento Santos",
"invoice_date": "2026-06-01",
"total_price": 1500.00,
"amount_to_pay": 750.00,
"paid": false,
"draft": false,
"contact_id": 123,
"project_id": 456,
"created_at": "2026-06-01T10:00:00Z",
"url": "https://www.fotostudio.io/app/invoices/789"
}
amount_to_payé o saldo que falta pagar (total - pagamentos já recebidos).
payment.created
{
"id": 101,
"amount": 750.00,
"payment_date": "2026-06-10",
"payment_type": "Transferência",
"invoice_id": 789,
"contact_id": 123,
"created_at": "2026-06-10T14:00:00Z"
}estimate.accepted / estimate.refused
{
"id": 202,
"numero": "D2026-018",
"title": "Casamento Santos",
"total_price": 1500.00,
"accepted": true,
"refused": false,
"accepted_at": "2026-06-05T16:00:00Z",
"contact_id": 123,
"project_id": 456,
"created_at": "2026-05-20T09:00:00Z",
"url": "https://www.fotostudio.io/app/estimates/202"
}contract.signed
{
"id": 303,
"title": "Contrato Casamento Santos",
"signed_at": "2026-06-08T11:30:00Z",
"project_id": 456,
"contact_id": 123,
"created_at": "2026-05-25T10:00:00Z",
"url": "https://www.fotostudio.io/app/contracts/303"
}Histórico das entregas
Na lista dos webhooks, abre o menu Ações de um webhook e depois Últimas entregas (50). Aí vês o histórico das chamadas com:
- a data e a hora
- o evento acionado
- o estado (Entregue, Falhado ou Pendente)
- o número de tentativas
- o código HTTP de resposta
- a mensagem de erro em caso de falha
Em caso de falha, o Fotostudio tenta novamente de forma automática até 3 vezes, com um intervalo exponencial. Também podes relançar uma chamada manualmente com o botão Tentar novamente.
Usar com o Make
- No Make, cria um novo cenário e adiciona um módulo Webhooks → Custom webhook
- Copia o URL gerado pelo Make
- No Fotostudio, cria um webhook com esse URL e seleciona os eventos que queres
- Aciona um evento de teste no Fotostudio (cria um contacto, por exemplo)
- O Make recebe os dados. A seguir, podes construir a tua automatização
Usar com o Zapier
- No Zapier, cria um novo Zap e escolhe Webhooks by Zapier → Catch Hook como acionador
- Copia o URL fornecido pelo Zapier
- No Fotostudio, cria um webhook com esse URL
- Aciona um evento de teste. O Zapier deteta automaticamente a estrutura dos dados
- Configura a tua ação (Google Sheets, Notion, Slack...)
Perguntas frequentes
O que acontece se o meu servidor estiver indisponível?
O Fotostudio tenta novamente 3 vezes, com um intervalo crescente. Depois de 3 tentativas, a entrega fica marcada como falhada, mas continua no histórico. Podes relançá-la manualmente.
Em quanto tempo deve o meu webhook responder?
O teu endpoint tem de responder em 10 segundos. Para lá disso, o pedido é considerado falhado.
Posso ter vários webhooks?
Sim, podes criar quantos webhooks quiseres, cada um com os seus eventos e o seu URL.
Como desativar temporariamente um webhook?
Na lista, abre o menu Ações do webhook e escolhe Inativo (ou Ativo para o reativar): fica em pausa sem ser eliminado.
O que acontece se eu desativar o módulo Webhooks?
Os teus webhooks são mantidos, mas deixa de ser enviada qualquer chamada e a entrada Webhooks de saída desaparece do menu. Reativa o módulo para retomar os envios.
Actualizado em: 23/10/2026
Obrigado!
