Automatizaciones con webhooks
Los webhooks requieren un plan de pago. Basic: 1 webhook, Pro: 3, Ultra: 10.
Los webhooks te permiten conectar TellDone a cualquier servicio externo. Cuando creas una nota de voz, TellDone la procesa y envía automáticamente los datos extraídos (notas, tareas, eventos e informes) a una URL que tú indiques. Cada tarea y cada evento se envían como una entrega separada, para que tu herramienta de automatización pueda procesarlos por separado.
Qué enviar
Cada automatización tiene sus propios interruptores de payload. Elige uno o cualquier combinación:
- Notas: la nota procesada entera (título, transcripción, resumen, etiquetas, idioma)
- Audio: en el plan Ultra, adjunta un enlace de descarga de 24 horas al archivo de audio junto con el payload de la nota
- Tareas: una entrega por cada tarea extraída
- Eventos: una entrega por cada evento de calendario extraído
- Informes: una entrega por cada informe diario, semanal, mensual o anual generado
Puedes cambiar los interruptores cuando quieras desde los ajustes de la automatización: los cambios se aplican solo a eventos nuevos.
Configurar un webhook

- Ve a Ajustes > Integraciones > Webhook Automations
- Toca Nueva automatización

- Introduce un nombre (por ejemplo, "Mi webhook de Zapier")
- Pega la URL del webhook de tu servicio de automatización
- Elige qué datos enviar: notas, tareas, eventos, informes (o cualquier combinación)
- Si quieres, añade un auth header: un token que se envía como encabezado
Authorizationpara endpoints seguros - Toca Guardar
- Copia el secreto de firma: se muestra completo solo cuando creas la automatización o después de rotarlo. Lo necesitarás si quieres verificar la autenticidad del webhook
- Toca "Test" para enviar un payload de prueba a tu endpoint sin crear un evento real
La URL del webhook debe usar HTTPS. Las direcciones HTTP y las IPs de redes privadas no se aceptan.
Qué se envía
Cada entrega es un objeto JSON con tres campos: event (el tipo de evento), timestamp y data (el contenido real). Aquí tienes cómo se ve cada tipo de evento.
Notas (note.created)
Contiene el título generado por IA, la transcripción completa, resumen, tipo de nota, etiquetas, prioridad, idioma y fecha de creación.
{
"event": "note.created",
"timestamp": "2026-02-27T14:38:00Z",
"data": {
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meeting notes - Project Alpha",
"transcript": "Full transcript text...",
"summary": "Brief AI-generated summary...",
"type": "meeting",
"tags": ["work", "project-alpha"],
"priority": "high",
"language": "en",
"created_at": "2026-02-27T10:00:00Z"
}
}
En el plan Ultra, las entregas de notas también pueden incluir un enlace a la grabación de audio (audio_url, audio_format, duration_seconds). El enlace expira después de 24 horas. Activa esto con la opción "Note + Audio" al crear la automatización.
Tareas (task.created)
Una entrega por tarea. Una nota con 3 tareas envía 3 webhooks separados.
{
"event": "task.created",
"timestamp": "2026-02-27T14:38:01Z",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes - Project Alpha",
"task_id": "660f9511-...",
"title": "Send proposal to client",
"description": "Include pricing for Q2",
"priority": "high",
"due_date": "2026-03-01",
"reminder_at": "2026-02-28T09:00:00Z",
"tags": ["work"],
"status": "todo",
"created_at": "2026-02-27T10:00:00Z"
}
}
Eventos (calendar_event.created)
Una entrega por evento de calendario.
{
"event": "calendar_event.created",
"timestamp": "2026-02-27T14:38:02Z",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes",
"event_id": "770a0622-...",
"title": "Team standup",
"description": "Weekly sync",
"start": "2026-03-03T10:00:00+03:00",
"end": "2026-03-03T10:30:00+03:00",
"location": "Zoom",
"is_all_day": false,
"attendees": ["alice@example.com"],
"tags": ["work"],
"created_at": "2026-02-27T10:00:00Z"
}
}
Informes (report.created)
Se envía cuando se genera un informe diario, semanal, mensual o anual.
{
"event": "report.created",
"timestamp": "2026-02-28T00:05:00Z",
"data": {
"report_id": "880b1733-...",
"report_type": "daily",
"period_start": "2026-02-27",
"period_end": "2026-02-27",
"content_md": "# Daily Report\n\n...",
"content_json": {
"productivity_score": 72,
"day_type": "productive",
"tasks_created": 5,
"tasks_completed": 3
},
"created_at": "2026-02-28T00:05:00Z"
}
}
Seguridad
Cada entrega está firmada con HMAC-SHA256 usando el secreto de firma de tu automatización. Los siguientes encabezados se incluyen con cada entrega:
X-LP-Signature: la firma HMAC-SHA256 (sha256=...)X-LP-Timestamp: marca de tiempo Unix usada para la firmaX-LP-Event: el tipo de evento (note.created,task.created,calendar_event.created,report.created)X-LP-Delivery-Id: ID único de entrega (útil para deduplicación)User-Agent: siempreTellDone-Webhooks/1.0
Los encabezados de firma se envían con cada entrega, independientemente de otras configuraciones.
Por defecto, cada entrega incluye el secreto de firma de tu automatización en el encabezado Authorization, así que herramientas como la autenticación por encabezado de n8n funcionan directamente pegando el secreto como valor de auth. Si configuras un auth header personalizado en los ajustes, reemplaza este valor predeterminado. Puedes usar dos formatos: Nombre-Encabezado: valor (envía el encabezado con ese nombre) o un valor simple (lo envía como Authorization: <valor>).
Cada automatización tiene su propio secreto de firma, así que rotar uno no afecta a tus otros webhooks. El secreto se muestra completo solo cuando creas la automatización o después de rotarlo. En cualquier otro momento, solo se muestra una vista previa (whsec_...últimos4). Para cambiarlo, toca "Rotate secret" en los ajustes de la automatización: se genera una nueva clave HMAC sin tocar la URL ni el auth header. El secreto anterior deja de funcionar al instante.
Solo se aceptan URLs HTTPS. Se rechazan direcciones HTTP, direcciones IP y direcciones de redes privadas.
Verificación de firmas de webhooks
Cada entrega incluye un encabezado de firma con el formato X-LP-Signature: sha256=<hex>. El ejemplo de abajo muestra cómo verificarlo en Python.
Cada webhook está firmado para que puedas confirmar que proviene realmente de TellDone. La firma se calcula como:
HMAC-SHA256(signing_secret, timestamp + "." + raw_body)
El resultado se codifica en hexadecimal y se prefija con sha256= en el encabezado de firma.
TellDone serializa JSON con espacios después de los separadores (por ejemplo, {"event": "note.created"}). Si parseas y vuelves a serializar el cuerpo, la firma no coincidirá. Verifica siempre contra los bytes crudos del cuerpo de la solicitud.
Python
import hmac
import hashlib
def verify_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
payload = f"{timestamp}.".encode() + raw_body
expected = "sha256=" + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
# Ejemplo con Flask
@app.route("/webhook/telldone", methods=["POST"])
def telldone_webhook():
raw_body = request.get_data() # bytes crudos, NO request.json
signature = request.headers.get("X-LP-Signature", "")
timestamp = request.headers.get("X-LP-Timestamp", "")
if not verify_signature(raw_body, signature, timestamp, SIGNING_SECRET):
abort(403)
data = request.json
# procesar webhook...
Node.js
const crypto = require("crypto");
function verifySignature(rawBody, signature, timestamp, secret) {
const payload = `${timestamp}.${rawBody}`;
const expected =
"sha256=" +
crypto.createHmac("sha256", secret).update(payload).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Ejemplo con Express (usa express.raw para obtener el cuerpo crudo)
app.post("/webhook/telldone", express.raw({ type: "application/json" }), (req, res) => {
const rawBody = req.body.toString();
const signature = req.headers["x-lp-signature"] || "";
const timestamp = req.headers["x-lp-timestamp"] || "";
if (!verifySignature(rawBody, signature, timestamp, SIGNING_SECRET)) {
return res.status(403).send("Invalid signature");
}
const data = JSON.parse(rawBody);
// procesar webhook...
});
Proteccion contra replay (opcional)
Para prevenir ataques de replay, verifica que el timestamp sea reciente:
import time
def verify_timestamp(timestamp: str, tolerance_seconds: int = 300) -> bool:
try:
return abs(time.time() - int(timestamp)) < tolerance_seconds
except (ValueError, TypeError):
return False
Errores comunes
| Error | Solución |
|---|---|
| Usar cuerpo parseado y re-serializado | Usa el cuerpo crudo de la solicitud |
JSON.stringify() en JS (compacto, sin espacios) | Usa el cuerpo crudo o replica el formato de Python |
| Olvidar el prefijo de timestamp | El formato es timestamp + "." + body |
| Comparar strings directamente | Usa hmac.compare_digest o timingSafeEqual |
Política de reintentos
Si tu endpoint falla, TellDone reintenta cada entrega con backoff exponencial (unos minutos al principio, luego intervalos más largos):
| Intento | Retraso |
|---|---|
| 1er reintento | 30 segundos |
| 2do reintento | 2 minutos |
| 3er reintento | 15 minutos |
| 4to reintento | 1 hora |
| 5to reintento | 4 horas |
Después de 5 intentos fallidos, la entrega se marca como muerta. Aún puedes reintentarla manualmente desde el Delivery log.
Cómo TellDone maneja diferentes respuestas:
- 2xx: entregado correctamente
- 4xx (excepto 429): marcado como muerto al instante, sin reintento (tu endpoint rechazó los datos explícitamente)
- 429 (Too Many Requests): reintenta, respeta el encabezado
Retry-After - 5xx o timeout: reintenta con el calendario de arriba
Cuando las entregas fallan repetidamente
No tienes que estar pendiente del Delivery log para enterarte de que algo se ha roto. TellDone vigila los fallos consecutivos por ti y te avisa en dos etapas.
Tras 3 fallos: aviso en el Inbox
Tras 3 entregas fallidas seguidas, TellDone crea un mensaje en tu Inbox bajo la categoría "Webhook failures". El mensaje nombra la automatización afectada y te enlaza directamente a Ajustes > Integraciones > Automations > [la automatización fallida] > Delivery log para que puedas inspeccionar la respuesta y decidir qué hacer.
Los avisos en el Inbox hacen que te enteres de las automatizaciones rotas por la insignia del icono de la app, en lugar de descubrirlo semanas más tarde por datos que faltan en tu herramienta destino.
Tras 20 fallos: desactivación automática
Si 20 entregas seguidas de la misma automatización fallan (contadas tras el aviso del Inbox), TellDone la desactiva automáticamente para dejar de llamar a un endpoint roto y proteger tu cuota mensual de entregas. Corrige el problema en el destino y luego reactívala desde Ajustes > Integraciones > Automations.
El contador de fallos consecutivos se reinicia a cero con la siguiente entrega correcta.
Gestión de webhooks
- Pausar/reanudar: desactiva cualquier automatización sin eliminarla, reactívala cuando quieras
- Delivery log: consulta todas las entregas con estado, código HTTP y tiempo de respuesta. Filtra por Entregados o Errores. Toca cualquier entrega fallida y elige "Reintentar" para reenviarla sin esperar al siguiente reintento programado
- Test: toca "Test" para enviar un payload de prueba (con
"test": trueen el cuerpo) a tu endpoint sin crear un evento real. Los envíos de prueba no cuentan en tu cuota mensual - Rotate secret: genera un nuevo secreto HMAC sin cambiar la URL ni el auth header
- Editar: actualiza la URL, el auth header o los interruptores de payload (notas / audio / tareas / eventos / informes). Los cambios se aplican al instante
- Eliminar: borra de forma permanente la automatización y todos sus registros de entrega
Límites de entrega
La entrega de webhooks tiene dos límites: una cuota mensual (límite estricto, varía según el plan) y un límite antirráfaga por hora (límite suave, idéntico en todos los planes de pago).
| Plan | Webhooks | Entregas mensuales | Ráfaga por hora |
|---|---|---|---|
| Free | 0 | 0 | - |
| Basic | 1 | 300 | 100 |
| Pro | 3 | 3.000 | 100 |
| Ultra | 10 | 15.000 | 100 |
El plan Ultra también admite enlaces de audio en los payloads de notas (expiran en 24 horas).
Cómo se comportan los límites:
- Cuota mensual superada: la entrega se marca como fallida sin reintento. Las nuevas entregas se reanudan el día 1 del mes siguiente, cuando se reinicia el contador.
- Límite por hora superado: la entrega se aplaza y se reintenta unos 5 minutos después, así una ráfaga corta no pierde datos. Es una protección antirráfaga suave, no un rechazo definitivo.
Los envíos de prueba y los reintentos manuales desde el registro de entregas no cuentan para ninguno de los dos límites.
Filtrar eventos de prueba
Cuando tocas "Test", el payload incluye "test": true en el nivel superior. En tu herramienta de automatización, puedes comprobar este campo y omitir el procesamiento cuando esté presente.
Guías por plataforma
Para instrucciones paso a paso con tu herramienta de automatización:
- Zapier: conecta TellDone a miles de apps con Zaps
- Make: construye escenarios de automatización visuales (antes Integromat)
- n8n: usa webhooks de TellDone en flujos de trabajo autoalojados o en la nube
- Endpoints personalizados: cualquier servicio que acepte solicitudes HTTPS POST funciona con webhooks de TellDone
Casos de uso populares
- Enviar tareas a Google Sheets a través de Zapier
- Crear mensajes de Slack a partir de notas con Make
- Registrar eventos en un CRM personalizado con n8n
- Hacer copia de seguridad de todas las notas en almacenamiento en la nube
- Reenviar informes a un panel de equipo
Ver también
- Inbox y soporte: si un webhook falla varias veces, verás un mensaje en tu Inbox
- Zapier: configuración paso a paso de Zapier
- Make: configuración paso a paso de Make
- n8n: configuración paso a paso de n8n
- Todoist: sincronización bidireccional dedicada de tareas (sin webhooks)
- Notion: integración dedicada con Notion
- Reenvío por correo - recibir datos de notas por correo