1597 lines
45 KiB
Markdown

# Administrator Guide
## Overview
The Administrator role is the highest-level role in Changemaker Lite. As an administrator, you have complete control over the platform, including:
- **User management**: Create, edit, suspend, and delete user accounts
- **Campaign oversight**: Manage all advocacy campaigns and moderate responses
- **Location and mapping**: Import locations, create territorial cuts, and organize canvassing efforts
- **Volunteer coordination**: Create shifts, manage signups, and monitor canvassing activity
- **Site configuration**: Configure global settings, themes, email, and feature toggles
- **Content management**: Create landing pages, edit email templates, and manage media library
- **Monitoring**: View queue status, geocoding quality, and system health
This guide will walk you through all administrative functions in Changemaker Lite V2.
---
## Getting Started
### First Login
When you first access Changemaker Lite, you'll log in at the admin portal URL:
```
https://app.cmlite.org
```
Or if running locally:
```
http://localhost:3000
```
**Default credentials** (change immediately after first login):
- **Email**: `admin@example.com`
- **Password**: `Admin123!`
!!! danger "Security Critical"
The default password is publicly known. Change it immediately after your first login to prevent unauthorized access.
**Screenshot placeholder**: *Login page showing email/password fields and "Remember me" checkbox*
### Dashboard Overview
After logging in, you'll see the Administrator Dashboard, which provides an at-a-glance overview of your platform:
**Key dashboard sections:**
1. **Statistics Cards**
- Total users (breakdown by role)
- Active campaigns
- Total locations
- Active canvass sessions
2. **Recent Activity Feed**
- New user registrations
- Campaign responses
- Shift signups
- Canvass visits
3. **Quick Actions**
- Create new campaign
- Import locations
- Create volunteer shift
- View email queue
4. **System Health**
- API status
- Database connectivity
- Redis cache status
- Queue worker status
**Screenshot placeholder**: *Dashboard showing statistics cards, activity feed, and quick action buttons*
### Changing Your Password
!!! warning "Required First Step"
You must change the default password before performing any other administrative tasks.
**To change your password:**
1. Click your email address in the top-right corner
2. Select **"Change Password"** from the dropdown
3. Enter your current password
4. Enter new password (must meet requirements below)
5. Confirm new password
6. Click **"Update Password"**
**Password requirements:**
- Minimum 12 characters
- At least one uppercase letter (A-Z)
- At least one lowercase letter (a-z)
- At least one digit (0-9)
- Cannot reuse recent passwords
**Screenshot placeholder**: *Change password modal showing current/new password fields and requirements checklist*
### Navigating the Admin Interface
The admin interface uses a sidebar navigation with the following sections:
**Main Navigation:**
- **Dashboard** — Overview and quick actions
- **Influence** — Campaigns, responses, representatives, email queue
- **Map** — Locations, cuts, shifts, map settings, data quality
- **Canvass** — Dashboard, sessions, activity reports
- **Content** — Landing pages, email templates, media library
- **Services** — Listmonk, Pangolin, docs, integrations
- **Observability** — Monitoring, metrics, alerts
- **Users** — User management
- **Settings** — Global site settings
**Screenshot placeholder**: *Sidebar navigation showing expanded Influence and Map sections*
---
## User Management
### Creating Users
**To create a new user:**
1. Navigate to **Users** in the sidebar
2. Click **"Create User"** button (top-right)
3. Fill in user details:
- **Email**: User's email address (must be unique)
- **Name**: User's full name
- **Password**: Temporary password (user should change on first login)
- **Role**: Select from dropdown (see roles below)
- **Status**: ACTIVE or SUSPENDED
4. Click **"Create"**
The new user will receive a welcome email (if email is configured) with their login credentials.
**Screenshot placeholder**: *Create User modal showing email, name, password, role dropdown, and status toggle*
### Understanding Roles
Changemaker Lite has five user roles with different permission levels:
#### 1. SUPER_ADMIN (You)
- **Access**: Everything
- **Capabilities**: All administrative functions, user management, site configuration
- **Use case**: Primary administrator(s)
#### 2. INFLUENCE_ADMIN
- **Access**: Influence module only
- **Capabilities**:
- Create and manage campaigns
- Moderate responses
- View representative cache
- Monitor email queue
- **Restrictions**: Cannot manage users, locations, or site settings
- **Use case**: Campaign managers who don't need full admin access
#### 3. MAP_ADMIN
- **Access**: Map module only
- **Capabilities**:
- Import and manage locations
- Create cuts
- Organize shifts
- Monitor canvassing
- **Restrictions**: Cannot manage users, campaigns, or site settings
- **Use case**: Field organizers, volunteer coordinators
#### 4. USER
- **Access**: Volunteer portal only
- **Capabilities**:
- View assigned shifts
- Start canvassing sessions
- Record door visits
- View own activity
- **Restrictions**: Cannot access admin areas
- **Use case**: Regular volunteers
#### 5. TEMP
- **Access**: Very limited, volunteer portal only
- **Capabilities**:
- Sign up for public shifts (creates TEMP account automatically)
- Cannot start canvassing sessions
- **Restrictions**: Cannot access most features until upgraded to USER
- **Use case**: Anonymous shift signups (converted to USER by admin)
!!! tip "Role Upgrading"
You can upgrade TEMP users to USER role to give them full volunteer access. This is common after a volunteer attends their first shift.
**Screenshot placeholder**: *User list table showing users with different roles and color-coded role badges*
### Managing Existing Users
The **Users** page shows all user accounts in a searchable, filterable table.
**Table columns:**
- **Name** — User's full name
- **Email** — Login email
- **Role** — Current role (color-coded badge)
- **Status** — ACTIVE (green) or SUSPENDED (red)
- **Last Login** — Most recent login timestamp
- **Created** — Account creation date
- **Actions** — Edit, suspend/activate, delete
**Available filters:**
- **Search**: Search by name or email
- **Role filter**: Show only specific roles
- **Status filter**: Active, suspended, or all
- **Date range**: Filter by creation date
**Screenshot placeholder**: *Users table with search bar, role filter dropdown, and action buttons*
### Editing Users
**To edit a user:**
1. Click the **Edit** icon (pencil) in the Actions column
2. Modify any of:
- Name
- Email (must remain unique)
- Role (change permissions)
- Status (activate/suspend)
3. Click **"Save"**
!!! warning "Email Changes"
Changing a user's email will require them to log in with the new email address. Notify them before making this change.
### Suspending Users
**To temporarily disable a user account:**
1. Find the user in the table
2. Click **"Suspend"** in the Actions column
3. Confirm suspension
Suspended users:
- Cannot log in
- Existing sessions are invalidated immediately
- Can be reactivated at any time
- Data and history are preserved
**When to suspend:**
- Volunteer is temporarily unavailable
- Security concerns (investigate before deleting)
- User requests account pause
**Screenshot placeholder**: *Suspend confirmation dialog explaining effects*
### Password Resets
**To reset a user's password:**
1. Edit the user
2. Click **"Reset Password"**
3. Choose one of:
- **Generate temporary password** (shown on screen, expires in 24 hours)
- **Send reset email** (user clicks link to set new password)
4. Provide temporary password to user securely (not via email)
!!! tip "Security Best Practice"
Always use "Send reset email" option when possible. Only generate temporary passwords for in-person support scenarios.
### Deleting Users
!!! danger "Permanent Action"
Deleting a user is permanent and cannot be undone. All associated data (canvass visits, responses, etc.) will be anonymized.
**To delete a user:**
1. Click the **Delete** icon (trash) in the Actions column
2. Type the user's email to confirm
3. Click **"Delete Permanently"**
**When deletion is appropriate:**
- Duplicate accounts
- Test accounts in production
- User requests account deletion (GDPR compliance)
**Data handling on deletion:**
- User account record is deleted
- Associated content (responses, visits) remains but user reference is nullified
- Email queue jobs remain (email address is preserved for audit)
### Viewing Login Activity
**To see recent login activity:**
1. Navigate to **Users**
2. Check the **"Last Login"** column
3. Click on a user to see detailed login history (if audit logging is enabled)
**Screenshot placeholder**: *User detail view showing login history table with timestamps and IP addresses*
---
## Campaign Management
### Campaign Overview
Campaigns are at the heart of the Influence module. A campaign allows citizens to:
1. Enter their postal code
2. Find their elected representatives
3. Send advocacy emails
4. Share their story on a public response wall
As an administrator, you can create, configure, publish, and monitor campaigns.
### Creating a Campaign
**To create a new campaign:**
1. Navigate to **Influence > Campaigns**
2. Click **"Create Campaign"** (top-right)
3. Fill in the campaign form (see fields below)
4. Click **"Create"**
**Required fields:**
**Basic Information:**
- **Title**: Campaign name (shown to public)
- Example: "Protect Our Climate"
- **Slug**: URL-friendly identifier (auto-generated from title)
- Example: `protect-our-climate`
- Used in public URL: `/campaigns/protect-our-climate`
- **Description**: Campaign overview (supports HTML)
- Shown on campaign listing page
- Recommended: 2-3 sentences
**Email Configuration:**
- **Email Subject**: Subject line for advocacy emails
- Example: "Please support climate action legislation"
- Variables supported: `{{USER_NAME}}`, `{{REP_NAME}}`
- **Email Body**: The email message citizens send
- HTML editor available
- Variables: `{{USER_NAME}}`, `{{USER_EMAIL}}`, `{{REP_NAME}}`, `{{REP_EMAIL}}`, `{{USER_MESSAGE}}`
- Preview before publishing
**Targeting:**
- **Government Level**: FEDERAL, PROVINCIAL, or MUNICIPAL
- Determines which representatives are looked up
- Can select multiple levels
**Screenshot placeholder**: *Create Campaign form showing title, slug, description, email subject, and body editor*
### Understanding Feature Flags
Campaigns have 12 feature flags that control functionality:
#### Core Features
1. **Published**
- Controls public visibility
- Unpublished campaigns only visible to admins
- Toggle to launch/pause campaign
2. **Featured**
- Featured campaigns appear at top of listing page
- Use for high-priority campaigns
- Limit to 2-3 featured campaigns
3. **Has Response Wall**
- Enables public response wall
- Citizens can share their story after emailing
- Responses require admin approval (unless `auto_approve_responses`)
4. **Collect Phone Numbers**
- Adds optional phone number field
- Used for call-in campaigns
- Numbers stored for admin use
5. **Track Calls**
- Adds "I called my representative" button
- Tracks call attempts separately from emails
- Good for blended campaigns
#### Advanced Features
6. **Require Verification**
- Sends verification email before submitting
- Prevents spam and bot submissions
- Recommended for public campaigns
7. **Auto Approve Responses**
- Response wall submissions appear immediately
- No admin moderation required
- Only use for trusted campaigns
8. **Allow Anonymous**
- Citizens can submit without creating account
- Reduces friction but limits tracking
- Good for privacy-sensitive topics
9. **Custom Recipients**
- Override representative lookup
- Send to specific email addresses
- Use for non-government campaigns
10. **Show Progress Bar**
- Displays email count goal and progress
- Motivates participation
- Requires setting `email_goal` field
11. **Disable After Date**
- Automatically unpublish after specified date
- Good for time-sensitive campaigns
- Requires setting `disable_date` field
12. **Enable Comments**
- Allow comments on response wall entries
- Creates discussion threads
- Requires moderation
**Screenshot placeholder**: *Campaign feature flags showing toggles for all 12 flags with descriptive labels*
!!! tip "Recommended Defaults"
For most campaigns, enable: **Published**, **Has Response Wall**, **Require Verification**. Leave others off unless specifically needed.
### Configuring Email Template
The email template is what citizens send to their representatives. Make it:
**Effective email guidelines:**
- **Personal**: Use variables like `{{USER_NAME}}` to personalize
- **Clear**: State the ask in first paragraph
- **Specific**: Reference specific legislation or issue
- **Respectful**: Professional tone, even if issue is urgent
- **Actionable**: Tell representatives exactly what you want them to do
**Example template:**
```
Subject: Please vote YES on Bill C-123 for climate action
Dear {{REP_NAME}},
My name is {{USER_NAME}}, and I am a constituent in your riding. I'm writing to urge you to vote YES on Bill C-123, the Climate Action Framework.
Climate change is the defining issue of our generation. This bill provides a realistic pathway to reduce emissions while protecting jobs and supporting workers.
I'm specifically asking you to:
1. Vote YES on Bill C-123 when it comes to the floor
2. Speak publicly in support of climate action
3. Oppose any amendments that weaken the bill
Thank you for considering my views. I look forward to your response.
Sincerely,
{{USER_NAME}}
{{USER_EMAIL}}
---
{{USER_MESSAGE}}
```
**Available variables:**
- `{{USER_NAME}}` — Citizen's full name
- `{{USER_EMAIL}}` — Citizen's email address
- `{{USER_PHONE}}` — Citizen's phone (if collected)
- `{{REP_NAME}}` — Representative's name
- `{{REP_EMAIL}}` — Representative's email
- `{{REP_TITLE}}` — Representative's title (MP, MPP, Councillor)
- `{{USER_MESSAGE}}` — Custom message from citizen (optional field)
**Screenshot placeholder**: *Email template editor showing subject and body fields with variable insertion dropdown*
### Publishing a Campaign
Before publishing, verify:
- [ ] Email template is proofread (send test email to yourself)
- [ ] Feature flags are configured correctly
- [ ] Representative lookup is working (test with your postal code)
- [ ] Response wall moderation is ready (if enabled)
**To publish:**
1. Edit the campaign
2. Toggle **"Published"** flag to ON
3. Click **"Save"**
The campaign is now live at `/campaigns/[slug]`.
**Promoting your campaign:**
- Share direct link: `https://yourdomain.org/campaigns/protect-our-climate`
- Embed in email newsletter
- Post on social media
- Add to landing page
**Screenshot placeholder**: *Published campaign card on public campaigns listing page*
### Monitoring Email Sends
**To view email statistics:**
1. Navigate to **Influence > Campaigns**
2. Click **"Emails"** button in the Actions column for your campaign
The **Campaign Emails** drawer shows:
**Statistics:**
- Total emails sent
- Successful deliveries
- Failed deliveries
- Emails waiting in queue
**Email list table:**
- Recipient name and email
- Status (PENDING, SENT, FAILED)
- Sent timestamp
- Representative targeted
- Error message (if failed)
**Actions:**
- **Retry failed**: Re-queue failed emails
- **Export CSV**: Download full email list
**Screenshot placeholder**: *Campaign Emails drawer showing statistics cards and email list table*
### Managing the Email Queue
The email queue processes advocacy emails asynchronously using BullMQ.
**To monitor queue health:**
1. Navigate to **Influence > Email Queue**
**Queue statistics:**
- **Waiting**: Emails queued but not yet processing
- **Active**: Emails currently being sent
- **Completed**: Successfully sent emails (last 24 hours)
- **Failed**: Failed emails requiring retry
- **Delayed**: Scheduled for future sending
**Queue controls:**
- **Pause Queue**: Stop processing new emails (emergencies only)
- **Resume Queue**: Restart after pause
- **Clean Completed**: Remove old completed jobs (frees memory)
- **Retry Failed**: Re-queue all failed emails
!!! warning "Queue Pausing"
Only pause the queue during system maintenance or if email configuration is broken. Citizens expect immediate sends.
**Screenshot placeholder**: *Email Queue page showing statistics cards, job counts, and control buttons*
### Moderating Responses
If your campaign has **"Has Response Wall"** enabled, citizens can share their stories publicly.
**To moderate responses:**
1. Navigate to **Influence > Responses**
2. Use filters to find pending responses
3. Review each response
4. Approve or reject
**Response filters:**
- **Campaign**: Filter by specific campaign
- **Status**: PENDING, APPROVED, REJECTED
- **Search**: Search response text
- **Date range**: Filter by submission date
**Response table columns:**
- **Name**: Citizen's name
- **Campaign**: Which campaign
- **Status**: Approval status (color-coded)
- **Upvotes**: Number of upvotes received
- **Submitted**: Submission date
- **Actions**: View, approve, reject, delete
**Screenshot placeholder**: *Responses table with filter controls and status badges*
**To review a response:**
1. Click **"View"** in Actions column
2. Read full response text
3. Decide:
- **Approve**: Make public (appears on response wall)
- **Reject**: Hide from public (not deleted)
- **Delete**: Permanently remove
**Moderation guidelines:**
**Approve responses that:**
- Are authentic personal stories
- Relate to the campaign issue
- Use respectful language
- Add value to the public conversation
**Reject responses that:**
- Contain profanity or hate speech
- Are spam or off-topic
- Violate privacy (include private information about others)
- Are duplicate submissions
**Screenshot placeholder**: *Response detail modal showing full text, citizen info, and approve/reject buttons*
---
## Location Management
### Location Data Overview
Locations represent physical addresses where canvassing occurs. Each location has:
- **Address**: Street address, city, province, postal code
- **Coordinates**: Latitude/longitude (from geocoding)
- **Metadata**: Building type, federal district, unit count
- **Cut assignment**: Which territorial cut it belongs to
- **Canvass history**: Visits, outcomes, support levels
### Importing Locations from CSV
**To import locations:**
1. Navigate to **Map > Locations**
2. Click **"Import CSV"** button
3. Upload CSV file
4. Map CSV columns to location fields
5. Click **"Import"**
**Required CSV columns:**
- **address** — Full street address
- **city** — City name
- **province** — Province/state code (e.g., "ON", "BC")
- **postalCode** — Postal code (e.g., "K1A 0B1")
**Optional columns:**
- **latitude** — Pre-geocoded latitude
- **longitude** — Pre-geocoded longitude
- **buildingType** — RESIDENTIAL, APARTMENT, BUSINESS
- **unitCount** — Number of units in building
- **federalDistrict** — Electoral district
- **notes** — Internal notes
**CSV example:**
```csv
address,city,province,postalCode,buildingType
"123 Main St","Ottawa","ON","K1A 0B1","RESIDENTIAL"
"456 Queen St E","Toronto","ON","M5A 1T1","APARTMENT"
"789 Granville St","Vancouver","BC","V6Z 1K3","BUSINESS"
```
!!! tip "Excel to CSV"
If your data is in Excel, use "Save As" > "CSV (Comma delimited)" to export.
**Screenshot placeholder**: *CSV import dialog showing file upload, column mapping interface, and preview table*
### NAR Import (Canadian Electoral Data)
For Canadian campaigns, you can import official electoral data from Elections Canada NAR (National Address Register) files.
**To import NAR data:**
1. Navigate to **Map > Locations**
2. Click **"NAR Import"** button
3. Select province
4. Choose NAR dataset (year)
5. Apply filters:
- City filter (optional)
- Postal code filter (optional)
- Cut filter (assign to specific cut)
- Residential only (exclude commercial)
6. Click **"Start Import"**
The import runs server-side and can take several minutes for large provinces.
**NAR data includes:**
- Precise civic addresses (from Address files)
- Geocoded coordinates (from Location files)
- Federal electoral districts
- Building use (residential, commercial, institutional)
**Screenshot placeholder**: *NAR Import modal showing province selector, dataset picker, and filter options*
!!! note "NAR Data Source"
NAR data must be obtained from Elections Canada and placed in the `/data` directory on the server. Contact your system administrator.
### Geocoding Addresses
Geocoding converts addresses to latitude/longitude coordinates for map display.
**Automatic geocoding:**
- CSV imports without lat/lng are automatically geocoded
- NAR imports include pre-geocoded coordinates
- Manual location creation triggers geocoding
**Manual geocoding:**
1. Navigate to **Map > Locations**
2. Filter for **"Ungeocoded"** locations
3. Select locations to geocode
4. Click **"Geocode Selected"** (bulk action)
**Geocoding providers** (tried in order):
1. **Nominatim** (OpenStreetMap) — Free, no API key required
2. **ArcGIS** — Free tier, accurate for North America
3. **Photon** — Free, Europe-focused
4. **Mapbox** — Requires API key, very accurate
5. **Google** — Requires API key, most accurate
6. **LocationIQ** — Requires API key, Nominatim-based
!!! tip "Geocoding Quality"
Check **Map > Data Quality** to review geocoding confidence levels. Re-geocode low-confidence addresses.
**Screenshot placeholder**: *Locations table with "Geocode Selected" button and geocoding status column*
### Creating Cuts
Cuts are geographic areas (wards, neighborhoods, districts) used to organize canvassing.
**To create a cut:**
1. Navigate to **Map > Cuts**
2. Click the **"Map Drawing"** tab
3. Click **"Start Drawing"**
4. Click on the map to add polygon vertices
5. Close the polygon (click near first point)
6. Fill in cut details:
- **Name**: Cut identifier (e.g., "Ward 5", "Downtown")
- **Category**: WARD, NEIGHBORHOOD, DISTRICT, or CUSTOM
- **Color**: Display color on map
- **Description**: Internal notes
7. Click **"Save Cut"**
**Cut best practices:**
- **Size**: 200-500 locations per cut (manageable for canvassing)
- **Boundaries**: Use natural boundaries (roads, rivers, parks)
- **Naming**: Use official ward/district names when available
- **Colors**: Use distinct colors for adjacent cuts
**Screenshot placeholder**: *Cut drawing map interface showing polygon being drawn with vertex markers*
### Assigning Locations to Cuts
**Automatic assignment** (during cut creation):
- Locations inside polygon are automatically assigned
- Uses point-in-polygon algorithm
**Manual assignment:**
1. Navigate to **Map > Locations**
2. Select locations to assign
3. Choose **"Assign to Cut"** from bulk actions
4. Select target cut
5. Click **"Assign"**
**Viewing cut assignments:**
- Location table has **"Cut"** column
- Filter locations by cut using dropdown
**Screenshot placeholder**: *Bulk action modal showing "Assign to Cut" with cut selector dropdown*
### Managing Locations
**To edit a location:**
1. Navigate to **Map > Locations**
2. Click **"Edit"** in Actions column
3. Modify fields:
- Address details
- Coordinates (manually adjust map pin)
- Building type
- Unit count
- Notes
- Cut assignment
4. Click **"Save"**
**To delete locations:**
1. Select locations in table
2. Choose **"Delete"** from bulk actions
3. Confirm deletion
!!! warning "Canvass History"
Deleting a location preserves associated canvass visits (visits are linked to coordinates, not location records).
**Screenshot placeholder**: *Edit Location modal showing address fields, map with draggable pin, and metadata fields*
### Exporting Walk Sheets
Walk sheets are printable lists of addresses for door-to-door canvassing.
**To generate a walk sheet:**
1. Navigate to **Map > Locations**
2. Filter to specific cut
3. Click **"Walk Sheet"** in the cut's action menu
OR:
1. Navigate to **Canvass > Walk Sheet**
2. Select cut from dropdown
3. Configure settings (see below)
4. Click **"Print"**
**Walk sheet settings** (from Map > Map Settings):
- **Header text**: Organization name, campaign info
- **Instructions**: How to use the walk sheet
- **QR code**: Include QR code linking to volunteer canvass map
- **Sorting**: Sort by street name or walking route
- **Include map**: Embed cut map on first page
**Walk sheet contents:**
- Cut name and statistics
- QR code (volunteers scan to start canvass session)
- Location table:
- Address
- Unit count
- Last visit date
- Last outcome
- Notes field (blank for volunteers to fill)
**Screenshot placeholder**: *Walk sheet PDF preview showing header, QR code, and address table*
---
## Volunteer Management
### Creating Shifts
Shifts are scheduled volunteer canvassing sessions assigned to specific cuts.
**To create a shift:**
1. Navigate to **Map > Shifts**
2. Click **"Create Shift"**
3. Fill in shift details:
- **Title**: Shift name (e.g., "Saturday Morning Canvass - Ward 5")
- **Description**: Additional details for volunteers
- **Start Time**: Shift start date and time
- **End Time**: Shift end date and time
- **Cut**: Which cut to canvass (optional, but recommended)
- **Max Signups**: Capacity limit (0 = unlimited)
- **Meeting Location**: Where volunteers should meet
4. Click **"Create"**
**Screenshot placeholder**: *Create Shift modal showing date/time picker, cut selector, and capacity field*
!!! tip "Cut Assignment"
Shifts assigned to a cut appear in the volunteer portal under "My Assignments" for volunteers who signed up. Volunteers can start canvassing directly from their dashboard.
### Managing Shift Signups
**To view shift signups:**
1. Navigate to **Map > Shifts**
2. Click **"Signups"** in Actions column
The signups drawer shows:
- **Total signups** vs capacity
- **Signup list**: Name, email, role, signup date
- **Actions**: Remove signup, upgrade TEMP users to USER
**Signup sources:**
- **Public signup form**: `/shifts` page (creates TEMP users)
- **Admin-created**: You manually add volunteers
- **Volunteer portal**: USER-role volunteers sign up themselves
**Screenshot placeholder**: *Shift Signups drawer showing capacity gauge and signup list table*
### Emailing Shift Volunteers
**To email all volunteers in a shift:**
1. Navigate to **Map > Shifts**
2. Click **"Signups"** for the shift
3. Click **"Email All"** button
4. Compose email:
- **Subject**: Email subject line
- **Body**: Message (supports HTML)
- **Variables**: Use `{{NAME}}`, `{{SHIFT_TITLE}}`, `{{SHIFT_START}}`
5. Click **"Send"**
**Common email scenarios:**
- **Reminder**: Day before shift
- **Cancellation**: Weather or other issues
- **Location change**: Meeting point updated
- **Follow-up**: Thank you after shift
**Screenshot placeholder**: *Email Volunteers modal showing subject, body editor, and variable insertion buttons*
### Monitoring Canvass Sessions
**To view active canvass sessions:**
1. Navigate to **Canvass > Dashboard**
The dashboard shows:
**Statistics cards:**
- **Active sessions**: Currently in progress
- **Total visits today**: Doors knocked
- **Completed sessions**: Finished today
- **Average session duration**
**Activity feed:**
- Real-time visit stream
- Shows: Volunteer name, address, outcome, timestamp
- Updates every 30 seconds
**Cut progress table:**
- Progress by cut (% of locations visited)
- Session count per cut
- Visit count per cut
**Leaderboard:**
- Top volunteers by visit count
- Session count
- Success rate (SPOKE_WITH outcomes)
**Screenshot placeholder**: *Canvass Dashboard showing stats cards, activity feed, and leaderboard*
### Viewing Canvass Activity Reports
**To see detailed canvassing data:**
1. Navigate to **Canvass > Dashboard**
2. Use filters:
- **Date range**: Last 7 days, last 30 days, custom
- **Cut**: Specific cut or all
- **Volunteer**: Specific volunteer or all
- **Outcome**: Filter by visit outcome
**Exportable reports:**
- **Visit history CSV**: All visits with outcomes, notes, timestamps
- **Support levels CSV**: LEVEL_1 through LEVEL_4 breakdown
- **Session summary CSV**: Session duration, visit count, volunteer info
**Screenshot placeholder**: *Activity report filters and export buttons*
---
## Site Configuration
### Site Settings
**To configure global site settings:**
1. Navigate to **Settings** (gear icon in sidebar)
**Available settings:**
**Branding:**
- **Site Name**: Your organization name
- **Site URL**: Public website URL
- **Logo URL**: URL to your logo image
- **Primary Color**: Brand color (hex code)
- **Secondary Color**: Accent color
**Email Configuration:**
- **From Name**: Sender name for system emails
- **From Email**: Sender email address
- **SMTP Host**: Email server hostname
- **SMTP Port**: Usually 587 (TLS) or 465 (SSL)
- **SMTP Username**: SMTP authentication username
- **SMTP Password**: SMTP authentication password
- **Test Mode**: Send to MailHog instead of real SMTP (dev only)
**Representative API:**
- **Represent API Base URL**: Usually `https://represent.opennorth.ca`
- **API Key**: If required by provider
- **Cache TTL**: How long to cache representative data (hours)
**Feature Toggles:**
- **Enable Media Features**: Enable video library and media management
- **Enable Listmonk Sync**: Sync contacts to Listmonk newsletter platform
- **Allow Public Shift Signup**: Anyone can sign up for shifts (creates TEMP users)
- **Require Email Verification**: Campaign responses require email confirmation
**Screenshot placeholder**: *Settings page showing branding, email, and feature toggle sections*
!!! tip "Test Email Configuration"
After changing SMTP settings, click "Send Test Email" to verify configuration before publishing campaigns.
### Map Settings
**To configure map defaults:**
1. Navigate to **Map > Map Settings**
**Map Configuration:**
- **Default Center**: Latitude/longitude for map center
- Used on public map and admin map
- Usually your city center
- **Default Zoom**: Zoom level (1-18)
- 12 = city-wide view
- 15 = neighborhood view
- **Enable Fullscreen**: Allow fullscreen button on public map
- **Enable Geolocation**: Allow "Find My Location" button
**Walk Sheet Configuration:**
- **Header Text**: Appears at top of walk sheets
- **Footer Text**: Appears at bottom
- **Include QR Code**: Add QR code linking to volunteer map
- **QR Code Size**: Small, medium, or large
- **Instructions**: Text explaining how to use walk sheet
**Screenshot placeholder**: *Map Settings page showing map center picker and walk sheet config*
### Feature Toggles
Feature toggles allow you to enable/disable major platform features without code changes.
**To manage feature toggles:**
1. Navigate to **Settings**
2. Scroll to **Feature Toggles** section
3. Toggle features on/off
4. Click **"Save"**
**Available toggles:**
**ENABLE_MEDIA_FEATURES**
- Enables Media Library and video management
- Shows Media menu in sidebar
- Allows video uploads and public media gallery
- Requires media-api service running
**ENABLE_LISTMONK_SYNC**
- Enables newsletter integration
- Syncs campaign participants to Listmonk lists
- Shows Listmonk menu in sidebar
- Requires Listmonk service configured
**ALLOW_PUBLIC_SHIFT_SIGNUP**
- Public can sign up for shifts at `/shifts`
- Creates TEMP user accounts automatically
- Shows shifts on public pages
- Disable for invitation-only volunteering
**REQUIRE_EMAIL_VERIFICATION**
- Campaign responses require email verification
- Prevents spam and fake submissions
- Sends verification link before recording response
- Recommended for public campaigns
**Screenshot placeholder**: *Feature Toggles section showing four toggles with descriptions*
!!! warning "Media Features"
Enabling media features requires the `media-api` Docker container to be running. Check with your system administrator.
---
## Email Templates
### Understanding Email Templates
Changemaker Lite uses email templates for system-generated emails:
**System templates:**
- **Welcome Email**: Sent to new users
- **Password Reset**: Sent when user requests password reset
- **Shift Confirmation**: Sent when volunteer signs up for shift
- **Shift Reminder**: Sent day before shift
- **Response Verification**: Sent to verify campaign response
**Custom templates:**
- You can create custom templates for specific needs
- Use in shift emails, campaign follow-ups, etc.
### Editing Templates
**To edit an email template:**
1. Navigate to **Content > Email Templates**
2. Click **"Edit"** for the template
3. Modify:
- **Subject**: Email subject line
- **HTML Body**: Rich email content
- **Plain Text Body**: Fallback for text-only clients
4. Use variables (e.g., `{{USER_NAME}}`, `{{SHIFT_TITLE}}`)
5. Click **"Preview"** to see rendered email
6. Click **"Save"**
**Screenshot placeholder**: *Email Template Editor showing subject field, HTML editor, and variable buttons*
### Available Variables
Templates support variable interpolation:
**User variables:**
- `{{USER_NAME}}` — User's full name
- `{{USER_EMAIL}}` — User's email address
**Shift variables:**
- `{{SHIFT_TITLE}}` — Shift name
- `{{SHIFT_START}}` — Start date/time
- `{{SHIFT_END}}` — End date/time
- `{{SHIFT_LOCATION}}` — Meeting location
- `{{SHIFT_CUT}}` — Cut name
**Campaign variables:**
- `{{CAMPAIGN_TITLE}}` — Campaign name
- `{{CAMPAIGN_URL}}` — Link to campaign page
**System variables:**
- `{{SITE_NAME}}` — Your organization name
- `{{SITE_URL}}` — Website URL
**Screenshot placeholder**: *Variable reference table in template editor sidebar*
### Testing Templates
**To test an email template:**
1. Edit the template
2. Click **"Send Test Email"**
3. Enter your email address
4. Click **"Send"**
You'll receive the email with sample data filled in for variables.
!!! tip "Always Test"
Test templates before using them in production. Check both HTML and plain text versions.
---
## Media Library
!!! note "Optional Feature"
Media features must be enabled via **Settings > Feature Toggles > ENABLE_MEDIA_FEATURES**. Requires media-api service.
### Uploading Videos
**To upload a video:**
1. Navigate to **Content > Media > Library**
2. Click **"Upload Video"**
3. Either:
- Drag and drop video file
- Click to browse and select file
4. Fill in metadata:
- **Title**: Video title
- **Description**: Video description
- **Producer**: Organization or creator
- **Creator**: Individual creator/director
- **Tags**: Comma-separated tags
- **Directory**: Organize into folders
5. Click **"Upload"**
**Supported formats:**
- MP4 (recommended)
- MOV
- AVI
- MKV
- WebM
- M4V
- FLV
**File size limit:** 10 GB per file
**Screenshot placeholder**: *Upload Video modal showing drag-drop area, metadata form, and progress bar*
### Automatic Metadata Extraction
When you upload a video, the system automatically extracts:
- **Duration**: Length in seconds
- **Dimensions**: Width x height in pixels
- **Orientation**: PORTRAIT, LANDSCAPE, or SQUARE
- **Quality**: SD, HD, FULL_HD, or 4K
- **Has Audio**: Boolean
- **File Size**: Bytes
This metadata is used for filtering and organizing videos.
### Organizing the Library
**Directory structure:**
- Create directories to organize videos
- Directories are simple text paths (e.g., "events/2024", "testimonials")
- Set directory when uploading or editing
**Filtering videos:**
- **Search**: Search title, description, tags
- **Directory**: Filter by directory
- **Quality**: Filter by SD, HD, etc.
- **Orientation**: Portrait, landscape, square
- **Locked**: Show only locked or unlocked
**Sorting:**
- Upload date (newest first)
- Title (A-Z)
- Duration (shortest first)
**Screenshot placeholder**: *Media Library showing directory tree, filters, and video grid*
### Sharing Videos Publicly
**To make videos public:**
1. Navigate to **Content > Media > Shared Media**
2. Select videos from library
3. Choose category:
- **TESTIMONIAL**
- **EVENT**
- **EDUCATIONAL**
- **PROMOTIONAL**
4. Click **"Share"**
Shared videos appear on the public media gallery at `/media`.
**To unshare videos:**
1. Go to **Shared Media**
2. Select videos
3. Click **"Unshare"**
**Screenshot placeholder**: *Shared Media page showing category filter and share/unshare buttons*
### Locking Videos
**Locked videos** cannot be deleted or moved. Use locks to protect important content.
**To lock a video:**
1. Select video in library
2. Click **"Lock"** (padlock icon)
**To unlock:**
1. Select locked video
2. Click **"Unlock"**
!!! warning "Lock Before Sharing"
Lock videos before sharing publicly to prevent accidental deletion.
---
## Monitoring & Reports
### Viewing Queue Status
**To monitor the email queue:**
1. Navigate to **Influence > Email Queue**
**Key metrics:**
- **Waiting**: Emails queued for sending
- High number = slow processing (check SMTP)
- **Active**: Currently processing
- Should be 1-5 (concurrent workers)
- **Completed**: Sent in last 24 hours
- **Failed**: Delivery failures
- Click "View Failed" to see error messages
**Queue health indicators:**
- **Green**: < 50 waiting, < 5 failed
- **Yellow**: 50-200 waiting, 5-20 failed
- **Red**: > 200 waiting, > 20 failed
**Screenshot placeholder**: *Email Queue dashboard showing job counts with color-coded health indicators*
### Geocoding Quality Dashboard
**To review geocoding quality:**
1. Navigate to **Map > Data Quality**
**Quality metrics:**
- **Total locations**: All location records
- **Geocoded**: Have lat/lng coordinates
- **Ungeocoded**: Missing coordinates
- **Low confidence**: Confidence < 0.5
- **Medium confidence**: 0.5-0.8
- **High confidence**: > 0.8
**Quality breakdown:**
- **Provider distribution**: Which geocoding service was used
- **Confidence histogram**: Distribution of confidence scores
- **Error analysis**: Common geocoding failures
**Actions:**
- **Re-geocode low confidence**: Retry with different provider
- **Export ungeocoded**: CSV of failed addresses
- **Manual review**: Edit addresses and re-geocode
**Screenshot placeholder**: *Data Quality Dashboard showing geocoding statistics and confidence distribution chart*
### Canvass Completion Statistics
**To view canvass progress:**
1. Navigate to **Canvass > Dashboard**
**Completion metrics:**
- **Locations visited**: Total unique addresses visited
- **Visit rate**: Visits per day/week
- **Completion by cut**: % of each cut visited
- **Outcome breakdown**: % NOT_HOME, REFUSED, SPOKE_WITH, etc.
**Support level analysis:**
- **LEVEL_1** (Strong support): Count and percentage
- **LEVEL_2** (Leaning support): Count and percentage
- **LEVEL_3** (Undecided): Count and percentage
- **LEVEL_4** (Opposition): Count and percentage
**Volunteer performance:**
- **Sessions per volunteer**: Distribution histogram
- **Visits per volunteer**: Leaderboard
- **Average session duration**: Time spent canvassing
**Screenshot placeholder**: *Canvass statistics showing completion gauges, outcome pie chart, and support level breakdown*
### Observability Dashboard
**To monitor system health:**
1. Navigate to **Observability**
The observability dashboard has three tabs:
#### Metrics Tab
- **Custom metrics**: 12 `cm_*` Prometheus metrics
- API uptime
- Request counts
- Email queue size
- Active sessions
- Geocoding success rate
- **HTTP metrics**: Request duration, status codes
- **System metrics**: CPU, memory, disk
**Screenshot placeholder**: *Metrics tab showing API uptime gauge and request count graph*
#### Dashboards Tab
- **Links to Grafana dashboards**:
- API Health (uptime, response times, error rates)
- Queue Monitoring (email queue, geocoding queue)
- Canvassing Activity (sessions, visits, outcomes)
- Click dashboard name to open in Grafana
**Screenshot placeholder**: *Dashboards tab showing three dashboard cards with "Open" buttons*
#### Alerts Tab
- **Active alerts**: Currently firing alerts
- **Alert history**: Recent resolved alerts
- **Alert rules**: Configured thresholds
- **Silence alerts**: Temporarily mute alerts
**Common alerts:**
- **API Down**: API not responding
- **High Error Rate**: > 5% requests failing
- **Queue Backed Up**: > 1000 emails waiting
- **Disk Space Low**: < 10% free space
**Screenshot placeholder**: *Alerts tab showing active alert for "Queue Backed Up" with severity and details*
---
## Troubleshooting
### Common Admin Issues
#### Issue: Cannot Log In
**Symptoms:** "Invalid credentials" error
**Solutions:**
1. **Verify email address**: Check for typos, spaces
2. **Try password reset**: Use "Forgot Password" link
3. **Check account status**: Ask another admin if account is suspended
4. **Check browser console**: Look for API errors
#### Issue: Emails Not Sending
**Symptoms:** Emails stuck in "Waiting" status
**Solutions:**
1. **Check SMTP configuration**:
- Navigate to **Settings**
- Verify SMTP host, port, username, password
- Click "Send Test Email"
2. **Check email queue**:
- Navigate to **Influence > Email Queue**
- Look for error messages in failed jobs
3. **Check email test mode**:
- If `EMAIL_TEST_MODE=true`, emails go to MailHog (not real recipients)
- Change in environment settings
4. **Restart queue worker**:
- Ask system administrator to restart api service
#### Issue: CSV Import Fails
**Symptoms:** Error during CSV upload
**Solutions:**
1. **Check CSV format**:
- Must be valid CSV (comma-separated)
- First row must be headers
- Required columns: address, city, province, postalCode
2. **Check file encoding**:
- Use UTF-8 encoding
- Excel users: "Save As" > "CSV UTF-8"
3. **Check file size**:
- Maximum 10,000 rows per import
- Split large files
4. **Check for special characters**:
- Remove emoji, unusual symbols
- Use standard quotes ("not "" or '')
#### Issue: Geocoding Fails
**Symptoms:** Addresses remain ungeocoded after import
**Solutions:**
1. **Check address format**:
- Include full civic address
- Include city and postal code
- Use standard abbreviations (St, Ave, Rd)
2. **Check geocoding providers**:
- Navigate to **Map > Data Quality**
- See which providers are responding
3. **Try manual geocoding**:
- Edit location
- Click and drag map pin to correct position
- Save
4. **Use NAR data** (Canada only):
- NAR import includes pre-geocoded coordinates
- More reliable than automatic geocoding
#### Issue: Map Not Loading
**Symptoms:** Blank map or loading spinner
**Solutions:**
1. **Check browser console**: Look for JavaScript errors
2. **Check internet connection**: Map tiles require network
3. **Try different browser**: Test in Chrome, Firefox
4. **Clear browser cache**: Hard refresh (Ctrl+Shift+R)
5. **Check locations**:
- Navigate to **Map > Locations**
- Verify locations have coordinates
- At least one location needed to display map
#### Issue: Campaign Not Appearing Publicly
**Symptoms:** Campaign visible in admin but not on `/campaigns`
**Solutions:**
1. **Check "Published" flag**:
- Edit campaign
- Ensure "Published" toggle is ON
- Save
2. **Check URL**:
- Campaign URL is `/campaigns/[slug]`
- Slug is auto-generated from title
- Must be unique
3. **Clear browser cache**: Public pages may be cached
4. **Check representative lookup**:
- Test with your postal code
- If lookup fails, campaign won't display form
#### Issue: Volunteer Cannot Start Canvass Session
**Symptoms:** Error when volunteer clicks "Start Canvassing"
**Solutions:**
1. **Check shift assignment**:
- Navigate to **Map > Shifts**
- Verify shift has a cut assigned
- Shifts without cuts cannot be canvassed
2. **Check volunteer role**:
- Navigate to **Users**
- Verify volunteer is USER role (not TEMP)
- Upgrade TEMP users to USER
3. **Check cut locations**:
- Navigate to **Map > Cuts**
- Verify cut has locations assigned
- Empty cuts cannot be canvassed
4. **Check for existing session**:
- Volunteer may have abandoned session
- Ask admin to close abandoned session
### Getting Help
**Documentation:**
- **Feature docs**: `/docs/v2/features/` (detailed feature guides)
- **API reference**: `/docs/v2/api/` (API endpoint documentation)
- **User guides**: `/docs/v2/user-guides/` (this guide and others)
- **Deployment**: `/docs/v2/deployment/` (server setup, Docker, backups)
**Support channels:**
- **GitHub Issues**: Report bugs, request features
- **Community Forum**: Ask questions, share tips
- **Email Support**: Contact your system administrator
**Before asking for help:**
1. Check browser console for errors (F12)
2. Try in different browser
3. Check server logs (if you have access)
4. Document steps to reproduce issue
---
## Related Documentation
- **[Volunteer Guide](volunteer-guide.md)**: Guide for volunteers using the canvassing portal
- **[Campaign Manager Guide](campaign-manager-guide.md)**: Deep dive on campaign strategy and management
- **[Map Organizer Guide](map-organizer-guide.md)**: Advanced location and territory management
- **[Content Editor Guide](content-editor-guide.md)**: Landing pages and media library
- **[Influence Module](../features/influence.md)**: Technical details on campaigns and email sending
- **[Map Module](../features/map.md)**: Technical details on geocoding and canvassing
- **[API Reference](../api/overview.md)**: REST API documentation for integrations
---
**Last updated**: February 2026 (V2 complete)