Status: Complete (17.1, 17.2, 17.3, 17.4)
Priority: High
Estimated Sub-Phases: 4
Create a publicly accessible landing page at belmontalum.com/champions (the redirect target for alumnichampions.com) that educates visitors about the Alumni Champions program and encourages them to create an account. Simultaneously retire the legacy champion signup flow (/signups/*) and ensure the ChampionSignup data conversion pipeline is preserved and documented.
alumnichampions.com will DNS-redirect to belmontalum.com/champions — it is NOT currently an accepted host domain (blocked from displaying anything)/champion-info page (Phase 13.7) already has warm, well-written Champions education content — but it’s behind authentication (before_action :authenticate_cp_champion!). This is the prime candidate to adapt into a public page./signups/new (8-step quiz → ChampionSignup model) is obsolete — the modern flow is Devise registration (/signup) → email confirmation → profile wizard → onboardingCp::ConfirmationsController has a conversion pipeline (find_legacy_signup_for → apply_legacy_signup_data) that pre-fills Cp::Champion profiles from old signup data during email confirmation. This must be preserved.alumnichampions.com, they land on a page that shows them the impact they can make and how the Champions program solves what they’re trying to achieve/ landing page needs to clearly articulate the two tiers — joining the Alumni Network, and then becoming an Alumni Champion — so visitors understand what they’re signing up for and what’s inside/champion-info page (Phase 13.7) as the public-facing /champions pageGoal: Create a publicly accessible page at /champions (the redirect target for alumnichampions.com) that educates visitors about the Alumni Champions program and encourages signup.
/champion-infoThe existing /champion-info page (Phase 13.7, Cp::ChampionInfoController) already has excellent content:
Plan: Create a new public version of this content at /champions that:
LandingController pattern)The /champions page targets people in the “second tier” of interest — alumni who are already asking:
These aren’t cold prospects. They’ve heard about the program (word of mouth, event, email, social) and are looking for the answer to “what does this actually look like?” The page must show them that the Champions program is the vehicle for the impact they want to make.
Tone: Purpose-driven, impact-focused, warm. Not recruitment. Not “join our numbers.” More: “Here’s how alumni like you are already making a difference — and here’s how you can too.”
/champion-info content but reframed for an external audience who hasn’t seen it beforeChampionRoleService + ALUMNI_CHAMPIONS__ROLES_FRAMEWORK.md/signup → profile wizard → communitiesLandingController pattern)
CTA — Primary: /signup. Secondary: /login
GET /champions → Cp::ChampionsLandingController#show (or adapt existing controller)public layout (same as existing anonymous landing page)authenticate_cp_champion!alumnichampions.com DNS-redirects to belmontalum.com/championsalumnichampions.com added to Heroku custom domains if direct routing is wanted later (currently it’s a redirect, not a constraint match)Cp::ChampionsLandingController < ApplicationController/champion-info content)/champions (public scope, near policy routes)set_meta_tags helper)Controller: app/controllers/cp/champions_landing_controller.rb
ApplicationController (NOT Cp::BaseController) — matches PoliciesController pattern for public pageslayout "champions" — uses champion portal layout with footer/champion-info (authenticated version)@champion_count, @city_count from Cp::Champion.verified filtered by primary_role present (true Champions with a role selected, not just verified portal members)@roles from ChampionRoleService.all_rolesView: app/views/cp/champions_landing/show.html.erb
/champion-info| OG meta: “Alumni Champions | Belmont University” |
Route: GET /champions → cp/champions_landing#show (as: :cp_champions_landing)
Tests: test/controllers/cp/champions_landing_controller_test.rb
/champion-infoApplicationController (PoliciesController pattern), layout "champions"/champions on belmontalum.com domain, directly accessible/champion-info (authenticated version of same content)| OG meta: Title “Alumni Champions | Belmont University”, Description “Discover how Belmont alumni are making an impact…” |
Goal: Update the existing landing page at / (Cp::LandingController#show) to clearly articulate the two-tier value proposition: joining the Alumni Network, and then becoming an Alumni Champion.
The existing landing page (Phase 5.1a) has:
It’s warm and inviting, but it doesn’t explain what the app actually is, what you’ll find inside, or why it’s worth creating an account. It also doesn’t distinguish between the two tiers of engagement.
The refreshed landing page should clearly communicate:
/champions for full story)/champions pageCp::LandingController#showpublicapp/views/cp/landing/show.html.erb/champions from the landing page/champions for tier-2 teaserView: app/views/cp/landing/show.html.erb
/championsTests: test/controllers/cp/landing_controller_test.rb
/championsController: No changes needed — same stats queries.
Goal: Remove the old /signups/* public champion signup flow and clean up associated code, while preserving the data conversion pipeline.
Routes:
resources :signups, controller: 'champion_signups', only: [:new, :create, :show] (belmontalum.com scope, line ~329 of routes.rb)Controllers:
app/controllers/champions/champion_signups_controller.rb (public-facing signup flow only)Views:
app/views/champions/champion_signups/ (entire directory)
new.html.erb, show.html.erb_header.html.erb, _progress_bar.html.erbsteps/_welcome.html.erb, _info.html.erb, _question.html.erb, _results.html.erb, _role.html.erb, _details.html.erb, _interests.html.erb_score_bar.html.erb, _score_chart.html.erb_seal.svg.erb, _icon.svg.erb, _alumni_champions.svg.erb, _logo_primary.svg.erbMailer:
ChampionSignupMailer — No longer needed (no new ChampionSignup records will be created)app/mailers/champion_signup_mailer.rbapp/views/champion_signup_mailer/ (email templates)Helper:
app/helpers/champion_signups_helper.rb (public signup helper — evaluate if staff UI still needs it)Initializer:
config/initializers/champion_signup.rb (admin email config — evaluate if staff flow still needs it)Critical — Data Conversion Pipeline:
Cp::ConfirmationsController#find_legacy_signup_for(champion) — Searches ChampionSignup.active by emailCp::ConfirmationsController#apply_legacy_signup_data(champion, signup) — Pre-fills Cp::Champion from signup.to_champion_attributesCp::ConfirmationsController#legacy_prefilled_fields(signup) — Lists pre-filled fieldsChampionSignup#to_champion_attributes method on the modelStaff Management (Phase 17.3 decision):
app/controllers/champion_signups_controller.rb (staff interface on alumnilookup.com)app/views/champion_signups/ (staff views)Model & Services (still needed):
ChampionSignup model — needed for conversion pipeline and staff managementChampionSignupMerger — needed for staff duplicate managementCsv::ChampionSignupExporter — needed for staff CSV exportChampionQuizService — used by profile wizard quiz (NOT just old signup)ChampionRoleService — used widely across the portal/signups/new → 301 redirect to /champions (new public landing page)/signups/:id → 301 redirect to /championsalumnichampions.com (which will redirect to /champions at DNS level)/championsChampions::ChampionSignupsController (public flow)app/views/champions/champion_signups/ directory (kept SVG partials used by staff views)ChampionSignupMailer and email templatesRemoved:
app/controllers/champions/champion_signups_controller.rb — 154-line multi-step wizard controllerapp/views/champions/champion_signups/ — new.html.erb, show.html.erb, _header.html.erb, _progress_bar.html.erb, all step partials, _score_bar.html.erb, _score_chart.html.erb, _alumni_champions.svg.erb, _logo_primary.svg.erbapp/mailers/champion_signup_mailer.rb — welcome and admin notification emailsapp/views/champion_signup_mailer/ — 4 email templates (HTML + text)config/initializers/champion_signup.rb — admin email config (only used by deleted mailer)lib/tasks/champion_signup_emails.rake — test email rake tasktest/controllers/champion_signups_controller_test.rb — public flow teststest/mailers/champion_signup_mailer_test.rb + previewPreserved:
_seal.svg.erb and _icon.svg.erb at original path — still used by staff views and alumni_helper.rbChampionSignupsHelper — still used by alumni_helper.rb and rake taskChampionSignup model, ChampionSignupMerger, Csv::ChampionSignupExporter/champion_signupsCp::ConfirmationsControllerRoutes:
resources :signups with 301 redirects: /signups/new → /champions, /signups/:id → /championsTests: 2 new redirect tests, full suite 4219 runs, 0 failures
Goal: Keep the internal ChampionSignup staff management interface, document the data pipeline, and catalog how legacy data is used.
Staff management at /champion_signups on alumnilookup.com provides:
This data will be actively used when marketing the new Alumni Network — staff will reference legacy signups to identify prospects and the conversion pipeline will use it to pre-fill new accounts.
No new ChampionSignup records will be created after removing the legacy public flow. Keep the staff interface for:
Document how ChampionSignup data flows through the system:
| Flow | Source | Destination | Mechanism |
|---|---|---|---|
| Profile Pre-fill | ChampionSignup (by email match) |
Cp::Champion profile |
ConfirmationsController#apply_legacy_signup_data calls signup.to_champion_attributes during email confirmation |
| Staff Reference | ChampionSignup records |
Staff dashboard at /champion_signups |
ChampionSignupsController (index, show, export) |
| CRM Export | ChampionSignup data |
Engagement stats CSV | EngagementStatsController includes champion_signup_status, champion_signup_role, champion_signup_date |
| Engagement Metrics | ChampionSignup.completed.count |
Overview dashboard | EngagementStats::OverviewService counts unique completed BUIDs |
| Alumni Association | ChampionSignup.buid → Alumni.buid |
Alumni record view | Alumni has_many :champion_signups (FK via buid) |
to_champion_attributes(Needs verification — read ChampionSignup#to_champion_attributes to confirm exact mapping)
Expected: first_name, last_name, maiden_name, graduation_year, email, phone, street, city, state, zip_code, selected_role/result_role, lifestage_interest, belonging_categories, vocation
to_champion_attributes field mappingdocs/features/CHAMPION_SIGNUP_SYSTEM.md to reflect retired statusto_champion_attributes maps 9 fields: first_name, last_name, college_last_name, zip_code, city, state, street_address, phone, primary_role (all compact_blank)CHAMPION_SIGNUP_SYSTEM.md: renamed to “Legacy”, added retirement notice with field mapping table, marked historical sectionsdocs/planning/champion-portal/source/ALUMNI_CHAMPIONS__*.mddocs/planning/champion-portal/development/DESIGN-GUIDELINES.mddocs/planning/champion-portal/development/LANGUAGE_STYLE_GUIDE.mdapp/views/cp/champion_info/show.html.erb (Phase 13.7)ChampionRoleService for role metadataapp/controllers/cp/landing_controller.rbCp::ConfirmationsController legacy signup pipelinealumnichampions.com (DNS redirect handles it)Phases 17.1 and 17.2 can be built in either order or in parallel — they’re independent pages. However, the generic landing page (17.2) will link to /champions (17.1), so 17.1 should be deployed first or simultaneously.
Phase 17.3 (legacy retirement) should come after 17.1 is live, so the /signups/new redirect has a destination.
Phase 17.4 (data catalog) can happen anytime.
alumnichampions.com should DNS-redirect (301) to belmontalum.com/championsalumnichampions.com as a Heroku custom domain if using DNS redirectalumnichampions (line 10, routes.rb) — can be removed once DNS redirect is confirmed working(To be updated as sub-phases are completed)