Plan and Track Milestones
Milestones let you group work items into time-boxed iterations (sprints), releases, or project phases. This guide covers creating milestones, assigning work items, and tracking progress.
Milestone types
| Type | Description |
|---|---|
SPRINT | A time-boxed iteration (default) |
RELEASE | A product release |
PHASE | A project phase |
Milestone statuses
| Status | Description |
|---|---|
UPCOMING | Not yet started (default) |
ACTIVE | Currently in progress |
CLOSED | Completed |
Create a milestone
POST /rest/v1/t_ppm_milestones
{
"project_id": "a1b2c3d4-...",
"milestone_name": "Sprint 1",
"milestone_description": "Initial sprint covering core onboarding screens.",
"milestone_type": "SPRINT",
"milestone_start_date": "2026-05-01T00:00:00Z",
"milestone_due_date": "2026-05-14T23:59:59Z"
}
Response (201 Created)
{
"id": "m1n2o3p4-...",
"milestone_name": "Sprint 1",
"milestone_type": "SPRINT",
"milestone_status": "UPCOMING",
"milestone_start_date": "2026-05-01T00:00:00+00:00",
"milestone_due_date": "2026-05-14T23:59:59+00:00",
"project_id": "a1b2c3d4-..."
}
Available fields
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
project_id | uuid | Yes | — | The parent project |
milestone_name | varchar(256) | Yes | — | Display name (unique per tenant) |
milestone_description | text | No | — | Longer description |
milestone_type | varchar(32) | No | SPRINT | SPRINT, RELEASE, or PHASE |
milestone_start_date | timestamptz | No | — | Start date |
milestone_due_date | timestamptz | No | — | Target end date |
milestone_status | varchar(32) | No | UPCOMING | UPCOMING, ACTIVE, or CLOSED |
metadata | jsonb | No | — | Arbitrary key-value data |
Start a milestone
PATCH /rest/v1/t_ppm_milestones?id=eq.m1n2o3p4-...
{
"milestone_status": "ACTIVE"
}
Close a milestone
PATCH /rest/v1/t_ppm_milestones?id=eq.m1n2o3p4-...
{
"milestone_status": "CLOSED"
}
Assign a work item to a milestone
Set the milestone_id field on the work item:
PATCH /rest/v1/t_ppm_work_items?id=eq.<work-item-id>
{
"milestone_id": "m1n2o3p4-..."
}
You can also set milestone_id when creating a work item:
POST /rest/v1/t_ppm_work_items
{
"project_id": "a1b2c3d4-...",
"work_item_type": "TASK",
"work_item_name": "Implement login page",
"milestone_id": "m1n2o3p4-..."
}
Remove a work item from a milestone
PATCH /rest/v1/t_ppm_work_items?id=eq.<work-item-id>
{
"milestone_id": null
}
List work items in a milestone
GET /rest/v1/t_ppm_work_items?milestone_id=eq.m1n2o3p4-...&order=display_order.asc
List milestones for a project
GET /rest/v1/t_ppm_milestones?project_id=eq.a1b2c3d4-...&order=milestone_start_date.asc