blob: 1d4122a5bbba1c2923f6d09628a718632eea26a9 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
# ClickUp
The ClickUp plugin collects issues, boards, and sprints from ClickUp so they
feed DevLake's issue-tracking and DORA/velocity metrics, modeled on the Jira
and Linear connectors.
## Authentication
ClickUp authenticates with a **personal API token** (ClickUp → Settings → Apps
→ API Token, starts with `pk_`). The token is sent verbatim in the
`Authorization` header. OAuth is not yet supported.
Create a connection with:
- **Endpoint** — `https://api.clickup.com/api/v2/`
- **Token** — your `pk_...` personal token
## Data scope: the folder is the board
Unlike a raw list, the **scope you select is a ClickUp folder** (e.g. a team's
`Dev Team` / `Sprint Folder`). This mirrors a Jira board: selecting the folder
collects every list inside it on each sync, so rolling and archived sprint
lists never need to be re-scoped.
Domain mapping:
| ClickUp | DevLake domain |
| --- | --- |
| Folder | `board` |
| Sprint list (name-matched) | `sprint` + `board_sprint` |
| Task | `issue` + `board_issue` |
| Task in a sprint list | `sprint_issue` |
| Folder member | `account` |
## Sprints
A list is treated as a sprint when its name matches the **sprint name pattern**
(default `(?i)sprint\s*\d+`, e.g. `v4.3.0 Sprint 40 (7/6/26 - 7/19/26)`). The
start/end dates are parsed from the parenthesised date span in the name;
`M/D/YY` vs `D/M/YY` ordering is disambiguated automatically (a component > 12
must be the day). Lists that don't match are collected as plain board issues.
Archived sprint lists are collected too, so historical velocity is retained.
## Story points
Story points default to ClickUp's native sprint **`points`** field. To read
them from a custom field instead (e.g. a Fibonacci "LOE" field), set
**Story point field** in the scope config to the custom-field name.
## Incidents (DORA Change Failure Rate / MTTR)
ClickUp tasks have no universal "type" field, so incidents are modeled by
**scope**: add the folder that holds incidents (e.g. a "Security Incidents"
folder) as its own board and set the scope config's **Force issue type** to
`INCIDENT`. Every issue on that board is then classified as an incident.
## Scope configuration (transformation)
Per board, the scope config lets you override:
- **Sprint name pattern** — which lists are sprints.
- **Story point field** — native `points` (blank) or a custom field name.
- **Force issue type** — flag the whole board as `REQUIREMENT` / `BUG` /
`INCIDENT` (leave blank to detect per task).
- **Issue type patterns** — RegExes matched against a task's type; precedence
is `INCIDENT` > `BUG` > `REQUIREMENT`.
- **Status mapping** — ClickUp statuses are auto-mapped by their `type`
(`open`/`unstarted` → `TODO`, `custom` → `IN_PROGRESS`, `done`/`closed` →
`DONE`); list raw status names to override where a team's workflow differs.
## Metrics
A branded **ClickUp** Grafana dashboard (`grafana/dashboards/{mysql,postgresql}/ClickUp.json`)
renders issue throughput and lead-time metrics; DORA and sprint/velocity
metrics are computed from the source-agnostic domain layer.