Status: π PLANNING Estimated Effort: 6β8 weeks
Prerequisites: Phase 1β6 CompleteLast Updated: January 2026
Related Documents:
- ../README.md β Phase Index
- ../../BACKLOG.md β Job Board concept (Β§1.1)
- ../../JOBS-TO-BE-DONE.md β Jobs C1, C7, E4
- ../../development/DESIGN-GUIDELINES.md β Visual standards
- ../../development/LANGUAGE_STYLE_GUIDE.md β Voice & tone
Phase 7 introduces a two-part feature to help Champions navigate careers:
| Component | Description | Accessibility |
|---|---|---|
| Career Resource Hub | Curated landing page with OCPD partnership resources, external links, and career-related events | Public β No login required |
| Jobs & Internships Board | Champion-powered job listings where verified alumni post opportunities and connect with job seekers | Logged-in Champions β Requires verified account |
Champions frequently ask: βIs there a Bruin job network?β Currently, thereβs no centralized place for:
This phase creates that home β with the Career Resource Hub serving as the public entry point and the Job Board providing the alumni-to-alumni network value.
| # | Goal | Success Indicator |
|---|---|---|
| G1 | Surface OCPD partnership and career resources to alumni | 500+ unique Hub views in first 90 days |
| G2 | Enable Champions to post jobs at their companies | 50+ job postings in first 6 months |
| G3 | Help job-seeking Champions discover opportunities | 200+ job views in first 6 months |
| G4 | Promote βBruins helping Bruinsβ network effect | 30%+ of job applications mention Champion referral |
| G5 | Integrate career events into existing events system | Career events discoverable via standard events flow |
| G6 | Maintain community safety via moderation | <5% of postings flagged, 100% resolved within 48 hours |
| # | Non-Goal | Rationale |
|---|---|---|
| N1 | Built-in application tracking (ATS) | Complexity; links to external ATS preferred |
| N2 | Employer/company accounts (separate from Champions) | Champions post on behalf of employers; keeps identity within network |
| N3 | Resume database or profile matching | Out of scope for MVP; potential future feature |
| N4 | Salary data or negotiation tools | External resources (Glassdoor, etc.) handle this well |
| N5 | Integration with external job boards (Indeed, LinkedIn) | Focus on Bruin network value, not aggregation |
| N6 | Paid job postings or premium tiers | All postings free in MVP |
| Term | Definition |
|---|---|
| Career Resource Hub | Public landing page at /careers with OCPD resources, links, and career events |
| Job Board | Authenticated section at /careers/jobs where Champions post and browse opportunities |
| Job Posting | A single opportunity listing (job, internship, etc.) created by a Champion |
| Poster | The Champion who created a job posting |
| OCPD | Office of Career and Professional Development (Belmont partner) |
| Career Event | An event tagged with career_event: true in the existing events system |
| Experience Level | Entry, Mid-Level, Senior, Executive, Intern |
| Employment Type | Full-time, Part-time, Contract, Internship, Volunteer |
| Remote Designation | On-site, Hybrid, Remote, Flexible |
When Iβm looking for a new job, I want to browse opportunities posted by fellow Bruins, so I can leverage my Belmont network and get referred.
Acceptance: Job seeker can filter by industry, location, experience level; see posterβs Champion profile; apply with referral context.
When I need career guidance, I want to find resources available to alumni, so I can get professional support without searching multiple sites.
Acceptance: Career Resource Hub shows OCPD appointment booking, resume help, and external resources clearly.
When Iβm passively job searching, I want to receive notifications for relevant postings, so I can stay informed without checking daily.
Acceptance: Job seeker can save search criteria and receive email notifications when matching jobs are posted.
When my company is hiring, I want to share the opportunity with the Bruin network, so I can help fellow alumni find roles and get quality referrals.
Acceptance: Poster can create listing with title, company, location, description, application link; posting is visible to all verified Champions.
When a position is filled or expired, I want to close or edit my listing, so I can keep the board accurate and relevant.
Acceptance: Poster can edit, close, or delete their own postings; closed postings removed from public board.
When Champions view my posting, I want to understand interest level, so I can gauge reach and follow up if appropriate.
Acceptance: Poster sees view count on their listings (anonymized, no individual viewer names).
When a job posting is flagged or inappropriate, I want to review and take action quickly, so I can maintain a professional, safe environment.
Acceptance: Staff can hide, edit, or delete postings; flagged postings appear in moderation queue; moderation actions are logged.
When a Champion shares an exceptional opportunity, I want to highlight it, so I can encourage engagement and showcase network value.
Acceptance: Staff can βfeatureβ a posting to pin it to the top of the job board.
When reporting on Champion Portal value, I want to see career feature metrics, so I can demonstrate ROI and identify improvements.
Acceptance: Admin dashboard shows Hub views, job views, postings created, applications initiated, and conversion rates.
| Existing Job | Phase 7 Connection |
|---|---|
| C1: Find My Tribe | Career resources help Champions find professional communities |
| C7: Give Back Without Hassle | Posting jobs is a simple way to help fellow Bruins |
| E4: Reduce Repetitive Work | Self-service job posting eliminates manual coordination |
/careers (Career Resource Hub) β PUBLIC
βββ Hero: "Your Belmont Career Network"
βββ OCPD Partnership Section (hardcoded resources)
βββ Quick Links Grid (external resources)
βββ Career Events Section (from events with career_event=true)
βββ [Login CTA] β Leads to Job Board for logged-in users
β
/careers/jobs (Job Board) β AUTHENTICATED
βββ Search/Filter Bar (industry, location, type, experience, remote)
βββ Job Listings Grid/List
βββ Sidebar: Saved Searches, My Postings
β
/careers/jobs/new β AUTHENTICATED
βββ Post a Job Form
β
/careers/jobs/:id β AUTHENTICATED (full view)
βββ Job Detail View
βββ Company Context (from poster's profile)
βββ [Apply] β External link
βββ [Flag] / [Save] actions
βββ **Redirect:** Unauthenticated users β /careers/jobs/:id/preview
β
/careers/jobs/:id/preview β PUBLIC (shareable)
βββ Limited Job Preview (title, company, location, summary)
βββ "Posted by a Champion in the Bruin network"
βββ [View Full Details] β Sign-in gate β redirects to full job page
βββ [Learn About Alumni Champions] β Hub or landing page
| Section | Access Level | Rationale |
|---|---|---|
| Career Resource Hub | Public | Maximum exposure for OCPD partnership; attracts potential Champions |
| Browse Job Listings | Logged-in Champions | Verified network maintains value |
| View Job Preview (Shareable) | Public | Enables Champions to share job links externally; funnel into portal |
| View Job Details | Logged-in Champions | Full details require membership |
| Post a Job | Verified Champions | Ensures quality and accountability |
| Flag / Save / Apply | Verified Champions | Authenticated actions only |
Public Teaser: The Hub shows job board exists with βLog in to browse X opportunities from your Bruin networkβ CTA. Encourages signup without gating resource content.
Shareable Preview Strategy: Individual job postings have a public preview URL (/careers/jobs/:id/preview) that Champions can share via social media, email, or messaging. The preview shows limited information (title, company, location, truncated description) but withholds application details and full description. This serves as a funnel into the portal β recipients see a compelling job but must sign in or sign up to apply. The preview page includes clear CTAs for both login and Champion signup.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HERO: "Your Belmont Career Network" β
β Subtitle: Resources, opportunities, and connections β all in one place β
β [Browse Jobs β] [Book OCPD Appointment β] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β π― OCPD PARTNERSHIP β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β The Office of Career and Professional Development offers FREE career β β
β β services to Belmont alumni β for life! β β
β β β β
β β β’ 30-Minute Career Consultations β Schedule at calendly.com/[ocpd] β β
β β β’ Resume & Cover Letter Review β Upload for feedback β β
β β β’ Job Search Strategy Sessions β One-on-one coaching β β
β β β’ LinkedIn Profile Optimization β Get found by recruiters β β
β β β’ Career Fairs & Networking Events β Belmont + Nashville area β β
β β β β
β β Contact: ocpd@belmont.edu | 615-460-XXXX β β
β β β β
β β [Book a Consultation β] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β π QUICK LINKS β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Handshake β β LinkedIn β β Indeed β β Glassdoor β β
β β Alumni β β Alumni β β Salary β β Company β β
β β Access β β Learning β β Research β β Reviews β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
β π
CAREER EVENTS β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Feb 15 Career Fair (Nashville) β Register β β β
β β Feb 20 Resume Workshop (Virtual) β RSVP β β β
β β Mar 1 Industry Panel: Music Business β Learn More β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β πΌ BRUIN JOB BOARD β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 47 opportunities from your Bruin network β β
β β β β
β β [Log In to Browse Jobs β] β β
β β β β
β β Already a Champion? Browse jobs, post opportunities, and connect β β
β β with fellow Bruins who are hiring. β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Jobs & Internships [+ Post a Job] β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β π Search jobs... [Industry βΌ] [Location βΌ] [Remote βΌ] [π] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β¨ FEATURED β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Marketing Manager β Capitol Records Nashville β β
β β π Nashville, TN Β· πΌ Full-time Β· π’ Music Industry β β
β β Posted by Sarah Chen '15 Β· 3 days ago β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ALL OPPORTUNITIES (47) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Software Engineer β Bruin Health Tech β β
β β π Remote Β· πΌ Full-time Β· π’ Healthcare β β
β β Posted by Mike Johnson '12 Β· 1 day ago β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Summer Intern β Nashville Symphony β β
β β π Nashville, TN Β· πΌ Internship Β· π’ Arts & Entertainment β β
β β Posted by Jane Williams '08 Β· 2 days ago β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Accounting Associate β Deloitte Nashville β β
β β π Nashville, TN Β· πΌ Full-time Β· π’ Finance β β
β β Posted by Tom Davis '19 Β· 5 days ago β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β [Load More β] β
β β
β ββ SIDEBAR ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β π My Postings (2) β β
β β Marketing Manager β Capitol Records β β
β β Junior Designer β Capitol Records β β
β β β β
β β π Saved Searches (1) β β
β β Music Industry + Nashville β β
β β [Manage Alerts β] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. User visits alumnichampions.com/careers β
β βββΊ Public landing page renders (no auth required) β
β β
β 2. User sees: β
β βββΊ Hero with "Your Belmont Career Network" + CTAs β
β βββΊ OCPD Partnership section (hardcoded content) β
β βββΊ Quick Links grid (external resources) β
β βββΊ Career Events section (filtered from cp_events) β
β βββΊ Job Board teaser with "Log in to browse" CTA β
β β
β 3. User clicks "Book a Consultation" β
β βββΊ Opens external Calendly link in new tab β
β β
β 4. User clicks "Log In to Browse Jobs" β
β βββΊ [If logged in] Redirect to /careers/jobs β
β βββΊ [If not logged in] Redirect to sign-in with return_to β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 0. [If unauthenticated] User visits /careers/jobs β
β βββΊ Redirect to sign-in with return_to=/careers/jobs β
β β
β 0a. [If unauthenticated] User visits /careers/jobs/:id (shared link) β
β βββΊ Redirect to /careers/jobs/:id/preview (NOT sign-in wall) β
β β
β 1. Champion visits /careers/jobs (must be logged in + verified) β
β βββΊ Job board index renders with featured + all listings β
β β
β 2. Champion applies filters: β
β βββΊ Industry dropdown (Entertainment, Healthcare, Tech, etc.) β
β βββΊ Location search (city autocomplete or "Remote") β
β βββΊ Employment type (Full-time, Part-time, Internship, etc.) β
β βββΊ Experience level (Entry, Mid, Senior, Executive, Intern) β
β βββΊ Remote designation (On-site, Hybrid, Remote, Flexible) β
β β
β 3. Listings update via Turbo Frame β
β βββΊ "47 opportunities" count updates β
β β
β 4. Champion clicks a job listing β
β βββΊ Job detail page renders β
β β
β 5. Champion can: β
β βββΊ [Save] β Add to saved jobs β
β βββΊ [Apply] β Opens external application URL in new tab β
β βββΊ [Flag] β Report inappropriate content β
β βββΊ [Share] β Copy shareable preview link to clipboard β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Non-member receives shared link: alumnichampions.com/careers/jobs/42/preview
β βββΊ Public preview page renders (no auth required) β
β β
β 2. User sees limited job information: β
β βββΊ Job title, company name, location β
β βββΊ Remote type, employment type, experience level β
β βββΊ Truncated description (first 300 chars + "...") β
β βββΊ "Posted by a Champion in the Bruin network" β
β βββΊ Posted date (relative: "3 days ago") β
β β
β 3. User does NOT see: β
β βββΊ Full job description β
β βββΊ Application URL or email β
β βββΊ Poster's name or profile link β
β βββΊ Save / Flag actions β
β β
β 4. Primary CTAs: β
β βββΊ [View Full Details & Apply] β Sign-in page with return_to β
β βββΊ [Become a Champion] β Champion signup/landing page β
β βββΊ [Explore Career Resources] β /careers (Hub) β
β β
β 5. If already logged in as Champion: β
β βββΊ Redirect to full job detail page (/careers/jobs/:id) β
β β
β 6. SEO & Social: β
β βββΊ Page has proper Open Graph meta tags for social sharing β
β βββΊ Title: "{Job Title} at {Company} | Belmont Alumni Champions" β
β βββΊ Description: Truncated job summary β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Champion clicks "+ Post a Job" button β
β βββΊ New job form renders at /careers/jobs/new β
β β
β 2. Champion completes form: β
β βββΊ Title* (required, max 100 chars) β
β βββΊ Company Name* (required, text field β see Β§7 decision) β
β βββΊ Location* (city/state or "Remote") β
β βββΊ Remote Designation (On-site, Hybrid, Remote, Flexible) β
β βββΊ Employment Type* (Full-time, Part-time, Contract, Internship...) β
β βββΊ Experience Level* (Entry, Mid-Level, Senior, Executive, Intern) β
β βββΊ Industry* (select from existing industry list) β
β βββΊ Description* (rich text, max 10,000 chars) β
β βββΊ Application URL* (external link) β
β βββΊ Application Email (optional, mailto: alternative) β
β βββΊ Expiration (30, 60, or 90 days β default 60) β
β β
β 3. Champion clicks "Post Job" β
β βββΊ Validation runs (required fields, URL format, etc.) β
β βββΊ [If valid] Job posting created with status: :active β
β βββΊ [If valid] Redirect to job detail page with success flash β
β βββΊ [If valid] Activity event: job_posted recorded β
β βββΊ [If invalid] Form re-renders with errors β
β β
β 4. Posting appears immediately in Job Board β
β βββΊ No approval workflow (Champions are trusted; moderation reactive) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Champion views their posting at /careers/jobs/:id β
β βββΊ [Edit] and [Close] buttons visible (author only) β
β β
β 2. [Edit] β Champion can modify: β
β βββΊ All fields except Company Name (locked after creation) β
β βββΊ Changes take effect immediately β
β β
β 3. [Close] β Champion closes filled/cancelled position β
β βββΊ Status changes from :active to :closed β
β βββΊ Posting removed from public listings β
β βββΊ Poster can still view in "My Postings" β
β β
β 4. [Reopen] β Champion can reopen a closed posting β
β βββΊ Status changes from :closed to :active β
β βββΊ Must set new expiration date β
β β
β 5. [Delete] β Champion can permanently delete β
β βββΊ Confirmation modal required β
β βββΊ Status changes to :deleted (soft delete) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Champion views a posting and clicks [Flag] β
β βββΊ Flag modal appears β
β β
β 2. Champion selects reason: β
β βββΊ spam (0) β Not a real job / promotional content β
β βββΊ inappropriate (1) β Offensive or discriminatory β
β βββΊ misleading (2) β Inaccurate information β
β βββΊ scam (3) β Suspected fraudulent posting β
β βββΊ other (4) β Requires notes β
β β
β 3. Champion optionally adds notes β
β βββΊ Max 500 characters β
β β
β 4. Champion submits flag β
β βββΊ PostFlag record created (reuses existing model) β
β βββΊ flaggable_type: "Cp::JobPosting" β
β βββΊ If posting reaches 3 flags β auto-hide (status: :hidden) β
β βββΊ Engagement Team notified (appears in moderation queue) β
β β
β 5. One flag per Champion per posting β
β βββΊ Duplicate attempts show "You've already flagged this posting" β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. Champion applies filters on Job Board β
β βββΊ e.g., Industry: Music, Location: Nashville β
β β
β 2. Champion clicks [Save This Search] β
β βββΊ Modal asks for search name (optional, default: filter summary) β
β βββΊ Toggle: "Email me new matches" (default: on) β
β βββΊ Frequency: Immediately, Daily, Weekly (default: Daily) β
β β
β 3. Saved search stored in cp_saved_job_searches β
β βββΊ Filters serialized as JSONB β
β β
β 4. When new posting matches saved search criteria: β
β βββΊ [If immediate] Email sent within 15 minutes β
β βββΊ [If daily] Included in daily digest (9am local time) β
β βββΊ [If weekly] Included in weekly digest (Monday 9am) β
β β
β 5. Champion can manage saved searches from sidebar β
β βββΊ Edit frequency, delete, toggle notifications β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Events with career_event: true appear in two places: β
β β
β 1. Career Resource Hub (/careers) β
β βββΊ "Career Events" section shows next 5 career-tagged events β
β β
β 2. Standard Events section (/events) β
β βββΊ Career events included normally, with "Career Event" badge β
β β
β Implementation: β
β βββΊ Add `career_event` boolean to `cp_events` table β
β βββΊ Admin can toggle when creating/editing events β
β βββΊ Scope: `Cp::Event.career_events` β where(career_event: true) β
β βββΊ Hub queries: Event.career_events.published.upcoming.limit(5) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
cp_job_postings| Column | Type | Constraints | Notes |
|---|---|---|---|
id |
bigint | PK | Β |
champion_id |
bigint | FK, NOT NULL | Poster |
title |
string(100) | NOT NULL | Job title |
company_name |
string(255) | NOT NULL | Text field (see Decision 7.2) |
location |
string(255) | Β | City, ST or βRemoteβ |
remote_type |
integer | NOT NULL, default: 0 | Enum: on_site, hybrid, remote, flexible |
employment_type |
integer | NOT NULL | Enum: full_time, part_time, contract, internship, volunteer |
experience_level |
integer | NOT NULL | Enum: entry, mid, senior, executive, intern |
industry |
string(100) | NOT NULL | References existing industry list |
description |
text | NOT NULL | Rich text via ActionText (max 10,000) |
application_url |
string(2048) | Β | External link |
application_email |
string(255) | Β | mailto: alternative |
expires_at |
date | NOT NULL | Auto-close date |
status |
integer | NOT NULL, default: 0 | Enum: active, closed, hidden, deleted |
view_count |
integer | default: 0 | Anonymized interest metric |
featured |
boolean | default: false | Staff-pinned |
created_at |
datetime | Β | Β |
updated_at |
datetime | Β | Β |
Indexes:
index_cp_job_postings_on_champion_idindex_cp_job_postings_on_status_and_expires_atindex_cp_job_postings_on_industryindex_cp_job_postings_on_experience_levelindex_cp_job_postings_on_created_atcp_saved_job_searches| Column | Type | Constraints | Notes |
|---|---|---|---|
id |
bigint | PK | Β |
champion_id |
bigint | FK, NOT NULL | Search owner |
name |
string(100) | Β | User-defined name |
filters |
jsonb | NOT NULL | Serialized filter criteria |
notify |
boolean | default: true | Email alerts enabled |
frequency |
integer | default: 1 | Enum: immediate(0), daily(1), weekly(2) |
last_notified_at |
datetime | Β | Prevents duplicates |
created_at |
datetime | Β | Β |
updated_at |
datetime | Β | Β |
Indexes:
index_cp_saved_job_searches_on_champion_idindex_cp_saved_job_searches_on_notify_and_frequency (partial: where notify = true)cp_saved_jobs| Column | Type | Constraints | Notes |
|---|---|---|---|
id |
bigint | PK | Β |
champion_id |
bigint | FK, NOT NULL | Β |
job_posting_id |
bigint | FK, NOT NULL | Β |
created_at |
datetime | Β | Β |
Indexes:
index_cp_saved_jobs_on_champion_and_posting (unique)Options:
| Option | Pros | Cons |
|---|---|---|
| A) Text field only | Simple, flexible, no normalization overhead | Duplicates (βCapitol Recordsβ vs βCapitol Records Nashvilleβ), no company pages |
B) Normalized cp_companies table |
Clean data, company pages, analytics by employer | Complexity, orphan records, maintenance burden |
Decision: Option A (Text Field)
For MVP, use a simple text field for company_name. Reasons:
Future consideration: If we see significant duplicate employers, introduce optional cp_companies with autocomplete suggestions. Posterβs profile already contains employer and job_title for credibility context.
cp_events| Column | Type | Change |
|---|---|---|
career_event |
boolean | ADD β default: false |
cp_post_flags (Existing β Reuse)Already supports polymorphic flaggable. Add support for:
flaggable_type: "Cp::JobPosting"New reason enum values (extend existing):
misleading: 5scam: 6# app/models/cp/job_posting.rb
class Cp::JobPosting < ApplicationRecord
belongs_to :champion, class_name: "Cp::Champion"
has_many :flags, as: :flaggable, class_name: "Cp::PostFlag", dependent: :destroy
has_many :saves, class_name: "Cp::SavedJob", dependent: :destroy
has_many :savers, through: :saves, source: :champion
has_rich_text :description
enum :status, { active: 0, closed: 1, hidden: 2, deleted: 3 }
enum :remote_type, { on_site: 0, hybrid: 1, remote: 2, flexible: 3 }
enum :employment_type, { full_time: 0, part_time: 1, contract: 2, internship: 3, volunteer: 4 }
enum :experience_level, { entry: 0, mid: 1, senior: 2, executive: 3, intern: 4 }
scope :visible, -> { where(status: :active).where("expires_at >= ?", Date.current) }
scope :featured, -> { where(featured: true) }
scope :by_industry, ->(industry) { where(industry: industry) if industry.present? }
scope :by_location, ->(location) { where("location ILIKE ?", "%#{location}%") if location.present? }
scope :by_remote_type, ->(type) { where(remote_type: type) if type.present? }
scope :by_experience_level, ->(level) { where(experience_level: level) if level.present? }
scope :by_employment_type, ->(type) { where(employment_type: type) if type.present? }
validates :title, presence: true, length: { maximum: 100 }
validates :company_name, presence: true, length: { maximum: 255 }
validates :industry, presence: true
validates :employment_type, presence: true
validates :experience_level, presence: true
validates :description, presence: true
validates :expires_at, presence: true
validate :application_method_present
def expired?
expires_at < Date.current
end
def auto_hide_if_flagged!
update!(status: :hidden) if flags.pending.count >= 3
end
private
def application_method_present
if application_url.blank? && application_email.blank?
errors.add(:base, "Either application URL or email is required")
end
end
end
# app/models/cp/saved_job_search.rb
class Cp::SavedJobSearch < ApplicationRecord
belongs_to :champion, class_name: "Cp::Champion"
enum :frequency, { immediate: 0, daily: 1, weekly: 2 }
validates :filters, presence: true
def matches?(job_posting)
# Compare job_posting attributes against stored filters
criteria = filters.with_indifferent_access
return false if criteria[:industry].present? && job_posting.industry != criteria[:industry]
return false if criteria[:location].present? && !job_posting.location&.downcase&.include?(criteria[:location].downcase)
return false if criteria[:remote_type].present? && job_posting.remote_type != criteria[:remote_type]
return false if criteria[:experience_level].present? && job_posting.experience_level != criteria[:experience_level]
return false if criteria[:employment_type].present? && job_posting.employment_type != criteria[:employment_type]
true
end
end
# app/models/cp/saved_job.rb
class Cp::SavedJob < ApplicationRecord
belongs_to :champion, class_name: "Cp::Champion"
belongs_to :job_posting, class_name: "Cp::JobPosting"
validates :job_posting_id, uniqueness: { scope: :champion_id }
end
| Action | Unauthenticated | Email Verified | Champion Verified | CL | Staff |
|---|---|---|---|---|---|
| View Hub | β | β | β | β | β |
| Click external links | β | β | β | β | β |
| View career events | β | β | β | β | β |
| See job board teaser | β | β | β | β | β |
| View job preview (shareable) | β | β | β | β | β |
| Action | Unauthenticated | Email Verified | Champion Verified | CL | Staff |
|---|---|---|---|---|---|
| Browse job listings | β | β | β | β | β |
| View job details | β | β | β | β | β |
| Post a job | β | β | β | β | β |
| Edit own posting | β | β | β (author) | β (author) | β |
| Close own posting | β | β | β (author) | β (author) | β |
| Delete own posting | β | β | β (author) | β (author) | β |
| Flag a posting | β | β | β | β | β |
| Save a job | β | β | β | β | β |
| Save search / alerts | β | β | β | β | β |
| Apply (external link) | β | β | β | β | β |
| Action | Unauthenticated | Email Verified | Champion Verified | CL | Staff |
|---|---|---|---|---|---|
| View moderation queue | β | β | β | β | β |
| Hide posting | β | β | β | β | β |
| Unhide posting | β | β | β | β | β |
| Feature posting | β | β | β | β | β |
| Delete posting | β | β | β | β | β |
| Resolve/dismiss flags | β | β | β | β | β |
| Edit any posting | β | β | β | β | β |
Note: Unlike Discussion Boards, CLs do NOT have moderation privileges for the Job Board. All job moderation is handled by Staff to ensure consistency and reduce abuse potential.
Job postings appear in the existing Staff moderation queue when flagged:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Moderation Queue [Discussions] [Jobs] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β οΈ 3 Flagged Job Postings β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β "Work From Home $$$" β Posted by John Doe '18 β β
β β 3 flags Β· Reasons: scam (2), spam (1) β β
β β Status: Hidden (auto-hidden at 3 flags) β β
β β β β
β β [View Posting] [Restore] [Delete] [Contact Poster] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β "Marketing Manager" β Posted by Jane Smith '15 β β
β β 1 flag Β· Reasons: misleading (1) β β
β β Status: Active β β
β β β β
β β [View Posting] [Hide] [Delete] [Dismiss Flag] [Contact Poster] β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Reuses existing Cp::ModerationAction model with new action types:
| Action | Code | Effect |
|---|---|---|
action_hide |
0 | Hide posting from public view |
action_unhide |
1 | Restore hidden posting |
action_feature |
10 | Pin to top of job board |
action_unfeature |
11 | Remove featured status |
action_delete |
7 | Soft delete posting |
Add to ModerationAction enum:
enum :action, {
# ... existing actions ...
action_feature: 10,
action_unfeature: 11
}, prefix: :action
Matching Discussion Boards pattern:
Add new tab to existing /champions/ admin namespace:
Route: /champions/jobs
Views:
The Career Resource Hub includes hardcoded content about OCPD services. This content is managed in the view template, not a database.
Hardcoded Resources:
| Resource | Link | Description |
|---|---|---|
| Book a Consultation | https://calendly.com/belmont-ocpd |
30-minute career consultations |
| Resume Review | https://forms.belmont.edu/resume-review |
Upload resume for feedback |
| LinkedIn Help | https://linkedin.com/learning |
LinkedIn Learning access |
| Handshake | https://belmont.joinhandshake.com |
Job/internship platform |
| Career Events | Internal /events?career=true |
Portal career events |
Contact Information:
ocpd@belmont.edu615-460-XXXX (confirm with OCPD)External resources displayed in the Hub. Managed via a YAML config file for easy updates without code changes:
# config/career_resources.yml
quick_links:
- name: Handshake
url: https://belmont.joinhandshake.com
description: Jobs & internships for students and alumni
icon: handshake
- name: LinkedIn Learning
url: https://linkedin.com/learning
description: Free courses for professional development
icon: linkedin
- name: Indeed
url: https://indeed.com
description: Search millions of job listings
icon: search
- name: Glassdoor
url: https://glassdoor.com
description: Company reviews and salary data
icon: building
Display in the βPost a Jobβ form:
Posting Guidelines
β Do:
- Post legitimate opportunities at real companies
- Include clear job requirements and responsibilities
- Provide a direct application link or contact email
- Keep descriptions professional and accurate
β Donβt:
- Post multi-level marketing or commission-only sales roles without disclosure
- Include discriminatory requirements
- Misrepresent the position, company, or compensation
- Post duplicate listings for the same role
Postings that violate these guidelines may be removed.
| Scenario | Behavior |
|---|---|
| Posting reaches expiration date | Status β closed, removed from listings |
| Poster manually closes | Status β closed, removed from listings |
| Poster deletes | Status β deleted, soft deleted |
| Staff deletes | Status β deleted, soft deleted |
Scheduled Job: JobPostingCleanupJob runs daily at 2am:
expires_at < Date.current)deleted postings older than 90 daysAdd to Cp::ActivityEvent::EVENT_TYPES:
| Event | Trigger | Metadata |
|---|---|---|
career_hub_view |
Visit /careers | { source: referrer } |
job_board_view |
Visit /careers/jobs | { filters: applied_filters } |
job_view |
View job detail | { job_posting_id: id } |
job_posted |
Create new posting | { job_posting_id: id, industry: industry } |
job_edited |
Edit posting | { job_posting_id: id } |
job_closed |
Close posting | { job_posting_id: id, reason: manual/expired } |
job_saved |
Save a job | { job_posting_id: id } |
job_apply_click |
Click Apply button | { job_posting_id: id } |
job_search_saved |
Save a search | { filters: filters } |
job_flagged |
Flag a posting | { job_posting_id: id, reason: reason } |
Add βCareerβ section to Staff admin dashboard:
| Metric | Calculation |
|---|---|
| Hub Views (period) | Count of career_hub_view events |
| Job Board Views (period) | Count of job_board_view events |
| Active Postings | Count where status = active AND not expired |
| New Postings (period) | Count created in period |
| Apply Clicks (period) | Count of job_apply_click events |
| Conversion Rate | Apply clicks / Job views |
| Flags Pending | Count where flag status = pending |
Each poster sees on their postings:
| Metric | Description |
|---|---|
| Views | Total view count |
| Saves | How many Champions saved this job |
| Apply Clicks | How many clicked the Apply button |
| Days Active | Days since posting |
| Days Remaining | Days until expiration |
| Scenario | Behavior |
|---|---|
| Poster loses Champion status (unverified) | Their postings remain visible; cannot create new |
| Poster deletes account | Postings remain with βPosted by [Former Champion]β |
| Poster blocked by viewer | Posting still visible (blocking affects messaging, not jobs) |
| Posterβs profile incomplete | Posting shows available info; encourage profile completion |
| Scenario | Behavior |
|---|---|
| Duplicate posting (same title/company) | Allow; user responsibility (warn in UI) |
| Posting with invalid URL | Validation prevents; show helpful error |
| Posting with no salary info | Allowed; salary not a required field |
| Very long description | Truncate at 10,000 chars; show error if exceeded |
| Expired posting viewed via direct link | Show βThis posting has expiredβ with search link |
| Scenario | Behavior |
|---|---|
| Saved search with no matches | No alert sent; show βNo new matchesβ if checked manually |
| New posting matches 50+ saved searches | Queue alerts to prevent email blast |
| Champion deletes account with saved searches | Cascade delete searches |
| Saved search with invalid filters (data migration) | Skip alert; log for review |
| Scenario | Behavior |
|---|---|
Unauthenticated user visits /careers/jobs/:id |
Redirect to /careers/jobs/:id/preview (not sign-in wall) |
Authenticated Champion visits /careers/jobs/:id/preview |
Redirect to /careers/jobs/:id (full view) |
| Shared preview link for deleted posting | Show βThis opportunity is no longer availableβ with Hub link |
| Shared preview link for hidden posting | Show βThis opportunity is no longer availableβ with Hub link |
| Shared preview link for expired posting | Show βThis posting has expiredβ with search link |
Rationale: Champions will inevitably copy their browser URL (/careers/jobs/:id) and share it via email, social media, or messaging. Rather than showing non-members a sign-in wall (poor UX), we gracefully redirect them to the public preview page. This preserves the funnel strategy while handling real-world sharing behavior.
| Scenario | Behavior |
|---|---|
| Posting flagged while poster is editing | Flag still applies; poster notified after save |
| Staff deletes flagged posting | Flags marked as resolved; poster notified |
| Poster appeals hidden posting | Email to Engagement Team; manual review |
| Same posting flagged and featured | Featured status overrides; staff sees conflict in queue |
/careers is publicly accessible (no login required)career_event: true/careers/jobs requires verified Champion authenticationcreated_at DESC by defaultapplication_url in new tab/careers/jobs/newjob_posted recordedcp_moderation_actionsStatus: π Not Started
Estimated Time: 3β4 days
Goal: Create database tables and public Career Resource Hub page
Deliverables:
create_cp_job_postingscreate_cp_saved_job_searchescreate_cp_saved_jobsadd_career_event_to_cp_eventsCp::JobPosting with validations and scopesCp::SavedJobSearch with filter matching logicCp::SavedJob with uniqueness validationCp::PostFlag reasons enum (misleading, scam)Cp::ModerationAction enum (feature, unfeature)config/career_resources.ymlCp::CareersController#show (public Hub)careers/show.html.erb (Hub page)GET /careers (public)Key Files to Create:
db/migrate/YYYYMMDD_create_cp_job_postings.rb
db/migrate/YYYYMMDD_create_cp_saved_job_searches.rb
db/migrate/YYYYMMDD_create_cp_saved_jobs.rb
db/migrate/YYYYMMDD_add_career_event_to_cp_events.rb
app/models/cp/job_posting.rb
app/models/cp/saved_job_search.rb
app/models/cp/saved_job.rb
app/controllers/cp/careers_controller.rb
app/views/cp/careers/show.html.erb
config/career_resources.yml
test/models/cp/job_posting_test.rb
test/models/cp/saved_job_search_test.rb
test/models/cp/saved_job_test.rb
test/controllers/cp/careers_controller_test.rb
Status: π Not Started
Estimated Time: 4β5 days
Goal: Champions can browse, post, edit, and manage job listings
Deliverables:
Cp::JobsController (index, show, new, create, edit, update, close, reopen, destroy)jobs/index.html.erb (listings with filters)jobs/show.html.erb (detail page)jobs/new.html.erb (post form)jobs/edit.html.erb (edit form)jobs/_form.html.erb (shared form partial)jobs/_listing.html.erb (listing card partial)jobs/_filters.html.erb (filter bar partial)jobs/_sidebar.html.erb (my postings, saved searches)job_filters_controller.js (Turbo filter updates)Key Files to Create:
app/controllers/cp/jobs_controller.rb
app/views/cp/jobs/index.html.erb
app/views/cp/jobs/show.html.erb
app/views/cp/jobs/new.html.erb
app/views/cp/jobs/edit.html.erb
app/views/cp/jobs/_form.html.erb
app/views/cp/jobs/_listing.html.erb
app/views/cp/jobs/_filters.html.erb
app/views/cp/jobs/_sidebar.html.erb
app/javascript/controllers/job_filters_controller.js
test/controllers/cp/jobs_controller_test.rb
Status: π Not Started
Estimated Time: 2β3 days
Goal: Champions can save jobs, flag inappropriate postings, and click to apply
Deliverables:
Cp::SavedJobsController (create, destroy)Cp::JobFlagsController (create) β reuses PostFlagKey Files to Create:
app/controllers/cp/saved_jobs_controller.rb
app/controllers/cp/job_flags_controller.rb
app/views/cp/jobs/_flag_modal.html.erb
app/views/cp/saved_jobs/create.turbo_stream.erb
app/views/cp/saved_jobs/destroy.turbo_stream.erb
test/controllers/cp/saved_jobs_controller_test.rb
test/controllers/cp/job_flags_controller_test.rb
Status: π Not Started
Estimated Time: 3β4 days
Goal: Champions can save searches and receive alerts for new matches
Deliverables:
Cp::SavedJobSearchesController (create, update, destroy)JobAlertMailer (new_matches)JobAlertJob (process immediate alerts)JobAlertDigestJob (daily/weekly digests)Key Files to Create:
app/controllers/cp/saved_job_searches_controller.rb
app/views/cp/saved_job_searches/index.html.erb
app/views/cp/saved_job_searches/_form.html.erb
app/views/cp/jobs/_save_search_modal.html.erb
app/mailers/job_alert_mailer.rb
app/views/job_alert_mailer/new_matches.html.erb
app/jobs/job_alert_job.rb
app/jobs/job_alert_digest_job.rb
test/controllers/cp/saved_job_searches_controller_test.rb
test/mailers/job_alert_mailer_test.rb
test/jobs/job_alert_job_test.rb
Status: π Not Started
Estimated Time: 2β3 days
Goal: Staff can moderate job postings from admin interface
Deliverables:
Champions::JobsController (admin namespace)champions/jobs/index.html.erb (all postings with filters)champions/jobs/show.html.erb (detail with moderation controls)champions/jobs/queue.html.erb (flagged postings)cp_moderation_actionsKey Files to Create:
app/controllers/champions/jobs_controller.rb
app/views/champions/jobs/index.html.erb
app/views/champions/jobs/show.html.erb
app/views/champions/jobs/queue.html.erb
app/views/champions/jobs/_moderation_controls.html.erb
test/controllers/champions/jobs_controller_test.rb
Status: π Not Started
Estimated Time: 1β2 days
Goal: Events can be tagged as career events and surface on Hub
Deliverables:
Cp::Event.career_eventscareer_event: trueKey Files to Modify:
app/views/champions/events/_form.html.erb (add checkbox)
app/models/cp/event.rb (add scope)
app/views/cp/careers/show.html.erb (add section)
app/views/cp/events/_event_card.html.erb (add badge)
test/models/cp/event_test.rb
Status: π Not Started
Estimated Time: 2β3 days
Goal: Staff dashboard shows career metrics; automated cleanup runs
Deliverables:
JobPostingCleanupJob (expire and purge old postings)Key Files to Create/Modify:
app/controllers/champions/dashboard_controller.rb (add career metrics)
app/views/champions/dashboard/_career_metrics.html.erb
app/jobs/job_posting_cleanup_job.rb
app/mailers/job_posting_mailer.rb
app/views/job_posting_mailer/expiring_soon.html.erb
test/jobs/job_posting_cleanup_job_test.rb
test/mailers/job_posting_mailer_test.rb
| Model | Test Cases |
|---|---|
Cp::JobPosting |
Validations (required fields, length limits), enums, scopes (visible, featured, by_*), expired?, auto_hide_if_flagged! |
Cp::SavedJobSearch |
Validations, matches? method with various filter combinations |
Cp::SavedJob |
Uniqueness validation, associations |
Cp::PostFlag (extended) |
New reason values work correctly |
Cp::Event |
career_event attribute, career_events scope |
| Controller | Test Cases |
|---|---|
Cp::CareersController |
Public access, renders Hub content, shows career events |
Cp::JobsController |
Auth required, CRUD operations, filtering, authorization (author-only edit) |
Cp::SavedJobsController |
Create/destroy, uniqueness, Turbo Stream response |
Cp::JobFlagsController |
Create flag, prevent duplicates, auto-hide at threshold |
Cp::SavedJobSearchesController |
CRUD, filter serialization |
Champions::JobsController |
Staff-only access, moderation actions, audit trail |
| Flow | Test Cases |
|---|---|
| Browse β Apply | Champion browses, views detail, clicks apply (external link) |
| Post β Edit β Close | Champion posts job, edits it, closes it |
| Flag β Auto-hide | Three Champions flag posting, posting auto-hides |
| Save Search β Alert | Champion saves search, new matching job triggers alert |
| Staff Moderation | Staff hides posting, poster notified, audit logged |
| Mailer | Test Cases |
|---|---|
JobAlertMailer |
Email content, links, unsubscribe |
JobPostingMailer |
Expiration warning, hidden notification |
| Job | Test Cases |
|---|---|
JobAlertJob |
Matches saved searches, sends immediate alerts |
JobAlertDigestJob |
Aggregates matches, sends daily/weekly digest |
JobPostingCleanupJob |
Expires old postings, purges deleted, sends warnings |
Features explicitly deferred from Phase 7 MVP:
| Feature | Description | Reason for Deferral |
|---|---|---|
| Company pages | Normalized cp_companies table with aggregate postings |
Adds complexity; text field sufficient for MVP |
| Salary information | Optional salary range on postings | Sensitive data; external tools (Glassdoor) handle well |
| Application tracking | Built-in ATS to track applications | Major feature; external ATS preferred |
| Resume upload | Champions upload resumes for matching | Separate feature (Mentorship Center?) |
| Employer accounts | Non-Champion employers can post | Champions-only maintains network value |
| Job categories | Hierarchical job categories beyond industry | Flat industry list sufficient for MVP |
| Map view | Geographic visualization of jobs | Nice-to-have; list/filter is primary |
| Mobile app deep links | Open job in native app | Native app not yet built |
Based on user feedback after launch:
| Enhancement | Trigger |
|---|---|
| Duplicate detection | If users complain about spam postings |
| Company autocomplete | If text field creates data quality issues |
| Referral tracking | If βBruin networkβ value proposition needs measurement |
| Skills matching | If job seekers want profile-based recommendations |
| Interview prep resources | If OCPD requests deeper integration |
Potential deeper integration with OCPD:
| Integration | Description |
|---|---|
| Event sync | Auto-import OCPD events to Career Events section |
| Appointment booking | Embed Calendly directly instead of linking |
| Resource updates | OCPD admin can update Hub content without code changes |
| Analytics sharing | Share Career Hub metrics with OCPD team |
The following content should be hardcoded in the Career Resource Hub view. Confirm URLs and contact info with OCPD before implementation.
| Service | Description | Link |
|---|---|---|
| Career Consultations | 30-minute one-on-one sessions with career counselors | https://calendly.com/belmont-ocpd |
| Resume Review | Upload resume for professional feedback | https://forms.belmont.edu/resume-review |
| LinkedIn Optimization | Profile review and enhancement tips | https://linkedin.com/help/linkedin/answer/XXX |
| Interview Prep | Mock interviews and preparation resources | https://belmont.edu/ocpd/interview-prep |
| Job Search Strategy | Personalized job search coaching | https://calendly.com/belmont-ocpd/strategy |
| Resource | Description | Link |
|---|---|---|
| Handshake | Job/internship platform for students and alumni | https://belmont.joinhandshake.com |
| LinkedIn Learning | Free professional development courses | https://linkedin.com/learning |
| Indeed | Job search engine | https://indeed.com |
| Glassdoor | Company reviews and salary data | https://glassdoor.com |
| CareerBuilder | Job listings and resume posting | https://careerbuilder.com |
| Channel | Value |
|---|---|
| Website | https://www.belmont.edu/career-development/ |
careerdevelopment@belmont.edu |
|
| Phone | 615-460-6490 |
| Office | Jack C. Massey Center, Suite 214 |
| Hours | MondayβFriday, 8amβ4:30pm CT |
https://www.instagram.com/bucareerdevelop/ |
When creating events, apply career_event: true for:
Use existing industry list from Champion profiles. For reference:
INDUSTRIES = [
"Arts & Entertainment",
"Business & Finance",
"Education",
"Government & Public Policy",
"Healthcare",
"Law & Legal",
"Marketing & Communications",
"Music Industry",
"Nonprofit",
"Real Estate",
"Religion & Ministry",
"Science & Research",
"Sports & Recreation",
"Technology",
"Other"
].freeze
Subject: New job matching your search: [Job Title] at [Company]
Hi [First Name],
A new job was just posted that matches your saved search "[Search Name]":
[Job Title]
[Company Name] β’ [Location]
[Employment Type] β’ [Experience Level]
[First 200 chars of description...]
View Full Posting β
---
You're receiving this because you saved this search with immediate alerts.
Manage your alerts β
Subject: [X] new jobs matching your searches
Hi [First Name],
Here are today's new job postings matching your saved searches:
For "[Search Name 1]" (3 new):
β’ [Job Title] at [Company] β [Location]
β’ [Job Title] at [Company] β [Location]
β’ [Job Title] at [Company] β [Location]
For "[Search Name 2]" (1 new):
β’ [Job Title] at [Company] β [Location]
Browse All Jobs β
---
You're receiving this daily digest for your saved job searches.
Manage your alerts β
Subject: Your job posting has been hidden for review
Hi [First Name],
Your job posting "[Job Title]" has been temporarily hidden for review by our team.
This typically happens when multiple community members flag a posting for review. Common reasons include:
β’ Posting appears to be spam or promotional
β’ Content may be misleading
β’ Position details need clarification
What happens next:
β’ Our team will review the posting within 48 hours
β’ If restored, you'll receive a confirmation email
β’ If you'd like to discuss, reply to this email
We appreciate your understanding as we work to maintain a trusted job board for all Champions.
The Engagement Team
Subject: Your job posting expires in 7 days
Hi [First Name],
Your job posting "[Job Title]" will expire on [Date].
If the position is still open, you can extend it:
β’ Edit your posting and select a new expiration date
If the position has been filled, you can close it:
β’ Mark as filled to remove from active listings
Manage Your Posting β
Thanks for sharing opportunities with the Bruin network!
The Engagement Team
Document created: January 2026 Author: Phase 7 Planning Status: Ready for Implementation Review