Automatizaciones sin código (n8n, Make, Zapier)
Las plantillas de n8n que vienen con StockAI, cómo importarlas y qué hace cada una, y cómo armar los mismos flujos en Make o Zapier.
En esta página
Con los webhooks y la API puedes conectar StockAI a Slack, Google Sheets, Jira o Google Drive sin escribir un programa. StockAI trae tres plantillas para n8n, en la carpeta integrations/n8n/ del código fuente.
Las plantillas
| Archivo | Qué hace | Necesita |
|---|---|---|
order-approved-to-slack-and-sheets.json | Cuando se aprueba una orden (purchase_order.approved), manda un mensaje a un canal de Slack y agrega una fila a una hoja de Google Sheets con orden, bodega, SKUs, unidades, valor, monto aprobado, quién aprobó, id del evento y fecha. | Un webhook de StockAI, Slack y Google Sheets. |
stockout-imminent-to-jira.json | Cuando un SKU entra en riesgo de quiebre (stockout.imminent), crea una incidencia en Jira: «Stockout risk: SKU en bodega (N days of cover)». | Un webhook de StockAI y Jira. |
drive-file-to-dataset.json | Cuando cae un archivo nuevo en una carpeta de Google Drive, lo descarga y reemplaza el archivo de una fuente de ventas de StockAI (POST /api/v1/data-sources/{id}/file). Si StockAI lo rechaza, avisa por Slack. | Una llave de escritura, Google Drive y Slack. |
Importar una plantilla de webhook
- En n8n, crea un flujo nuevo e impórtale el archivo JSON (menú del flujo → importar desde archivo).
- Abre el primer nodo, «StockAI webhook», y copia su URL de producción.
- En StockAI, abre Automatización → «Avisos automáticos», pulsa «Agregar webhook», pega esa URL y marca solo el evento de la plantilla (
purchase_order.approvedostockout.imminent). Guarda. - Copia la «Clave de firma del webhook» (se muestra una sola vez).
- En n8n, guarda esa clave en la variable de entorno
STOCKAI_WEBHOOK_SECRETy permite el módulo crypto conNODE_FUNCTION_ALLOW_BUILTIN=crypto. - Elige tus credenciales y completa los campos vacíos: el canal de Slack y la hoja, o el proyecto y el tipo de incidencia de Jira.
- Activa el flujo y, en StockAI, pulsa «Enviar prueba» en el webhook. Revisa «Entregas» para ver que llegó.
Importar la plantilla de Google Drive
- Busca el id de tu fuente de ventas con
GET /data-sourceso en Mis ventas. - Importa
drive-file-to-dataset.jsonen n8n. - En el nodo «Replace the dataset», cambia
REPLACE_WITH_DATA_SOURCE_IDpor ese id. Si tu StockAI no esapp.stockai.es, cambia también el dominio. - Crea en n8n una credencial «Header Auth» con nombre
Authorizationy valorBearer sk_live_...(una llave de escritura) y asígnala a ese nodo. - Elige la carpeta de Drive en el primer nodo y el canal de Slack en «Say it failed».
- Activa el flujo y deja un archivo en la carpeta. La fuente conserva su mapeo de columnas, y si la sesión tiene una tarea programada, StockAI reentrena solo.
Make y Zapier
Make y Zapier no importan un archivo nuestro, así que el mismo flujo se arma con sus módulos genéricos:
- Recibir un evento de StockAI
- Make: «Custom webhook». Zapier: «Catch Hook». Pega su URL al crear el webhook en StockAI.
- Verificar la firma
- Necesita código. En Zapier, un paso «Code by Zapier» con la receta de abajo; en Make, un módulo que calcule HMAC-SHA256.
- Llamar a StockAI
- Make: «HTTP > Make a request». Zapier: «Webhooks by Zapier > Custom Request». URL
https://app.stockai.es/api/v1/<ruta>, cabeceraAuthorization: Bearer <llave>(de escritura para POST/PATCH/DELETE). Un archivo va comomultipart/form-datacon el campofile.
// Code by Zapier (JavaScript). Inputs: secret, signature (the X-StockAI-Signature header), body (raw text)
const crypto = require('crypto')
const parts = Object.fromEntries(inputData.signature.split(',').map(p => p.split('=')))
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300
const expected = crypto.createHmac('sha256', inputData.secret)
.update(parts.t + '.' + inputData.body).digest('hex')
output = [{ valid: fresh && expected === parts.v1 }]Ojo: el paso de código tiene que recibir el cuerpo crudo de la entrega, tal como llegó. Si la herramienta ya lo interpretó como JSON y lo vuelve a armar, la firma no coincide.