7268 lines
155 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
<meta name="author" content="Bunker Operations">
<link rel="canonical" href="https://bnkserve.org/v2/user-guides/map-organizer-guide/">
<link rel="prev" href="../campaign-manager-guide/">
<link rel="next" href="../content-editor-guide/">
<link rel="icon" href="../../../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>Map Organizer Guide - Changemaker Lite</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<link rel="stylesheet" href="../../../stylesheets/extra.css">
<link rel="stylesheet" href="../../../stylesheets/home.css">
<link rel="stylesheet" href="../../../assets/css/video-player.css">
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" />
<meta property="og:title" content="Map Organizer Guide - Changemaker Lite" />
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="og:image" content="https://bnkserve.org/assets/images/social/v2/user-guides/map-organizer-guide.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://bnkserve.org/v2/user-guides/map-organizer-guide/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="Map Organizer Guide - Changemaker Lite" />
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/v2/user-guides/map-organizer-guide.png" />
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#map-organizer-guide" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Changemaker Lite
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Map Organizer Guide
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
</nav>
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
V2 Documentation
</a>
</li>
<li class="md-tabs__item">
<a href="../../../phil/" class="md-tabs__link">
Philosophy
</a>
</li>
<li class="md-tabs__item">
<a href="../../../v1/" class="md-tabs__link">
V1 Documentation (Legacy)
</a>
</li>
<li class="md-tabs__item">
<a href="../../../blog/" class="md-tabs__link">
Blog
</a>
</li>
</ul>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
<img src="../../../assets/logo.png" alt="logo">
</a>
Changemaker Lite
</label>
<div class="md-nav__source">
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
changemaker.lite
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
V2 Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
<div class="md-nav__link md-nav__container">
<a href="../../getting-started/" class="md-nav__link ">
<span class="md-ellipsis">
Getting Started
</span>
</a>
<label class="md-nav__link " for="__nav_2_2" id="__nav_2_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_3" >
<div class="md-nav__link md-nav__container">
<a href="../../architecture/" class="md-nav__link ">
<span class="md-ellipsis">
Architecture
</span>
</a>
<label class="md-nav__link " for="__nav_2_3" id="__nav_2_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_3">
<span class="md-nav__icon md-icon"></span>
Architecture
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../architecture/dual-api/" class="md-nav__link">
<span class="md-ellipsis">
Dual API System
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication & Security
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_4" >
<div class="md-nav__link md-nav__container">
<a href="../../backend/" class="md-nav__link ">
<span class="md-ellipsis">
Backend
</span>
</a>
<label class="md-nav__link " for="__nav_2_4" id="__nav_2_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_4">
<span class="md-nav__icon md-icon"></span>
Backend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/modules/" class="md-nav__link">
<span class="md-ellipsis">
Modules
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/services/" class="md-nav__link">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/middleware/" class="md-nav__link">
<span class="md-ellipsis">
Middleware
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../backend/utilities/" class="md-nav__link">
<span class="md-ellipsis">
Utilities
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_5" >
<div class="md-nav__link md-nav__container">
<a href="../../frontend/" class="md-nav__link ">
<span class="md-ellipsis">
Frontend
</span>
</a>
<label class="md-nav__link " for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Frontend
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/components/" class="md-nav__link">
<span class="md-ellipsis">
Components
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/layouts/" class="md-nav__link">
<span class="md-ellipsis">
Layouts
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../frontend/pages/" class="md-nav__link">
<span class="md-ellipsis">
Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_6" >
<div class="md-nav__link md-nav__container">
<a href="../../database/" class="md-nav__link ">
<span class="md-ellipsis">
Database
</span>
</a>
<label class="md-nav__link " for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Database
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../database/schema/" class="md-nav__link">
<span class="md-ellipsis">
Schema Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/seeding/" class="md-nav__link">
<span class="md-ellipsis">
Seeding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../database/indexes/" class="md-nav__link">
<span class="md-ellipsis">
Indexes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../database/models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_7" >
<div class="md-nav__link md-nav__container">
<a href="../../features/" class="md-nav__link ">
<span class="md-ellipsis">
Features
</span>
</a>
<label class="md-nav__link " for="__nav_2_7" id="__nav_2_7_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7">
<span class="md-nav__icon md-icon"></span>
Features
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/influence/" class="md-nav__link">
<span class="md-ellipsis">
Influence
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/map/" class="md-nav__link">
<span class="md-ellipsis">
Map
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/landing-pages/" class="md-nav__link">
<span class="md-ellipsis">
Landing Pages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/email-templates/" class="md-nav__link">
<span class="md-ellipsis">
Email Templates
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/media/" class="md-nav__link">
<span class="md-ellipsis">
Media
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/newsletter/" class="md-nav__link">
<span class="md-ellipsis">
Newsletter
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/observability/" class="md-nav__link">
<span class="md-ellipsis">
Observability
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../features/tunnel/" class="md-nav__link">
<span class="md-ellipsis">
Tunnel
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_8" >
<div class="md-nav__link md-nav__container">
<a href="../../deployment/" class="md-nav__link ">
<span class="md-ellipsis">
Deployment
</span>
</a>
<label class="md-nav__link " for="__nav_2_8" id="__nav_2_8_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Deployment
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../deployment/docker-compose/" class="md-nav__link">
<span class="md-ellipsis">
Docker Compose
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/environment-variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/nginx/" class="md-nav__link">
<span class="md-ellipsis">
Nginx Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/ssl-tls/" class="md-nav__link">
<span class="md-ellipsis">
SSL/TLS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/tunneling/" class="md-nav__link">
<span class="md-ellipsis">
Tunneling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/monitoring-stack/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Stack
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/healthchecks/" class="md-nav__link">
<span class="md-ellipsis">
Health Checks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/scaling/" class="md-nav__link">
<span class="md-ellipsis">
Scaling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deployment/backup-restore/" class="md-nav__link">
<span class="md-ellipsis">
Backup & Restore
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_9" >
<div class="md-nav__link md-nav__container">
<a href="../../development/" class="md-nav__link ">
<span class="md-ellipsis">
Development
</span>
</a>
<label class="md-nav__link " for="__nav_2_9" id="__nav_2_9_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_9">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../development/local-setup/" class="md-nav__link">
<span class="md-ellipsis">
Local Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/docker-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Docker Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/git-workflow/" class="md-nav__link">
<span class="md-ellipsis">
Git Workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/npm-commands/" class="md-nav__link">
<span class="md-ellipsis">
NPM Commands
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/migrations/" class="md-nav__link">
<span class="md-ellipsis">
Migrations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/typescript/" class="md-nav__link">
<span class="md-ellipsis">
TypeScript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/testing/" class="md-nav__link">
<span class="md-ellipsis">
Testing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/debugging/" class="md-nav__link">
<span class="md-ellipsis">
Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../development/code-style/" class="md-nav__link">
<span class="md-ellipsis">
Code Style
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_10" >
<div class="md-nav__link md-nav__container">
<a href="../../api-reference/" class="md-nav__link ">
<span class="md-ellipsis">
API Reference
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_10">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_11" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
User Guides
</span>
</a>
<label class="md-nav__link " for="__nav_2_11" id="__nav_2_11_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_11">
<span class="md-nav__icon md-icon"></span>
User Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../admin-guide/" class="md-nav__link">
<span class="md-ellipsis">
Admin Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../campaign-manager-guide/" class="md-nav__link">
<span class="md-ellipsis">
Campaign Manager Guide
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Map Organizer Guide
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Map Organizer Guide
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#understanding-map-roles" class="md-nav__link">
<span class="md-ellipsis">
Understanding Map Roles
</span>
</a>
<nav class="md-nav" aria-label="Understanding Map Roles">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#super_admin" class="md-nav__link">
<span class="md-ellipsis">
SUPER_ADMIN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#map_admin" class="md-nav__link">
<span class="md-ellipsis">
MAP_ADMIN
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#understanding-location-data" class="md-nav__link">
<span class="md-ellipsis">
Understanding Location Data
</span>
</a>
<nav class="md-nav" aria-label="Understanding Location Data">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-location" class="md-nav__link">
<span class="md-ellipsis">
What is a Location?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-vs-unit-level" class="md-nav__link">
<span class="md-ellipsis">
Building vs Unit Level
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-sources" class="md-nav__link">
<span class="md-ellipsis">
Data Sources
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#importing-locations-from-csv" class="md-nav__link">
<span class="md-ellipsis">
Importing Locations from CSV
</span>
</a>
<nav class="md-nav" aria-label="Importing Locations from CSV">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#preparing-your-csv-file" class="md-nav__link">
<span class="md-ellipsis">
Preparing Your CSV File
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#importing-the-csv" class="md-nav__link">
<span class="md-ellipsis">
Importing the CSV
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#troubleshooting-import-issues" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting Import Issues
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nar-import-canadian-electoral-data" class="md-nav__link">
<span class="md-ellipsis">
NAR Import (Canadian Electoral Data)
</span>
</a>
<nav class="md-nav" aria-label="NAR Import (Canadian Electoral Data)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-nar-data" class="md-nav__link">
<span class="md-ellipsis">
What is NAR Data?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#obtaining-nar-data" class="md-nav__link">
<span class="md-ellipsis">
Obtaining NAR Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#importing-nar-data" class="md-nav__link">
<span class="md-ellipsis">
Importing NAR Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nar-data-fields" class="md-nav__link">
<span class="md-ellipsis">
NAR Data Fields
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#creating-and-managing-cuts" class="md-nav__link">
<span class="md-ellipsis">
Creating and Managing Cuts
</span>
</a>
<nav class="md-nav" aria-label="Creating and Managing Cuts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-cut" class="md-nav__link">
<span class="md-ellipsis">
What is a Cut?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-best-practices" class="md-nav__link">
<span class="md-ellipsis">
Cut Best Practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-cut-drawing-on-map" class="md-nav__link">
<span class="md-ellipsis">
Creating a Cut (Drawing on Map)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#automatic-location-assignment" class="md-nav__link">
<span class="md-ellipsis">
Automatic Location Assignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editing-cuts" class="md-nav__link">
<span class="md-ellipsis">
Editing Cuts
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#managing-locations" class="md-nav__link">
<span class="md-ellipsis">
Managing Locations
</span>
</a>
<nav class="md-nav" aria-label="Managing Locations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#viewing-and-filtering-locations" class="md-nav__link">
<span class="md-ellipsis">
Viewing and Filtering Locations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editing-a-location" class="md-nav__link">
<span class="md-ellipsis">
Editing a Location
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#manually-placing-locations-on-map" class="md-nav__link">
<span class="md-ellipsis">
Manually Placing Locations on Map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bulk-operations" class="md-nav__link">
<span class="md-ellipsis">
Bulk Operations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deleting-locations" class="md-nav__link">
<span class="md-ellipsis">
Deleting Locations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#geocoding-and-data-quality" class="md-nav__link">
<span class="md-ellipsis">
Geocoding and Data Quality
</span>
</a>
<nav class="md-nav" aria-label="Geocoding and Data Quality">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#understanding-geocoding" class="md-nav__link">
<span class="md-ellipsis">
Understanding Geocoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#geocoding-providers" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Providers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#geocode-confidence-levels" class="md-nav__link">
<span class="md-ellipsis">
Geocode Confidence Levels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-quality-dashboard" class="md-nav__link">
<span class="md-ellipsis">
Data Quality Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#improving-geocoding-quality" class="md-nav__link">
<span class="md-ellipsis">
Improving Geocoding Quality
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#organizing-volunteer-shifts" class="md-nav__link">
<span class="md-ellipsis">
Organizing Volunteer Shifts
</span>
</a>
<nav class="md-nav" aria-label="Organizing Volunteer Shifts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-shift" class="md-nav__link">
<span class="md-ellipsis">
What is a Shift?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-shift" class="md-nav__link">
<span class="md-ellipsis">
Creating a Shift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#managing-shift-signups" class="md-nav__link">
<span class="md-ellipsis">
Managing Shift Signups
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-volunteers-to-a-shift" class="md-nav__link">
<span class="md-ellipsis">
Adding Volunteers to a Shift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emailing-shift-volunteers" class="md-nav__link">
<span class="md-ellipsis">
Emailing Shift Volunteers
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#generating-walk-sheets" class="md-nav__link">
<span class="md-ellipsis">
Generating Walk Sheets
</span>
</a>
<nav class="md-nav" aria-label="Generating Walk Sheets">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-walk-sheet" class="md-nav__link">
<span class="md-ellipsis">
What is a Walk Sheet?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walk-sheet-settings" class="md-nav__link">
<span class="md-ellipsis">
Walk Sheet Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generating-a-walk-sheet" class="md-nav__link">
<span class="md-ellipsis">
Generating a Walk Sheet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walking-order-optimization" class="md-nav__link">
<span class="md-ellipsis">
Walking Order Optimization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#using-walk-sheets-in-the-field" class="md-nav__link">
<span class="md-ellipsis">
Using Walk Sheets in the Field
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#monitoring-canvass-progress" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Canvass Progress
</span>
</a>
<nav class="md-nav" aria-label="Monitoring Canvass Progress">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#canvass-dashboard" class="md-nav__link">
<span class="md-ellipsis">
Canvass Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-level-progress" class="md-nav__link">
<span class="md-ellipsis">
Cut-Level Progress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#session-monitoring" class="md-nav__link">
<span class="md-ellipsis">
Session Monitoring
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#data-analysis-and-reporting" class="md-nav__link">
<span class="md-ellipsis">
Data Analysis and Reporting
</span>
</a>
<nav class="md-nav" aria-label="Data Analysis and Reporting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#outcome-analysis" class="md-nav__link">
<span class="md-ellipsis">
Outcome Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#support-level-analysis" class="md-nav__link">
<span class="md-ellipsis">
Support Level Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#volunteer-performance" class="md-nav__link">
<span class="md-ellipsis">
Volunteer Performance
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#geocoding-issues" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-issues" class="md-nav__link">
<span class="md-ellipsis">
Cut Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shift-issues" class="md-nav__link">
<span class="md-ellipsis">
Shift Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#canvassing-issues" class="md-nav__link">
<span class="md-ellipsis">
Canvassing Issues
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
<span class="md-ellipsis">
Related Documentation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../content-editor-guide/" class="md-nav__link">
<span class="md-ellipsis">
Content Editor Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../volunteer-guide/" class="md-nav__link">
<span class="md-ellipsis">
Volunteer Guide
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_12" >
<div class="md-nav__link md-nav__container">
<a href="../../troubleshooting/" class="md-nav__link ">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<label class="md-nav__link " for="__nav_2_12" id="__nav_2_12_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_12">
<span class="md-nav__icon md-icon"></span>
Troubleshooting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../troubleshooting/faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/common-errors/" class="md-nav__link">
<span class="md-ellipsis">
Common Errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/auth-issues/" class="md-nav__link">
<span class="md-ellipsis">
Auth Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/database-issues/" class="md-nav__link">
<span class="md-ellipsis">
Database Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/docker-issues/" class="md-nav__link">
<span class="md-ellipsis">
Docker Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/email-issues/" class="md-nav__link">
<span class="md-ellipsis">
Email Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/geocoding-issues/" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/monitoring-issues/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../troubleshooting/performance-optimization/" class="md-nav__link">
<span class="md-ellipsis">
Performance Optimization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_13" >
<div class="md-nav__link md-nav__container">
<a href="../../migration/" class="md-nav__link ">
<span class="md-ellipsis">
Migration
</span>
</a>
<label class="md-nav__link " for="__nav_2_13" id="__nav_2_13_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_13">
<span class="md-nav__icon md-icon"></span>
Migration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../migration/feature-parity/" class="md-nav__link">
<span class="md-ellipsis">
Feature Parity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/breaking-changes/" class="md-nav__link">
<span class="md-ellipsis">
Breaking Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/api-changes/" class="md-nav__link">
<span class="md-ellipsis">
API Changes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../migration/data-migration/" class="md-nav__link">
<span class="md-ellipsis">
Data Migration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_14" >
<div class="md-nav__link md-nav__container">
<a href="../../contributing/" class="md-nav__link ">
<span class="md-ellipsis">
Contributing
</span>
</a>
<label class="md-nav__link " for="__nav_2_14" id="__nav_2_14_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_14">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../contributing/development-setup/" class="md-nav__link">
<span class="md-ellipsis">
Development Setup
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/code-of-conduct/" class="md-nav__link">
<span class="md-ellipsis">
Code of Conduct
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/pull-requests/" class="md-nav__link">
<span class="md-ellipsis">
Pull Requests
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../contributing/roadmap/" class="md-nav__link">
<span class="md-ellipsis">
Roadmap
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../phil/" class="md-nav__link">
<span class="md-ellipsis">
Philosophy
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../v1/" class="md-nav__link">
<span class="md-ellipsis">
V1 Documentation (Legacy)
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../blog/" class="md-nav__link">
<span class="md-ellipsis">
Blog
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="On this page">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
On this page
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#understanding-map-roles" class="md-nav__link">
<span class="md-ellipsis">
Understanding Map Roles
</span>
</a>
<nav class="md-nav" aria-label="Understanding Map Roles">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#super_admin" class="md-nav__link">
<span class="md-ellipsis">
SUPER_ADMIN
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#map_admin" class="md-nav__link">
<span class="md-ellipsis">
MAP_ADMIN
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#understanding-location-data" class="md-nav__link">
<span class="md-ellipsis">
Understanding Location Data
</span>
</a>
<nav class="md-nav" aria-label="Understanding Location Data">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-location" class="md-nav__link">
<span class="md-ellipsis">
What is a Location?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-vs-unit-level" class="md-nav__link">
<span class="md-ellipsis">
Building vs Unit Level
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-sources" class="md-nav__link">
<span class="md-ellipsis">
Data Sources
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#importing-locations-from-csv" class="md-nav__link">
<span class="md-ellipsis">
Importing Locations from CSV
</span>
</a>
<nav class="md-nav" aria-label="Importing Locations from CSV">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#preparing-your-csv-file" class="md-nav__link">
<span class="md-ellipsis">
Preparing Your CSV File
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#importing-the-csv" class="md-nav__link">
<span class="md-ellipsis">
Importing the CSV
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#troubleshooting-import-issues" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting Import Issues
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nar-import-canadian-electoral-data" class="md-nav__link">
<span class="md-ellipsis">
NAR Import (Canadian Electoral Data)
</span>
</a>
<nav class="md-nav" aria-label="NAR Import (Canadian Electoral Data)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-nar-data" class="md-nav__link">
<span class="md-ellipsis">
What is NAR Data?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#obtaining-nar-data" class="md-nav__link">
<span class="md-ellipsis">
Obtaining NAR Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#importing-nar-data" class="md-nav__link">
<span class="md-ellipsis">
Importing NAR Data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nar-data-fields" class="md-nav__link">
<span class="md-ellipsis">
NAR Data Fields
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#creating-and-managing-cuts" class="md-nav__link">
<span class="md-ellipsis">
Creating and Managing Cuts
</span>
</a>
<nav class="md-nav" aria-label="Creating and Managing Cuts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-cut" class="md-nav__link">
<span class="md-ellipsis">
What is a Cut?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-best-practices" class="md-nav__link">
<span class="md-ellipsis">
Cut Best Practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-cut-drawing-on-map" class="md-nav__link">
<span class="md-ellipsis">
Creating a Cut (Drawing on Map)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#automatic-location-assignment" class="md-nav__link">
<span class="md-ellipsis">
Automatic Location Assignment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editing-cuts" class="md-nav__link">
<span class="md-ellipsis">
Editing Cuts
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#managing-locations" class="md-nav__link">
<span class="md-ellipsis">
Managing Locations
</span>
</a>
<nav class="md-nav" aria-label="Managing Locations">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#viewing-and-filtering-locations" class="md-nav__link">
<span class="md-ellipsis">
Viewing and Filtering Locations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editing-a-location" class="md-nav__link">
<span class="md-ellipsis">
Editing a Location
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#manually-placing-locations-on-map" class="md-nav__link">
<span class="md-ellipsis">
Manually Placing Locations on Map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bulk-operations" class="md-nav__link">
<span class="md-ellipsis">
Bulk Operations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#deleting-locations" class="md-nav__link">
<span class="md-ellipsis">
Deleting Locations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#geocoding-and-data-quality" class="md-nav__link">
<span class="md-ellipsis">
Geocoding and Data Quality
</span>
</a>
<nav class="md-nav" aria-label="Geocoding and Data Quality">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#understanding-geocoding" class="md-nav__link">
<span class="md-ellipsis">
Understanding Geocoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#geocoding-providers" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Providers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#geocode-confidence-levels" class="md-nav__link">
<span class="md-ellipsis">
Geocode Confidence Levels
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-quality-dashboard" class="md-nav__link">
<span class="md-ellipsis">
Data Quality Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#improving-geocoding-quality" class="md-nav__link">
<span class="md-ellipsis">
Improving Geocoding Quality
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#organizing-volunteer-shifts" class="md-nav__link">
<span class="md-ellipsis">
Organizing Volunteer Shifts
</span>
</a>
<nav class="md-nav" aria-label="Organizing Volunteer Shifts">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-shift" class="md-nav__link">
<span class="md-ellipsis">
What is a Shift?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#creating-a-shift" class="md-nav__link">
<span class="md-ellipsis">
Creating a Shift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#managing-shift-signups" class="md-nav__link">
<span class="md-ellipsis">
Managing Shift Signups
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#adding-volunteers-to-a-shift" class="md-nav__link">
<span class="md-ellipsis">
Adding Volunteers to a Shift
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#emailing-shift-volunteers" class="md-nav__link">
<span class="md-ellipsis">
Emailing Shift Volunteers
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#generating-walk-sheets" class="md-nav__link">
<span class="md-ellipsis">
Generating Walk Sheets
</span>
</a>
<nav class="md-nav" aria-label="Generating Walk Sheets">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#what-is-a-walk-sheet" class="md-nav__link">
<span class="md-ellipsis">
What is a Walk Sheet?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walk-sheet-settings" class="md-nav__link">
<span class="md-ellipsis">
Walk Sheet Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#generating-a-walk-sheet" class="md-nav__link">
<span class="md-ellipsis">
Generating a Walk Sheet
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#walking-order-optimization" class="md-nav__link">
<span class="md-ellipsis">
Walking Order Optimization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#using-walk-sheets-in-the-field" class="md-nav__link">
<span class="md-ellipsis">
Using Walk Sheets in the Field
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#monitoring-canvass-progress" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Canvass Progress
</span>
</a>
<nav class="md-nav" aria-label="Monitoring Canvass Progress">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#canvass-dashboard" class="md-nav__link">
<span class="md-ellipsis">
Canvass Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-level-progress" class="md-nav__link">
<span class="md-ellipsis">
Cut-Level Progress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#session-monitoring" class="md-nav__link">
<span class="md-ellipsis">
Session Monitoring
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#data-analysis-and-reporting" class="md-nav__link">
<span class="md-ellipsis">
Data Analysis and Reporting
</span>
</a>
<nav class="md-nav" aria-label="Data Analysis and Reporting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#outcome-analysis" class="md-nav__link">
<span class="md-ellipsis">
Outcome Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#support-level-analysis" class="md-nav__link">
<span class="md-ellipsis">
Support Level Analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#volunteer-performance" class="md-nav__link">
<span class="md-ellipsis">
Volunteer Performance
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#troubleshooting" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
<nav class="md-nav" aria-label="Troubleshooting">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#geocoding-issues" class="md-nav__link">
<span class="md-ellipsis">
Geocoding Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cut-issues" class="md-nav__link">
<span class="md-ellipsis">
Cut Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shift-issues" class="md-nav__link">
<span class="md-ellipsis">
Shift Issues
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#canvassing-issues" class="md-nav__link">
<span class="md-ellipsis">
Canvassing Issues
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#related-documentation" class="md-nav__link">
<span class="md-ellipsis">
Related Documentation
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../../.." class="md-path__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../" class="md-path__link">
<span class="md-ellipsis">
V2 Documentation
</span>
</a>
</li>
<li class="md-path__item">
<a href="../" class="md-path__link">
<span class="md-ellipsis">
User Guides
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset">
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/user-guides/map-organizer-guide.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/user-guides/map-organizer-guide.md" title="View source of this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<h1 id="map-organizer-guide">Map Organizer Guide<a class="headerlink" href="#map-organizer-guide" title="Permanent link">&para;</a></h1>
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h2>
<p>As a Map Organizer, you're responsible for managing territories, coordinating volunteers, and organizing door-to-door canvassing using Changemaker Lite's Map module. This guide will help you:</p>
<ul>
<li><strong>Import and manage locations</strong>: Build your canvassing database from CSV or NAR data</li>
<li><strong>Create territorial cuts</strong>: Divide your area into manageable canvassing zones</li>
<li><strong>Organize volunteer shifts</strong>: Schedule and coordinate door-to-door canvassing</li>
<li><strong>Monitor canvass progress</strong>: Track coverage, outcomes, and volunteer performance</li>
<li><strong>Ensure data quality</strong>: Review geocoding accuracy and fix issues</li>
<li><strong>Generate walk sheets</strong>: Create printable canvassing materials</li>
</ul>
<p>Whether you're organizing a local ward campaign or a city-wide canvass, this guide provides strategies for effective territory management.</p>
<hr />
<h2 id="understanding-map-roles">Understanding Map Roles<a class="headerlink" href="#understanding-map-roles" title="Permanent link">&para;</a></h2>
<p>You may have one of two roles for map management:</p>
<h3 id="super_admin">SUPER_ADMIN<a class="headerlink" href="#super_admin" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Access</strong>: Full platform access</li>
<li><strong>Capabilities</strong>: All map functions plus user management, campaigns, site settings</li>
<li><strong>Use case</strong>: Primary administrator</li>
</ul>
<h3 id="map_admin">MAP_ADMIN<a class="headerlink" href="#map_admin" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Access</strong>: Map module only</li>
<li><strong>Capabilities</strong>:</li>
<li>Import and manage locations</li>
<li>Create cuts</li>
<li>Organize shifts</li>
<li>Monitor canvassing</li>
<li>Generate walk sheets</li>
<li><strong>Restrictions</strong>: Cannot manage users (except shift assignments), campaigns, or site settings</li>
<li><strong>Use case</strong>: Dedicated field organizer without full admin access</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Role Specialization</p>
<p>If you only manage field operations (not campaigns), ask for MAP_ADMIN role. This keeps the interface focused on your work.</p>
</div>
<hr />
<h2 id="understanding-location-data">Understanding Location Data<a class="headerlink" href="#understanding-location-data" title="Permanent link">&para;</a></h2>
<h3 id="what-is-a-location">What is a Location?<a class="headerlink" href="#what-is-a-location" title="Permanent link">&para;</a></h3>
<p>A <strong>location</strong> is a physical address where canvassing occurs. Each location represents:</p>
<ul>
<li>A single-family home, OR</li>
<li>An apartment/condo building (multi-unit), OR</li>
<li>A business address (if canvassing businesses)</li>
</ul>
<p><strong>Location data includes:</strong></p>
<ul>
<li><strong>Address</strong>: Full civic address (street, city, province, postal code)</li>
<li><strong>Coordinates</strong>: Latitude and longitude (from geocoding)</li>
<li><strong>Building type</strong>: RESIDENTIAL, APARTMENT, BUSINESS</li>
<li><strong>Unit count</strong>: Number of dwelling units (1 for houses, 10+ for apartments)</li>
<li><strong>Cut assignment</strong>: Which territorial cut the location belongs to</li>
<li><strong>Canvass history</strong>: Past visits, outcomes, support levels</li>
</ul>
<h3 id="building-vs-unit-level">Building vs Unit Level<a class="headerlink" href="#building-vs-unit-level" title="Permanent link">&para;</a></h3>
<p><strong>Building-level data</strong> (recommended):</p>
<ul>
<li>One location record per building</li>
<li><code>unitCount</code> field indicates multi-unit buildings</li>
<li>Example: "123 Main St" with <code>unitCount: 24</code> (apartment building)</li>
</ul>
<p><strong>Unit-level data</strong> (alternative):</p>
<ul>
<li>One location record per unit</li>
<li>Example: "123 Main St, Unit 1", "123 Main St, Unit 2", etc.</li>
<li>More granular but creates more records</li>
</ul>
<div class="admonition tip">
<p class="admonition-title">Recommended Approach</p>
<p>Use building-level data for apartments (one record with <code>unitCount</code>). This reduces database size and simplifies canvassing (volunteers visit building once, not once per unit).</p>
</div>
<h3 id="data-sources">Data Sources<a class="headerlink" href="#data-sources" title="Permanent link">&para;</a></h3>
<p><strong>1. CSV Import</strong> — Your own data</p>
<ul>
<li>Volunteer sign-up forms</li>
<li>Voter registration data</li>
<li>Membership lists</li>
<li>Custom databases</li>
</ul>
<p><strong>2. NAR Import</strong> — Canadian electoral data</p>
<ul>
<li>Elections Canada National Address Register</li>
<li>All residential addresses in Canada</li>
<li>Pre-geocoded coordinates</li>
<li>Federal electoral districts</li>
</ul>
<p><strong>3. Manual Entry</strong> — Individual addresses</p>
<ul>
<li>Add one location at a time via admin interface</li>
<li>Click-to-add on map</li>
</ul>
<hr />
<h2 id="importing-locations-from-csv">Importing Locations from CSV<a class="headerlink" href="#importing-locations-from-csv" title="Permanent link">&para;</a></h2>
<h3 id="preparing-your-csv-file">Preparing Your CSV File<a class="headerlink" href="#preparing-your-csv-file" title="Permanent link">&para;</a></h3>
<p><strong>Required columns:</strong></p>
<ul>
<li><code>address</code> — Full street address (e.g., "123 Main St")</li>
<li><code>city</code> — City name (e.g., "Ottawa")</li>
<li><code>province</code> — Province/state code (e.g., "ON", "BC")</li>
<li><code>postalCode</code> — Postal code (e.g., "K1A 0B1")</li>
</ul>
<p><strong>Optional columns:</strong></p>
<ul>
<li><code>latitude</code> — Pre-geocoded latitude (decimal degrees)</li>
<li><code>longitude</code> — Pre-geocoded longitude (decimal degrees)</li>
<li><code>buildingType</code> — RESIDENTIAL, APARTMENT, or BUSINESS</li>
<li><code>unitCount</code> — Number of units (integer, default: 1)</li>
<li><code>federalDistrict</code> — Electoral district name</li>
<li><code>notes</code> — Internal notes</li>
</ul>
<p><strong>CSV example:</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>address,city,province,postalCode,buildingType,unitCount
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>&quot;123 Main St&quot;,&quot;Ottawa&quot;,&quot;ON&quot;,&quot;K1A 0B1&quot;,&quot;RESIDENTIAL&quot;,1
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>&quot;456 Queen St E, Unit 5&quot;,&quot;Toronto&quot;,&quot;ON&quot;,&quot;M5A 1T1&quot;,&quot;APARTMENT&quot;,36
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>&quot;789 Granville St&quot;,&quot;Vancouver&quot;,&quot;BC&quot;,&quot;V6Z 1K3&quot;,&quot;RESIDENTIAL&quot;,1
</span></code></pre></div>
<p><strong>CSV formatting tips:</strong></p>
<ol>
<li><strong>Use quotes</strong> around addresses with commas</li>
<li><strong>Remove special characters</strong> (emoji, unusual symbols)</li>
<li><strong>Use UTF-8 encoding</strong> (not Windows-1252 or ASCII)</li>
<li><strong>One header row</strong> (first row = column names)</li>
<li><strong>No blank rows</strong> (delete empty rows at end)</li>
<li><strong>Consistent province codes</strong> (use 2-letter abbreviations)</li>
</ol>
<p><strong>Excel to CSV:</strong></p>
<ol>
<li>Open your Excel file</li>
<li>File &gt; Save As</li>
<li>Format: "CSV UTF-8 (Comma delimited) (*.csv)"</li>
<li>Save</li>
</ol>
<h3 id="importing-the-csv">Importing the CSV<a class="headerlink" href="#importing-the-csv" title="Permanent link">&para;</a></h3>
<p><strong>To import locations:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Locations</strong></li>
<li>Click <strong>"Import CSV"</strong> button (top-right)</li>
<li>Upload your CSV file (drag-drop or browse)</li>
<li>Map CSV columns to location fields</li>
<li>Preview imported data (first 10 rows shown)</li>
<li>Click <strong>"Import"</strong></li>
</ol>
<p><strong>Screenshot placeholder</strong>: <em>CSV import dialog showing file upload area and column mapping interface</em></p>
<p><strong>Column mapping:</strong></p>
<p>The system tries to auto-detect columns, but verify:</p>
<ul>
<li>CSV "address" → Location "address"</li>
<li>CSV "city" → Location "city"</li>
<li>CSV "province" → Location "province"</li>
<li>CSV "postalCode" → Location "postalCode"</li>
</ul>
<p>If your CSV uses different column names (e.g., "Street Address" instead of "address"), map manually using the dropdowns.</p>
<p><strong>What happens during import:</strong></p>
<ol>
<li>System validates each row (checks required fields)</li>
<li>Skips invalid rows (logs errors)</li>
<li>Creates location records</li>
<li>Geocodes addresses (if lat/lng not provided)</li>
<li>Shows summary: X imported, Y skipped</li>
</ol>
<p><strong>Import limits:</strong></p>
<ul>
<li>Maximum 10,000 rows per import</li>
<li>For larger datasets, split into multiple files</li>
</ul>
<h3 id="troubleshooting-import-issues">Troubleshooting Import Issues<a class="headerlink" href="#troubleshooting-import-issues" title="Permanent link">&para;</a></h3>
<p><strong>Issue: "Invalid CSV format"</strong></p>
<p><strong>Causes:</strong></p>
<ul>
<li>File is not actually CSV (e.g., Excel .xlsx)</li>
<li>Missing header row</li>
<li>Inconsistent column count (some rows have more/fewer columns)</li>
</ul>
<p><strong>Solutions:</strong></p>
<ul>
<li>Save as CSV UTF-8 from Excel</li>
<li>Ensure first row is headers</li>
<li>Remove blank rows and columns</li>
</ul>
<hr />
<p><strong>Issue: "Missing required field"</strong></p>
<p><strong>Causes:</strong></p>
<ul>
<li>CSV missing required column (address, city, province, or postalCode)</li>
<li>Column name doesn't match (e.g., "Street" instead of "address")</li>
</ul>
<p><strong>Solutions:</strong></p>
<ul>
<li>Add missing column to CSV</li>
<li>Use column mapping to map "Street" → "address"</li>
</ul>
<hr />
<p><strong>Issue: "Geocoding failed for X addresses"</strong></p>
<p><strong>Causes:</strong></p>
<ul>
<li>Addresses are invalid (typos, wrong format)</li>
<li>Addresses are too vague ("Main Street" without number)</li>
<li>Geocoding service is down</li>
</ul>
<p><strong>Solutions:</strong></p>
<ul>
<li>Review failed addresses in Data Quality dashboard</li>
<li>Fix typos and re-import those rows</li>
<li>Manually place locations on map (see below)</li>
</ul>
<hr />
<h2 id="nar-import-canadian-electoral-data">NAR Import (Canadian Electoral Data)<a class="headerlink" href="#nar-import-canadian-electoral-data" title="Permanent link">&para;</a></h2>
<h3 id="what-is-nar-data">What is NAR Data?<a class="headerlink" href="#what-is-nar-data" title="Permanent link">&para;</a></h3>
<p>NAR (National Address Register) is Elections Canada's official database of all residential addresses in Canada. It includes:</p>
<ul>
<li><strong>Precise civic addresses</strong> (from Address files)</li>
<li><strong>Geocoded coordinates</strong> (from Location files)</li>
<li><strong>Federal electoral districts</strong></li>
<li><strong>Building use classification</strong> (residential, commercial, institutional)</li>
</ul>
<p><strong>Advantages:</strong></p>
<ul>
<li>✅ Comprehensive (all Canadian addresses)</li>
<li>✅ Pre-geocoded (high accuracy)</li>
<li>✅ Includes federal district data</li>
<li>✅ Updated regularly by Elections Canada</li>
</ul>
<p><strong>Disadvantages:</strong></p>
<ul>
<li>❌ Canada only (not available for other countries)</li>
<li>❌ Requires server access to install data files</li>
<li>❌ Large file size (multi-GB for provinces like Ontario)</li>
</ul>
<h3 id="obtaining-nar-data">Obtaining NAR Data<a class="headerlink" href="#obtaining-nar-data" title="Permanent link">&para;</a></h3>
<p>NAR data must be obtained from Elections Canada:</p>
<ol>
<li>Contact Elections Canada Open Data team</li>
<li>Request latest NAR dataset (e.g., "NAR 2025 Server")</li>
<li>Download Address and Location files</li>
<li>Provide files to your system administrator</li>
</ol>
<p><strong>Files needed:</strong></p>
<ul>
<li><code>Address_[province]_part_[X].csv</code> — Civic addresses</li>
<li><code>Location_[province].csv</code> — Geocoded coordinates</li>
</ul>
<p>System administrator places files in <code>/data</code> directory on server.</p>
<h3 id="importing-nar-data">Importing NAR Data<a class="headerlink" href="#importing-nar-data" title="Permanent link">&para;</a></h3>
<p><strong>To import NAR data:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Locations</strong></li>
<li>Click <strong>"NAR Import"</strong> button</li>
<li>Select province (e.g., Ontario)</li>
<li>Choose dataset (if multiple years available)</li>
<li>Apply filters (see below)</li>
<li>Click <strong>"Start Import"</strong></li>
</ol>
<p><strong>Screenshot placeholder</strong>: <em>NAR Import modal showing province selector, dataset picker, and filter options</em></p>
<p><strong>Import filters:</strong></p>
<p><strong>Province filter</strong> (required):</p>
<ul>
<li>Select province to import (ON, BC, AB, etc.)</li>
<li>Each province has separate Address/Location files</li>
</ul>
<p><strong>City filter</strong> (optional):</p>
<ul>
<li>Import only specific cities</li>
<li>Example: "Toronto,Ottawa,Mississauga" (comma-separated)</li>
<li>Leave blank to import entire province</li>
</ul>
<p><strong>Postal code filter</strong> (optional):</p>
<ul>
<li>Import only specific postal code prefixes</li>
<li>Example: "K1A,K1B,K1C" (forward sortation areas)</li>
<li>Useful for targeting specific neighborhoods</li>
</ul>
<p><strong>Cut filter</strong> (optional):</p>
<ul>
<li>Assign imported locations to a specific cut</li>
<li>If left blank, locations are imported without cut assignment</li>
<li>You can assign to cuts later</li>
</ul>
<p><strong>Residential only</strong> (toggle):</p>
<ul>
<li>ON: Import only residential buildings (exclude commercial, institutional)</li>
<li>OFF: Import all buildings</li>
<li>Recommended: ON (unless you're canvassing businesses)</li>
</ul>
<p><strong>What happens during NAR import:</strong></p>
<ol>
<li>System scans NAR files for selected province</li>
<li>Joins Address and Location files on <code>LOC_GUID</code> (internal Elections Canada ID)</li>
<li>Filters by city, postal code (if specified)</li>
<li>Converts coordinates from EPSG:3347 (Lambert projection) to WGS84 (lat/lng)</li>
<li>Creates location records</li>
<li>Shows progress (can take several minutes for large provinces)</li>
</ol>
<p><strong>Import performance:</strong></p>
<ul>
<li>Small municipality (10k addresses): ~30 seconds</li>
<li>Large city (500k addresses): ~5 minutes</li>
<li>Full province (3M addresses): ~20 minutes</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Server-Side Processing</p>
<p>NAR import runs on the server (not in your browser). Do not close the modal during import—wait for completion message.</p>
</div>
<h3 id="nar-data-fields">NAR Data Fields<a class="headerlink" href="#nar-data-fields" title="Permanent link">&para;</a></h3>
<p>NAR import populates these location fields:</p>
<ul>
<li><code>address</code> — From Address file: <code>CIVIC_NO + OFFICIAL_STREET_NAME + STREET_TYPE + STREET_DIRECTION</code></li>
<li><code>city</code> — From Address file: <code>MUNICIPALITY_NAME</code></li>
<li><code>province</code> — From province code</li>
<li><code>postalCode</code> — From Address file: <code>POSTAL_CODE</code></li>
<li><code>latitude</code> — From Location file: <code>BG_LATITUDE</code> (converted to WGS84)</li>
<li><code>longitude</code> — From Location file: <code>BG_LONGITUDE</code> (converted to WGS84)</li>
<li><code>federalDistrict</code> — From Location file: <code>FED_NUM</code> (district number) + name lookup</li>
<li><code>buildingUse</code> — From Address file: <code>BUILDING_USE</code> (RESIDENTIAL, COMMERCIAL, INSTITUTIONAL)</li>
</ul>
<hr />
<h2 id="creating-and-managing-cuts">Creating and Managing Cuts<a class="headerlink" href="#creating-and-managing-cuts" title="Permanent link">&para;</a></h2>
<h3 id="what-is-a-cut">What is a Cut?<a class="headerlink" href="#what-is-a-cut" title="Permanent link">&para;</a></h3>
<p>A <strong>cut</strong> is a geographic area used to organize canvassing. Cuts are polygons drawn on a map.</p>
<p><strong>Common cut types:</strong></p>
<ul>
<li><strong>WARD</strong>: Municipal electoral ward</li>
<li><strong>NEIGHBORHOOD</strong>: Informal neighborhood (e.g., "Downtown", "Riverside")</li>
<li><strong>DISTRICT</strong>: Federal or provincial electoral district</li>
<li><strong>CUSTOM</strong>: Any other boundary (e.g., "North of Highway", "Priority Zone")</li>
</ul>
<p><strong>Why use cuts?</strong></p>
<ul>
<li><strong>Assign territories to volunteers</strong>: "You canvass Ward 5"</li>
<li><strong>Track progress by area</strong>: "Ward 5 is 75% complete"</li>
<li><strong>Generate walk sheets</strong>: Print addresses for Ward 5 only</li>
<li><strong>Prevent duplication</strong>: Volunteers know their boundaries</li>
</ul>
<h3 id="cut-best-practices">Cut Best Practices<a class="headerlink" href="#cut-best-practices" title="Permanent link">&para;</a></h3>
<p><strong>Size:</strong></p>
<ul>
<li><strong>Recommended</strong>: 200-500 locations per cut</li>
<li>Too small (&lt; 100): Inefficient (volunteers finish too quickly)</li>
<li>Too large (&gt; 1000): Overwhelming (takes many sessions to complete)</li>
</ul>
<p><strong>Boundaries:</strong></p>
<ul>
<li>Use <strong>natural boundaries</strong>: Roads, rivers, parks, rail lines</li>
<li>Avoid cutting through neighborhoods arbitrarily</li>
<li>Use official boundaries when available (ward maps, district maps)</li>
</ul>
<p><strong>Naming:</strong></p>
<ul>
<li>Use <strong>official names</strong> when available ("Ward 5", "Riverdale")</li>
<li>Be consistent (don't mix "Ward 5" and "Fifth Ward")</li>
<li>Avoid abbreviations unless universally understood</li>
</ul>
<p><strong>Colors:</strong></p>
<ul>
<li>Use <strong>distinct colors</strong> for adjacent cuts</li>
<li>Use <strong>color coding</strong> meaningfully (e.g., priority cuts in red)</li>
<li>Ensure colors are visible on both light and dark backgrounds</li>
</ul>
<h3 id="creating-a-cut-drawing-on-map">Creating a Cut (Drawing on Map)<a class="headerlink" href="#creating-a-cut-drawing-on-map" title="Permanent link">&para;</a></h3>
<p><strong>To create a cut:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Cuts</strong></li>
<li>Click the <strong>"Map Drawing"</strong> tab</li>
<li>Click <strong>"Start Drawing"</strong></li>
<li>Click on the map to add polygon vertices</li>
<li>Close the polygon (click near first vertex)</li>
<li>Fill in cut details (see form below)</li>
<li>Click <strong>"Save Cut"</strong></li>
</ol>
<p><strong>Screenshot placeholder</strong>: <em>Cut drawing interface showing map with polygon being drawn</em></p>
<p><strong>Drawing tips:</strong></p>
<ol>
<li><strong>Start at a corner</strong>: Begin at a distinct landmark (intersection, park corner)</li>
<li><strong>Follow roads</strong>: Click along roads and boundaries</li>
<li><strong>Use zoom</strong>: Zoom in for precision, out for overview</li>
<li><strong>Closing detection</strong>: System detects when you're near the first point and offers to close</li>
<li><strong>Undo</strong>: Click <strong>"Undo Last Point"</strong> if you make a mistake</li>
</ol>
<p><strong>Cut form fields:</strong></p>
<p><strong>Name</strong> (required):</p>
<ul>
<li>Cut identifier (e.g., "Ward 5", "Downtown")</li>
<li>Displayed on map, walk sheets, volunteer portal</li>
</ul>
<p><strong>Category</strong> (required):</p>
<ul>
<li>WARD, NEIGHBORHOOD, DISTRICT, or CUSTOM</li>
<li>Used for filtering and organizing</li>
</ul>
<p><strong>Color</strong> (required):</p>
<ul>
<li>Display color on map</li>
<li>Use color picker or enter hex code (#FF5733)</li>
</ul>
<p><strong>Description</strong> (optional):</p>
<ul>
<li>Internal notes about the cut</li>
<li>Example: "Priority area, high support expected"</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Cut creation form showing name, category, color picker, and description</em></p>
<h3 id="automatic-location-assignment">Automatic Location Assignment<a class="headerlink" href="#automatic-location-assignment" title="Permanent link">&para;</a></h3>
<p>When you save a cut, the system automatically:</p>
<ol>
<li>Checks which locations fall inside the polygon (point-in-polygon algorithm)</li>
<li>Assigns those locations to the cut</li>
<li>Shows count: "X locations assigned"</li>
</ol>
<p><strong>Re-assignment:</strong></p>
<ul>
<li>Locations can only belong to one cut</li>
<li>If you draw overlapping cuts, later cuts override earlier assignments</li>
<li>Review location table to verify assignments</li>
</ul>
<h3 id="editing-cuts">Editing Cuts<a class="headerlink" href="#editing-cuts" title="Permanent link">&para;</a></h3>
<p><strong>To edit a cut:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Cuts</strong></li>
<li>Click <strong>"Edit"</strong> in Actions column</li>
<li>Modify name, category, color, or description</li>
<li>Click <strong>"Save"</strong></li>
</ol>
<p><strong>Note:</strong> You cannot edit the polygon shape after creation. To change boundaries, delete the cut and redraw.</p>
<p><strong>To delete a cut:</strong></p>
<ol>
<li>Click <strong>"Delete"</strong> in Actions column</li>
<li>Confirm deletion</li>
</ol>
<p><strong>What happens to locations?</strong></p>
<ul>
<li>Cut assignment is removed (locations become unassigned)</li>
<li>Locations are NOT deleted</li>
<li>Historical canvass data is preserved (visits remain linked to coordinates)</li>
</ul>
<hr />
<h2 id="managing-locations">Managing Locations<a class="headerlink" href="#managing-locations" title="Permanent link">&para;</a></h2>
<h3 id="viewing-and-filtering-locations">Viewing and Filtering Locations<a class="headerlink" href="#viewing-and-filtering-locations" title="Permanent link">&para;</a></h3>
<p><strong>To view all locations:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Locations</strong></li>
</ol>
<p>The locations table shows:</p>
<ul>
<li><strong>Address</strong>: Full civic address</li>
<li><strong>City</strong>: City name</li>
<li><strong>Cut</strong>: Assigned cut (if any)</li>
<li><strong>Geocoded</strong>: ✅ (has coordinates) or ❌ (needs geocoding)</li>
<li><strong>Last Visit</strong>: Date of most recent canvass visit</li>
<li><strong>Actions</strong>: Edit, delete</li>
</ul>
<p><strong>Filters:</strong></p>
<ul>
<li><strong>Search</strong>: Search by address or postal code</li>
<li><strong>Cut</strong>: Filter to specific cut</li>
<li><strong>Geocoded</strong>: Show only geocoded or ungeocoded</li>
<li><strong>Building Type</strong>: Filter by RESIDENTIAL, APARTMENT, BUSINESS</li>
<li><strong>Date Added</strong>: Filter by import/creation date</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Locations table with search bar, cut filter, and geocoded status column</em></p>
<h3 id="editing-a-location">Editing a Location<a class="headerlink" href="#editing-a-location" title="Permanent link">&para;</a></h3>
<p><strong>To edit a location:</strong></p>
<ol>
<li>Click <strong>"Edit"</strong> in Actions column</li>
<li>Modify fields (see below)</li>
<li>Click <strong>"Save"</strong></li>
</ol>
<p><strong>Editable fields:</strong></p>
<p><strong>Address details:</strong></p>
<ul>
<li>Street address</li>
<li>City</li>
<li>Province</li>
<li>Postal code</li>
</ul>
<p><strong>Coordinates:</strong></p>
<ul>
<li>Latitude (decimal degrees, e.g., 45.4215)</li>
<li>Longitude (decimal degrees, e.g., -75.6972)</li>
<li>Drag map pin to adjust visually</li>
</ul>
<p><strong>Metadata:</strong></p>
<ul>
<li>Building type (RESIDENTIAL, APARTMENT, BUSINESS)</li>
<li>Unit count (integer)</li>
<li>Federal district (text)</li>
<li>Notes (internal notes)</li>
</ul>
<p><strong>Cut assignment:</strong></p>
<ul>
<li>Select cut from dropdown</li>
<li>Or leave blank (unassigned)</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Edit Location modal showing address fields, map with draggable pin, and metadata fields</em></p>
<h3 id="manually-placing-locations-on-map">Manually Placing Locations on Map<a class="headerlink" href="#manually-placing-locations-on-map" title="Permanent link">&para;</a></h3>
<p>If geocoding fails, you can manually place a location:</p>
<ol>
<li>Edit the location</li>
<li>Use the map at the bottom of the form</li>
<li>Drag the red pin to the correct position</li>
<li>Latitude and longitude fields update automatically</li>
<li>Click <strong>"Save"</strong></li>
</ol>
<p><strong>Tip:</strong> Use satellite view or street view to identify exact building location.</p>
<h3 id="bulk-operations">Bulk Operations<a class="headerlink" href="#bulk-operations" title="Permanent link">&para;</a></h3>
<p><strong>To perform bulk actions:</strong></p>
<ol>
<li>Select locations (checkboxes in table)</li>
<li>Choose action from <strong>"Bulk Actions"</strong> dropdown:</li>
<li><strong>Assign to Cut</strong>: Assign selected locations to a cut</li>
<li><strong>Geocode</strong>: Re-geocode selected locations</li>
<li><strong>Delete</strong>: Delete selected locations</li>
<li>Confirm action</li>
</ol>
<p><strong>Screenshot placeholder</strong>: <em>Bulk actions dropdown with selected locations and action buttons</em></p>
<h3 id="deleting-locations">Deleting Locations<a class="headerlink" href="#deleting-locations" title="Permanent link">&para;</a></h3>
<p><strong>To delete locations:</strong></p>
<ol>
<li>Select locations in table (or filter and select all)</li>
<li>Choose <strong>"Delete"</strong> from bulk actions</li>
<li>Confirm deletion</li>
</ol>
<div class="admonition warning">
<p class="admonition-title">Canvass History Preserved</p>
<p>Deleting a location removes the address record but preserves canvass visit data (visits are linked to coordinates, not location IDs). Historical data remains for reporting.</p>
</div>
<hr />
<h2 id="geocoding-and-data-quality">Geocoding and Data Quality<a class="headerlink" href="#geocoding-and-data-quality" title="Permanent link">&para;</a></h2>
<h3 id="understanding-geocoding">Understanding Geocoding<a class="headerlink" href="#understanding-geocoding" title="Permanent link">&para;</a></h3>
<p><strong>Geocoding</strong> converts addresses to latitude/longitude coordinates for map display.</p>
<p><strong>Why geocoding matters:</strong></p>
<ul>
<li>Locations without coordinates cannot appear on map</li>
<li>Inaccurate coordinates place locations in wrong areas</li>
<li>Poor geocoding affects canvassing efficiency (volunteers can't find addresses)</li>
</ul>
<h3 id="geocoding-providers">Geocoding Providers<a class="headerlink" href="#geocoding-providers" title="Permanent link">&para;</a></h3>
<p>Changemaker Lite tries multiple geocoding providers in order:</p>
<ol>
<li><strong>Nominatim</strong> (OpenStreetMap) — Free, no API key, global coverage</li>
<li><strong>ArcGIS</strong> — Free tier, accurate for North America</li>
<li><strong>Photon</strong> — Free, Europe-focused</li>
<li><strong>Mapbox</strong> — Requires API key, very accurate</li>
<li><strong>Google Geocoding</strong> — Requires API key, most accurate</li>
<li><strong>LocationIQ</strong> — Requires API key, Nominatim-based</li>
</ol>
<p><strong>How it works:</strong></p>
<ul>
<li>System tries Nominatim first</li>
<li>If confidence &lt; 0.5, tries next provider</li>
<li>If all fail, location remains ungeocoded</li>
</ul>
<p><strong>API keys</strong> (optional, configured by admin):</p>
<ul>
<li>Mapbox: <code>MAPBOX_API_KEY</code></li>
<li>Google: <code>GOOGLE_MAPS_API_KEY</code></li>
<li>LocationIQ: <code>LOCATIONIQ_API_KEY</code></li>
</ul>
<p>Without API keys, only free providers (Nominatim, ArcGIS, Photon) are used.</p>
<h3 id="geocode-confidence-levels">Geocode Confidence Levels<a class="headerlink" href="#geocode-confidence-levels" title="Permanent link">&para;</a></h3>
<p>Each geocoded location has a <strong>confidence score</strong> (0.0 to 1.0):</p>
<ul>
<li><strong>0.9-1.0</strong>: High confidence (exact address match)</li>
<li><strong>0.7-0.9</strong>: Medium-high confidence (likely correct)</li>
<li><strong>0.5-0.7</strong>: Medium confidence (street or area match)</li>
<li><strong>0.3-0.5</strong>: Low confidence (approximate)</li>
<li><strong>0.0-0.3</strong>: Very low confidence (city or region only)</li>
</ul>
<p><strong>Confidence affects accuracy:</strong></p>
<ul>
<li>High confidence → Pin is at exact building</li>
<li>Low confidence → Pin may be at street midpoint or city center</li>
</ul>
<h3 id="data-quality-dashboard">Data Quality Dashboard<a class="headerlink" href="#data-quality-dashboard" title="Permanent link">&para;</a></h3>
<p><strong>To review geocoding quality:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Data Quality</strong></li>
</ol>
<p>The dashboard shows:</p>
<p><strong>Statistics cards:</strong></p>
<ul>
<li><strong>Total locations</strong>: All location records</li>
<li><strong>Geocoded</strong>: Locations with coordinates</li>
<li><strong>Ungeocoded</strong>: Locations without coordinates</li>
<li><strong>Low confidence</strong>: Confidence &lt; 0.5</li>
<li><strong>Medium confidence</strong>: Confidence 0.5-0.8</li>
<li><strong>High confidence</strong>: Confidence &gt; 0.8</li>
</ul>
<p><strong>Geocoding provider breakdown:</strong></p>
<ul>
<li>Chart showing which providers geocoded how many locations</li>
<li>Example: 60% Nominatim, 30% ArcGIS, 10% Mapbox</li>
</ul>
<p><strong>Confidence distribution:</strong></p>
<ul>
<li>Histogram showing confidence score distribution</li>
<li>Identify patterns (many low-confidence addresses?)</li>
</ul>
<p><strong>Action items:</strong></p>
<ul>
<li><strong>Re-geocode low confidence</strong>: Button to retry with different provider</li>
<li><strong>Export ungeocoded</strong>: CSV of failed addresses</li>
<li><strong>Manual review</strong>: Link to locations table filtered for low confidence</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Data Quality Dashboard showing statistics cards, provider pie chart, and confidence histogram</em></p>
<h3 id="improving-geocoding-quality">Improving Geocoding Quality<a class="headerlink" href="#improving-geocoding-quality" title="Permanent link">&para;</a></h3>
<p><strong>Strategy 1: Fix Address Typos</strong></p>
<ol>
<li>Export ungeocoded locations (CSV)</li>
<li>Review addresses in Excel</li>
<li>Fix typos, formatting errors</li>
<li>Re-import corrected CSV</li>
</ol>
<p><strong>Common issues:</strong></p>
<ul>
<li>Missing civic number ("Main Street" → "123 Main Street")</li>
<li>Misspelled street name ("Mane St" → "Main St")</li>
<li>Wrong province ("ON" → "BC")</li>
</ul>
<hr />
<p><strong>Strategy 2: Re-geocode with Better Provider</strong></p>
<ol>
<li>Configure API keys for Mapbox or Google (ask admin)</li>
<li>Select low-confidence locations</li>
<li>Click <strong>"Geocode Selected"</strong> (bulk action)</li>
<li>System retries with all available providers</li>
</ol>
<hr />
<p><strong>Strategy 3: Manually Place Locations</strong></p>
<ol>
<li>Filter locations with confidence &lt; 0.5</li>
<li>Edit each location</li>
<li>Find correct position on map (use satellite view)</li>
<li>Drag pin to correct location</li>
<li>Save</li>
</ol>
<hr />
<p><strong>Strategy 4: Use NAR Data (Canada Only)</strong></p>
<p>NAR data includes pre-geocoded coordinates with very high accuracy. If you imported from CSV and have poor geocoding, consider switching to NAR import.</p>
<hr />
<h2 id="organizing-volunteer-shifts">Organizing Volunteer Shifts<a class="headerlink" href="#organizing-volunteer-shifts" title="Permanent link">&para;</a></h2>
<h3 id="what-is-a-shift">What is a Shift?<a class="headerlink" href="#what-is-a-shift" title="Permanent link">&para;</a></h3>
<p>A <strong>shift</strong> is a scheduled volunteer canvassing session. Shifts have:</p>
<ul>
<li><strong>Title</strong>: Name of the canvass (e.g., "Saturday Morning Canvass - Ward 5")</li>
<li><strong>Start/End Time</strong>: When volunteers should arrive and finish</li>
<li><strong>Cut Assignment</strong>: Which area to canvass (optional but recommended)</li>
<li><strong>Max Signups</strong>: Capacity limit (0 = unlimited)</li>
<li><strong>Meeting Location</strong>: Where volunteers meet before canvassing</li>
</ul>
<p><strong>Why shifts matter:</strong></p>
<ul>
<li><strong>Coordinate volunteers</strong>: Everyone knows when and where to show up</li>
<li><strong>Track assignments</strong>: Volunteers see "their" shifts in portal</li>
<li><strong>Enable canvassing</strong>: Volunteers can only start canvass sessions if they have a shift</li>
<li><strong>Measure progress</strong>: See which shifts generated most visits</li>
</ul>
<h3 id="creating-a-shift">Creating a Shift<a class="headerlink" href="#creating-a-shift" title="Permanent link">&para;</a></h3>
<p><strong>To create a shift:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Shifts</strong></li>
<li>Click <strong>"Create Shift"</strong></li>
<li>Fill in shift details (see below)</li>
<li>Click <strong>"Create"</strong></li>
</ol>
<p><strong>Shift fields:</strong></p>
<p><strong>Title</strong> (required):</p>
<ul>
<li>Descriptive name</li>
<li>Include date, time, and area</li>
<li>Example: "Saturday Morning Canvass - Ward 5"</li>
</ul>
<p><strong>Description</strong> (optional):</p>
<ul>
<li>Additional details for volunteers</li>
<li>Example: "Bring water, comfortable shoes. We'll provide clipboards and walk sheets."</li>
</ul>
<p><strong>Start Time</strong> (required):</p>
<ul>
<li>Date and time picker</li>
<li>When volunteers should arrive</li>
</ul>
<p><strong>End Time</strong> (required):</p>
<ul>
<li>Expected end time</li>
<li>Helps volunteers plan their day</li>
</ul>
<p><strong>Cut</strong> (optional but recommended):</p>
<ul>
<li>Select which cut to canvass</li>
<li>Volunteers assigned to this shift will see this cut in their portal</li>
<li>Shifts without cuts cannot be canvassed</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Cut Assignment Required for Canvassing</p>
<p>Volunteers can only start canvass sessions for shifts assigned to a cut. Always assign a cut unless the shift is for training or other non-canvassing purposes.</p>
</div>
<p><strong>Max Signups</strong> (optional):</p>
<ul>
<li>Capacity limit (e.g., 10 volunteers)</li>
<li>Set to 0 for unlimited</li>
<li>Useful for managing group size</li>
</ul>
<p><strong>Meeting Location</strong> (optional):</p>
<ul>
<li>Address or description of meeting point</li>
<li>Example: "Community Centre, 123 Main St" or "Corner of Main &amp; Oak"</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Create Shift form showing date/time picker, cut dropdown, capacity field, and meeting location</em></p>
<h3 id="managing-shift-signups">Managing Shift Signups<a class="headerlink" href="#managing-shift-signups" title="Permanent link">&para;</a></h3>
<p><strong>To view shift signups:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Shifts</strong></li>
<li>Click <strong>"Signups"</strong> in Actions column for a shift</li>
</ol>
<p>The signups drawer shows:</p>
<p><strong>Capacity gauge:</strong></p>
<ul>
<li>Current signups / Max signups</li>
<li>Example: "8 / 10 signups (80% full)"</li>
</ul>
<p><strong>Signup list:</strong></p>
<ul>
<li>Volunteer name</li>
<li>Email</li>
<li>Role (USER or TEMP)</li>
<li>Signup date</li>
<li>Actions: Remove signup, upgrade TEMP to USER</li>
</ul>
<p><strong>Signup sources:</strong></p>
<ol>
<li><strong>Public signup form</strong> (<code>/shifts</code> page):</li>
<li>Anyone can sign up</li>
<li>Creates TEMP user account automatically</li>
<li>
<p>Sends confirmation email</p>
</li>
<li>
<p><strong>Admin-added</strong>:</p>
</li>
<li>You manually add volunteers</li>
<li>
<p>Select existing users or create new</p>
</li>
<li>
<p><strong>Volunteer portal</strong>:</p>
</li>
<li>USER-role volunteers sign up themselves</li>
<li>See <strong>My Shifts</strong> page in their portal</li>
</ol>
<p><strong>Screenshot placeholder</strong>: <em>Shift Signups drawer showing capacity gauge and signup list</em></p>
<h3 id="adding-volunteers-to-a-shift">Adding Volunteers to a Shift<a class="headerlink" href="#adding-volunteers-to-a-shift" title="Permanent link">&para;</a></h3>
<p><strong>To manually add a volunteer:</strong></p>
<ol>
<li>Click <strong>"Signups"</strong> for the shift</li>
<li>Click <strong>"Add Volunteer"</strong></li>
<li>Select existing user from dropdown (or click "Create New User")</li>
<li>Click <strong>"Add"</strong></li>
</ol>
<p><strong>Upgrading TEMP users to USER:</strong></p>
<p>After a TEMP user attends their first shift:</p>
<ol>
<li>Open shift signups</li>
<li>Find the TEMP user</li>
<li>Click <strong>"Upgrade to USER"</strong></li>
<li>Confirm</li>
</ol>
<p>This gives them full canvassing access for future shifts.</p>
<h3 id="emailing-shift-volunteers">Emailing Shift Volunteers<a class="headerlink" href="#emailing-shift-volunteers" title="Permanent link">&para;</a></h3>
<p><strong>To email all volunteers in a shift:</strong></p>
<ol>
<li>Click <strong>"Signups"</strong> for the shift</li>
<li>Click <strong>"Email All"</strong></li>
<li>Compose email:</li>
<li>Subject</li>
<li>Body (HTML supported)</li>
<li>Variables: <code>{{NAME}}</code>, <code>{{SHIFT_TITLE}}</code>, <code>{{SHIFT_START}}</code>, <code>{{MEETING_LOCATION}}</code></li>
<li>Click <strong>"Send"</strong></li>
</ol>
<p><strong>Common email scenarios:</strong></p>
<p><strong>Reminder (day before shift):</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Subject: Reminder: Tomorrow&#39;s Canvass - {{SHIFT_TITLE}}
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>Hi {{NAME}},
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>This is a reminder about tomorrow&#39;s canvass:
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>
</span><span id="__span-1-7"><a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>Shift: {{SHIFT_TITLE}}
</span><span id="__span-1-8"><a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>Time: {{SHIFT_START}}
</span><span id="__span-1-9"><a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a>Meeting Point: {{MEETING_LOCATION}}
</span><span id="__span-1-10"><a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a>
</span><span id="__span-1-11"><a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a>Please arrive 10 minutes early. We&#39;ll provide walk sheets and materials.
</span><span id="__span-1-12"><a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a>
</span><span id="__span-1-13"><a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a>Looking forward to seeing you there!
</span></code></pre></div>
<p><strong>Cancellation (weather, etc.):</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>Subject: CANCELLED: {{SHIFT_TITLE}}
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>Hi {{NAME}},
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>Unfortunately, we need to cancel tomorrow&#39;s canvass due to severe weather.
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a>We&#39;ll reschedule and send you a new date soon. Thank you for your understanding.
</span></code></pre></div>
<p><strong>Follow-up (after shift):</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>Subject: Thank you for canvassing!
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>Hi {{NAME}},
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>Thank you for participating in {{SHIFT_TITLE}}! Your efforts made a real difference.
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>Together, we knocked on [X] doors and spoke with [Y] residents.
</span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>
</span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>See you at the next shift!
</span></code></pre></div>
<p><strong>Screenshot placeholder</strong>: <em>Email Shift Volunteers modal showing subject, body editor, and variable buttons</em></p>
<hr />
<h2 id="generating-walk-sheets">Generating Walk Sheets<a class="headerlink" href="#generating-walk-sheets" title="Permanent link">&para;</a></h2>
<h3 id="what-is-a-walk-sheet">What is a Walk Sheet?<a class="headerlink" href="#what-is-a-walk-sheet" title="Permanent link">&para;</a></h3>
<p>A <strong>walk sheet</strong> is a printed list of addresses for door-to-door canvassing. It includes:</p>
<ul>
<li>Cut name and statistics</li>
<li>QR code (volunteers scan to start canvass session)</li>
<li>List of addresses in walking order</li>
<li>Fields for volunteers to record outcomes</li>
</ul>
<h3 id="walk-sheet-settings">Walk Sheet Settings<a class="headerlink" href="#walk-sheet-settings" title="Permanent link">&para;</a></h3>
<p><strong>To configure walk sheet defaults:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Map Settings</strong></li>
<li>Scroll to <strong>"Walk Sheet Configuration"</strong></li>
<li>Set:</li>
<li><strong>Header Text</strong>: Organization name, campaign info</li>
<li><strong>Footer Text</strong>: Contact info, instructions</li>
<li><strong>Include QR Code</strong>: Toggle ON/OFF</li>
<li><strong>QR Code Size</strong>: Small, medium, large</li>
<li><strong>Instructions</strong>: How to use the walk sheet</li>
</ol>
<p><strong>Example header:</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>Community Action Network
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>Fall 2024 Canvass
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>Contact: organizer@example.com | (555) 123-4567
</span></code></pre></div>
<p><strong>Example footer:</strong></p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>Record outcomes: NH (Not Home), R (Refused), SW (Spoke With), S1-S4 (Support Level)
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>Return completed walk sheets to the office by end of week.
</span></code></pre></div>
<p><strong>Screenshot placeholder</strong>: <em>Map Settings page showing walk sheet configuration section</em></p>
<h3 id="generating-a-walk-sheet">Generating a Walk Sheet<a class="headerlink" href="#generating-a-walk-sheet" title="Permanent link">&para;</a></h3>
<p><strong>To generate a walk sheet for a cut:</strong></p>
<ol>
<li>Navigate to <strong>Canvass &gt; Walk Sheet</strong></li>
<li>Select cut from dropdown</li>
<li>Click <strong>"Generate"</strong></li>
<li>Review PDF preview</li>
<li>Click <strong>"Print"</strong> or <strong>"Download PDF"</strong></li>
</ol>
<p><strong>OR:</strong></p>
<ol>
<li>Navigate to <strong>Map &gt; Locations</strong></li>
<li>Filter to specific cut</li>
<li>Click <strong>"Walk Sheet"</strong> button (top-right)</li>
</ol>
<p><strong>Walk sheet contents:</strong></p>
<p><strong>Page 1:</strong></p>
<ul>
<li>Header (from settings)</li>
<li>Cut name and statistics:</li>
<li>Total locations</li>
<li>Last visit summary</li>
<li>Completion percentage</li>
<li>QR code (links to <code>/volunteer/canvass/[cutId]</code>)</li>
<li>Instructions (from settings)</li>
<li>Cut map (small overview map)</li>
</ul>
<p><strong>Subsequent pages:</strong></p>
<ul>
<li>Address table:</li>
<li>Street address</li>
<li>Unit count (if apartment building)</li>
<li>Last visit date (if previously canvassed)</li>
<li>Last outcome (if previously canvassed)</li>
<li>Blank fields for volunteers to fill:<ul>
<li>Date visited</li>
<li>Outcome</li>
<li>Support level</li>
<li>Notes</li>
</ul>
</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Walk sheet PDF showing header, QR code, map, and address table</em></p>
<h3 id="walking-order-optimization">Walking Order Optimization<a class="headerlink" href="#walking-order-optimization" title="Permanent link">&para;</a></h3>
<p>Walk sheets sort addresses in <strong>walking order</strong> to minimize backtracking.</p>
<p><strong>Algorithm:</strong></p>
<ol>
<li>Start at center of cut</li>
<li>Find nearest unvisited address</li>
<li>Move to that address</li>
<li>Repeat until all addresses covered</li>
</ol>
<p>This creates an efficient route similar to the GPS route in the volunteer portal.</p>
<h3 id="using-walk-sheets-in-the-field">Using Walk Sheets in the Field<a class="headerlink" href="#using-walk-sheets-in-the-field" title="Permanent link">&para;</a></h3>
<p><strong>Distribute to volunteers:</strong></p>
<ol>
<li>Print one walk sheet per volunteer (or per pair, if canvassing in pairs)</li>
<li>Bring clipboards and pens</li>
<li>Brief volunteers on how to record outcomes</li>
</ol>
<p><strong>Volunteers record:</strong></p>
<ul>
<li>Date visited</li>
<li>Outcome code (NH, R, SW, etc.)</li>
<li>Support level (S1-S4 if spoke with)</li>
<li>Notes (brief comments)</li>
</ul>
<p><strong>After the canvass:</strong></p>
<ol>
<li>Collect completed walk sheets</li>
<li>Enter data into system (or scan QR code during canvass for automatic recording)</li>
</ol>
<hr />
<h2 id="monitoring-canvass-progress">Monitoring Canvass Progress<a class="headerlink" href="#monitoring-canvass-progress" title="Permanent link">&para;</a></h2>
<h3 id="canvass-dashboard">Canvass Dashboard<a class="headerlink" href="#canvass-dashboard" title="Permanent link">&para;</a></h3>
<p><strong>To view overall canvass progress:</strong></p>
<ol>
<li>Navigate to <strong>Canvass &gt; Dashboard</strong></li>
</ol>
<p>The dashboard shows:</p>
<p><strong>Statistics cards:</strong></p>
<ul>
<li><strong>Active sessions</strong>: Volunteers currently canvassing</li>
<li><strong>Total visits today</strong>: Doors knocked today</li>
<li><strong>Completed sessions</strong>: Finished sessions today</li>
<li><strong>Average session duration</strong>: Time spent canvassing</li>
</ul>
<p><strong>Activity feed:</strong></p>
<ul>
<li>Real-time stream of visits</li>
<li>Shows: Volunteer name, address, outcome, timestamp</li>
<li>Updates every 30 seconds</li>
</ul>
<p><strong>Cut progress table:</strong></p>
<ul>
<li>Progress by cut (% of locations visited)</li>
<li>Session count per cut</li>
<li>Visit count per cut</li>
<li>Click cut name to view details</li>
</ul>
<p><strong>Leaderboard:</strong></p>
<ul>
<li>Top volunteers by visit count</li>
<li>Session count</li>
<li>Success rate (% SPOKE_WITH outcomes)</li>
</ul>
<p><strong>Screenshot placeholder</strong>: <em>Canvass Dashboard showing stats cards, activity feed, cut progress table, and leaderboard</em></p>
<h3 id="cut-level-progress">Cut-Level Progress<a class="headerlink" href="#cut-level-progress" title="Permanent link">&para;</a></h3>
<p><strong>To view progress for a specific cut:</strong></p>
<ol>
<li>Navigate to <strong>Canvass &gt; Dashboard</strong></li>
<li>Click cut name in cut progress table</li>
</ol>
<p><strong>Cut detail view shows:</strong></p>
<ul>
<li><strong>Completion gauge</strong>: % of locations visited</li>
<li><strong>Outcome breakdown</strong>: Pie chart of outcomes (NOT_HOME, REFUSED, SPOKE_WITH, etc.)</li>
<li><strong>Support levels</strong>: Count of LEVEL_1 through LEVEL_4</li>
<li><strong>Visit history</strong>: Recent visits in this cut</li>
<li><strong>Active sessions</strong>: Volunteers currently canvassing this cut</li>
</ul>
<p><strong>Export cut data:</strong></p>
<ul>
<li>Click <strong>"Export CSV"</strong> to download all visits for this cut</li>
<li>Use for analysis, reporting, follow-up planning</li>
</ul>
<h3 id="session-monitoring">Session Monitoring<a class="headerlink" href="#session-monitoring" title="Permanent link">&para;</a></h3>
<p><strong>To view active canvass sessions:</strong></p>
<ol>
<li>Navigate to <strong>Canvass &gt; Dashboard</strong></li>
<li>Scroll to <strong>"Active Sessions"</strong> section</li>
</ol>
<p><strong>Each active session shows:</strong></p>
<ul>
<li>Volunteer name</li>
<li>Cut being canvassed</li>
<li>Start time</li>
<li>Visit count</li>
<li>Last activity (how long since last visit)</li>
</ul>
<p><strong>Warning signs:</strong></p>
<ul>
<li>⚠️ No activity for &gt; 30 minutes (volunteer may be stuck or abandoned session)</li>
<li>⚠️ Very low visit rate (volunteer may need help)</li>
</ul>
<p><strong>Actions:</strong></p>
<ul>
<li>Contact volunteer to check in</li>
<li>Manually end session if abandoned</li>
</ul>
<hr />
<h2 id="data-analysis-and-reporting">Data Analysis and Reporting<a class="headerlink" href="#data-analysis-and-reporting" title="Permanent link">&para;</a></h2>
<h3 id="outcome-analysis">Outcome Analysis<a class="headerlink" href="#outcome-analysis" title="Permanent link">&para;</a></h3>
<p><strong>To understand canvassing results:</strong></p>
<ol>
<li>Navigate to <strong>Canvass &gt; Dashboard</strong></li>
<li>View <strong>Outcome Breakdown</strong> chart</li>
</ol>
<p><strong>Outcome categories:</strong></p>
<ul>
<li><strong>NOT_HOME</strong>: Nobody answered (typical: 40-60% of visits)</li>
<li><strong>REFUSED</strong>: Refused to talk (typical: 5-15%)</li>
<li><strong>SPOKE_WITH</strong>: Had a conversation (typical: 20-40%)</li>
<li><strong>MOVED_AWAY</strong>: Resident moved (typical: 2-5%)</li>
<li><strong>WRONG_ADDRESS</strong>: Address doesn't exist (typical: 1-3%)</li>
<li><strong>DO_NOT_CONTACT</strong>: Requested no contact (typical: &lt; 1%)</li>
<li><strong>OTHER</strong>: Other situation (typical: &lt; 5%)</li>
</ul>
<p><strong>Interpreting outcomes:</strong></p>
<p><strong>High NOT_HOME rate (&gt; 60%):</strong></p>
<ul>
<li>Canvassing at wrong time (try evenings or weekends)</li>
<li>Multi-unit buildings (hard to access)</li>
</ul>
<p><strong>High REFUSED rate (&gt; 20%):</strong></p>
<ul>
<li>Issue is unpopular or controversial</li>
<li>Volunteers may need better training on approach</li>
<li>Consider different messaging</li>
</ul>
<p><strong>Low SPOKE_WITH rate (&lt; 20%):</strong></p>
<ul>
<li>See above (related to NOT_HOME and REFUSED)</li>
<li>Canvassing at wrong time</li>
<li>Poor volunteer approach</li>
</ul>
<p><strong>High WRONG_ADDRESS (&gt; 5%):</strong></p>
<ul>
<li>Data quality issues</li>
<li>Need to clean location database</li>
</ul>
<h3 id="support-level-analysis">Support Level Analysis<a class="headerlink" href="#support-level-analysis" title="Permanent link">&para;</a></h3>
<p><strong>To understand voter sentiment:</strong></p>
<ol>
<li>View <strong>Support Levels</strong> on Canvass Dashboard</li>
</ol>
<p><strong>Support level breakdown:</strong></p>
<ul>
<li><strong>LEVEL_1</strong> (Strong support): Target for GOTV (Get Out The Vote)</li>
<li><strong>LEVEL_2</strong> (Leaning support): Persuasion targets</li>
<li><strong>LEVEL_3</strong> (Undecided): Persuasion targets</li>
<li><strong>LEVEL_4</strong> (Opposition): Deprioritize future contact</li>
</ul>
<p><strong>Targeting strategy:</strong></p>
<p><strong>For GOTV:</strong></p>
<ul>
<li>Focus on LEVEL_1 (strong support)</li>
<li>Ensure they vote (door knock day before election, offer rides)</li>
</ul>
<p><strong>For persuasion:</strong></p>
<ul>
<li>Focus on LEVEL_2 and LEVEL_3 (undecided, leaning)</li>
<li>Provide information, answer questions, invite to events</li>
</ul>
<p><strong>For opposition:</strong></p>
<ul>
<li>LEVEL_4: Don't waste time (respect their decision)</li>
</ul>
<h3 id="volunteer-performance">Volunteer Performance<a class="headerlink" href="#volunteer-performance" title="Permanent link">&para;</a></h3>
<p><strong>To evaluate volunteer effectiveness:</strong></p>
<ol>
<li>View <strong>Leaderboard</strong> on Canvass Dashboard</li>
</ol>
<p><strong>Metrics:</strong></p>
<ul>
<li><strong>Visit count</strong>: Total doors knocked</li>
<li><strong>Session count</strong>: Number of canvassing sessions</li>
<li><strong>Success rate</strong>: % of visits that resulted in SPOKE_WITH outcome</li>
<li><strong>Average session duration</strong>: Time spent canvassing</li>
</ul>
<p><strong>Identifying top performers:</strong></p>
<ul>
<li>High visit count + high success rate = Star volunteer (recognize publicly, ask to mentor others)</li>
<li>High visit count + low success rate = May be rushing (provide feedback)</li>
<li>Low visit count + high success rate = Quality over quantity (consider assigning harder areas)</li>
</ul>
<p><strong>Coaching opportunities:</strong></p>
<ul>
<li>Low success rate: Offer training on approach, scripting</li>
<li>Short sessions: Ask why (time constraints? Lack of confidence?)</li>
<li>High REFUSED rate: Review volunteer's approach (too pushy? Poor messaging?)</li>
</ul>
<hr />
<h2 id="troubleshooting">Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="geocoding-issues">Geocoding Issues<a class="headerlink" href="#geocoding-issues" title="Permanent link">&para;</a></h3>
<p><strong>Issue: Many locations ungeocoded after import</strong></p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Review ungeocoded addresses (Data Quality &gt; Export Ungeocoded)</li>
<li>Fix typos and re-import</li>
<li>Configure additional geocoding API keys (Mapbox, Google)</li>
<li>Manually place locations on map</li>
</ol>
<hr />
<p><strong>Issue: Locations geocoded to wrong area</strong></p>
<p><strong>Symptoms:</strong> Locations appear far from where they should be</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Check confidence score (likely low confidence)</li>
<li>Edit location and manually place on map</li>
<li>Re-geocode with better provider (if API key available)</li>
</ol>
<hr />
<h3 id="cut-issues">Cut Issues<a class="headerlink" href="#cut-issues" title="Permanent link">&para;</a></h3>
<p><strong>Issue: Locations not assigning to cut</strong></p>
<p><strong>Symptoms:</strong> Locations inside polygon not assigned after cut creation</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Verify polygon is properly closed (check vertices)</li>
<li>Check for very complex polygons (may hit algorithm limits)</li>
<li>Manually assign locations using bulk action</li>
</ol>
<hr />
<p><strong>Issue: Overlapping cuts</strong></p>
<p><strong>Symptoms:</strong> Some locations assigned to wrong cut</p>
<p><strong>Cause:</strong> Multiple cuts cover the same area</p>
<p><strong>Solution:</strong></p>
<ul>
<li>Locations can only belong to one cut</li>
<li>Later cuts override earlier assignments</li>
<li>Redraw cuts to avoid overlap, OR</li>
<li>Accept overlap and use manual assignment for edge cases</li>
</ul>
<hr />
<h3 id="shift-issues">Shift Issues<a class="headerlink" href="#shift-issues" title="Permanent link">&para;</a></h3>
<p><strong>Issue: Volunteer cannot start canvass session</strong></p>
<p><strong>Symptoms:</strong> "No active shift found" error</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Verify shift date is today</li>
<li>Verify volunteer is signed up for shift</li>
<li>Verify shift has a cut assigned (required for canvassing)</li>
<li>Verify volunteer role is USER (not TEMP)</li>
</ol>
<hr />
<p><strong>Issue: Shift signups not appearing</strong></p>
<p><strong>Symptoms:</strong> Public signup form doesn't show shift</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Check shift start time (past shifts don't appear)</li>
<li>Check max signups (if full, shift is hidden)</li>
<li>Check feature toggle (Settings &gt; Allow Public Shift Signup must be ON)</li>
</ol>
<hr />
<h3 id="canvassing-issues">Canvassing Issues<a class="headerlink" href="#canvassing-issues" title="Permanent link">&para;</a></h3>
<p><strong>Issue: Walking route not updating</strong></p>
<p><strong>Symptoms:</strong> Route doesn't change after completing visits</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Route updates every 30 seconds (wait a moment)</li>
<li>Refresh volunteer's map (pull down)</li>
<li>Check internet connection (route calculation requires server)</li>
</ol>
<hr />
<p><strong>Issue: Visit won't save</strong></p>
<p><strong>Symptoms:</strong> Volunteer reports "Save Visit" doesn't work</p>
<p><strong>Solutions:</strong></p>
<ol>
<li>Check internet connection (visits save to server)</li>
<li>Verify outcome is selected (required field)</li>
<li>Check for abandoned session (volunteer may need to start new session)</li>
</ol>
<hr />
<h2 id="related-documentation">Related Documentation<a class="headerlink" href="#related-documentation" title="Permanent link">&para;</a></h2>
<ul>
<li><strong><a href="../admin-guide/">Admin Guide</a></strong>: Full administrator guide (includes map management)</li>
<li><strong><a href="../volunteer-guide/">Volunteer Guide</a></strong>: Guide for volunteers using canvassing portal</li>
<li><strong><a href="../features/map.md">Map Module</a></strong>: Technical documentation on locations, geocoding, cuts</li>
<li><strong><a href="../features/canvassing.md">Canvassing System</a></strong>: Technical documentation on canvass sessions and GPS tracking</li>
<li><strong><a href="../api/map.md">API Reference</a></strong>: Map API endpoints</li>
</ul>
<hr />
<p><strong>Last updated</strong>: February 2026 (V2 complete)</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../campaign-manager-guide/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Campaign Manager Guide">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
Previous
</span>
<div class="md-ellipsis">
Campaign Manager Guide
</div>
</div>
</a>
<a href="../content-editor-guide/" class="md-footer__link md-footer__link--next" aria-label="Next: Content Editor Guide">
<div class="md-footer__title">
<span class="md-footer__direction">
Next
</span>
<div class="md-ellipsis">
Content Editor Guide
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright &copy; 2024 The Bunker Operations <a href="#__consent">Change cookie settings</a>
</div>
</div>
<div class="md-social">
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M536.4-26.3c9.8-3.5 20.6-1 28 6.3s9.8 18.2 6.3 28l-178 496.9c-5 13.9-18.1 23.1-32.8 23.1-14.2 0-27-8.6-32.3-21.7l-64.2-158c-4.5-11-2.5-23.6 5.2-32.6l94.5-112.4c5.1-6.1 4.7-15-.9-20.6s-14.6-6-20.6-.9l-112.4 94.3c-9.1 7.6-21.6 9.6-32.6 5.2L38.1 216.8c-13.1-5.3-21.7-18.1-21.7-32.3 0-14.7 9.2-27.8 23.1-32.8z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.expand", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.sections", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../../../javascripts/home.js"></script>
<script src="../../../javascripts/github-widget.js"></script>
<script src="../../../javascripts/gitea-widget.js"></script>
<script src="../../../assets/js/env-config.js"></script>
<script src="../../../assets/js/video-player.js"></script>
</body>
</html>