Skip to content

Schedules

A schedule defines an automated sequence of operations that JIM executes on a trigger (cron-based or manual). Each schedule contains ordered steps that can run sequentially or in parallel, and supports several step types: Run Profile execution, PowerShell scripts, external executables, and SQL scripts.

Schedules are the primary mechanism for automating identity synchronisation workflows. A typical example is a nightly schedule that imports from each Connected System, runs synchronisation, and exports the results.

Triggers

A schedule is one of two trigger types:

  • Cron
    Runs automatically on a recurring pattern.
  • Manual
    Runs only when explicitly triggered.

Pattern types

Cron schedules support three authoring modes:

  • Specific times
    Pick days and times of day (e.g. weekdays at 06:00 and 18:00). JIM derives the cron expression from your selection.
  • Interval
    Run every N minutes or hours within a daily window (e.g. every 15 minutes between 08:00 and 18:00 on weekdays).
  • Custom
    Supply a raw cron expression for full control.

The first two modes cover the vast majority of cases without requiring administrators to think in cron syntax. Custom is the escape hatch for the unusual schedules they don't.

Steps

Each step has an execution mode and a step type.

Execution mode

  • Sequential
    The step runs after the previous one finishes.
  • Parallel with previous
    The step runs at the same time as the previous one.

A stepIndex orders steps; multiple steps with the same index run in parallel.

Step types

  • Run Profile
    Execute a Run Profile against a Connected System.
  • PowerShell
    Run a PowerShell script with arguments.
  • Executable
    Run an external executable.
  • SQL script
    Run a SQL script against a configured database connection.

Continue on failure

Set per step. By default, a failing step halts the schedule. Turn this on for steps where downstream work should proceed regardless (for example, an optional reporting step that shouldn't block the rest of the run).

Executions

Each schedule run produces a Schedule Execution record with per-step progress. Active and historical executions can be listed, retrieved, and (for active ones) cancelled.

A Schedule Execution typically appears as a parent activity with one child activity per step; this lets you walk down a schedule's execution tree from a single high-level record into the per-step detail.

Seeing how a run ended

The Schedules list shows each schedule's last run and, beside it, how that run ended. A run that stopped on a failure names the step it stopped on, so you can tell at a glance whether last night's schedule did what it was supposed to. A schedule that has never run says so.

Expanding a schedule's row lists its recent executions with their outcomes, how long each took, and how many of its steps ran. This is the quickest way to tell a one-off failure from a step that has been failing all week.

The same last-run outcome is available to automation. Get-JIMSchedule and the Schedules list REST endpoint carry it on each Schedule as LastExecutionId, LastExecutionStatus, LastExecutionCurrentStepIndex, LastExecutionTotalSteps, LastExecutionCompletedAt and LastExecutionErrorMessage, so a monitoring script can ask whether last night's run succeeded without walking the execution history. See the Schedules cmdlets for the field-by-field description.

The Schedule Execution view

Selecting an execution opens a view of that single run:

  • Every step, in the order it ran, with its outcome and duration.
  • Steps that share a step index are shown as a group, because they ran in parallel.
  • A link from each step to the Activity that produced it, where the per-object detail and any error live.
  • The error that stopped the run, where one did, together with whether Continue on failure was set on the step that failed.

Steps after a hard failure are shown as not run, rather than pending: the run has stopped, and they never will.

An execution that is still in progress refreshes as it goes, and can be cancelled from this view.

Watching one run

While a schedule is running, its tasks are grouped under a header in Admin > Operations > Queue, and that header draws the whole schedule as a rail: one marker per step, in the order they run, with the step names underneath and the step it has reached named beside them ("Step 2 of 5").

The rail shows the whole schedule, not just the part still queued. A task is removed from the queue the moment it finishes, so steps already done would otherwise disappear as the run progressed; their outcomes are read from their Activities instead. A step that failed stays visible as a failed marker, including when the group is collapsed to a single row.

A step running several tasks at once is drawn as one divided marker, a wedge per task, each carrying that task's own outcome. So a step where one of two parallel imports has failed while the other is still running reads as exactly that, rather than as a single colour for the whole step. The wedges are ordered by outcome rather than by task, so a failure always starts at the top of the marker and stays visible however wide the schedule fans out.

A step's position counts step groups: steps that run concurrently share one position, so a schedule of six steps where two run together is five steps long.

Enabled flag

Disabled schedules don't fire on their cron trigger and don't appear as eligible for manual run. This is useful for temporarily pausing a schedule during maintenance without losing its definition.

Built-in schedules

JIM ships with a small number of built-in schedules that are part of the product rather than something you create. They behave like any other schedule with one difference: their name is fixed and they cannot be deleted. You can still change when they run and enable or disable them.

  • Temporal Scope Reconciliation
    Keeps relative-date scope filters live for objects whose source data isn't changing. Both the import and export hot paths skip an object that hasn't changed since the last run, so a leaver whose end date has just passed, or a joiner whose start date has just arrived, would otherwise never be re-evaluated until something else about them changed. This schedule periodically re-checks those time-driven scope transitions and routes the affected objects back through the normal synchronisation engine, so date-driven deprovisioning and staged provisioning happen on their own. It runs hourly by default; lower the interval for tighter timing, or raise it to reduce background work.

What you can and can't do with a built-in schedule:

  • Re-time it
    Change the trigger pattern or interval (for example, run the reconciler every 15 minutes instead of hourly).
  • Enable or disable it
    Pause it during a maintenance window and re-enable it afterwards.
  • Rename it
    The name is fixed so the schedule stays recognisable and JIM can keep it maintained across upgrades.
  • Delete it
    Built-in schedules are part of the product; disable one instead if you don't want it to run.
  • Change its steps
    The step composition is defined and maintained by JIM; the Steps tab is read-only for a built-in schedule.

The portal reflects this: a built-in schedule's name and steps are read-only in the editor, and its delete action is replaced with a lock. These rules are enforced everywhere, not just in the portal: the PowerShell module and REST API reject a rename, delete or step change, and the underlying application layer is the authoritative backstop.

Auditing

Every configuration change to a schedule is recorded in the immutable audit log (Activities): creating, editing, enabling, disabling, re-timing and deleting are each captured as an Activity attributed to whoever made the change, the same audit trail JIM keeps for Connected Systems and Synchronisation Rules. Running a schedule is tracked separately, as a schedule execution and its per-step Activities.

Change history

Every change to a Schedule's configuration (including its Steps) is recorded as a versioned snapshot, the same way as for Synchronisation Rules and Connected Systems. The History tab in the Schedule editor shows the timeline of changes, each as a field-by-field "before and after", and lets you compare any two versions. A step's SQL connection string is treated as a secret: a change to it is recorded, but its value is never stored or shown.

The same history is available from the Get-JIMConfigurationChangeHistory cmdlet (-Type Schedule -Id <guid>) and the Schedule change-history REST endpoints in the interactive API reference.

When changing a schedule from automation you can record a reason alongside the change, exactly as for Synchronisation Rules and Connected Systems: pass -ChangeReason on the Schedule write cmdlets (New-, Set-, Remove-, Enable-, Disable-JIMSchedule and the step cmdlets), or the optional changeReason field/query parameter on the REST write endpoints. The reason shows with the change and on its Activity.

Common workflows

Setting up an automated nightly sync:

  1. Create a schedule with a cron trigger, a specific-times pattern, and the schedule enabled
  2. Add ordered steps for each operation: imports first, then syncs, then exports (typically sequential)
  3. Verify by triggering a manual run before the first scheduled fire
  4. Monitor the resulting execution to confirm each step completes as expected

Running an ad-hoc sync via a manual schedule:

  1. Create a schedule with a manual trigger
  2. Add the steps for the operations you want
  3. Run it when you need it; monitor the execution

Pausing a schedule during a maintenance window:

  1. Disable the schedule
  2. Do the maintenance work
  3. Re-enable the schedule; the next scheduled fire-time picks up automatically

Manage Schedules

  • JIM portal
    Schedules area of the admin UI
  • PowerShell
    Schedules cmdlets (Get-JIMSchedule, New-JIMSchedule, Invoke-JIMSchedule, etc.)
  • REST API
    Schedules and schedule execution endpoints in the interactive API reference

See also

  • Run Profiles -- the operations executed by Run Profile steps
  • Activities -- each schedule execution produces a parent activity with child activities per step