GOTV Admin Wireframes

Purpose

Get Out The Vote is the highest-stakes operation in the platform — election day itself. Everything the campaign has built (contact data, support scores, volunteer relationships, turf knowledge) converges into a single-day sprint to get identified supporters to the polls.

The core UX challenge: GOTV admin screens serve two timelines. Before election day, staff methodically plan — building the voter universe, cutting turfs, registering poll watchers, staging volunteers. On election day, the same staff shift into real-time operations — monitoring turnout, dispatching rides, triaging issues, reallocating resources. The admin UX must support both the deliberate planning phase and the high-pressure, time-critical operational phase.

Scope boundary: this document covers GOTV admin, coordination, and field volunteer screens. Field-mode screens (GOTV Door Card, Walk List) are in field-mode/field-mode.md. The War Room Dashboard (DASH-008) is in dashboards/dashboards.md. Alliance GOTV coordination (ALLY-008) is in alliance/alliance.md.

Scope

ID Screen Personas Offline Mobile Phase
GOTV-001 GOTV Universe Builder OA, FiD No Desktop Pre-Election
GOTV-002 Early Voting Data Upload OA, FiD, DM No Desktop Pre-Election
GOTV-003 Volunteer Staging Setup OA, FiD, VC No Desktop Pre-Election
GOTV-004 GOTV Turf Cutting OA, FiD No Desktop Pre-Election
GOTV-005 Election Day Comms Plan OA, FiD, CD No Desktop Pre-Election
GOTV-006 Poll Watcher Registry OA, FiD No Desktop Pre-Election
GOTV-007 Poll Watcher Credential Tracking OA, FiD No Desktop Pre-Election
GOTV-010 Chase Call Interface V No Primary Election Day
GOTV-011 Ride Request Form V, TL, S Partial Primary Election Day
GOTV-012 Ride Coordination — Dispatcher View OA, FiD, VC No Yes Election Day
GOTV-013 Ride Driver View V No Primary Election Day
GOTV-014 Poll Watcher Check-in V No Primary Election Day
GOTV-015 Poll Watcher Issue Report Form V Partial Primary Election Day
GOTV-016 Poll Watcher Issue Queue OA, FiD No Yes Election Day
GOTV-017 Turnout Dashboard — Map View OA, FiD No Yes Election Day
GOTV-018 Turnout Dashboard — Segment View OA, FiD No Desktop Election Day
GOTV-019 Reallocation Suggestions OA, FiD No Yes Election Day
GOTV-020 Election Night Results Entry V No Primary Election Night
GOTV-021 Election Night Results Dashboard OA, FiD No Yes Election Night
GOTV-022 Post-Election Analysis OA, FiD No Desktop Post-Election
GOTV-023 Staging Location Check-in TL No Primary Election Day

Cross-References (wireframed elsewhere)

ID Screen Location
DASH-008 GOTV War Room Dashboard dashboards/dashboards.md
GOTV-008 GOTV Door Card field-mode/field-mode.md
GOTV-009 GOTV Walk List field-mode/field-mode.md
ALLY-008 GOTV Alliance Coordination alliance/alliance.md

GOTV Navigation Context

GOTV (sidebar section — appears when GOTV is activated)

  Pre-Election Setup
    Universe Builder    → GOTV-001
    Early Voting Upload → GOTV-002
    Staging Locations   → GOTV-003
    Turf Cutting        → GOTV-004
    Comms Plan          → GOTV-005
    Poll Watchers       → GOTV-006, GOTV-007

  Election Day Ops
    War Room            → DASH-008 (cross-ref)
    Turnout Map         → GOTV-017
    Turnout Segments    → GOTV-018
    Chase Calls         → GOTV-010
    Ride Request        → GOTV-011
    Ride Dispatch       → GOTV-012
    Ride Driver         → GOTV-013
    Poll Watcher Check  → GOTV-014
    Issue Report        → GOTV-015
    Issue Queue         → GOTV-016
    Reallocation        → GOTV-019
    Staging Check-in    → GOTV-023

  Results
    Results Entry       → GOTV-020
    Results Dashboard   → GOTV-021

  Post-Election
    Analysis            → GOTV-022

GOTV-001: GOTV Universe Builder

Defines which voters the campaign will target on election day. The GOTV universe is the subset of all contacts who should be contacted — typically supporters identified through canvassing, phone banking, and other outreach. This is the foundational step; everything else (turfs, comms, staffing) flows from the universe.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                 GOTV Universe Builder                          │
│                                           [Save Draft]  [Finalize Universe]  │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌─ Universe Criteria ─────────────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Include contacts matching ALL of:                                     │ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Support Score     [is at least ▾]    [3 ▾]                      │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Voting History    [has voted in ▾]   [1 of last 3 elections ▾]  │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Registration      [is ▾]             [Active ▾]                 │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  [+ Add Criterion]                                                     │ │
│  │                                                                        │ │
│  │  ─ Exclude contacts matching ANY of: ────────────────                  │ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Tag               [is ▾]             [Do Not Contact ▾]         │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Early Voted       [is ▾]             [Yes ▾]                    │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  [+ Add Exclusion]                                                     │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Universe Preview ──────────────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Matching Contacts: 14,832                   [↻ Refresh Count]        │ │
│  │                                                                        │ │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐                │ │
│  │  │ Score 5      │  │ Score 4      │  │ Score 3      │                │ │
│  │  │ (Strong)     │  │ (Lean)       │  │ (Soft)       │                │ │
│  │  │ 4,210        │  │ 6,118        │  │ 4,504        │                │ │
│  │  └──────────────┘  └──────────────┘  └──────────────┘                │ │
│  │                                                                        │ │
│  │  Geographic Breakdown                                                  │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ District/Region      Score 5   Score 4   Score 3   Total        │  │ │
│  │  │ ────────────────     ───────   ───────   ───────   ─────        │  │ │
│  │  │ San Juan North       1,240     1,890     1,320     4,450        │  │ │
│  │  │ Bayamón              980       1,450     1,010     3,440        │  │ │
│  │  │ Caguas               720       1,100     890       2,710        │  │ │
│  │  │ Carolina             650       840       680       2,170        │  │ │
│  │  │ Ponce                620       838       604       2,062        │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Segments ──────────────────────────────────────────────────────── [+] ┐ │
│  │                                                                        │ │
│  │  Segment GOTV contacts into priority tiers for targeting.              │ │
│  │                                                                        │ │
│  │  Tier 1 — Must Contact (first pass)          4,210 contacts            │ │
│  │  Score 5 (Strong supporters)                  [Edit Criteria] [×]      │ │
│  │                                                                        │ │
│  │  Tier 2 — Should Contact (second pass)        6,118 contacts           │ │
│  │  Score 4 (Lean supporters)                    [Edit Criteria] [×]      │ │
│  │                                                                        │ │
│  │  Tier 3 — If Time Allows (third pass)         4,504 contacts           │ │
│  │  Score 3 (Soft supporters)                    [Edit Criteria] [×]      │ │
│  │                                                                        │ │
│  │  [+ Add Segment]                                                       │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  ⓘ Finalizing the universe locks the criteria and generates turf-ready     │
│    contact lists. You can still add exclusions (e.g., early voters)        │
│    after finalization.                                                      │
│                                                                              │
│  [Save Draft]                                          [Finalize Universe]  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Criteria builder: similar to CRM Segment Builder (CRM-004) but with GOTV-specific fields: Support Score, Voting History, Registration Status, Geography, Tags
  • Live preview: count updates on [↻ Refresh Count] click (not auto-refresh to avoid expensive queries during editing)
  • Segments: priority tiers that determine contact order. Tier 1 gets contacted first in every turf pass
  • Finalize Universe: locks inclusion criteria, generates per-turf contact lists. Confirmation dialog: "This will generate GOTV contact lists for 14,832 voters across 5 regions. Proceed?" Once finalized, status changes to "Finalized" and criteria become read-only (exclusions can still be added)
  • Early Voter exclusion: auto-applied from GOTV-002 uploads. Shows as a permanent exclusion rule
  • Save Draft: saves criteria without finalizing. Universe can be refined over days/weeks

GOTV-002: Early Voting Data Upload

Upload lists of voters who have already voted (early/absentee) to remove them from the GOTV universe. Prevents wasting volunteer time contacting voters who've already cast ballots.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                    Early Voting Data Upload                    │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌─ Upload Early Voting List ──────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │                                                                  │  │ │
│  │  │              Drag a file here or click to browse                 │  │ │
│  │  │              CSV or Excel  ·  Max 50MB                          │  │ │
│  │  │                                                                  │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  Data Source *                                                         │ │
│  │  ○ Official electoral authority file                                   │ │
│  │  ○ Poll watcher reports                                                │ │
│  │  ○ Voter self-report (lower confidence)                                │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Column Mapping ────────────────────────────────────── (after upload) ──┐ │
│  │                                                                        │ │
│  │  File: early_voters_mar2.csv  ·  2,847 rows  ·  6 columns             │ │
│  │                                                                        │ │
│  │  Match file columns to voter fields:                                   │ │
│  │                                                                        │ │
│  │  File Column          →   GreenGrass Field                             │ │
│  │  ─────────────────        ────────────────                             │ │
│  │  voter_id             →   [Voter ID ▾]         ✓ Primary match key     │ │
│  │  full_name            →   [Full Name ▾]        ↳ Used if no Voter ID   │ │
│  │  date_of_birth        →   [Date of Birth ▾]    ↳ Secondary match       │ │
│  │  vote_date            →   [Vote Date ▾]                                │ │
│  │  vote_method          →   [Vote Method ▾]                              │ │
│  │  precinct             →   [Precinct ▾]                                 │ │
│  │                                                                        │ │
│  │  [Preview Matches]                                                     │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Match Preview ─────────────────────────────────── (after matching) ────┐ │
│  │                                                                        │ │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐                │ │
│  │  │ Total Rows   │  │ Matched      │  │ Unmatched    │                │ │
│  │  │ 2,847        │  │ 2,614 (92%)  │  │ 233 (8%)     │                │ │
│  │  └──────────────┘  └──────────────┘  └──────────────┘                │ │
│  │                                                                        │ │
│  │  ┌──────────────┐  ┌──────────────┐                                  │ │
│  │  │ In Universe  │  │ Not in Univ. │                                  │ │
│  │  │ 1,204        │  │ 1,410        │                                  │ │
│  │  │ Will remove  │  │ No action    │                                  │ │
│  │  └──────────────┘  └──────────────┘                                  │ │
│  │                                                                        │ │
│  │  ⓘ 1,204 voters will be marked as "Early Voted" and excluded from    │ │
│  │    GOTV contact lists. 1,410 matched voters are not in the GOTV       │ │
│  │    universe (no action needed).                                        │ │
│  │                                                                        │ │
│  │  [Import & Exclude from Universe]                                      │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  Upload History                                                              │
│  ──────────────                                                              │
│  Mar 2 · Official file · 2,847 rows · 1,204 excluded · by Jorge Rivera     │
│  Mar 1 · Official file · 1,923 rows · 812 excluded · by Ana López           │
│  Feb 28 · Poll watcher · 342 rows · 198 excluded · by Jorge Rivera          │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Three-step flow: Upload → Map columns → Preview & confirm. Similar to CRM Data Import (CRM-008) but simpler
  • Match keys: Voter ID is primary. Falls back to name + DOB combo for fuzzy matching
  • Data source confidence: Official files get highest confidence. Self-reports flagged as lower confidence in analytics
  • Cumulative: multiple uploads are additive. Each adds more early voters to the exclusion list
  • Upload history: shows all previous uploads with row counts, exclusion counts, and who performed them
  • Undo: individual uploads can be reverted from history (re-includes those voters in the universe)

GOTV-003: Volunteer Staging Setup

Create and manage physical staging locations where volunteers gather on election day before deploying to their turf assignments.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                    Staging Locations           [+ Add Location]│
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────────────────────────┐  ┌────────────────────────────────────┐│
│  │                                  │  │                                    ││
│  │       [Map with pins]            │  │  Community Center — San Juan North ││
│  │                                  │  │  ──────────────────────────────── ││
│  │       📍 3 staging locations     │  │                                    ││
│  │          shown on map            │  │  Address                           ││
│  │                                  │  │  Calle Luna 45, San Juan 00901    ││
│  │                                  │  │                                    ││
│  │                                  │  │  Contact: María Del Valle          ││
│  │                                  │  │  📱 +1 (787) 555-0198             ││
│  │                                  │  │                                    ││
│  │                                  │  │  Hours: 5:30 AM – 8:00 PM         ││
│  │                                  │  │  Capacity: 40 volunteers           ││
│  │                                  │  │                                    ││
│  │                                  │  │  Assigned: 34 / 40                 ││
│  │                                  │  │  ████████████████░░░░ 85%         ││
│  │                                  │  │                                    ││
│  │                                  │  │  Supplies                          ││
│  │                                  │  │  ☑ Walk sheets (200)              ││
│  │                                  │  │  ☑ Door hangers (500)             ││
│  │                                  │  │  ☑ Water/snacks                   ││
│  │                                  │  │  □ Phones/chargers                ││
│  │                                  │  │                                    ││
│  │                                  │  │  [Edit] [View Roster] [Delete]     ││
│  │                                  │  │                                    ││
│  └──────────────────────────────────┘  └────────────────────────────────────┘│
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │  All Staging Locations                                                │  │
│  │  ─────────────────────                                                │  │
│  │                                                                       │  │
│  │  Location                     Contact          Capacity   Assigned    │  │
│  │  ──────────────────────       ──────────       ────────   ────────    │  │
│  │  📍 Community Ctr — SJ North  María Del Valle  40         34 (85%)   │  │
│  │  📍 Church Hall — Bayamón     Carlos Ruiz      30         28 (93%)   │  │
│  │  📍 School Gym — Caguas       Luisa Fernández  25         18 (72%)   │  │
│  │                                                                       │  │
│  │  Totals                                         95         80 (84%)   │  │
│  │                                                                       │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Create/Edit Location (modal)

┌─ Add Staging Location ─────────────────────────┐
│                                                 │
│  Location Name *                                │
│  ┌─────────────────────────────────────────┐   │
│  │ Community Center — San Juan North       │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│  Address *                                      │
│  ┌─────────────────────────────────────────┐   │
│  │ Calle Luna 45, San Juan, PR 00901      │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│  Contact Person *        Contact Phone *        │
│  ┌──────────────────┐   ┌──────────────────┐   │
│  │ María Del Valle  │   │ +1 787-555-0198  │   │
│  └──────────────────┘   └──────────────────┘   │
│                                                 │
│  Hours *                                        │
│  Open: [5:30 AM ▾]    Close: [8:00 PM ▾]      │
│                                                 │
│  Capacity *                                     │
│  ┌──────────────────┐                          │
│  │ 40               │  volunteers              │
│  └──────────────────┘                          │
│                                                 │
│  Supplies Checklist                             │
│  □ Walk sheets      Qty: [____]                │
│  □ Door hangers     Qty: [____]                │
│  □ Water/snacks                                │
│  □ Phones/chargers                             │
│  □ [+ Add item...]                             │
│                                                 │
│  Notes                                          │
│  ┌─────────────────────────────────────────┐   │
│  │ Parking available in rear lot...        │   │
│  └─────────────────────────────────────────┘   │
│                                                 │
│  [Cancel]                        [Save Location]│
│                                                 │
└─────────────────────────────────────────────────┘

Interaction

  • Map + list: map shows pins for all locations, clicking a pin selects the detail panel. List below for quick scanning
  • Capacity tracking: visual bar showing assigned vs. capacity. Over-capacity highlighted in amber
  • [View Roster]: shows the list of volunteers assigned to this location — names, phone numbers, assigned turfs, check-in status (on election day)
  • Supplies checklist: customizable per location. Items can be checked off as delivered
  • Volunteer assignment: volunteers are assigned to staging locations when turfs are assigned (GOTV-004). This screen shows the resulting assignments

GOTV-004: GOTV Turf Cutting

Create election-day-specific turfs optimized for speed and supporter density. GOTV turfs are smaller than canvassing turfs — designed for 1-2 hour completion in a time-critical context. Supports multiple passes (morning, afternoon, evening) over the same geography.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                    GOTV Turf Cutting                           │
│                                                [Auto-Generate]  [Save All]   │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────────────────────────────────┐  ┌────────────────────────────┐│
│  │                                          │  │ Turf Details               ││
│  │         [Map — full interactive]         │  │ ────────────               ││
│  │                                          │  │                            ││
│  │   Colored polygons showing turf          │  │ Selected: Turf SJ-N-03    ││
│  │   boundaries. Color by:                  │  │                            ││
│  │   ○ Completion status                    │  │ Contacts: 42              ││
│  │   ○ Priority tier                        │  │  Tier 1: 18              ││
│  │   ○ Assignment status                    │  │  Tier 2: 16              ││
│  │                                          │  │  Tier 3: 8               ││
│  │   Draw tools:                            │  │                            ││
│  │   [✎ Draw] [□ Select] [✂ Split]         │  │ Est. Time: 1h 15m         ││
│  │                                          │  │ Walking Dist: 2.1 km      ││
│  │   Supporter density heatmap              │  │                            ││
│  │   overlay (toggle on/off)                │  │ Staging: Community Ctr     ││
│  │                                          │  │          SJ North          ││
│  │                                          │  │                            ││
│  │                                          │  │ Assigned: (unassigned)     ││
│  │                                          │  │ [Assign Volunteer ▾]      ││
│  │                                          │  │                            ││
│  │                                          │  │ Pass Schedule              ││
│  │                                          │  │ ☑ Morning  (6-10 AM)      ││
│  │                                          │  │ ☑ Afternoon (12-3 PM)     ││
│  │                                          │  │ □ Evening  (4-7 PM)       ││
│  │                                          │  │                            ││
│  │                                          │  │ [Edit Boundary] [Delete]   ││
│  │                                          │  │                            ││
│  └──────────────────────────────────────────┘  └────────────────────────────┘│
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │  Turf Summary                                                         │  │
│  │  ─────────────                                                        │  │
│  │  Total Turfs: 38    Contacts Covered: 14,832 / 14,832 (100%)         │  │
│  │  Assigned: 31 / 38  Avg Contacts/Turf: 390                           │  │
│  │  Avg Est. Time: 1h 20m                                                │  │
│  │                                                                       │  │
│  │  ⚠ 7 turfs unassigned. Assign volunteers before election day.        │  │
│  │                                                                       │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Auto-Generate Modal

┌─ Auto-Generate GOTV Turfs ─────────────────────┐
│                                                 │
│  Target Contacts per Turf                       │
│  ┌──────────────┐                              │
│  │ 40           │  (recommended: 30-50)        │
│  └──────────────┘                              │
│                                                 │
│  Max Completion Time                            │
│  ┌──────────────┐                              │
│  │ 90 minutes   │                              │
│  └──────────────┘                              │
│                                                 │
│  Priority                                       │
│  ○ Minimize walking distance                    │
│  ○ Maximize supporter density                   │
│  ○ Balance both                                 │
│                                                 │
│  Staging Location Assignment                    │
│  ☑ Auto-assign to nearest staging location      │
│                                                 │
│  [Cancel]         [Generate 38 Turfs (preview)] │
│                                                 │
└─────────────────────────────────────────────────┘

Interaction

  • Map-centric: most time spent drawing or adjusting turf boundaries on the map. Same drawing tools as canvassing turf management (CANV-004) but with GOTV-specific parameters
  • Auto-generate: creates turfs algorithmically based on target contacts per turf, time constraints, and optimization priority. Preview before applying
  • Multi-pass scheduling: same geography can be contacted multiple times (morning for catch, afternoon for follow-up). Each pass is a checkbox on the turf
  • Supporter density heatmap: overlay shows where supporters are concentrated. Helps manual turf cutting focus on high-value areas
  • Assignment: turfs assigned to individual volunteers or team lead + team. Dropdown searches the volunteer roster
  • Dynamic re-cutting (election day): on election day, staff can access this screen from the War Room to split or merge turfs based on real-time turnout data. Banner shows "Election Day — changes apply immediately to field workers"
  • Coverage check: bottom summary shows total coverage. Warning if any universe contacts fall outside all turfs

GOTV-005: Election Day Comms Plan

Pre-configure the sequence of communications that go out on election day. Each "wave" is a scheduled blast (SMS, WhatsApp, email) targeting voters who haven't yet voted.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                    Election Day Communications Plan            │
│                                                                [Save Plan]   │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌─ Communication Timeline ────────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  6 AM    8 AM    10 AM   12 PM   2 PM    4 PM    6 PM    8 PM         │ │
│  │  ├───────┼───────┼───────┼───────┼───────┼───────┼───────┤            │ │
│  │  ▲               ▲               ▲               ▲                    │ │
│  │  Wave 1          Wave 2          Wave 3          Wave 4               │ │
│  │  Morning         Midday          Afternoon       Final                │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Wave 1: Morning Reminder ──────────────────────────────────────── [×] ┐ │
│  │                                                                        │ │
│  │  Scheduled Time *     Trigger                                          │ │
│  │  [6:30 AM ▾]          ○ Auto-send at time  ○ Manual trigger           │ │
│  │                                                                        │ │
│  │  Channel *            Audience                                         │ │
│  │  [SMS ▾]              ○ Full GOTV universe (who haven't voted)         │ │
│  │                       ○ Tier 1 only                                    │ │
│  │                       ○ Custom segment                                 │ │
│  │                                                                        │ │
│  │  Message                                                               │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ Buenos días {{first_name}}! Today is Election Day. Polls are    │  │ │
│  │  │ open 8 AM - 5 PM. Your polling place: {{polling_location}}.    │  │ │
│  │  │ Every vote counts! 🗳️                                          │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │  SMS: 148 / 160 chars (1 segment)   Recipients: ~12,450              │ │
│  │                                                                        │ │
│  │  Status: ● Ready                                                       │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Wave 2: Midday Follow-up ─────────────────────────────────────── [×] ┐ │
│  │                                                                        │ │
│  │  Scheduled Time *     Trigger                                          │ │
│  │  [11:30 AM ▾]         ○ Auto-send at time  ● Manual trigger           │ │
│  │                                                                        │ │
│  │  Channel *            Audience                                         │ │
│  │  [WhatsApp ▾]         ● Full GOTV universe (who haven't voted)        │ │
│  │                       ○ Tier 1 only                                    │ │
│  │                                                                        │ │
│  │  Message                                                               │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐  │ │
│  │  │ {{first_name}}, polls close at 5 PM today. Have you voted yet? │  │ │
│  │  │ Your polling place: {{polling_location}}. Need a ride?          │  │ │
│  │  │ Reply RIDE and we'll help! 🚗                                   │  │ │
│  │  └──────────────────────────────────────────────────────────────────┘  │ │
│  │                                                                        │ │
│  │  Quick Reply Buttons (WhatsApp)                                        │ │
│  │  [Already Voted]  [Need a Ride]  [Where's My Poll?]                   │ │
│  │                                                                        │ │
│  │  Status: ● Ready                                                       │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Wave 3: Afternoon Push ────────────────────────────────────────── [×] ┐ │
│  │  [Collapsed — click to expand]                                         │ │
│  │  2:00 PM · SMS · Manual trigger · Tier 1 + Tier 2 not voted           │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Wave 4: Final Push ───────────────────────────────────────────── [×] ┐ │
│  │  [Collapsed — click to expand]                                         │ │
│  │  4:00 PM · SMS + WhatsApp · Manual trigger · All not voted             │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  [+ Add Wave]                                                                │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│  ⓘ "Who haven't voted" excludes contacts marked as early voted and         │
│    any voters confirmed voted during election day via poll watcher           │
│    reports or self-report.                                                   │
│                                                                              │
│  [Save Plan]                                                                 │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Election Day State

On election day, each wave shows additional controls:

│  Status: ● Ready   →   [Send Now]  or  (Auto-sends at 6:30 AM)          │
│  Status: ● Sending →   Sent: 8,234 / 12,450  (66%)                      │
│  Status: ● Sent    →   Delivered: 11,890 / 12,450 (95%)  ·  2 min ago   │

Interaction

  • Visual timeline: top bar shows wave timing at a glance. Drag wave markers to adjust timing
  • Auto vs manual trigger: auto-send fires at the scheduled time with no intervention. Manual trigger requires a staff member to click [Send Now] in the War Room — useful for waves that depend on turnout data
  • Dynamic audience: "who haven't voted" recalculates at send time using the latest early voting data and election day confirmations
  • Personalization tokens: {{first_name}}, {{polling_location}}, {{polling_hours}} — auto-filled per recipient
  • WhatsApp quick replies: up to 3 buttons. "Already Voted" auto-marks the contact as voted. "Need a Ride" creates a ride request (GOTV-012)
  • GOTV override: election day comms bypass normal quiet hours and frequency caps (as configured in Communications Preferences)

GOTV-006: Poll Watcher Registry

Register and manage poll watchers. Track their registration status with electoral authorities and assign them to polling locations.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV Setup                    Poll Watchers             [+ Add Watcher]   │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  [Search watchers...]   Status: [All ▾]   Location: [All ▾]                 │
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Name              Status       Polling Location     Backup     Creds  │  │
│  │ ────────────────  ──────────   ──────────────────   ────────   ─────  │  │
│  │ Jorge Rivera      ● Registered Esc. Lincoln, SJ     Esc. Muñoz  ✓    │  │
│  │ Ana López         ● Registered Centro Com. Bayamón  —           ✓    │  │
│  │ Carlos Méndez     ◐ Pending    Esc. Barbosa, Caguas —           —    │  │
│  │ María Santos      ○ Not filed  (unassigned)          —           —    │  │
│  │ Luis Ortiz        ● Registered Iglesia San José     Esc. Lincoln ✓   │  │
│  │ Carmen Vega       ◐ Pending    Esc. Muñoz, SJ       —           —    │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐                      │
│  │ Total        │  │ Registered   │  │ Locations    │                      │
│  │ 6 watchers   │  │ 3 (50%)      │  │ 4 covered    │                      │
│  └──────────────┘  └──────────────┘  └──────────────┘                      │
│                                                                              │
│  Jurisdiction Requirements                                                   │
│  ─────────────────────────                                                   │
│  Registration deadline: Mar 15, 2026 (12 days away)                          │
│  Required documents: Government ID, party affiliation proof                  │
│  Filing authority: Comisión Estatal de Elecciones                            │
│  [Export Roster for Filing]                                                   │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Add/Edit Watcher (modal)

Fields: Name, Phone, Email, Government ID #, Party affiliation, Assigned polling location (dropdown of known locations), Backup location, Registration status (Not filed / Pending / Registered / Denied), Notes.

Interaction

  • Status badges: ○ Not filed, ◐ Pending, ● Registered, ✕ Denied
  • Credential tracking: ✓ indicates credentials received (tracked in detail in GOTV-007)
  • [Export Roster for Filing]: generates a formatted document matching jurisdiction requirements for submission to electoral authorities
  • Deadline warning: amber at 14 days, red at 7 days before registration deadline
  • Backup assignments: if a primary watcher can't attend, backup is automatically promoted
  • Row click: opens watcher detail with full history, assigned location details, and credential documents

GOTV-007: Poll Watcher Credential Tracking

Track credentials/certificates issued by electoral authorities for registered poll watchers.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← Poll Watchers                 Credential Tracking                         │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Watcher           Credential        Issued       Expires    Status    │  │
│  │ ────────────────  ──────────────    ──────────   ────────   ──────    │  │
│  │ Jorge Rivera      CEE-2026-4521    Feb 28       Mar 15     ✓ Valid   │  │
│  │                   📎 credential.pdf                                   │  │
│  │                                                                       │  │
│  │ Ana López         CEE-2026-4522    Feb 28       Mar 15     ✓ Valid   │  │
│  │                   📎 credential.pdf                                   │  │
│  │                                                                       │  │
│  │ Luis Ortiz        CEE-2026-4598    Mar 2        Mar 15     ✓ Valid   │  │
│  │                   📎 credential.pdf                                   │  │
│  │                                                                       │  │
│  │ Carlos Méndez     —                —            —          ⏳ Pending│  │
│  │                   Registration pending                                │  │
│  │                                                                       │  │
│  │ Carmen Vega       —                —            —          ⏳ Pending│  │
│  │                   Registration pending                                │  │
│  │                                                                       │  │
│  │ María Santos      —                —            —          — Not filed│  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐                      │
│  │ Credentials  │  │ Pending      │  │ Missing      │                      │
│  │ 3 received   │  │ 2            │  │ 1            │                      │
│  └──────────────┘  └──────────────┘  └──────────────┘                      │
│                                                                              │
│  [Print Credential Summary]                                                  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Upload credential: click a row to upload credential PDF or photo. Record credential number, issue date, expiration
  • Status: Valid (credential received and not expired), Pending (registration pending), Not filed (registration not started), Expired (past expiration date)
  • [Print Credential Summary]: generates a printable sheet with all watcher names, locations, and credential numbers — for field day distribution
  • Expiration warnings: credentials expiring within 7 days highlighted in amber
  • Compact view: this is a simpler extension of GOTV-006, often accessed from the same flow

GOTV-010: Chase Call Interface

Mobile-first phone banking interface for GOTV chase calls — contacting voters who haven't yet voted on election day. This is the highest-urgency phone bank: every call is a direct attempt to get a supporter to the polls before they close. The interface is stripped down for speed and single-purpose focus.

Mobile (Primary)

The screen is organized as a single-card, single-task flow optimized for one-handed use. Top to bottom:

Election Day Header Bar — persistent bar at the top of the screen showing the election day clock: "Polls close in 3h 12m" with a countdown timer. Background color shifts from green (>4 hours) to amber (2-4 hours) to red (<2 hours) as time runs out. This creates urgency without requiring the caller to check the time.

Progress Counter — immediately below the header: "23 of 145 calls made" with a thin progress bar. Shows the caller how far through their list they are and how much remains.

Contact Card — the main content area. A full-width card displaying:

  • Voter name (large, bold — the first thing the caller sees)
  • Support tier badge (e.g., "Tier 1 — Strong Supporter") with color coding
  • Phone number (tappable, large font)
  • Address (street address, municipality)
  • Voting status: "Not Voted" (default for chase list) or "Early Voted — Skip" if the voter was marked after the list was generated
  • Polling location name and hours

Call Button — a large, full-width primary button: "Call [First Name]". Tapping opens the device phone dialer via tel: link (BYOP model — the volunteer uses their own phone and carrier). The button is 56px tall with high contrast.

Result Buttons — appear below the call button in a 2x3 grid of quick-result options. Each button is a large touch target (minimum 48px tall):

  • Voted (green) — voter confirms they already voted or will go now
  • Will Vote (blue) — voter says they plan to vote but hasn't yet
  • Not Voting (gray) — voter declines or says they won't vote
  • No Answer (gray) — call wasn't picked up
  • Wrong Number (amber) — number is incorrect
  • Do Not Call (red) — voter requests removal from call list

Needs a Ride — below the result grid, a secondary toggle: "Needs a ride to polls?" When enabled, tapping a positive result (Voted/Will Vote) also creates a ride request routed to the GOTV-011 form (pre-filled with voter name, address, and polling location) and then into the GOTV-012 dispatcher queue.

Auto-Advance — after a result is logged, the screen auto-advances to the next contact after a 1-second delay. A brief toast confirms the result: "Logged: No Answer. Next call..." The caller can tap "Undo" on the toast to go back and change the result.

Skip Button — small text link at the bottom: "Skip this contact →" for cases where the caller needs to move on without logging a result (e.g., they recognize the person and know they've voted).

Interaction

  • List source: the chase call list is generated from the GOTV universe (GOTV-001) filtered to voters not yet marked as voted. Ordered by priority tier (Tier 1 first, then Tier 2, then Tier 3)
  • BYOP model: the platform does not place calls — it provides the number and the caller uses their own phone. The tel: link opens the native dialer. This avoids telephony infrastructure and works on any device
  • Result logging is the primary action: the screen is designed so that after each call, the caller taps one button and moves on. No forms, no text entry, no navigation
  • Ride request shortcut: the "Needs a Ride" flag creates a ride request (GOTV-011) with voter name, address, and polling location pre-filled. The caller doesn't leave the chase call flow — the request is submitted in the background
  • Offline: not supported. Chase calls require real-time list updates to avoid duplicate calls across volunteers. If connectivity is lost, the screen shows a banner: "Offline — results will sync when reconnected" but the caller can continue working from the cached list
  • Mirrors PHONE-004: the layout closely follows the standard phone bank call interface but removes survey questions, scripts, and multi-issue tracking. The only question is binary: did they vote / will they vote?

Design Notes

  • The election day clock is the most important ambient element — it keeps the caller aware of urgency without being distracting. The color shift is subtle but effective
  • Result buttons are deliberately large and few. On a high-stress, high-volume day, reducing the number of taps per call is critical. Six options cover every outcome without requiring "Other" or free text
  • Auto-advance eliminates the need to manually navigate to the next contact. The 1-second delay gives the caller a beat to mentally prepare for the next call
  • The "Do Not Call" button is red and positioned last in the grid to prevent accidental taps. Logging DNC is irreversible and removes the contact from all future lists
  • No desktop wireframe: this screen is designed for volunteers making calls from their personal phones while standing, walking, or sitting in a staging location. Desktop use is possible but not the target

GOTV-011: Ride Request Form

Simple form for requesting a ride to the polls. Used by volunteers during chase calls (GOTV-010), team leads at staging locations, and staff processing voter requests from SMS/WhatsApp replies. The form is intentionally minimal — requesting a ride should take less than 30 seconds.

Mobile (Primary)

┌────────────────────────────┐
│  Request a Ride to Polls    │
├────────────────────────────┤
│                            │
│  Voter Name *              │
│  ┌────────────────────────┐│
│  │ María Colón            ││
│  └────────────────────────┘│
│  (pre-filled from contact) │
│                            │
│  Pickup Address *          │
│  ┌────────────────────────┐│
│  │ Calle Sol 12, San Juan ││
│  └────────────────────────┘│
│                            │
│  Phone Number *            │
│  ┌────────────────────────┐│
│  │ +1 787-555-0142        ││
│  └────────────────────────┘│
│                            │
│  Passengers     [1 ▾]      │
│                            │
│  Accessibility Needs        │
│  □ Wheelchair accessible   │
│  □ Walker / mobility aid   │
│  □ Visual assistance       │
│  □ Other: [____________]   │
│                            │
│  Preferred Pickup Time     │
│  [As soon as possible ▾]   │
│                            │
│  Polling Location          │
│  ┌────────────────────────┐│
│  │ Esc. Lincoln, San Juan ││
│  └────────────────────────┘│
│  (auto-populated from      │
│   voter record, editable)  │
│                            │
│  Notes                     │
│  ┌────────────────────────┐│
│  │ Gate code: 4521        ││
│  └────────────────────────┘│
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │   Submit Ride Request  ││
│  │                        ││
│  └────────────────────────┘│
│                            │
└────────────────────────────┘

Confirmation

┌────────────────────────────┐
│                            │
│           ✓                │
│                            │
│  Ride requested!           │
│                            │
│  A volunteer driver will   │
│  contact María Colón at    │
│  +1 787-555-0142.          │
│                            │
│  Pickup: Calle Sol 12, SJ  │
│  To: Esc. Lincoln, SJ      │
│  Passengers: 1             │
│  Time: As soon as possible │
│                            │
│  Request #RD-2026-0089     │
│                            │
│  [Submit Another Request]  │
│  [Back to Chase Calls]     │
│                            │
└────────────────────────────┘

Interaction

  • Pre-fill: when opened from a chase call (GOTV-010), voter name, phone number, address, and polling location are pre-filled from the contact record. The volunteer only needs to confirm and tap Submit
  • Passengers: defaults to 1, dropdown goes up to 6. Useful when the voter is bringing family members
  • Accessibility checkboxes: selecting any option flags the ride as requiring an accessible vehicle in the dispatcher queue (GOTV-012). The "Other" field allows free text for needs not covered by the standard options
  • Pickup time: dropdown with options: "As soon as possible", "Within 30 minutes", "Within 1 hour", or a specific time picker. Defaults to "As soon as possible" for chase call requests
  • Polling location: auto-populated from the voter's record. Editable in case the voter prefers a different location (where permitted by jurisdiction rules)
  • Offline support: the form can be filled out and queued locally. When connectivity is restored, the request is submitted automatically. A banner shows: "You're offline — this request will be submitted when you reconnect." The confirmation screen shows "Queued" instead of a reference number
  • Submission: creates an entry in the GOTV-012 dispatcher queue with status "Pending". Dispatcher is notified of new requests via the auto-refresh mechanism
  • [Back to Chase Calls]: returns to GOTV-010 at the next contact in the list — the caller doesn't lose their place

Design Notes

  • The form is kept to a single scroll with no tabs or multi-step flow. On election day, every second counts — the fewer taps, the better
  • Accessibility needs are checkboxes rather than a dropdown so multiple options can be selected simultaneously (e.g., wheelchair + visual assistance)
  • The confirmation screen includes the reference number for tracking and the voter's phone number so the volunteer can tell the voter "someone will call you at this number"
  • Pre-fill is critical: when coming from GOTV-010, the form should require zero typing in the common case. Just review and submit
  • Notes field is optional but valuable for practical details like gate codes, apartment numbers, or "call when arriving, voter is hard of hearing"

GOTV-012: Ride Coordination — Dispatcher View

Real-time dispatcher interface for matching ride requests with available drivers on election day. Requests come from voter WhatsApp replies, volunteer reports, and phone bank calls.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  GOTV Rides                                            [Map View] [List View]│
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │ Pending      │  │ Assigned     │  │ In Transit   │  │ Completed    │    │
│  │ 8            │  │ 5            │  │ 3            │  │ 34           │    │
│  │ ● 2 urgent   │  │              │  │              │  │ today        │    │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘    │
│                                                                              │
│  ┌──────────────────────────────────┐  ┌────────────────────────────────────┐│
│  │                                  │  │ Pending Requests                   ││
│  │       [Map]                      │  │ ──────────────────                 ││
│  │                                  │  │                                    ││
│  │  🔴 = pending (urgent)           │  │ 🔴 María Colón · 1:45 PM          ││
│  │  🟡 = pending                    │  │    Calle Sol 12, SJ → Esc. Lincoln││
│  │  🔵 = assigned/in transit        │  │    Wheelchair accessible           ││
│  │  🟢 = driver available           │  │    ⏱ Waiting 22 min               ││
│  │                                  │  │    [Assign Driver ▾]               ││
│  │  Rider pins + driver pins        │  │                                    ││
│  │  with routing lines              │  │ 🔴 Pedro Ríos · 2:00 PM           ││
│  │                                  │  │    Calle Luna 8 → Centro Comunal  ││
│  │                                  │  │    Needs 2 seats (bringing spouse) ││
│  │                                  │  │    ⏱ Waiting 7 min                ││
│  │                                  │  │    [Assign Driver ▾]               ││
│  │                                  │  │                                    ││
│  │                                  │  │ 🟡 Ana Vega · 2:15 PM             ││
│  │                                  │  │    Bayamón → Esc. Barbosa          ││
│  │                                  │  │    ⏱ Waiting 2 min                ││
│  │                                  │  │    [Assign Driver ▾]               ││
│  │                                  │  │                                    ││
│  │                                  │  │ [Show 5 more...]                   ││
│  │                                  │  │                                    ││
│  └──────────────────────────────────┘  │ ─────────────────────────────────  ││
│                                         │                                    ││
│                                         │ Available Drivers                  ││
│                                         │ ──────────────────                 ││
│                                         │                                    ││
│                                         │ 🟢 Carlos R. · Sedan · 3 seats    ││
│                                         │    Near: San Juan North            ││
│                                         │    Trips today: 4                  ││
│                                         │                                    ││
│                                         │ 🟢 Luisa F. · Van · 6 seats       ││
│                                         │    Near: Caguas                    ││
│                                         │    Trips today: 2                  ││
│                                         │    ☑ Wheelchair accessible         ││
│                                         │                                    ││
│                                         │ 🟢 Miguel T. · Sedan · 3 seats    ││
│                                         │    Near: Bayamón                   ││
│                                         │    Trips today: 5                  ││
│                                         │                                    ││
│                                         └────────────────────────────────────┘│
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Assign Driver Flow

[Assign Driver ▾] → dropdown with recommended drivers:
┌─────────────────────────────────────────┐
│ Recommended                             │
│ ✓ Luisa F. · Van · ♿ · 8 min away     │
│   Carlos R. · Sedan · 12 min away      │
│                                         │
│ All Available                           │
│   Miguel T. · Sedan · 22 min away      │
│   [Show more...]                        │
└─────────────────────────────────────────┘

Mobile

┌────────────────────────────┐
│  GOTV Rides            [☰] │
├────────────────────────────┤
│                            │
│  Pending: 8 · Assigned: 5  │
│  Transit: 3 · Done: 34     │
│                            │
│  [Pending] [Active] [Done] │
│                            │
│  🔴 María Colón · 1:45 PM  │
│  Calle Sol 12 → Esc Lincol │
│  ♿ Wheelchair · ⏱ 22 min  │
│  [Assign ▾]                │
│                            │
│  🔴 Pedro Ríos · 2:00 PM   │
│  Calle Luna 8 → Centro Com │
│  2 seats · ⏱ 7 min        │
│  [Assign ▾]                │
│                            │
│  🟡 Ana Vega · 2:15 PM     │
│  Bayamón → Esc. Barbosa    │
│  ⏱ 2 min                  │
│  [Assign ▾]                │
│                            │
│  [Show 5 more...]          │
│                            │
└────────────────────────────┘

Interaction

  • Priority ordering: urgent requests (waiting >15 min, accessibility needs) at top with 🔴
  • Smart matching: [Assign Driver ▾] shows recommended drivers sorted by proximity, vehicle compatibility (wheelchair accessible, seat count), and workload
  • Map + list split: map shows spatial relationships, list shows details. Either can be used independently
  • Multi-passenger optimization: platform can suggest grouping nearby requests for a single driver run
  • Status tracking: Pending → Assigned (driver notified) → En Route (driver confirmed) → Transporting → Completed
  • Auto-refresh: 30-second refresh on pending list. New requests appear at top with brief highlight
  • Ride source: requests come from WhatsApp quick reply ("Need a Ride"), volunteer canvasser reports (field mode), phone bank referrals, or manual entry by dispatcher

GOTV-013: Ride Driver View

Mobile interface for volunteer drivers on election day. A task-by-task workflow: the driver sees their current assignment, completes it, and moves to the next one. No complex data views, no dispatch decisions — just clear instructions for the current ride.

Mobile (Primary)

┌────────────────────────────┐
│  GOTV Driver        [!]    │
│  4 completed · 1 active    │
├────────────────────────────┤
│                            │
│  ── Current Assignment ──  │
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │  PICKUP                ││
│  │  María Colón           ││
│  │  📱 +1 787-555-0142    ││
│  │  Calle Sol 12, SJ      ││
│  │                        ││
│  │  Passengers: 1          ││
│  │  ♿ Wheelchair access   ││
│  │                        ││
│  │  TO POLLS              ││
│  │  Esc. Lincoln, SJ      ││
│  │                        ││
│  │  ┌────────────────────┐││
│  │  │   📍 Navigate      │││
│  │  └────────────────────┘││
│  │  (opens native maps)   ││
│  │                        ││
│  │  ┌────────────────────┐││
│  │  │   📱 Call Voter    │││
│  │  └────────────────────┘││
│  │                        ││
│  │  Status:                ││
│  │  [En Route] [Picked Up]││
│  │  [At Polls] [Completed]││
│  │                        ││
│  └────────────────────────┘│
│                            │
│  ── Next Up ──             │
│                            │
│  ┌────────────────────────┐│
│  │ Pedro Ríos             ││
│  │ Calle Luna 8 → Centro  ││
│  │ 2 passengers           ││
│  └────────────────────────┘│
│                            │
│  [Report Issue]            │
│                            │
└────────────────────────────┘

Report Issue (modal)

┌─ Report Issue ────────────────────┐
│                                    │
│  Issue Type                        │
│  ○ Voter no-show at pickup         │
│  ○ Delay (traffic, road closure)   │
│  ○ Accessibility problem           │
│  ○ Vehicle issue                   │
│  ○ Other                           │
│                                    │
│  Details                           │
│  ┌────────────────────────────┐   │
│  │ Voter not answering phone, │   │
│  │ waited 10 minutes...       │   │
│  └────────────────────────────┘   │
│                                    │
│  [Cancel]          [Submit Report] │
│                                    │
└────────────────────────────────────┘

Interaction

  • Task-by-task flow: the driver only sees their current assignment prominently. No list of all assignments, no queue management — that complexity lives in the dispatcher view (GOTV-012)
  • Status progression: En Route → Picked Up → At Polls → Completed. Each tap advances the status. Status updates are visible to the dispatcher in real time
  • [Navigate]: opens the device's native maps app (Google Maps, Apple Maps, Waze) with directions to the pickup address. After pickup, the button changes to navigate to the polling location
  • [Call Voter]: opens phone dialer via tel: link. Used when the driver arrives and needs to coordinate ("I'm outside in the blue sedan")
  • Next assignment preview: shows a compact card for the next ride so the driver knows what's coming. The preview becomes the current assignment when the current ride is marked Completed
  • [Report Issue]: modal for problems — voter no-show, delays, accessibility mismatches, vehicle breakdowns. Reports go to the dispatcher who can reassign the ride
  • Ride count: "4 completed, 1 in progress" in the header gives the driver a sense of their contribution for the day
  • Assignment push: new assignments arrive via push notification. The driver doesn't need to refresh or check for assignments — they appear automatically
  • No offline mode: drivers need real-time assignment updates and status synchronization with dispatch. Offline driving is not supported

Design Notes

  • The screen is designed for use while standing next to a car or sitting in a parked vehicle. Large text, large buttons, minimal scrolling. The driver should be able to glance at their phone and know exactly what to do next
  • Navigate and Call buttons are the two most-used actions and get prominent placement. They use native OS capabilities (tel: and maps deep links) rather than in-app implementations
  • The status buttons are a horizontal row rather than a stepper — the driver taps the relevant status rather than advancing through each one sequentially. This handles cases where a status is skipped (e.g., voter meets the driver at the curb, so "Picked Up" and "At Polls" happen almost simultaneously)
  • Accessibility needs are shown prominently on the assignment card so the driver can confirm their vehicle is suitable before departing. If there's a mismatch, [Report Issue] routes the ride back to dispatch
  • The "Next Up" preview reduces anxiety — the driver knows whether they can take a break after the current ride or should head straight to the next pickup

GOTV-014: Poll Watcher Check-in

Simple check-in screen for poll watchers arriving at their assigned polling location on election day. The screen serves a single purpose: confirm arrival so that the field team knows which locations are covered. Minimal interface — this is used once per shift, not repeatedly.

Mobile (Primary)

┌────────────────────────────┐
│  Poll Watcher Check-in      │
├────────────────────────────┤
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │  Your Assignment       ││
│  │                        ││
│  │  Esc. Lincoln          ││
│  │  Calle Fortaleza 22    ││
│  │  San Juan, PR 00901    ││
│  │                        ││
│  │  Shift: 8:00 AM – 2 PM││
│  │  Credential: CEE-4521  ││
│  │                        ││
│  └────────────────────────┘│
│                            │
│  Status: ○ Not Checked In  │
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │     ✓ Check In Now     ││
│  │                        ││
│  └────────────────────────┘│
│    56px tall, full-width   │
│                            │
│  ─────────────────────     │
│                            │
│  Quick Links               │
│  ──────────                │
│                            │
│  [Report Issue →]          │
│    → GOTV-015              │
│                            │
│  [View Talking Points →]   │
│    Opens reference doc     │
│                            │
│  [Contact Field Director]  │
│    📱 +1 787-555-0101      │
│                            │
│  ─────────────────────     │
│                            │
│  ⓘ Check in when you       │
│  arrive at your assigned   │
│  location. This confirms   │
│  coverage for the field    │
│  team.                     │
│                            │
└────────────────────────────┘

Checked-In State

┌────────────────────────────┐
│  Poll Watcher Check-in      │
├────────────────────────────┤
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │  Esc. Lincoln          ││
│  │  Calle Fortaleza 22    ││
│  │  San Juan, PR 00901    ││
│  │                        ││
│  │  Shift: 8:00 AM – 2 PM││
│  │  Credential: CEE-4521  ││
│  │                        ││
│  └────────────────────────┘│
│                            │
│  Status: ● Checked In      │
│  Since: 7:52 AM            │
│                            │
│  ┌────────────────────────┐│
│  │   Complete Shift       ││
│  └────────────────────────┘│
│                            │
│  Quick Links               │
│  ──────────                │
│                            │
│  [Report Issue →]          │
│  [View Talking Points →]   │
│  [Contact Field Director]  │
│                            │
└────────────────────────────┘

Interaction

  • Check-in flow: single tap on "Check In Now" → confirmation vibration (haptic) → status changes to "Checked In" with timestamp. The check-in updates the poll watcher's status in the GOTV-006 registry, visible to field staff
  • Status progression: Not Checked In → Checked In → Shift Complete. Three states, no complexity
  • GPS validation (optional, configurable): if enabled, the platform compares the watcher's GPS coordinates against the assigned polling location. If the location doesn't match (>500m), a warning appears: "Your location doesn't match your assigned polling place. Are you at the right location?" The watcher can override and check in anyway — GPS is advisory, not blocking
  • Shift information: start time, end time, and credential number displayed prominently. The credential number is useful if challenged by election officials at the location
  • Quick links: three essential actions available throughout the shift:
    • Report Issue → opens GOTV-015 (issue report form)
    • View Talking Points → opens a reference document with poll watcher rights, what to observe, and how to handle common situations
    • Contact Field Director → direct phone call to the assigned field director for the watcher's area
  • [Complete Shift]: marks the shift as done when the watcher leaves. Timestamp recorded. If a backup watcher is assigned (GOTV-006), they receive a notification to take over

Design Notes

  • This is deliberately one of the simplest screens in the platform. Poll watchers are volunteers, often first-timers, arriving at an unfamiliar location early in the morning. The screen should feel reassuring, not overwhelming
  • The assignment card is the anchor — it confirms the watcher is at the right place. Address is displayed prominently so they can verify against the physical location
  • The credential number is shown on this screen specifically because poll watchers are sometimes asked to produce their credentials by election officials. Having it visible on their phone is a backup if they misplace the physical document
  • GPS validation is optional because GPS can be unreliable indoors or in dense urban areas. It's a helpful check, not a gate
  • The "Talking Points" link is important for watcher confidence — having a quick reference for their rights and responsibilities reduces anxiety and improves observation quality

GOTV-015: Poll Watcher Issue Report Form

Form for poll watchers to report issues observed at polling locations. Designed for speed and clarity under pressure — a poll watcher witnessing a problem needs to document it quickly before details fade. Reports feed into the GOTV-016 issue queue for staff triage.

Mobile (Primary)

┌────────────────────────────┐
│  ← Report Issue             │
│  Esc. Lincoln, San Juan     │
├────────────────────────────┤
│                            │
│  Issue Category *          │
│  ┌────────────────────────┐│
│  │ Voter Access          ▾││
│  └────────────────────────┘│
│  Voter Access / Equipment  │
│  Failure / Campaign        │
│  Violation / Long Wait     │
│  Times / Accessibility     │
│  Issue / Voter Intimidation│
│  / Other                   │
│                            │
│  Severity *                │
│  ┌────────────────────────┐│
│  │ High                  ▾││
│  └────────────────────────┘│
│  Critical / High / Medium  │
│                            │
│  Description *             │
│  ┌────────────────────────┐│
│  │ Poll worker asked voter││
│  │ for photo ID. This     ││
│  │ jurisdiction does not  ││
│  │ require photo ID...    ││
│  │                        ││
│  │                        ││
│  └────────────────────────┘│
│                            │
│  Evidence (optional)       │
│  [📷 Take Photo]           │
│  [🖼 Choose from Gallery]  │
│  photo_001.jpg ✓           │
│                            │
│  Time Observed             │
│  [2:34 PM ▾] (now)         │
│  (defaults to now,         │
│   editable)                │
│                            │
│  People Involved (optional)│
│  ┌────────────────────────┐│
│  │ Male poll worker at    ││
│  │ check-in table 2       ││
│  └────────────────────────┘│
│                            │
│  ┌────────────────────────┐│
│  │ ⚠ This requires        ││
│  │ immediate attention    ││
│  │                 [OFF]  ││
│  └────────────────────────┘│
│  Sends push notification   │
│  to Field Director         │
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │    Submit Report       ││
│  │                        ││
│  └────────────────────────┘│
│                            │
└────────────────────────────┘

Confirmation

┌────────────────────────────┐
│                            │
│           ✓                │
│                            │
│  Issue reported.           │
│                            │
│  Reference #ISS-2026-0047  │
│                            │
│  Category: Voter Access    │
│  Severity: High            │
│  Location: Esc. Lincoln    │
│                            │
│  The field team has been   │
│  notified.                 │
│                            │
│  [Report Another Issue]    │
│  [Back to Check-in]        │
│                            │
└────────────────────────────┘

Interaction

  • Pre-filled location: the polling location is pre-filled from the watcher's assignment (GOTV-014). Not editable — reports are tied to the assigned location
  • Issue categories: seven options covering the most common polling location issues. "Other" includes a required text field for the category description
  • Severity levels: Critical (voter being denied right to vote, intimidation, systemic failure), High (significant problems affecting multiple voters), Medium (minor issues or potential problems). No "Low" option — if it's not worth a Medium, it's not worth a report
  • Description: required free-text field. Minimum 20 characters to encourage meaningful detail. Placeholder text: "Describe what you observed. Be specific about what happened, who was involved, and how it affects voters."
  • Photo/video evidence: camera button opens the device camera directly. Gallery button allows selecting existing photos. Multiple files can be attached. Files are uploaded immediately on selection (progress indicator shown). Maximum 5 attachments, 20MB each
  • Time observed: defaults to current time. Editable via time picker for cases where the watcher is reporting an issue that happened earlier in the day
  • "Immediate attention" toggle: when enabled, the report triggers a push notification to the Field Director and the issue appears with a 🔴 badge in the GOTV-016 queue. Used for Critical severity issues that need real-time response
  • Offline support: the form can be filled out offline, including photos. The report is queued locally and submitted when connectivity is restored. A banner shows: "You're offline — this report will be submitted when you reconnect." Photos are stored locally until upload completes
  • Submission: creates an entry in the GOTV-016 issue queue. Reference number is generated server-side (or "Queued" if offline). The watcher can reference this number in follow-up communications

Design Notes

  • The form is ordered by importance: category and severity first (for triage), then description (for understanding), then evidence (for documentation), then metadata (time, people). This matches how a dispatcher would read the report
  • The "immediate attention" toggle is deliberately not a checkbox — it's a prominent, labeled toggle that makes the watcher consciously choose to escalate. This prevents accidental escalations while making real ones easy
  • Photo evidence is optional because requiring it would slow down reporting. Some issues (long wait times, verbal incidents) may not have visual evidence. But the camera button is prominent because photo evidence is extremely valuable when available
  • The severity picker has only three levels (no "Low") to prevent poll watchers from under-classifying issues. If someone takes the time to fill out a report, it's at least Medium
  • The confirmation screen includes the reference number prominently — the watcher may need to reference it when speaking with election officials or the legal team later in the day
  • The "People Involved" field is intentionally vague ("optional text field") rather than structured (name, role, ID) because poll watchers may not know who the person is. Descriptive identification ("male poll worker at check-in table 2") is more practical than trying to get a name

GOTV-016: Poll Watcher Issue Queue

Staff view for incoming issue reports from poll watchers at polling locations. Issues range from procedural irregularities to voter intimidation to equipment problems.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  GOTV Issue Queue                           [Filter ▾]   Auto-refresh: [ON] │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │ 🔴 Critical  │  │ 🟠 High      │  │ 🟡 Medium    │  │ ✓ Resolved   │    │
│  │ 2            │  │ 3            │  │ 5            │  │ 12           │    │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘    │
│                                                                              │
│  ┌─ Open Issues ───────────────────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  🔴 Voter turned away — no ID required for this jurisdiction           │ │
│  │     Esc. Lincoln, San Juan · Jorge Rivera · 2:34 PM (12 min ago)       │ │
│  │     Category: Voter Access · Severity: Critical                        │ │
│  │     📷 1 photo attached                                                │ │
│  │     [View Details]  [Escalate]  [Resolve]                              │ │
│  │                                                                        │ │
│  │  🔴 Machine malfunction — voters waiting 45+ min                       │ │
│  │     Centro Comunal, Bayamón · Ana López · 2:20 PM (26 min ago)         │ │
│  │     Category: Equipment · Severity: Critical                           │ │
│  │     [View Details]  [Escalate]  [Resolve]                              │ │
│  │                                                                        │ │
│  │  🟠 Campaigning inside 100m zone                                       │ │
│  │     Esc. Barbosa, Caguas · Carlos Méndez · 1:45 PM (1h 1m ago)        │ │
│  │     Category: Campaign Violation · Severity: High                      │ │
│  │     📷 2 photos attached                                               │ │
│  │     [View Details]  [Escalate]  [Resolve]                              │ │
│  │                                                                        │ │
│  │  🟠 Long lines — estimated 2 hour wait                                 │ │
│  │     Iglesia San José, SJ · Luis Ortiz · 1:30 PM (1h 16m ago)          │ │
│  │     Category: Wait Times · Severity: High                              │ │
│  │     [View Details]  [Escalate]  [Resolve]                              │ │
│  │                                                                        │ │
│  │  🟡 Accessibility ramp blocked by delivery truck                       │ │
│  │     Esc. Muñoz, SJ · Carmen Vega · 12:45 PM (2h 1m ago)               │ │
│  │     Category: Accessibility · Severity: Medium                         │ │
│  │     Internal note: Called building manager, ETA 30 min                 │ │
│  │     [View Details]  [Escalate]  [Resolve]                              │ │
│  │                                                                        │ │
│  │  [Show 5 more medium issues...]                                        │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Issue Detail (modal or side panel)

┌─ Issue Detail ──────────────────────────────────────────┐
│                                                         │
│  🔴 Voter turned away — no ID required                  │
│                                                         │
│  Location: Esc. Lincoln, San Juan                       │
│  Reported by: Jorge Rivera (Poll Watcher)               │
│  Time: 2:34 PM, March 15, 2026                          │
│  Category: Voter Access                                 │
│  Severity: Critical                                     │
│                                                         │
│  Description                                            │
│  Poll worker asked voter for government-issued photo    │
│  ID. This jurisdiction does not require photo ID. Voter │
│  left without voting. I informed the poll worker of     │
│  the correct rule but they said "it's our policy."      │
│                                                         │
│  📷 Photo: [poll worker sign reading "ID Required"]     │
│                                                         │
│  ─ Actions ──────────────────────────────               │
│                                                         │
│  Escalate to:                                           │
│  [Election Protection Hotline]                          │
│  [Legal Team]                                           │
│  [Electoral Commission]                                 │
│                                                         │
│  Internal Notes                                         │
│  ┌──────────────────────────────────────────────┐      │
│  │ Called election protection hotline at 2:40 PM.│      │
│  │ Case #EP-2026-4521. They are sending a...    │      │
│  └──────────────────────────────────────────────┘      │
│  [Add Note]                                             │
│                                                         │
│  [Mark Resolved]                                        │
│                                                         │
│  Resolution                                             │
│  ┌──────────────────────────────────────────────┐      │
│  │ (Fill in when resolving)                     │      │
│  └──────────────────────────────────────────────┘      │
│                                                         │
└─────────────────────────────────────────────────────────┘

Interaction

  • Severity ordering: Critical issues always at top, then High, then Medium. Within severity, sorted by age (oldest first — longest unresolved)
  • Category filter: Voter Access, Equipment, Campaign Violation, Wait Times, Accessibility, Intimidation, Other
  • Auto-refresh: new issues appear automatically (30-second poll). Sound notification for Critical issues
  • Escalation routing: configurable per severity. Critical can auto-notify legal team. Escalation buttons send to external election protection organizations with pre-formatted report
  • Photo/video: attached evidence from poll watcher's phone (uploaded via their field mode interface)
  • Internal notes: timestamped log of actions taken, visible only to staff
  • Resolution: required description when marking as resolved — creates audit trail
  • Mobile: full queue with swipe-to-act (swipe right to escalate, swipe left to resolve)

GOTV-017: Turnout Dashboard — Map View

The war room's primary spatial view of election day turnout. Real-time heatmap showing which areas are hitting targets and which need attention.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  GOTV Turnout — Map View                      [Segment View]  [War Room →]   │
│                                                 Last updated: 2:46 PM        │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │ Universe     │  │ Voted        │  │ Turnout      │  │ Target       │    │
│  │ 14,832       │  │ 5,891        │  │ 39.7%        │  │ 65%          │    │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘    │
│                                                                              │
│  ┌──────────────────────────────────────────────────────────────────────────┐│
│  │                                                                          ││
│  │                    [Full-width map]                                       ││
│  │                                                                          ││
│  │   Color by turnout %:                                                    ││
│  │   🟥 < 25%   🟧 25-40%   🟨 40-55%   🟩 55-65%   🟦 > 65%              ││
│  │                                                                          ││
│  │   Each turf/precinct is a colored polygon.                               ││
│  │   Click to see detail.                                                   ││
│  │                                                                          ││
│  │   Overlay toggles:                                                       ││
│  │   ☑ Turf boundaries                                                     ││
│  │   □ Active canvassers (pins)                                             ││
│  │   □ Staging locations                                                    ││
│  │   □ Polling locations                                                    ││
│  │                                                                          ││
│  └──────────────────────────────────────────────────────────────────────────┘│
│                                                                              │
│  ┌─ Selected: Turf SJ-N-03 ───────────────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Universe: 42 · Voted: 14 (33%) · Target: 65%                         │ │
│  │  Tier 1: 8/18 voted · Tier 2: 4/16 voted · Tier 3: 2/8 voted         │ │
│  │                                                                        │ │
│  │  Canvasser: Ana López · Pass 2 in progress                             │ │
│  │  Contacts remaining: 28                                                │ │
│  │                                                                        │ │
│  │  Data source: ● Official (12) · ◐ Volunteer report (2)                │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Mobile

┌────────────────────────────┐
│  Turnout Map      [Segs ▾] │
├────────────────────────────┤
│                            │
│  39.7% of 14,832 voted     │
│  Target: 65%               │
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │    [Map — full width]  ││
│  │                        ││
│  │    Color-coded turfs   ││
│  │                        ││
│  │                        ││
│  │                        ││
│  └────────────────────────┘│
│                            │
│  Tap turf for details      │
│                            │
│  ── Lowest Turnout ──      │
│  SJ-N-03  33%  42 voters   │
│  BAY-02   35%  38 voters   │
│  CAG-05   36%  45 voters   │
│                            │
└────────────────────────────┘

Interaction

  • Auto-refresh: map updates every 60 seconds. Turnout numbers update on each refresh
  • Color coding: red (behind target) → green (at/above target). Color scale relative to the 65% target, not absolute
  • Data confidence: each turnout data point has a source — official electoral authority data is highest confidence, volunteer reports are medium, voter self-reports are lowest. The detail panel shows the breakdown
  • Overlay toggles: layer active canvassers, staging locations, and polling locations onto the turnout map for spatial awareness
  • Click turf for detail: shows universe/voted/target for that turf, current canvasser, remaining contacts, and data source breakdown
  • "Lowest Turnout" list: mobile shows the turfs most needing attention — feeds into reallocation decisions (GOTV-019)

GOTV-018: Turnout Dashboard — Segment View

Tabular breakdown of turnout by voter segment. Complements the map view with analytical depth.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  GOTV Turnout — Segment View                  [Map View]    [War Room →]     │
│                                                 Last updated: 2:46 PM        │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  View by: [Support Tier ▾]    Compare: [Target vs Actual ▾]                 │
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Segment          Universe   Voted    Turnout   Target   Gap           │  │
│  │ ───────────────  ────────   ─────    ───────   ──────   ───           │  │
│  │ Tier 1 (Strong)  4,210      2,104    50.0%     75%      -25% ⚠       │  │
│  │                  ████████████████████░░░░░░░░░░                       │  │
│  │                                                                       │  │
│  │ Tier 2 (Lean)    6,118      2,387    39.0%     60%      -21% ⚠       │  │
│  │                  ██████████████░░░░░░░░░░░░░░░░                       │  │
│  │                                                                       │  │
│  │ Tier 3 (Soft)    4,504      1,400    31.1%     50%      -19%          │  │
│  │                  ████████████░░░░░░░░░░░░░░░░░░                       │  │
│  │                                                                       │  │
│  │ Total            14,832     5,891    39.7%     65%      -25%          │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  Turnout Over Time                                                           │
│  ─────────────────                                                           │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                                                                      │   │
│  │  70% ┤                                              ·····Target      │   │
│  │  60% ┤                                         ·····                 │   │
│  │  50% ┤                                    ·····        ___Tier 1     │   │
│  │  40% ┤                     ___─────────── ─────       ___Tier 2      │   │
│  │  30% ┤          __────────                            ___Tier 3      │   │
│  │  20% ┤    __────                                                     │   │
│  │  10% ┤ ──                                                            │   │
│  │   0% ┼──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──                           │   │
│  │       8AM 9  10  11  12  1PM 2  3  4  5PM                            │   │
│  │                                                                      │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  By Geography                                                                │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Region           Universe   Voted    Turnout   Target   Gap           │  │
│  │ ──────────────   ────────   ─────    ───────   ──────   ───           │  │
│  │ San Juan North   4,450      1,868    42.0%     65%      -23%          │  │
│  │ Bayamón          3,440      1,204    35.0%     65%      -30% ⚠       │  │
│  │ Caguas           2,710      1,138    42.0%     65%      -23%          │  │
│  │ Carolina         2,170      911      42.0%     65%      -23%          │  │
│  │ Ponce            2,062      770      37.3%     65%      -28% ⚠       │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • View by: toggle between Support Tier, Geography, Demographics, Custom segment — different table groupings
  • Target vs Actual: visual comparison with gap column. ⚠ flags segments >20% below target
  • Turnout over time chart: shows the hourly trajectory. Dotted line is the target pace. If the actual line is below the target pace at any point, the gap is widening and action is needed
  • Drill-down: click a segment row to see individual contacts in that segment and their vote status
  • Export: CSV export for post-election analysis

GOTV-019: Reallocation Suggestions

Platform analyzes live turnout data and suggests resource reallocation. War room staff review and approve suggestions — the platform recommends, humans decide.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  GOTV Reallocation Suggestions                              [War Room →]     │
│                                          Generated: 2:50 PM  [↻ Regenerate] │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌─ Suggestion 1 ── Priority: High ───────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Shift 2 canvassers from San Juan North → Bayamón                      │ │
│  │                                                                        │ │
│  │  Rationale:                                                            │ │
│  │  · SJ North is at 42% turnout with strong Tier 1 performance (58%)    │ │
│  │  · Bayamón is at 35% — lowest performing region, 30% gap to target    │ │
│  │  · 3 canvassers in SJ North have completed their turfs                │ │
│  │  · 4 Bayamón turfs are unworked in Pass 2                             │ │
│  │                                                                        │ │
│  │  Available canvassers:                                                 │ │
│  │  · Ana López (completed SJ-N-03, SJ-N-04)                             │ │
│  │  · Miguel Torres (completed SJ-N-07)                                   │ │
│  │                                                                        │ │
│  │  [✓ Approve]  [✎ Modify]  [✕ Reject]                                 │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Suggestion 2 ── Priority: High ───────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Add phone banking surge for Ponce Tier 1 non-voters                   │ │
│  │                                                                        │ │
│  │  Rationale:                                                            │ │
│  │  · 620 Tier 1 contacts in Ponce, only 37% have voted                  │ │
│  │  · 390 remaining — too many for door-to-door in remaining time        │ │
│  │  · 4 phone bank volunteers available                                   │ │
│  │                                                                        │ │
│  │  [✓ Approve]  [✎ Modify]  [✕ Reject]                                 │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ┌─ Suggestion 3 ── Priority: Medium ─────────────────────────────────────┐ │
│  │                                                                        │ │
│  │  Send SMS reminder to 1,240 Tier 1 non-voters in Bayamón + Ponce      │ │
│  │                                                                        │ │
│  │  Rationale:                                                            │ │
│  │  · These regions have the widest gap to target                        │ │
│  │  · Tier 1 contacts are highest-value — each additional vote matters   │ │
│  │  · Sending now (3 PM) gives 2 hours before polls close                │ │
│  │                                                                        │ │
│  │  [✓ Approve]  [✎ Modify]  [✕ Reject]                                 │ │
│  │                                                                        │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  Previously Actioned                                                         │
│  ──────────────────                                                          │
│  ✓ 1:30 PM — Shifted 1 canvasser from Carolina to Caguas (approved)         │
│  ✕ 12:45 PM — Suggested Wave 3 comms early (rejected — too soon)            │
│  ✓ 11:00 AM — Redirected 2 phone bankers to Tier 1 focus (approved)         │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Human-in-the-loop: platform suggests, staff decides. No auto-execution of resource changes
  • [✓ Approve]: executes the suggestion — reassigns canvassers, triggers phone bank, sends comms. Shows confirmation with details
  • [✎ Modify]: opens the suggestion for adjustment — change which canvassers, modify the target area, edit the message. Then approve the modified version
  • [✕ Reject]: dismisses with optional reason. Platform learns (or rather, the team learns what works)
  • [↻ Regenerate]: re-analyzes current data and generates fresh suggestions based on latest turnout numbers
  • Priority: High (significant impact, time-sensitive), Medium (helpful but not urgent), Low (optimization)
  • Previously Actioned: audit trail of all approved and rejected suggestions

GOTV-020: Election Night Results Entry

Fast, mobile-first data entry for poll watchers and staff to enter results as they're posted at polling locations.

Mobile (Primary)

┌────────────────────────────┐
│  Results Entry              │
├────────────────────────────┤
│                            │
│  Polling Location          │
│  [Esc. Lincoln, SJ ▾]     │
│  (your assigned location)  │
│                            │
│  ─────────────────────     │
│                            │
│  Race: Governor             │
│  ──────────────            │
│                            │
│  María Torres (PV)         │
│  ┌────────────────────────┐│
│  │ 1,247                  ││
│  └────────────────────────┘│
│                            │
│  Rafael Ortiz (PNP)        │
│  ┌────────────────────────┐│
│  │ 1,102                  ││
│  └────────────────────────┘│
│                            │
│  Carmen Soto (PPD)         │
│  ┌────────────────────────┐│
│  │ 438                    ││
│  └────────────────────────┘│
│                            │
│  Write-in / Other          │
│  ┌────────────────────────┐│
│  │ 23                     ││
│  └────────────────────────┘│
│                            │
│  Total: 2,810              │
│                            │
│  ─────────────────────     │
│                            │
│  Results Status            │
│  ○ Partial (still counting)│
│  ● Final (all counted)     │
│                            │
│  ┌────────────────────────┐│
│  │                        ││
│  │    Submit Results      ││
│  │                        ││
│  └────────────────────────┘│
│    48px tall, full-width   │
│                            │
│  [+ Add Another Race]     │
│                            │
└────────────────────────────┘

Confirmation

┌────────────────────────────┐
│                            │
│         ✓                  │
│                            │
│  Results submitted for     │
│  Esc. Lincoln, San Juan    │
│                            │
│  Governor                  │
│  Torres (PV): 1,247       │
│  Ortiz (PNP): 1,102       │
│  Soto (PPD): 438          │
│  Other: 23                 │
│  Status: Final             │
│                            │
│  Submitted at 8:42 PM      │
│                            │
│  [Edit Submission]         │
│  [Enter Next Location]     │
│                            │
└────────────────────────────┘

Interaction

  • Pre-filled location: defaults to the watcher's assigned location. Can switch if covering multiple
  • Pre-filled candidates: race and candidate names pre-configured by staff. Watcher just enters numbers
  • Number input: large numeric keyboard, numeric input type. Fast data entry
  • Partial vs Final: partial results submitted as counting progresses, final when complete. Partial updates are additive — previous entries for the same location are replaced
  • Validation: total vote count checked against registered voters for reasonableness. Warning (not block) if total seems unusually high or low
  • Timestamp: auto-recorded on submission. Used for results timeline in GOTV-021

GOTV-021: Election Night Results Dashboard

Real-time aggregation of entered results. The war room's view of how the election is going.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  Election Night Results                                 Last update: 8:45 PM │
│                                                [Map] [Table]  [War Room →]   │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  Governor                                            42 / 68 locations (62%)│
│  ────────                                            reporting              │
│                                                                              │
│  ┌──────────────────────────────────────────────────────────────────────────┐│
│  │                                                                          ││
│  │  María Torres (PV)      ████████████████████████████████  52.1%          ││
│  │                          38,420 votes                                    ││
│  │                                                                          ││
│  │  Rafael Ortiz (PNP)     ██████████████████████████        41.3%          ││
│  │                          30,480 votes                                    ││
│  │                                                                          ││
│  │  Carmen Soto (PPD)      ███                                5.8%          ││
│  │                          4,270 votes                                     ││
│  │                                                                          ││
│  │  Other                  ▏                                  0.8%          ││
│  │                          610 votes                                       ││
│  │                                                                          ││
│  └──────────────────────────────────────────────────────────────────────────┘│
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  Results Timeline                                                            │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                                                                      │   │
│  │  55% ┤                                           ___Torres           │   │
│  │  50% ┤                              ____─────────                    │   │
│  │  45% ┤              ─────────────── ─────────────Ortiz               │   │
│  │  40% ┤   ─────────── ──────────────                                  │   │
│  │  35% ┤ ──                                                            │   │
│  │      ┼───┬───┬───┬───┬───┬───┬───┬───                               │   │
│  │       7PM  7:15  7:30  7:45  8:00  8:15  8:30  8:45                  │   │
│  │                                                                      │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  By Location                                                                 │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Location              Status    Torres    Ortiz     Soto     Total    │  │
│  │ ────────────────────  ────────  ────────  ────────  ──────   ─────    │  │
│  │ Esc. Lincoln, SJ      Final    1,247     1,102     438      2,810    │  │
│  │ Centro Com. Bayamón    Final    987       1,234     312      2,556    │  │
│  │ Esc. Barbosa, Caguas   Partial  845       790       198      1,833    │  │
│  │ Iglesia San José       Final    1,102     856       267      2,240    │  │
│  │ [Show all 42 locations...]                                            │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ─────────────────────────────────────────────────────────────────────────   │
│                                                                              │
│  Internal Comparison                                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Region         Our Turnout    Torres Vote %    Expected (from data)   │  │
│  │ ──────────     ───────────    ──────────────   ────────────────────    │  │
│  │ SJ North       47%           54%               52% (support score)    │  │
│  │ Bayamón        38%           43%               49%   ⚠ below exp.    │  │
│  │ Caguas         44%           55%               51%                    │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Auto-refresh: 30-second refresh. New results highlight briefly when they come in
  • Reporting progress: "42 / 68 locations reporting" — shows completeness of the picture
  • Results timeline: how the race has moved as more results come in. Useful for understanding whether the trend is favorable
  • Internal comparison: compares actual vote percentage against the campaign's internal support score data. Validates the accuracy of the campaign's voter data
  • Map view: toggle to see results geographically — each location colored by leading candidate
  • Multiple races: tab selector at top if multiple races are being tracked (Governor, Senate, etc.)

GOTV-022: Post-Election Analysis

Retrospective on how the GOTV operation actually went. Used days/weeks after election day, so the team knows what to change next time.

Desktop

┌──────────────────────────────────────────────────────────────────────────────┐
│  ← GOTV                    Post-Election Analysis              [Export PDF]   │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  [Turnout] [Operations] [Volunteers] [Model Validation] [Resources]          │
│                                                                              │
│  ── Turnout Analysis ──────────────────────────────────────────────────────  │
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │ Universe     │  │ Final Turnout│  │ Target       │  │ Gap          │    │
│  │ 14,832       │  │ 9,641 (65.0%)│  │ 65%          │  │ 0% ✓        │    │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘    │
│                                                                              │
│  Turnout by Segment                                                          │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Segment          Universe   Voted    Turnout   Target   Result        │  │
│  │ ───────────────  ────────   ─────    ───────   ──────   ──────        │  │
│  │ Tier 1 (Strong)  4,210      3,368    80.0%     75%      +5% ✓        │  │
│  │ Tier 2 (Lean)    6,118      3,916    64.0%     60%      +4% ✓        │  │
│  │ Tier 3 (Soft)    4,504      2,357    52.3%     50%      +2% ✓        │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  Turnout by Region                                                           │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Region           Universe   Voted    Turnout   Target   Result        │  │
│  │ ──────────────   ────────   ─────    ───────   ──────   ──────        │  │
│  │ San Juan North   4,450      3,115    70.0%     65%      +5% ✓        │  │
│  │ Bayamón          3,440      2,097    61.0%     65%      -4% ⚠        │  │
│  │ Caguas           2,710      1,843    68.0%     65%      +3% ✓        │  │
│  │ Carolina         2,170      1,432    66.0%     65%      +1% ✓        │  │
│  │ Ponce            2,062      1,154    56.0%     65%      -9% ⚠        │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ── Operations ────────────────────────────────────────── [Operations tab]   │
│                                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐    │
│  │ Door Knocks  │  │ Contact Rate │  │ Phone Calls  │  │ Rides Given  │    │
│  │ 8,234        │  │ 62%          │  │ 3,890        │  │ 87           │    │
│  └──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘    │
│                                                                              │
│  Contact Rate by Region                                                      │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Region           Doors    Contacts  Rate     Avg. per Vol   Passes    │  │
│  │ ──────────────   ──────   ────────  ──────   ────────────   ──────    │  │
│  │ San Juan North   2,890    1,835     63%      28.4           2.1       │  │
│  │ Bayamón          2,120    1,230     58%      22.1           1.8       │  │
│  │ Caguas           1,540    1,012     66%      31.0           2.3       │  │
│  │ Carolina         980      612       62%      25.5           2.0       │  │
│  │ Ponce            704      398       57%      19.9           1.5       │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ── Model Validation ───────────────────── [Model Validation tab]           │
│                                                                              │
│  How well did our support scores predict actual voting behavior?              │
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │ Score    Universe   Voted    Turnout   Expected    Accuracy           │  │
│  │ ──────   ────────   ─────    ───────   ────────    ────────           │  │
│  │ 5        4,210      3,368    80.0%     80%         High ✓            │  │
│  │ 4        6,118      3,916    64.0%     65%         High ✓            │  │
│  │ 3        4,504      2,357    52.3%     45%         Moderate ◐        │  │
│  │ 2        —          —        —         —           (excluded)        │  │
│  │ 1        —          —        —         —           (excluded)        │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  Key Insight: Score 3 voters turned out at higher rates than predicted.       │
│  Consider expanding the GOTV universe to include more Score 3 contacts       │
│  in future elections.                                                        │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Interaction

  • Tab navigation: Turnout, Operations, Volunteers, Model Validation, Resources — each tab is a section of the analysis
  • [Export PDF]: generates a formatted report with all tabs, suitable for organizational review, board reports, or funder updates
  • Model Validation tab: the most strategically valuable section — compares support score predictions against actual turnout to improve future targeting
  • Volunteers tab (not shown): per-volunteer metrics — shifts completed, contacts made, contact rate, issues reported. Helps identify top performers and training needs
  • Resources tab (not shown): staging location utilization, ride completion rate, supply consumption — operational efficiency metrics

GOTV-023: Staging Location Check-in

Team Lead checks in volunteers at their staging location on election day morning. Fast, mobile-first interface similar to Event Check-in (EVT-005).

Mobile (Primary)

┌────────────────────────────┐
│  Staging Check-in          │
│  Community Ctr — SJ North  │
├────────────────────────────┤
│                            │
│  Checked in: 28 / 34       │
│  ████████████████████░░░░  │
│  82%                       │
│                            │
│  [Search volunteers...]    │
│  [📷 Scan QR]              │
│                            │
│  ─────────────────────     │
│                            │
│  Not Yet Checked In (6)    │
│  ──────────────────────    │
│                            │
│  ┌────────────────────────┐│
│  │ Carlos Méndez          ││
│  │ Turf: BAY-02           ││
│  │ 📱 787-555-0134        ││
│  │            [Check In ✓]││
│  └────────────────────────┘│
│                            │
│  ┌────────────────────────┐│
│  │ María Santos           ││
│  │ Turf: SJ-N-05          ││
│  │ 📱 787-555-0167        ││
│  │            [Check In ✓]││
│  └────────────────────────┘│
│                            │
│  [Show 4 more...]          │
│                            │
│  ─────────────────────     │
│                            │
│  Checked In (28)           │
│  ────────────────          │
│                            │
│  Ana López · 5:45 AM       │
│  Jorge Rivera · 5:42 AM    │
│  Luisa Fernández · 5:40 AM │
│  [Show all 28...]          │
│                            │
│  ─────────────────────     │
│                            │
│  [Report Issue]            │
│  [Contact Field Director]  │
│                            │
└────────────────────────────┘

Interaction

  • Tap to check in: [Check In ✓] — single tap with confirmation vibration (haptic). 10-second undo
  • QR scan: volunteer shows their app's QR code. Faster than searching
  • Not-checked-in priority: volunteers who haven't arrived are shown first. Team Lead can call them directly via phone number
  • Turf assignment visible: confirms each volunteer knows their assignment
  • Progress counter: always visible at top. Helps Team Lead know how many are still missing
  • [Report Issue]: if a volunteer doesn't show, or supplies are missing — sends an issue to the Field Director
  • 56px row height: large touch targets for election morning (cold hands, stress, speed)

Empty States Summary

Screen Empty Message Action
GOTV-001 (no criteria) Define your GOTV universe to identify which voters to contact on election day. Start by setting support score and voting history criteria. (form is ready to fill)
GOTV-002 (no uploads) Upload early voting data to remove voters who've already cast ballots from your GOTV contact lists. Upload File
GOTV-003 (no locations) Set up staging locations where volunteers will gather on election day before deploying to their turfs. + Add Location
GOTV-004 (no turfs) Cut GOTV turfs to divide your universe into manageable assignments. Finalize the universe first. (Finalize Universe link if not done)
GOTV-005 (no waves) Plan your election day communication waves. Schedule reminders for voters who haven't yet voted. + Add Wave
GOTV-006 (no watchers) Register poll watchers to monitor polling locations on election day. + Add Watcher
GOTV-010 (no contacts) No chase call contacts available. Finalize the GOTV universe and ensure voters are loaded into the call list. (waiting state — depends on GOTV-001)
GOTV-011 (standalone) Request a ride to the polls for a voter. Fill in the voter's details and a volunteer driver will be dispatched. (form is ready to fill)
GOTV-012 (no requests) No ride requests yet. Requests come from voter replies, volunteer reports, and phone bank referrals. (waiting state)
GOTV-013 (no assignment) No ride assignments yet. The dispatcher will assign rides to you as requests come in. (waiting state)
GOTV-014 (not checked in) You're assigned to [location name]. Check in when you arrive to confirm coverage for the field team. Check In Now
GOTV-015 (standalone) Report an issue observed at your polling location. Select a category and describe what you saw. (form is ready to fill)
GOTV-016 (no issues) No issues reported. Poll watchers report issues through their field interface. (waiting state)
GOTV-020 (no results) Results entry opens when polls close. Select your assigned location and enter results as they're posted. (waiting state)

Accessibility Notes

  • All status indicators use both color and text/shape (●/◐/○ + "Registered"/"Pending"/"Not filed")
  • Map views always have a companion table view for screen reader users
  • Turnout percentages announced via aria-live on refresh
  • Issue queue severity uses icons + text labels, never color alone
  • Results entry uses large numeric inputs with clear labels
  • Check-in uses 56px touch targets with haptic confirmation
  • Auto-refresh can be paused for users who find it disorienting
  • Chase call result buttons (GOTV-010) use color + text labels and are minimum 48px tall for reliable touch targets
  • Election day countdown clock (GOTV-010) uses color shift + text for urgency — not color alone
  • Ride request form (GOTV-011) uses standard form controls with visible labels; offline status announced via aria-live banner
  • Ride driver view (GOTV-013) uses large text and buttons designed for glanceable use; status buttons include text labels
  • Poll watcher check-in (GOTV-014) uses 56px CTA button with haptic confirmation; status uses symbol + text (○/●)
  • Issue report form (GOTV-015) severity levels use text labels, not color alone; immediate attention toggle includes descriptive text

Design Decisions

Decision Choice Rationale
Human-in-the-loop reallocation Platform suggests, staff approves Election day decisions are too high-stakes for full automation. Staff have context the platform doesn't (volunteer morale, weather, local knowledge)
Multi-pass turf design Same turf gets morning/afternoon/evening passes Voters who aren't home in the morning may be reachable later. Multiple passes maximize contact rate
Confidence-weighted turnout data Different icons for official vs. volunteer-reported vs. self-reported Prevents overconfidence in turnout numbers. Staff can see how much of the data is confirmed vs. estimated
Separate map and segment turnout views Two dedicated screens (GOTV-017, GOTV-018) rather than one combined Map answers "where" — spatial awareness for resource deployment. Segment view answers "who" — analytical depth for targeting. Different mental models, different screens
Poll watcher separation (registry + credentials) GOTV-006 for people, GOTV-007 for documents Registration workflow is people-focused (assign, track status). Credential tracking is document-focused (upload, verify, print). Combining them makes both harder
Results entry as mobile-first Dedicated simple form, not a spreadsheet Poll watchers are standing in a room watching results post. They need a fast, one-handed interface — not a data entry tool

Open Questions

  1. Official election data feeds — can the platform integrate with official electoral authority APIs for real-time turnout data, or is manual upload the only option? Official feeds would dramatically improve turnout tracking accuracy
  2. Alliance ride sharing — should ride coordination support cross-org driver pools? A multi-org ride dispatch is operationally complex but could serve voters in areas where one org has drivers and another has requests
  3. Reallocation suggestion algorithm — what model generates reallocation suggestions? Simple rule-based (gap-to-target) vs. predictive (based on historical turnout patterns by time of day)? Rule-based is more transparent and trustworthy
  4. Results entry security — how do we prevent fraudulent results entries? Options: restrict to registered poll watchers, require photo of posted results, dual-entry verification. Balance speed vs. integrity
  5. Post-election data retention — how long is GOTV operational data retained? Valuable for future elections but contains sensitive voter contact information. Retention policy should balance utility against data minimization