Feature: Hiring Pipeline (Stages + Kanban) with Scorecards & Email Notifications
Labels: feature frontend backend api ui/ux good first issue (subtasks)
Milestone: v0.2 (proposed)
Summary
Introduce a hiring pipeline so admins can move candidates through customizable stages (e.g., Applied → Phone Screen → Onsite → Offer → Hired/Rejected) using a drag-and-drop Kanban board. Each application gets a scorecard (structured feedback + rating), a timeline (stage history), and optional email notifications on stage changes. This builds on the current Jobs/Applications foundation.
Why
- Today, applications are flat. A pipeline gives recruiters a clear view of status and velocity.
- Scorecards standardize evaluations and reduce bias.
- Notifications tighten candidate communication without leaving the app.
In Scope
- Stage model + per-job stage presets.
- Kanban for applications per job; search/filter (stage, rating, text).
- Scorecard CRUD (per application).
- Stage history timeline.
- Email template triggers on stage changes (optional toggle per job).
Out of Scope (v1)
- Calendar booking UI (can add ICS invites later).
- Multi-org/tenant separation.
- SSO / external HRIS sync.
Data Model (MongoDB / Mongoose)
Application (extend existing):
// backend/models/Application.js (additions)
{
status: {
type: String,
enum: ['applied','phone_screen','onsite','offer','hired','rejected'],
default: 'applied'
},
scorecard: {
rating: { type: Number, min: 1, max: 5 },
competencies: [{
key: String, // e.g., "Communication"
rating: { type: Number, min: 1, max: 5 },
notes: String
}],
summary: String, // overall feedback
updatedAt: Date,
updatedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
},
stageHistory: [{
from: String,
to: String,
changedAt: { type: Date, default: Date.now },
changedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
note: String
}]
}
Job (optional additions):
// backend/models/Job.js (additions)
{
stages: {
type: [String],
default: ['applied','phone_screen','onsite','offer','hired','rejected']
},
emailTemplates: { // simple, optional
phone_screen: { subject: String, body: String, enabled: Boolean },
onsite: { subject: String, body: String, enabled: Boolean },
offer: { subject: String, body: String, enabled: Boolean },
rejected: { subject: String, body: String, enabled: Boolean }
}
}
API (Express)
# Applications
GET /api/applications?jobId=&stage=&q=&minRating=
GET /api/applications/:id
PATCH /api/applications/:id/status { to, note? } // moves stage, appends stageHistory
PATCH /api/applications/:id/scorecard { rating, competencies[], summary }
# Jobs (for stage presets & templates)
GET /api/jobs/:id/stages
PATCH /api/jobs/:id/stages { stages[] } // optional, to customize order/names
GET /api/jobs/:id/email-templates
PATCH /api/jobs/:id/email-templates { ... } // optional
# Notifications (optional server-side send)
POST /api/applications/:id/notify { templateKey, overrides? }
Notes
PATCH /status validates to ∈ job.stages and records history atomically.
- If email templates enabled for the job + candidate has email, send via Nodemailer.
Frontend (React + MUI)
New Views
Components
PipelineBoard (DND with @dnd-kit or react-beautiful-dnd)
ApplicationCard (compact)
ScorecardForm
TimelineList
EmailToggle (only if templates are configured)
Permissions & Security
- Stage changes and scorecard edits are admin-only (or a new
RECRUITER role).
- Server validates allowed transitions; logs
changedBy.
- Rate-limit notification endpoint; sanitize template rendering (no raw HTML injection).
Acceptance Criteria
- Drag a candidate card to another column → server updates
status, adds stageHistory, UI refreshes without full reload.
- Scorecard saves and persists (rating + competencies + summary) and displays last updated metadata.
- Pipeline filters by stage and text; search matches candidate name or cover letter snippet.
- If job templates enabled and stage changes to
phone_screen, an email can be sent using the job’s template.
- All new endpoints documented in README and return appropriate HTTP codes/errors.
Telemetry (optional)
- Count moves per day per job, average time-in-stage.
- Distribution of ratings by stage.
Task Breakdown
Backend
Frontend
DevOps / Config
Open Questions
- Do we allow custom stage names per job by default? (Proposal: yes; provide sensible defaults.)
- Minimal competency keys set? (e.g., Communication, Problem-Solving, Culture Add; make editable later.)
- Should rejected candidates be hidden by default on the board? (Toggle “Show Rejected”.)
Small Follow-ups (separate issues)
- Export pipeline to CSV (stage, days in stage, rating).
- ICS invite generator for scheduled interviews.
- Bulk actions (email, stage move).
Feature: Hiring Pipeline (Stages + Kanban) with Scorecards & Email Notifications
Labels:
featurefrontendbackendapiui/uxgood first issue (subtasks)Milestone:
v0.2(proposed)Summary
Introduce a hiring pipeline so admins can move candidates through customizable stages (e.g., Applied → Phone Screen → Onsite → Offer → Hired/Rejected) using a drag-and-drop Kanban board. Each application gets a scorecard (structured feedback + rating), a timeline (stage history), and optional email notifications on stage changes. This builds on the current Jobs/Applications foundation.
Why
In Scope
Out of Scope (v1)
Data Model (MongoDB / Mongoose)
Application(extend existing):Job(optional additions):API (Express)
Notes
PATCH /statusvalidatesto∈ job.stages and records history atomically.Frontend (React + MUI)
New Views
Pipeline Board
/jobs/:jobId/pipelinePATCH /status).Application Detail Drawer/Dialog
Components
PipelineBoard(DND with @dnd-kit or react-beautiful-dnd)ApplicationCard(compact)ScorecardFormTimelineListEmailToggle(only if templates are configured)Permissions & Security
RECRUITERrole).changedBy.Acceptance Criteria
status, addsstageHistory, UI refreshes without full reload.phone_screen, an email can be sent using the job’s template.Telemetry (optional)
Task Breakdown
Backend
Applicationschema (status, scorecard, stageHistory).PATCH /applications/:id/statuswith validation + history append.PATCH /applications/:id/scorecard.stages[]+emailTemplatesfields and routes.Frontend
/jobs/:jobId/pipeline.DevOps / Config
.envadditions:SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS.Open Questions
Small Follow-ups (separate issues)