Tableros · Importación
Importar tareas por JSON
Cargá un tablero entero de una — columnas, tareas, subtareas, etiquetas, responsables, fechas del Gantt e hitos del timeline — pegando un solo JSON. Pensado para armar el plan con una IA y volcarlo al tablero sin tipear tarjeta por tarjeta.
Cómo funciona
- Abrí el tablero al que querés importar.
- Tocá Importar en la barra superior.
- Pegá el JSON o subí un archivo
.json. - Validar hace una pasada en seco: te dice cuántas tareas van a cada columna, qué columnas y etiquetas se crean y qué avisos hay, sin escribir nada.
- Importar lo aplica en una sola transacción: o entra todo, o no entra nada.
Estructura
El JSON es un objeto con cuatro claves de primer nivel. Sólo cards es necesario:
{
"options": { }, // opcional — comportamiento de la importación
"lists": [ ], // opcional — columnas del kanban
"cards": [ ], // las tareas
"milestones": [ ] // opcional — hitos del timeline
}Si sólo tenés tareas, el JSON puede ser directamente el array: [{ "title": "Primera tarea" }, "Segunda tarea"].
Tareas
Cada elemento de cards es un objeto — o un string suelto, que equivale a { "title": "..." }. Lo único obligatorio es el título.
| Param | Type | Required | Description |
|---|---|---|---|
| title | string | Sí | Texto de la tarjeta. |
| description | string | No | Detalle largo. Acepta markdown. |
| list | string | No | Nombre de la columna destino. Si no existe se crea. Por defecto, la primera columna del tablero. |
| labels | string[] | No | Nombres de etiqueta. Las que falten se crean con un color automático. |
| assignee | string | No | Email de un miembro del sitio. Si no coincide, la tarea queda sin asignar y se avisa. |
| start_date | string | No | YYYY-MM-DD. Inicio de la barra en el Gantt. |
| due_date | string | No | YYYY-MM-DD. Vencimiento y fin de la barra. |
| cover_color | string | No | Hex #rrggbb. Franja de color arriba de la tarjeta. |
| completed | boolean | No | true marca la tarea como hecha. |
| is_epic | boolean | No | Épica: agrupa sus hijas en el Gantt. |
| children | card[] | No | Subtareas anidadas, mismo formato. Máximo 5 niveles. |
| ref | string | No | Id local para referenciar esta tarea desde otra. |
| parent | string | No | ref de la tarea padre — alternativa plana a children. |
Jerarquías
Hay dos formas de colgar una tarea de otra. Anidada con children, que es lo más legible:
{
"title": "Autenticación",
"children": [
{ "title": "Magic link" },
{ "title": "OAuth Google" }
]
}O plana, con ref + parent, útil cuando la hija va en otra columna o la generás por separado:
[
{ "ref": "auth", "title": "Autenticación", "list": "En progreso" },
{ "title": "Magic link", "parent": "auth", "list": "Por hacer" }
]"is_epic": false.Timeline y Gantt
El tablero tiene vista Gantt, y la importación la llena entera. Hay tres piezas:
1. Barras — start_date y due_date
Una tarea dibuja su barra en el timeline si tiene start_date y/o due_date. Sin ninguna de las dos aparece en la lista lateral pero sin barra.
2. Agrupación — épicas y subtareas
Las épicas se muestran como filas contenedoras y sus hijas indentadas debajo. Poné fechas también en las hijas para que cada una tenga su propia barra.
3. Hitos — milestones
Los hitos son las líneas verticales del timeline: un lanzamiento, una demo, un deadline duro. Van en el array milestones de primer nivel, no dentro de las tareas.
| Param | Type | Required | Description |
|---|---|---|---|
| title | string | Sí | Nombre del hito. |
| date | string | Sí | YYYY-MM-DD. Posición de la línea en el timeline. |
| color | string | No | Hex #rrggbb. Por defecto #6366f1. |
| description | string | No | Detalle opcional. |
| completed | boolean | No | true = hito ya alcanzado. |
{
"cards": [
{
"title": "Fase 1 — MVP",
"start_date": "2026-08-01",
"due_date": "2026-08-31",
"children": [
{ "title": "Modelo de datos", "start_date": "2026-08-01", "due_date": "2026-08-07" },
{ "title": "API", "start_date": "2026-08-08", "due_date": "2026-08-20" },
{ "title": "UI", "start_date": "2026-08-15", "due_date": "2026-08-31" }
]
}
],
"milestones": [
{ "title": "Demo interna", "date": "2026-08-20", "color": "#f59e0b" },
{ "title": "Beta pública", "date": "2026-09-01", "color": "#8b5cf6" }
]
}Columnas y opciones
Las columnas se crean solas al mencionarlas en list. Declaralas en lists sólo si querés fijar su orden o su color:
| Param | Type | Required | Description |
|---|---|---|---|
| name | string | Sí | Nombre de la columna. |
| color | string | No | Hex #rrggbb del punto de la columna. |
options
| Param | Type | Required | Description |
|---|---|---|---|
| default_list | string | No | Columna para las tareas que no definen list. Por defecto, la primera del tablero. |
| create_missing_lists | boolean | No | Default true. En false, las tareas con columna desconocida van a la columna por defecto. |
| create_missing_labels | boolean | No | Default true. En false, las etiquetas que no existan en el sitio se omiten. |
"Por hacer" y "por hacer" son la misma columna.Ejemplo completo
Usa todas las funciones: columnas con color, épica con subtareas, jerarquía por ref, tarea completada, string suelto e hitos.
{
"options": {
"default_list": "Por hacer",
"create_missing_lists": true,
"create_missing_labels": true
},
"lists": [
{ "name": "Por hacer", "color": "#6366f1" },
{ "name": "En progreso", "color": "#f59e0b" },
{ "name": "Listo", "color": "#10b981" }
],
"cards": [
{
"ref": "auth",
"title": "Autenticación",
"description": "Login con email + Google",
"list": "En progreso",
"labels": ["backend", "urgente"],
"assignee": "alguien@ejemplo.com",
"start_date": "2026-08-01",
"due_date": "2026-08-15",
"cover_color": "#8b5cf6",
"children": [
{ "title": "Magic link", "start_date": "2026-08-01", "due_date": "2026-08-07" },
{ "title": "OAuth Google", "start_date": "2026-08-08", "due_date": "2026-08-15" }
]
},
{
"title": "Definir esquema de la DB",
"list": "Listo",
"completed": true
},
{
"title": "Escribir tests de la API",
"parent": "auth",
"labels": ["testing"],
"due_date": "2026-08-20"
},
"Revisar copy del landing"
],
"milestones": [
{ "title": "Beta pública", "date": "2026-09-01", "color": "#8b5cf6" },
{ "title": "Lanzamiento", "date": "2026-10-15" }
]
}Prompt para IA
Para que una IA te genere el JSON, dale la especificación completa. Tenés tres formas:
- Copiar el prompt con el botón de arriba y pegarlo antes de tu pedido.
- Pasarle la URL
multi-site-manager.vercel.app/docs/tasks-import/llms.txtsi la IA puede leer la web. - Pegar esta página tal cual.
Después pedile lo tuyo. Por ejemplo:
Armá el plan de trabajo para lanzar el rediseño del sitio en 6 semanas arrancando el 2026-08-03. Columnas: Backlog, En progreso, Revisión, Listo. Agrupá por fase con épicas, poné start_date y due_date en todas las tareas y agregá hitos para la demo interna y el lanzamiento.
API
El modal usa este endpoint interno. Requiere sesión del dashboard (cookie), no un token de sitio.
/api/sites/{siteId}/tasks/boards/{boardId}/importInternalAgregá ?dry_run=1 para validar sin escribir. El body es el JSON del formato, tal cual.
curl -X POST "multi-site-manager.vercel.app/api/sites/SITE_ID/tasks/boards/BOARD_ID/import?dry_run=1" \ -H "Content-Type: application/json" \ --data-binary @plan.json
Respuesta
{
"dry_run": false,
"cards": 12,
"milestones": 2,
"lists_created": ["Revisión"],
"labels_created": ["backend", "testing"],
"by_list": [
{ "name": "Por hacer", "cards": 7, "is_new": false },
{ "name": "Revisión", "cards": 5, "is_new": true }
],
"warnings": []
}Errores y avisos
Errores — no se importa nada
Devuelven 400 con la ruta exacta dentro del JSON, por ejemplo cards[3].due_date:
- JSON con sintaxis inválida.
- Tarea sin
title. - Fecha que no es
YYYY-MM-DDo que no existe (2026-02-30). - Color que no es hex de 6 dígitos.
- Más de 500 tareas, más de 100 hitos o más de 5 niveles de anidamiento.
Avisos — se importa igual
Lo que se puede resolver perdiendo sólo ese dato entra como aviso:
assigneeque no es miembro del sitio → la tarea queda sin asignar.parentque apunta a unarefinexistente → la tarea queda sin padre.- Referencias circulares entre tareas → se corta el vínculo.
- Hito repetido (mismo título y fecha) → se omite.