alumni_lookup

Phase 7: Jobs & Internships (Job Board + Career Resource Hub)

Status: πŸ“‹ PLANNING Estimated Effort: 6–8 weeks
Prerequisites: Phase 1–6 Complete

Last Updated: January 2026

Related Documents:


Table of Contents

  1. Summary
  2. Goals & Non-Goals
  3. Terminology
  4. User Stories / JTBD
  5. UX Overview
  6. Detailed Flows
  7. Data Model
  8. Permissions Matrix
  9. Admin & Moderation
  10. Content Management
  11. Analytics & Instrumentation
  12. Edge Cases
  13. Acceptance Criteria
  14. Implementation Plan (Sub-Phases)
  15. Test Plan
  16. Backlog / Future

1. Summary

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

Why This Phase Exists

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.

Priority Order

  1. Alumni using career resources β€” The Hub exposes valuable existing resources that alumni don’t know about
  2. Alumni helping alumni find jobs/internships β€” Champions post opportunities, job seekers discover them
  3. Employers posting roles β€” Champions post for their companies (authenticated, not anonymous employer accounts)

2. Goals & Non-Goals

2.1 Goals

# 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

2.2 Non-Goals

# 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

3. Terminology

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

4. User Stories / JTBD

4.1 Champions (Job Seekers)

Job JS1: Find Opportunities Through My Network

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.

Job JS2: Discover Career Resources

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.

Job JS3: Set Up Job Alerts

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.

4.2 Champions (Job Posters)

Job JP1: Post Jobs at My Company

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.

Job JP2: Manage My Job Listings

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.

Job JP3: See Who’s Interested

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).

4.3 Engagement Team (Administrators)

Job ET1: Moderate Inappropriate Content

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.

Job ET2: Feature Quality Opportunities

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.

Job ET3: Track Career Feature Usage

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.

4.4 Alignment with Existing JTBD

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

5. UX Overview

5.1 Information Architecture

/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

5.2 Paywall Strategy

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.

5.3 Visual Hierarchy (Career Resource Hub)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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.                                    β”‚   β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5.4 Visual Hierarchy (Job Board - Authenticated)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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 β†’]                                                  β”‚   β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6. Detailed Flows

6.1 Flow: View Career Resource Hub (Public)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.2 Flow: Browse Job Listings (Authenticated)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.2a Flow: View Shared Job Preview (Public)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.3 Flow: Post a Job (Champion)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.4 Flow: Manage Own Posting (Poster)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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)                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.5 Flow: Flag Job Posting (Champion)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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"     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.6 Flow: Save Search & Alerts (Champion)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

6.7 Flow: Career Events Integration

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 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)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

7. Data Model

7.1 New Tables

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:

cp_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:

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:

7.2 Decision: Company Name Storage

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:

  1. Champions posting for small businesses may not have standardized names
  2. Avoids complexity of company verification/claiming
  3. Future enhancement can normalize retroactively with fuzzy matching
  4. Most value comes from the posting itself, not company aggregation

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.

7.3 Modifications to Existing Tables

cp_events

Column Type Change
career_event boolean ADD β€” default: false

cp_post_flags (Existing β€” Reuse)

Already supports polymorphic flaggable. Add support for:

New reason enum values (extend existing):

7.4 Model Relationships

# 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

8. Permissions Matrix

8.1 Career Resource Hub & Public Pages

Action Unauthenticated Email Verified Champion Verified CL Staff
View Hub βœ… βœ… βœ… βœ… βœ…
Click external links βœ… βœ… βœ… βœ… βœ…
View career events βœ… βœ… βœ… βœ… βœ…
See job board teaser βœ… βœ… βœ… βœ… βœ…
View job preview (shareable) βœ… βœ… βœ… βœ… βœ…

8.2 Job Board (Authenticated)

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) ❌ ❌ βœ… βœ… βœ…

8.3 Moderation (Staff Only)

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.


9. Admin & Moderation

9.1 Moderation Queue

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]          β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

9.2 Moderation Actions

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

9.3 Auto-Hide Threshold

Matching Discussion Boards pattern:

9.4 Staff Admin Interface

Add new tab to existing /champions/ admin namespace:

Route: /champions/jobs

Views:


10. Content Management

10.1 OCPD Partnership Content (Hardcoded)

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:

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

10.3 Job Posting Content Guidelines

Display in the β€œPost a Job” form:

Posting Guidelines

βœ… Do:

❌ Don’t:

Postings that violate these guidelines may be removed.

10.4 Expiration & Cleanup

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:

  1. Close expired postings (expires_at < Date.current)
  2. Notify posters 7 days before expiration
  3. Hard delete deleted postings older than 90 days

11. Analytics & Instrumentation

11.1 Activity Events

Add 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 }

11.2 Dashboard Metrics

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

11.3 Poster Analytics

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

12. Edge Cases

12.1 Poster Scenarios

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

12.2 Content Scenarios

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

12.3 Search & Alert Scenarios

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

12.4 URL Sharing & Redirect Scenarios

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.

12.5 Moderation Scenarios

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

13. Acceptance Criteria

13.1 Career Resource Hub

13.2 Job Board (Browse)

13.3 Job Detail Page

13.4 Post a Job

13.5 Manage Postings

13.6 Saved Searches & Alerts

13.7 Moderation

13.8 Analytics


14. Implementation Plan (Sub-Phases)

Sub-Phase 7.1: Data Model & Career Resource Hub

Status: πŸ“‹ Not Started
Estimated Time: 3–4 days
Goal: Create database tables and public Career Resource Hub page

Deliverables:

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

Sub-Phase 7.2: Job Board CRUD

Status: πŸ“‹ Not Started
Estimated Time: 4–5 days
Goal: Champions can browse, post, edit, and manage job listings

Deliverables:

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

Sub-Phase 7.3: Save, Flag & User Actions

Status: πŸ“‹ Not Started
Estimated Time: 2–3 days
Goal: Champions can save jobs, flag inappropriate postings, and click to apply

Deliverables:

Key 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

Sub-Phase 7.4: Saved Searches & Alerts

Status: πŸ“‹ Not Started
Estimated Time: 3–4 days
Goal: Champions can save searches and receive alerts for new matches

Deliverables:

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

Sub-Phase 7.5: Staff Moderation

Status: πŸ“‹ Not Started
Estimated Time: 2–3 days
Goal: Staff can moderate job postings from admin interface

Deliverables:

Key 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

Sub-Phase 7.6: Career Events Integration

Status: πŸ“‹ Not Started
Estimated Time: 1–2 days
Goal: Events can be tagged as career events and surface on Hub

Deliverables:

Key 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

Sub-Phase 7.7: Analytics Dashboard & Cleanup

Status: πŸ“‹ Not Started
Estimated Time: 2–3 days
Goal: Staff dashboard shows career metrics; automated cleanup runs

Deliverables:

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

15. Test Plan

15.1 Model Tests

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

15.2 Controller Tests

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

15.3 Integration Tests

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

15.4 Mailer Tests

Mailer Test Cases
JobAlertMailer Email content, links, unsubscribe
JobPostingMailer Expiration warning, hidden notification

15.5 Job Tests

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

16. Backlog / Future

Features explicitly deferred from Phase 7 MVP:

16.1 Deferred to Future Phase

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

16.2 Potential Enhancements (Post-Launch)

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

16.3 OCPD Partnership Expansion

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

Appendix A: OCPD Resources (Hardcoded Content)

The following content should be hardcoded in the Career Resource Hub view. Confirm URLs and contact info with OCPD before implementation.

A.1 Primary Services

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

A.2 External Resources

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

A.3 Contact Information

Channel Value
Website https://www.belmont.edu/career-development/
Email careerdevelopment@belmont.edu
Phone 615-460-6490
Office Jack C. Massey Center, Suite 214
Hours Monday–Friday, 8am–4:30pm CT
Instagram https://www.instagram.com/bucareerdevelop/

A.4 Event Types to Tag

When creating events, apply career_event: true for:


Appendix B: Industry List

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

Appendix C: Email Templates

C.1 Job Alert (Immediate)

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 β†’

C.2 Job Alert (Daily Digest)

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 β†’

C.3 Posting Hidden Notification

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

C.4 Posting Expiring Soon

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