Docs / Build Workflow

Scheduled Exports

Modo document y exports son la misma idea

Un dashboard en layout_mode: document está diseñado para ser leído de arriba abajo, como un reporte. Renderiza en un layout fijo que mapea limpio a una página impresa o PDF. Los exports toman ese layout y lo entregan en un schedule — sin que nadie tenga que abrir la UI.

La combinación de dashboards document y scheduled exports reemplaza el workflow manual de "screenshot y paste en slide". Defines el reporte una vez y aterriza donde tiene que ir, con data fresca, a tiempo.

Dónde viven las definiciones de export

Los exports son archivos YAML dentro de content/exports/ en tu workspace:

<workspace_slug>/
  content/
    exports/
      sales_daily_pdf.yml
      fulfillment_weekly_pdf.yml

Cada archivo define un job de export: qué dashboard, qué schedule, qué parámetros y a dónde entregar el output.

Working example

id: ec_business_daily_pdf
enabled: true
dashboard_id: ec_business_overview
schedule:
  cron: "0 8 * * *"
  timezone: "America/New_York"
params:
  cutoff_date: "{{today}}"
destination:
  type: local_folder
  folder: "."
  filename: "business-overview-{{today}}.pdf"
policy:
  on_missed_run: skip
  max_retries: 2
  timeout_seconds: 180
subscribers:
  email:
    - [email protected]
    - [email protected]

Campo por campo:

  • id: identifier único para este job de export.
  • enabled: setea a false para pausar sin borrar.
  • dashboard_id: tiene que matchear el id de un dashboard publicado. El layout mode document es requerido para exports PDF.
  • schedule.cron: expresión cron estándar de cinco campos. 0 8 * * * corre cada día a las 08:00.
  • schedule.timezone: nombre de timezone IANA. La expresión cron se evalúa en esta timezone.
  • params: valores de filtros de dashboard inyectados en tiempo de render. Las keys matchean el param del filtro del dashboard, con fallback a su id — así que para que la key cutoff_date de este ejemplo se bindee, el filtro cutoff del dashboard target declara param: cutoff_date.
  • destination.type: local_folder guarda el PDF en la carpeta especificada en el host del export engine.
  • destination.filename: soporta template variables. {{today}} se expande a la fecha actual en formato ISO.
  • policy.on_missed_run: skip saltea runs perdidos silenciosamente. Usa backfill si necesitas que los runs perdidos se ejecuten al recover.
  • policy.max_retries: cuántas veces se reintenta un render fallido antes de que el run se marque como failed.
  • policy.timeout_seconds: si el render del PDF lleva más que esto, el job se marca como failed.
  • subscribers: un hermano top-level de destination — destinatarios de entrega por canal; detallado abajo.

Enviar el reporte a suscriptores

Un export puede entregar el PDF terminado directo a las personas — por email o WhatsApp — sin que nadie abra Looky. Agrega un bloque subscribers y lista a cada destinatario bajo el canal por el que quieres alcanzarlo:

subscribers:
  email:
    - [email protected]
    - [email protected]
  whatsapp:
    - "+15551234567"
  • email: direcciones de correo que reciben el PDF como adjunto.
  • whatsapp: números de teléfono en formato +<código de país><número> que reciben el PDF por WhatsApp.

Tú eliges el canal explícitamente — pon un correo bajo email y un teléfono bajo whatsapp. Los destinatarios no necesitan una cuenta de Looky, así que un reporte programado es una forma simple de mantener informados a los interesados. Ambas listas son opcionales; un export sin subscribers solo genera el PDF sin enviarlo a ningún lado.

Template variables

Tanto los valores de params como destination.filename soportan estas template variables:

  • {{today}} — la fecha de hoy en la timezone del export (formato ISO: YYYY-MM-DD).
  • {{yesterday}} — la fecha de ayer en la timezone del export.

Esto mantiene en sync los nombres de archivo de export y los valores de filtro del dashboard sin configuración manual:

params:
  cutoff_date: "{{today}}"
destination:
  filename: "sales-report-{{today}}.pdf"

Ejemplos de cron schedule

  • 0 8 * * * — cada día a las 08:00
  • 0 8 * * 1 — cada lunes a las 08:00
  • 0 8 1 * * — primer día de cada mes a las 08:00
  • 0 6,18 * * * — dos veces al día a las 06:00 y 18:00

Siempre setea un timezone. Un cron sin timezone corre en UTC, lo que produce fechas off-by-one cuando usas {{today}} si tus usuarios están en otra timezone.

Push y verificar exports

Las definiciones de export se pushean con el resto del content del workspace:

looky validate
looky diff
looky push

Después del push, el export engine levanta el job nuevo en su próximo ciclo de scheduling. Para verificar que el job esté registrado, chequea el status del workspace en la UI.