Webhooks salientes
Los webhooks te permiten conectar Fotostudio a herramientas externas como Make, Zapier, n8n o tu propio backend. En cada evento importante (nuevo contacto, factura pagada, contrato firmado...), Fotostudio envía automáticamente los datos a la URL de tu elección.
Configurar un webhook
Los webhooks son un módulo que hay que activar, disponible en todas las suscripciones. Ve a Módulos > Todos los módulos, categoría Avanzado, y activa el módulo Webhooks. Si ya habías creado un webhook, el módulo ya está activado.
Después ve a Módulos > Webhooks salientes y haz clic en Añadir un webhook.
Rellena los siguientes campos:
Campo | Descripción |
|---|---|
Etiqueta (opcional) | Un nombre para orientarte (ej.: "Make facturas") |
URL de destino | La URL HTTPS que te da tu herramienta (Make, Zapier...) |
Eventos a suscribir | Los eventos que quieres escuchar (puedes marcar varios) |
Al crear el webhook se genera automáticamente una Clave secreta HMAC. Cópiala enseguida: después ya no se mostrará así. Sirve para comprobar que las llamadas vienen realmente de Fotostudio.
Eventos disponibles
Evento | Se activa cuando... |
|---|---|
| Se crea un nuevo contacto |
| Se modifica un contacto (datos, información...) |
| Se crea una nueva sesión |
| Cambia el estado de una sesión |
| Se confirma una sesión |
| Se crea una factura |
| Se marca una factura como pagada |
| Se registra un pago |
| Un presupuesto es aceptado por el cliente |
| Un presupuesto es rechazado por el cliente |
| Se firma un contrato |
Formato de los datos enviados
Cada llamada es un POST en JSON con la siguiente estructura:
{
"event": "invoice.paid",
"timestamp": "2026-06-12T10:30:00Z",
"data": {
...
}
}Encabezados HTTP
Header | Valor |
|---|---|
|
|
| Nombre del evento (ej: |
|
|
| Identificador único de la entrega |
Verificar la firma
La firma en X-FS-Signature se calcula así:
HMAC-SHA256(secret, body_json)En Node.js por ejemplo:
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('Firma inválida')
Detalle de los datos por evento
contact.created / contact.updated
{
"id": 123,
"firstname": "Marie",
"lastname": "Dupont",
"email": "marie@example.com",
"phone": "+33 6 12 34 56 78",
"company": "Studio Photo",
"street": "12 rue de la Paix",
"zipcode": "75001",
"city": "Paris",
"country": "France",
"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": "Boda Dupont",
"start_time": "2026-07-20T14:00:00Z",
"end_time": "2026-07-20T18:00:00Z",
"project_type": "Boda",
"status": "Confirmado",
"validated": true,
"location": "Castillo de Versalles",
"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": "Boda Dupont",
"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_payes el saldo pendiente de pago (total - pagos ya recibidos).
payment.created
{
"id": 101,
"amount": 750.00,
"payment_date": "2026-06-10",
"payment_type": "Transferencia",
"invoice_id": 789,
"contact_id": 123,
"created_at": "2026-06-10T14:00:00Z"
}estimate.accepted / estimate.refused
{
"id": 202,
"numero": "D2026-018",
"title": "Boda Dupont",
"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 Boda Dupont",
"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"
}Historial de entregas
En la lista de webhooks, abre el menú Acciones de un webhook y después Últimas entregas (50). Ahí ves el historial de llamadas con:
- la fecha y la hora
- el evento que se activó
- el estado (Entregado, Fallido o Pendiente)
- el número de intentos
- el código HTTP de respuesta
- el mensaje de error en caso de fallo
En caso de fallo, Fotostudio reintenta automáticamente hasta 3 veces con un intervalo exponencial. También puedes relanzar manualmente una llamada con el botón Reintentar.
Usar con Make
- En Make, crea un nuevo escenario y añade un módulo Webhooks → Custom webhook.
- Copia la URL generada por Make.
- En Fotostudio, crea un webhook con esa URL y selecciona los eventos que quieras recibir.
- Activa un evento de prueba desde Fotostudio (por ejemplo, crea un contacto).
- Make recibirá los datos. Después podrás crear tu automatización.
Usar con Zapier
- En Zapier, crea un nuevo Zap y elige Webhooks by Zapier → Catch Hook como desencadenante.
- Copia la URL proporcionada por Zapier.
- En Fotostudio, crea un webhook con esa URL.
- Activa un evento de prueba. Zapier detectará automáticamente la estructura de los datos.
- Configura la acción que desees (Google Sheets, Notion, Slack, etc.).
Preguntas frecuentes
¿Qué ocurre si mi servidor no está disponible?
Fotostudio vuelve a intentarlo 3 veces con un intervalo cada vez mayor. Después de 3 intentos, la entrega se marca como fallida, pero se queda en el historial. Puedes volver a lanzarla manualmente.
¿En cuánto tiempo debe responder mi webhook?
Tu endpoint debe responder en menos de 10 segundos. Si tarda más, la petición se considera fallida.
¿Puedo tener varios webhooks?
Sí, puedes crear tantos webhooks como quieras, cada uno con sus propios eventos y su propia URL.
¿Cómo desactivo temporalmente un webhook?
En la lista, abre el menú Acciones del webhook y elige Inactivo (o Activo para reactivarlo): queda en pausa sin eliminarse.
¿Qué pasa si desactivo el módulo Webhooks?
Tus webhooks se conservan, pero ya no se envía ninguna llamada y la entrada Webhooks salientes desaparece del menú. Vuelve a activar el módulo para reanudar los envíos.
Actualizado el: 23/10/2026
¡Gracias!
