Features
Projects — The Delivery Engine
The Projects module is natively connected to the CRM — projects link to deals, tasks link to contacts and deals, and time tracking data lives in the same database as revenue data. This is what makes the “Lead → Deal → Project → Profitability” loop possible.
- Free: 3 projects, 100 tasks, kanban board, calendar, comments, time tracking view
- Pro: 50 projects, unlimited tasks, + subtasks, milestones, gantt, dependencies, time tracking log, estimation, budget, team management
Projects
A project is the container for delivering on a won deal. It has a name, status, client, start/end dates, budget, and a linked deal. When a deal is Won, the team can immediately create the associated project without re-entering client information.
Views:
- List page (
/projects): Table and card views. Board tab shows all tasks across all projects. List tab shows all tasks as a sortable table. - Project detail (
/projects/[id]): Overview tab (status, progress, budget, team), Tasks tab (kanban/calendar/gantt), Files tab, Team tab. - Budget (Pro): Project budget displayed on Overview tab. Tracked against actual cost from time entries.
Tasks
Tasks are the atomic unit of work. They can have an assignee, due date, priority, story points, subtasks, dependencies, comments, time entries, and file attachments. Tasks are soft-deleted — deleted_at is set rather than removing the row.
Views:
- Kanban board: Tasks organized by status columns. Drag-and-drop to change status. Viewer role: read-only.
- Calendar view: Tasks with due dates plotted on a calendar.
- Gantt view (Pro): Horizontal timeline. Task bars can be dragged to reschedule.
- Task detail drawer: Opens from any task card — edit status, priority, assignee, due date, story points, subtasks, dependencies, time entries, comments, attachments.
- Task detail page (
/projects/tasks/[id]): Full-page view for deep linking.
Pro features:
- Subtasks: Tasks can have child tasks. Subtask progress shown on parent card.
- Task dependencies: Mark one task as blocking another.
- Story points / estimation: Numeric field for sprint planning.
Time tracking
Time tracking records how much time team members spend on tasks. Because this data lives in the same database as deal values and project budgets, OpsDash can calculate real-time project profitability — the differentiating feature no standalone tool can replicate.
- Free: View logged time entries per task, no logging
- Pro: Start/stop timer, manual entry (hours + minutes + description + date), delete entries
| Item | Detail |
|---|---|
| Table | task_time_entries — task_id, user_id, org_id, duration_minutes, description, logged_at |
| Server actions | getTaskTimeEntries, createTaskTimeEntry, deleteTaskTimeEntry |
| Feature flags | projects:time-tracking-view (Free), projects:time-tracking-log (Pro) |
Milestones
Milestones are high-level checkpoints within a project. They have a title, due date, and completion status. Milestones are visible on the project overview and in the gantt view (Pro).
- Feature flag:
projects:milestones(Pro) - Server actions:
getProjectMilestones,createMilestone,updateMilestone,deleteMilestone
Project team
Project team management (Pro) lets project owners assign team members with specific roles (manager, developer, designer, consultant) and control their access within the project.
- Feature flag:
projects:team-management(Pro) - Members can be added from the org's existing members list
- Project-level roles are separate from org-level roles
Technical reference
| Item | Detail |
|---|---|
| Action files | actions/projects.ts, actions/tasks.ts (barrel + tasks-*.ts), actions/milestones.ts, actions/project-members.ts |
| RPC | get_tasks_with_assignees — SECURITY DEFINER joins tasks + user names |
| Key migrations | 00003 (domain tables), 00024 (deal-linked tasks), 00025 (budget/milestones), 00026 (subtasks/dependencies), 00054 (soft-delete) |
| Audit actions | project.created, task.created, task.status_changed, task_time_entry.created |