Docs / Build Workflow

Scheduled Exports

Document mode and exports are the same idea

A dashboard in layout_mode: document is designed to be read top to bottom, like a report. It renders in a fixed layout that maps cleanly to a printed or PDF page. Exports take that layout and deliver it on a schedule — without anyone having to open the UI.

The combination of document dashboards and scheduled exports replaces the manual "screenshot and paste into slide" workflow. You define the report once and it lands wherever it needs to go, with fresh data, on time.

Where export definitions live

Exports are YAML files inside content/exports/ in your workspace:

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

Each file defines one export job: which dashboard, which schedule, which parameters, and where to deliver the 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
policy:
  on_missed_run: skip
  max_retries: 2
  timeout_seconds: 180
subscribers:
  email:
    - [email protected]
    - [email protected]

Field by field:

  • id: unique identifier for this export job.
  • enabled: set to false to pause without deleting.
  • dashboard_id: must match the id of a published dashboard. Document layout mode is required for PDF exports.
  • schedule.cron: standard five-field cron expression. 0 8 * * * runs every day at 08:00.
  • schedule.timezone: IANA timezone name. The cron expression is evaluated in this timezone.
  • params: dashboard filter values injected at render time. Keys match the dashboard filter's param, falling back to its id — so for this example's cutoff_date key to bind, the target dashboard's cutoff filter declares param: cutoff_date. The values in effect print as one line under the document's title, so the PDF states what its numbers answer to.
  • destination.type: local_folder saves the PDF to your workspace's exports folder. Looky names each file <export id>-<timestamp>-<random>.pdf, so every run lands as its own document and your id is what a reader recognizes it by.
  • policy.on_missed_run: skip skips missed runs silently, and is the supported value.
  • policy.max_retries: how many times a failed render is retried before the run is marked failed.
  • policy.timeout_seconds: if the PDF render takes longer than this, the job is marked as failed.
  • subscribers: a top-level sibling of destination — delivery recipients per channel; detailed below.

Send the report to subscribers

An export can deliver the finished PDF straight to people — by email or WhatsApp — without anyone opening Looky. Add a subscribers block and list each recipient under the channel you want to reach them on:

subscribers:
  email:
    - [email protected]
    - [email protected]
  whatsapp:
    - "+15551234567"
  • email: email addresses that receive the PDF as an attachment.
  • whatsapp: phone numbers in +<country code><number> form that receive the PDF on WhatsApp.

You choose the channel explicitly — put an email under email and a phone number under whatsapp. Recipients don't need a Looky account, so a scheduled report is a simple way to keep stakeholders in the loop. Both lists are optional; an export with no subscribers just produces the PDF without sending it anywhere.

Template variables

params values support these template variables:

  • {{today}} — today's date in the export timezone (ISO format: YYYY-MM-DD).
  • {{yesterday}} — yesterday's date in the export timezone.

This keeps a scheduled run's filter values in step with the day it runs, without editing the export:

params:
  cutoff_date: "{{today}}"

Cron schedule examples

  • 0 8 * * * — every day at 08:00
  • 0 8 * * 1 — every Monday at 08:00
  • 0 8 1 * * — first day of every month at 08:00
  • 0 6,18 * * * — twice daily at 06:00 and 18:00

Always set a timezone. A cron without a timezone runs in UTC, which will produce off-by-one dates when using {{today}} if your users are in a different timezone.

Push and verify exports

Export definitions are pushed with the rest of workspace content:

looky validate
looky diff
looky push

After push, the export engine picks up the new job on its next scheduling cycle. To verify the job is registered, check the workspace status in the UI.