Bulk Import Tasks Guide
Create many tasks at once from a CSV — migrating a backlog from another tracker, without one-at-a-time entry.
What it does
Project → Tasks tab → Import, right next to + New Task. Same tasks.create permission as a single create — this is “the same thing you could already do one row at a time, just faster,” not a new or looser privilege.
CSV Format
The first row must be column headers. Only Title is required — map as many of the rest as your file has:
- Title — required.
- Status — TODO / IN_PROGRESS / DONE / BLOCKED, defaults to TODO.
- Priority — LOW / MEDIUM / HIGH / URGENT, defaults to MEDIUM.
- Assignee (email) — must match an existing member of this project.
- Requirement — matched by title against this project's existing Requirements.
- Start date / End date
- Estimate (hours)
- Labels — comma-separated within the cell.
Title,Status,Priority,Assignee Email,Requirement,Start,End,Estimate,Labels
Fix login redirect,TODO,HIGH,dev@company.com,Auth revamp,2026-09-10,2026-09-15,4,bug,frontend
Write onboarding doc,TODO,LOW,,,,,,docsSteps
Choose a CSV file
Parsed entirely in your browser — nothing is uploaded until you actually confirm the import on the last step.
Map columns to task fields
Best guesses are pre-filled from common header names (e.g. “Assignee Email” → Assignee), but every field is shown for you to confirm or correct — never applied silently.
Preview
Shows the first 10 rows with a warning icon on any assignee or requirement that won't resolve, checked against this project's actual members/requirements before you commit to anything.
Import
Shows how many tasks were created, how many rows were skipped (missing title), and the full per-row warning list for anything that imported without an assignee or requirement link.
Nothing Is Ever Guessed
An assignee email that isn't a project member, or a requirement title that doesn't match one in this project, is never silently mapped to something close. The row still imports — the title always wins — just without that field, reported back per row so nothing vanishes into an import that “mostly worked.”
Limits
Capped at 300 rows per import (server-configurable via TASK_BULK_IMPORT_MAX_ROWS). Task numbers for the whole batch are allocated as one contiguous range in a single database update, not one at a time — a large import can't collide with someone creating a task manually at the same moment.