# Absentee voting — v1.3 (2026-10-14; v1.2 and v1.1 2026-10-05; v1 2026-09-30)

Absentee ballot requests, returns, acceptances and rejections for **every Maine election from November 2008 through the
June 2026 primary — 43 elections**, by town and party, built from the Secretary of State's statewide absentee voter
files (one record per absentee application; no names). Source: https://www.maine.gov/sos/elections-voting/voter-data/previous-absentee-data.

The raw files (5.5 million records in all) were aggregated straight from the SOS site; only the counts are kept here.
Each record carries the voter's town, enrollment, districts, how and when the ballot was requested, issued and
returned, and whether it was accepted or rejected — everything below is a count of those records.

| File | What it is |
|---|---|
| `absentee_by_town.csv` | One row per election × town × party (D, R, G, L, N = No Labels, U = unenrolled, `unknown`, plus `ALL`): `requested` (applications), `issued`, `returned`, `accepted`, `rejected`, `voted_in_person_absentee` (voted at the clerk's office before election day), `returned_by_mail`, `returned_drop_box` (coded only from 2026), `uocava` (military/overseas), `request_denied`. `uocava` is blank for 2008 and 2009 (no UOCAVA code in those file layouts). `unit_id` joins to every other table. 57,870 rows. |
| `absentee_statewide.csv` | The same counts for the whole state, by party and total, per election. |
| `absentee_daily_statewide.csv` | Statewide counts by day of request, issue and return, by party — the timing of early voting for every election. |
| `absentee_methods.csv` | How ballots were requested (written, electronic, telephone, in person…), issued (mailed, in person…) and returned (mail, delivered by voter, drop box, family member…) per election, using the SOS codes. |
| `absentee_reject_reasons.csv` | Why ballots were rejected, per election (BND = ballot not received by the deadline is by far the largest; ENS = envelope not signed; SBV = spoiled by voter; VIP = voted in person instead…). |
| `absentee_by_town_precinct_district.csv` | Requested / returned / accepted counts by town × ward-precinct × congressional, Senate, House and county-commissioner district as coded in the SOS file at the time — useful for district-level absentee shares under the plan in force. |
| `absentee_elections.csv` | The 43 elections with date, type, source URL, header layout, record count and the number of unparseable lines. |
| `build_absentee.py`, `aggregate_in_browser.js` | Code: `aggregate_in_browser.js` reduced each raw SOS file to counts; `build_absentee.py` built the tables (v1.1 code set). |
| `fix_v1.1_absentee.py`, `fix_v1.2_absentee.py`, `fix_v1.3_absentee.py` | The v1.1 corrections applied to the v1 tables, the v1.2 township matches applied to v1.1, and the v1.3 fixes applied to v1.2 (all re-runnable). |
| `README.md`, `FLAGS.md` | This file; known issues and judgement calls. |

**How to read the numbers.** `requested` counts applications, including the small number of duplicates and denied
requests; `returned` counts ballots that came back (a received date on the record); `accepted` is the number that
counted. In most files `rejected` includes ballots that were issued but never came back by the deadline (reason BND), so
`accepted + rejected` can exceed `returned`. **In nine files it does not** (Nov 2010, Nov 2015, Nov 2017, June 2018, Nov 2019,
Nov 2022, March 2024 and two specials); there `rejected` counts only returned ballots that were turned down. Do not compare
rejection rates across those files; see FLAGS #12. Turnout share = `accepted` ÷ total ballots cast from the election results.

**Yarmouth, November 2024:** 3,575 requests, 3,486 returned, 3,478 accepted (1,964 D / 582 R / 888 U requests).
**Statewide, November 2020:** 532,272 requests, 514,419 accepted — the pandemic high; November 2024: 388,815 / 378,760.

**Joining to election results (combined reporting units).** Absentee files code each unorganized township under its own
name, but the results sometimes report townships together. Roll the absentee rows up before joining:
Guilford (MPD-0351) + Kingsbury Plt (MPD-0352) → `MPD-0676` "Guilford / Kingsbury Plt"; Benedicta Twp (MPD-0019) +
Silver Ridge Twp (MPD-0084) → `MPD-0600`; Benedicta Twp + Sinclair Twp (MPD-0086) → `MPD-0601` where the results use it;
Sinclair Twp → Saint Agatha (MPD-0068) where results print "Saint Agatha/Sinclair"; Connor Twp (MPD-0083) → Caribou
(MPD-0022) where results print "Caribou/Connor"; Cary Twp (MPD-0023) → Hodgdon (MPD-0042) where results print
"Hodgdon/Cary Twp" (after Cary deorganized in 2019). Three more pairings show up when absentee is compared with results:
* New Canada (MPD-0058) + Cross Lake Twp, 2008–2012 and 2024.
* Webster Plt (MPD-0339) + Prentiss Twp + Kingman Twp: the 2024 referendum lines.
* Edinburg (MPD-0300). Its results exceed its registration in 1988, 2006 and 2008, and its 2004–2008 House returns are split between two districts; add the split rows before joining.

Unmatched T15 R15 Wels Twp rows belong with "Big Twenty / T15 R15" (MPD-0602) where the results combine them. Which pairing applies varies by election — use the results label
crosswalk (`results_label_crosswalk.csv`) for that election.

## What changed in v1.3 (2026-10-14)

Made by `fix_v1.3_absentee.py` (re-runnable on v1.2). No counts changed.

- **House District 121 special: the date is now 2011-08-16.** The SOS file is labelled "As of 08/19/2011", but the election was Tuesday, August 16, 2011 (results contest `2011-08-16_Special-Election_State-House_D121`). Every table now uses 2011-08-16, so the election joins to the results; the SOS label is kept in `election`.
- **The two specials without a town column now have their town.** Their ward and district codes match exactly one town's codes in the neighbouring elections:
  - April 2, 2019 (House District 52): wards 1–7, Senate 23 → **Bath** (MPD-0366).
  - February 24, 2026 (House District 94): wards 2–5, Senate 21 → **Lewiston** (MPD-0005).

  11 town rows and 45 precinct rows now carry `municipality`, `unit_id` and `unit_name`. The only rows still without a `unit_id` are the 19 rows of the 7 township spellings (FLAGS #3).
- **Documented, not changed:**
  - `rejected` means different things in different files (FLAGS #12).
  - The UOCAVA counts for 2014 are implausibly low (FLAGS #13).
  - Three more combined-unit pairings for joining to results (above).

## What changed in v1.2 (2026-10-05)

- **Three township matches confirmed by Matt** and applied (`fix_v1.2_absentee.py`): Kossuth Twp → MPD-1027 (Kossuth),
  Williamsburg Twp → MPD-1015 (Williamsburg), Long Pond Twp → MPD-1019 (Long Pond Plt). All three appear only in the June 9,
  2026 file: 6 rows of `absentee_by_town.csv` and 3 rows of `absentee_by_town_precinct_district.csv` now carry the
  `unit_id` (and `unit_name`). No counts changed. Rows still without a `unit_id`: 19 town rows (8 township spellings) plus
  the 11 rows of the two specials that have no town (FLAGS #1, #3).

## What changed in v1.1 (2026-10-05)

- **June 9, 2026 UOCAVA corrected.** v1 counted request type `WF` ("Written Immediate Family" in the SOS layout) as
  military/overseas, giving 9,475 (10.1% of requests). Recounted from the SOS file using request type UR / FPCA / FW / FWAB
  or issue type FW / FWAB: **987** statewide (870 D, 69 R, 48 U; ≈1.0% of requests, in line with other elections) —
  Portland 97, Bangor 32, Brunswick 31. Every 2026 town and statewide row recomputed; towns with no UOCAVA record are 0.
  `build_absentee.py` now drops WF and adds FWAB.
- **Retired party codes folded into `unknown`** (A 2012, PE 2021/2023, FW 2023, C 2025 — 30 town rows, 44 requests)
  in the town, statewide, daily and district tables.
- **T1 R9 Wels**: the two spellings in the June 2026 file merged into one set of rows (2 duplicate rows removed).
- **2008 and 2009 `uocava` now blank** (v1 showed 0, but those layouts have no UOCAVA request code).
- **`special_district`** filled for the January 11, 2022 (HD-27, Gorham/Scarborough) and June 13, 2023 (HD-45,
  Bremen/Bristol/Friendship/Waldoboro/Washington) specials.
- **`unit_name`** filled for 43 rows that had a `unit_id` but no name; T17 R3 Van Buren Cove matched to MPD-0614.
- 30 rows where `returned` > `issued` are flagged (FLAGS #9), not changed.
