alumni_lookup

Champion Signup System (v1.0)

Version: 1.0
Last Updated: November 2025
Status: ✅ Complete
Note: This documents the current Champion Signup flow. Much of this will be replaced/reintegrated when the Champion Portal (see planning/champion-portal/) is developed.


Overview

The Champion Signup System provides a complete workflow for alumni to become “Alumni Champions” — volunteer ambassadors for Belmont University. The system spans two domains:

Domain Audience Features
champions.bualum.co External Alumni Multi-step signup wizard
lookup.bualum.co Internal Staff Management, review, exports

Table of Contents

  1. Public Signup Flow
  2. Champion Status & Prospect Management
  3. Staff Management Interface
  4. Email Notifications
  5. CSV Import/Export
  6. Duplicate Detection & Merging
  7. Data Model
  8. Technical Implementation

1. Public Signup Flow

Wizard Steps

The signup process at champions.bualum.co guides alumni through 5 steps:

Step Status Value What’s Collected
1. Welcome started (1) First name, last name, graduation year
2. Personal Info completed_questions (2) Contact info, address
3. Questions selected_role (3) Quiz answers → role recommendation
4. Role Selection interests (4) Confirmed role choice
5. Interests zip_code (5) Lifestage interests, completion

Champion Roles

The quiz recommends one of four roles:

Role Description Icon
Connection Advisor 1:1 mentorship and career guidance 🤝
Digital Ambassador Social media and online engagement 📱
Community Builder Events and local gatherings 🏠
Giving Advocate Philanthropy and giving campaigns 💝

Completion

Upon completing step 5:


2. Champion Status & Prospect Management

Status Types

Alumni can have one of four champion-related statuses:

Status Criteria Visual Indicator
Completed Champion ChampionSignup with status: 5 Blue border
Signup In Progress ChampionSignup with status: 1-4 Yellow border
Manual Prospect prospect_status: 1 without signup Sky blue border
No Champion Activity No signup, prospect_status: 0 Gray border

Prospect Management

Staff can manually flag alumni as prospects from the alumni show page:

Filtering Options

The alumni search supports 6 status filters:


3. Staff Management Interface

Champion Signups Index (/champion_signups)

Features:

Individual Signup View

Shows:

BUID Linking

Staff can link signups to alumni records by:


4. Email Notifications

Configuration

# Required environment variables
MAILGUN_API_KEY=your_api_key
MAILGUN_DOMAIN=email.bualum.co
CHAMPION_ADMIN_EMAILS=alumni@belmont.edu,development@belmont.edu
MAILER_FROM_ADDRESS="Belmont University Alumni <noreply@email.bualum.co>"
MAILER_REPLY_TO="Belmont University Alumni <alumni@belmont.edu>"

Email Types

Welcome Email (to champion)

Admin Notification (to staff)

Testing

# Preview emails
http://localhost:3000/rails/mailers/champion_signup_mailer

# Send test emails
rails champion_signup:test_emails

5. CSV Import/Export

Import

Task: rails champion_signups:import[/path/to/file.csv]

Expected columns (case-insensitive):

Features:

Export

From /champion_signups index, click “Export CSV”.

Export includes:


6. Duplicate Detection & Merging

Detection

Duplicates are identified by matching BUID (when multiple signups are linked to the same alumni record).

Visual indicators:

Merging Logic

When duplicates are merged:

  1. Most recent signup becomes the target (by created_at)
  2. Older signups are soft deleted (deleted_at set)
  3. Data preservation rules:
    • Contact info: use most recent
    • Text fields: combine with date tags
    • Structured data: use most recent

Merging Tools

Web Interface:

Rake Tasks:

rails champion_signups:stats           # Statistics with duplicate counts
rails champion_signups:duplicates      # Detailed duplicate info
rails champion_signups:merge_all_duplicates  # Merge all
rails "champion_signups:merge_buid[B00123456]"  # Merge specific BUID

7. Data Model

ChampionSignup Table

create_table "champion_signups" do |t|
  t.string "first_name"
  t.string "last_name"
  t.string "graduation_year"
  t.string "email"
  t.string "phone"
  t.string "zip_code"
  t.string "street"
  t.string "city"
  t.string "state"
  t.string "interests"
  t.jsonb "answers", default: {}
  t.string "result_role"
  t.string "selected_role"
  t.string "lifestage_interest"
  t.jsonb "belonging_categories", default: []
  t.text "belonging_note"
  t.string "vocation"
  t.boolean "vocation_help", default: false
  t.string "buid"
  t.datetime "deleted_at"
  t.integer "status", default: 0, null: false
  t.timestamps
end

Status Enum

enum status: {
  started: 1,
  completed_questions: 2,
  selected_role: 3,
  interests: 4,
  zip_code: 5
}

Lifestage Interest Values

Valid keywords (comma-separated):

Alumni Association

# ChampionSignup
belongs_to :alumni, primary_key: :buid, foreign_key: :buid, optional: true

# Alumni
has_many :champion_signups, foreign_key: :buid, primary_key: :buid
enum prospect_status: { not_prospect: 0, prospect: 1 }

8. Technical Implementation

Controllers

Controller Domain Purpose
Champions::ChampionSignupsController External Public signup wizard
ChampionSignupsController Internal Staff management

Routes

# External (champions.bualum.co)
constraints subdomain: 'champions' do
  scope module: 'champions' do
    resources :signups, controller: 'champion_signups'
    root to: "champion_signups#new"
  end
end

# Internal (lookup.bualum.co)
resources :champion_signups do
  collection do
    get :export_csv
    get :duplicates
    post :merge_duplicates
    post :merge_all_duplicates
  end
end

Services

Service Purpose
ChampionSignupMerger Handles duplicate merging logic
Csv::ChampionSignupExporter Generates CSV exports

Mailers

Mailer Method Purpose
ChampionSignupMailer welcome_email Send to new champion
ChampionSignupMailer admin_notification Notify staff

Rake Tasks

rails champion_signups:stats                    # Show statistics
rails champion_signups:import[file.csv]         # Import from CSV
rails champion_signups:import_july_2025         # Import specific file
rails champion_signups:duplicates               # Show duplicate info
rails champion_signups:merge_all_duplicates     # Merge all duplicates

Data Cleanup

Lifestage Interest Normalization

Legacy data may have full descriptions instead of keywords. Cleanup tasks:

rails data:preview_lifestage_interest_cleanup   # Preview changes
rails data:cleanup_lifestage_interest           # Apply cleanup
rails data:cleanup_lifestage_interest_production  # Production-safe version

Mapping: | Legacy Format | Current Keyword | |—————|—————–| | “Almost Alumni (current seniors)” | almost-alumni | | “Young Alumni (0-10 years since graduating)” | young-alumni | | “Tower Society (50 or more years)” | tower-society | | “Belmont Family” or “Families” | families | | Unknown values | other |


Future Development

The Champion Portal (planning/champion-portal/) will expand this system with:

When implemented, the signup flow will integrate with the new portal, and champions will gain access to authenticated features beyond the initial signup.