Skip to main content
Maintenance programmes and the tasks they contain. Not part of the daily set — delivered only when a plan revision changes. Update key: the plan’s external_system_id plus task_external_system_id, within the project
This file deletes. Any task that exists in the platform but is absent from a delivered file is hard-deleted, for every plan the file mentions. A plan file must therefore always carry the complete task list for each plan it names. Read what gets deleted before producing this file — the failure modes are destructive and not recoverable from the import itself.

Layout

Plan and task columns sit on the same row, one row per task. Plan columns are repeated identically across every row belonging to the same plan. When a plan’s rows disagree on the plan-level columns, the first row in the file wins and the rest are ignored.

Plan columns

A plan targets a vehicle type or a component type, never both and never neither.

Task columns

The tolerances are what decide whether work shows as due soon, due, or overdue, so they are worth getting right even though they default to zero.

Rules

  • Exactly one of vehicle_type_code / component_type_code, and the code must resolve within the project.
  • secondary_interval_type and secondary_interval_value must both be set or both be empty.
  • A SEASONAL task requires all four season fields; a non-seasonal task must have none of them. Months are 1–12 and days 1–31.

What gets deleted

After inserting and updating, the import deletes tasks. The scope is precise, and both of its sharp edges are worth understanding. What is safe: the delete only touches plans whose external_system_id appears in the file you just delivered, and never crosses projects. Plans the file does not mention are untouched. What is deleted: within each plan the file does mention, every task in the platform whose identifier is absent from that plan’s rows in the file. This is a hard delete, not an archive flag.
The delete is not protected by the staleness check. If you re-deliver an old plan file, its plan and task rows will be skipped as stale — but the delete still runs, and removes every task added since. Re-sending an old file is destructive even though it appears to change nothing.Splitting one plan across two files is also destructive. Whichever file lands second deletes the tasks contributed by the first. One plan’s complete task list must arrive in one file.
estimated_manhours and estimated_cost are maintained in the application by the Planner role. They are not in this file and are never overwritten by an import — so ordinary re-imports preserve them.The exception follows from the delete above: if a task disappears from a delivered revision, its row is removed and those locally maintained estimates go with it. Re-adding the task later creates a fresh row with empty estimates.

Example

Two rows of the same plan carrying two different tasks. Note the repeated plan columns:

Why a file gets rejected

Required fields abort immediately, before anything else is checked:
Then the structural rules together:
Then type resolution: