07.1 Jobs: run things on a schedule

A job is one action on a timetable, e.g. rebuild the sales cube every night at 02:00. Analytics runs what's due and records every attempt.

Create a job

  1. Left menu Jobs → + New job.
  2. Job step:
    • Name: e.g. Nightly sales refresh.
    • Description (optional).
    • Action: what to run:
Action Does
cube-build Builds a cube, reloading its tables first if needed (06.3)
warehouse-load Reloads one warehouse table (06.2)
move-run Runs a saved move (02.4)
  1. Inputs step: pick which cube, table or move. For a stored procedure, add its Parameters with + Add parameter:

    • Name: click the box to pick one of the procedure’s own parameters, read from the database, or type it.
    • Value: where it comes from:
      • This run: the start or end of the period this run covers, from the job’s own schedule or from the job before it (below).
      • The job before: the range that job was given, or the range it actually used.
      • Fixed value: type it.

    On MySQL, keep the rows in the order the procedure declares its parameters.

  2. Schedule step:

    • Schedule: Every 15 minutes, Hourly, Daily at 02:00, Weekly, Monday at 06:00, Monthly, the 1st at 03:00, Custom cron… (ask IT for unusual timings), or Manual only.
    • Status: Active runs when due. Paused is saved but doesn’t run.
    • Start from: when the schedule begins.
    • Each run takes (only for actions that move a date range, such as move-run): Everything, each run, Since the last successful run, or Continue from what is already loaded (with Also re-read the last … days, for rows that change after they were loaded). This is the job’s choice, not the move’s: the same move can run nightly since the last successful run and be run by hand for one month. A range given when the job is started, by a workflow or by the job before it, always wins.
    • Retry on failure: no, once, twice or 3 times.
    • Give up after: minutes before a stuck run is stopped (30 by default).
  3. After this job step (optional): see Run another job after this one.

  4. Save job.

Run another job after this one

For example: when the nightly load finishes, rebuild the cube, but only if the load found new rows.

  1. Open the job → Edit → After this job.
  2. Tick Run another job when this one finishes.
  3. For each rule:
    • If: when this rule applies, written as JSON. Leave it empty to mean “otherwise”.
    • Run: the job to start.
  4. + Add rule for more. Rules are checked from the top, and the first one that matches runs its job. The ↑ button moves a rule up. A rule with no condition must be the last one.
  5. Save job.

Example conditions:

You want Write
Only if this job succeeded { "field": "status", "op": "=", "value": "success" }
Only if it failed { "field": "status", "op": "=", "value": "failed" }
Only if it moved rows { "field": "output.totalRows", "op": ">", "value": 0 }
Both at once { "all": [ { "field": "status", "op": "=", "value": "success" }, { "field": "output.totalRows", "op": ">", "value": 0 } ] }

A condition can read:

  • status: success or failed;
  • output.<name>: what this job’s action returned;
  • window.from and window.to: the period it ran for;
  • carry.<name>: values passed along from earlier jobs;
  • error.message: why it failed.

Comparisons are =, !=, >, >=, <, <=, in, contains and isEmpty, among others. Use all for “every one of these” and any for “at least one”.

The period carries over. The next job runs for the same date range as the one before it, so a chain of jobs all cover the same period. You don’t need to set anything for that. For a data movement that starts from the highest value already loaded, the range passed on is where it actually read from, onwards. A movement set to Strictly the date range the job gives it (02.4) then moves exactly that range.

Passing other values on (under Pass values on):

  • Inputs of the next job: e.g. { "region": "{output.region}" }. The next job must allow that input; a job never lets another job change its connection.
  • Carry for later jobs: e.g. { "loadedRows": "{output.totalRows}" }. Later jobs in the chain read it as carry.loadedRows.

A job can’t start itself, and a chain that comes back to a job it already ran stops with a message instead of looping. If no rule matches, nothing runs, and that isn’t an error.

It’s an ordinary workflow. What you set here is saved as a workflow that starts when this job finishes. It’s listed under Workflows, marked after job, with each of its runs. Open it there to add more, such as an email or an approval. Once it does more than simple rules can say, this step tells you so and points you there, rather than showing rules that are not what runs. Any other workflow that starts when this job finishes is listed here by name.

The jobs list

  • Run now, Edit, Delete (history is kept).
  • Enabled shows On, Paused or No schedule. Click it to pause or resume.
  • Expand a job to see its runs: when, outcome, how long, and the Log.
  • Live updates shows runs as they happen.

A run that stops reporting progress for 5 minutes is marked Not responding. Failures also appear on the Problems page (09.1).

Tip: a job for a move, from the move

On a saved move’s Run step, + New job opens this page with a new job for that move already filled in, and Jobs that run it lists the jobs it already has (02.4).

Who can see Jobs: by default, company admins and super admins.

Next: 07.2 Workflows

Last updated 23 October 2026