Skip to content
PolitiWardCalgary

About PolitiWard

A non-partisan, reproducible record of Calgary municipal politics, built from public data.

How the data are put together

People

Each source spells names its own way: 2013 ballots read “Nenshi, Naheed K.”, 2021 ballots read “JYOTI GONDEK”, and vote records use “Mayor J. Gondek”. Names are reduced to keys made of a given name (or nickname) and a surname; spellings sharing a key are one person. Council-vote names are only linked to people who held a seat on the vote date, so citizen members of committees stay unlinked. A short, sourced override file handles name changes (Kourtney Branagan → Kourtney Penner) and legal names (Rajdeep → Raj Dhaliwal). Council terms and voting periods begin on the published swearing-in dates, rather than election day. Departure dates come from sourced overrides; on a transition day, an actual recorded vote identifies the member occupying the seat for that resolution.

Elections

Station-level results are summed to candidate totals and checked against official voter counts. The 2013 station file omits a few stations, so 2013 totals come from the official summary. Votes cast at city-wide stations (advance, hospital, mail-in) cannot be assigned to a ward and are shown separately; the neighbourhood maps (2017 onward) place each election-day station's votes in the voting subdivision it serves, so they cover election-day ballots only. 2010 results are the official report's totals by ward; no station results were published. The City publishes no boundary file for the 2010 wards (replaced for 2013 by Bylaw 40M2011), but its April 2010 civic census by ward carries each ward's polygon and its count of eligible electors; those give the 2010 maps and an estimated turnout (valid mayoral votes, or council-race votes in a ward, against the census electors), 53.3% city-wide against the widely reported 53%. Incumbency comes from the official results for 2010, 2013 and 2017, and from the previous election's winners for 2021 and 2025; a race with a single candidate and no votes is counted as acclaimed. By-elections (school trustee seats in 2015 and 2025; no council seat has gone to a by-election since 2010) are listed separately and take no part in incumbency. The 2021 ballot questions and Senate nominee election count Calgary's votes only; the provincial questions were decided province-wide.

Turnout by ward

Ward turnout uses ballots cast in the councillor race. Electors per ward are official for 2013; for 2010 they are the eligible electors counted in the City's April 2010 civic census; the 2017 report's ward totals do not reconcile with the city total, so only their shares are used; for 2021 and 2025 the city's enumerated electors are apportioned by each ward's population aged 15+ (2021 census). City-wide turnout is the official figure in every year but 2010.

Council votes

The published electronic dataset begins in October 2020 (committees) and January 2021 (Council), one row per member per resolution with no motion identifier, so motions are rebuilt from meeting, text and result. Topics and motion types (procedural, amendment, bylaw reading, main motion) come from transparent keyword rules (etl/topics.py); a motion whose text names no subject (“That Bylaw 71M2021 be read a third time”) takes the topic of other votes on the same report or bylaw. Absences are rarely recorded, so participation treats a missing vote as not participating. Agreement and the voting map exclude procedural motions. Each vote's page link is keyed by its meeting, text and result, so it survives data refreshes. Lists shorten each resolution by dropping the standard opening (“That with respect to Report …, the following be adopted: That Council:”); the vote's own page shows the full text.

Earlier Council votes come from the confirmed minutes, from the 2010 council's first meeting on October 25, 2010 to the end of 2020. The yearly minutes PDFs are read for roll calls (“For: …”, “Against: …”, then the result), with the motion text that precedes them; surnames are linked to the member seated that day. Motions carried without a roll call, and those that list only the members opposed, name no one's vote and are left out. A roll call is used only when its lists read through to the printed result and, from 2017, match the member counts printed with them; a member listed on both sides (a clerical error) counts as neither. Each vote links to its page in the minutes.

Conduct and accountability

Integrity Commissioner findings of a code of conduct breach, Council's sanctions, expense reviews and the 2024 recall petition are recorded from Council's own resolutions and the City's published reports, in their wording, each linked to the recorded vote and report. The City publishes only investigations that found a breach, so a member with no entry may still have been the subject of a complaint. The code of conduct was repealed in May 2025.

Office spending and pay

The City Clerk publishes a budget and expenditure report for each ward office and the Mayor's office every quarter, cumulative for the calendar year. The reports are text PDFs, read by column position; each is checked (budget − spent = variance, itemized lines ≤ spent, every amount read). Spent includes staff salaries, which the City does not itemize, so itemized spending is the office's other spending. Account codes are grouped into eight categories in etl/load_spending.py. Reports are linked to whoever held the seat that year. Pay is the base salary from the Office of the Councillors' compensation summary.

Campaign finance

Disclosure statements are scanned images. They are read with OCR, and each statement's totals are tested against the form's own arithmetic (net contributions = lines 1 + 2 − 3, revenue = lines 4 + 9, and so on); totals that pass are marked Checked. Many forms are filled in by hand, which OCR cannot read reliably, so for every mayoral candidate in the top five and every council winner the totals were read from the scan by a reviewer and re-tested the same way. A misread can still balance (a $ sign read as a 5 on two lines), so totals that cannot all be true are discarded: contributions larger than total revenue, revenue and spending more than tenfold apart on a statement that runs past election day, or a sum beyond any Calgary campaign. Every final statement caught this way has been read from the scan instead. Contributor listings were transcribed from the scans for the leading mayoral candidates and, in 2025, for every council winner and runner-up (one runner-up filed no listing); each is checked against the form's itemized total, and any difference is explained by the statement itself (a redacted name, a listing that runs past the year). Other listings come from OCR with validation (subtotal lines and stamp text removed, amounts above the legal limit treated as unreadable); expect some misspellings and a few misread amounts. Party and third-party statements use other forms that OCR cannot separate from their text, so their totals and every listed contributor were transcribed from the scans; each listing adds up to the form's itemized total except Communities First's 2025 listing, which runs into January 2026 and exceeds it by $22,310.50. The seven statements from the January 2025 Catholic school trustee by-election were transcribed in full, listings included; they appear with the by-election's results and on each candidate's page, while the Funding page compares general elections. Every figure links to its PDF. Contributors are grouped across statements by name: spellings that differ only in ways OCR produces (an I read as l, rn as m, a doubled letter, a company name cut off by the column edge) count as one contributor, while genuine spelling differences (Stewart and Steward, Diana and Diane) stay apart. Two people who share a name are combined. Contributor pages request exclusion from search engines; that request does not restrict access or guarantee removal.

Limits to keep in mind

Measured data quality
  • Election results start in 2010, the earliest year Elections Calgary publishes official results online. Council votes before 2021 are readable roll calls printed in the minutes; later records use the published electronic dataset and selected verified public-hearing roll calls. Other gaps remain.
  • Ward boundaries changed in 2013, 2017 and 2021. A ward number does not cover the same neighbourhoods across those years; each ward page shows its earlier shapes and how much of today's ward they covered, by land area rather than population.
  • Ward profile (census) data describe the 2021–2025 boundaries only, so the Explore page compares them with the 2021 and 2025 elections.
  • Corporate and union contributions to municipal candidates were legal for 2017, banned from January 1, 2019 through the 2021 election, and allowed again in 2024 (Bill 20) for 2025. Organization gifts on 2021 statements may include 2018 donations from before the ban, or names misread or misclassified as companies. Inferred donor types do not establish legal compliance.
  • Local political parties were first permitted in Calgary for the 2025 election; party affiliation is as listed on that ballot.
  • Before 2021, a member's vote is on record only for roll calls, which a member requests and which are mostly contested votes; agreement and dissent figures for those councils describe roll calls, not every decision. A member missing from a roll call was absent or did not vote. About 1% of printed roll calls could not be read completely and are left out rather than guessed.
  • Census data offered only female and male categories; the dashboard reports them as published.
  • Patterns across 14 wards are ecological: they describe places, not how any individual voted.

Project

Started as a CPSC 471 database project at the University of Calgary and extended into a city-wide political tracker.

Database loaded Nov 7, 2026 at 21:48 UTC. The load time records when the database was built, not when sources were updated.

Sources

DatasetPublisher
Ward and Mayor's office budget and expenditure reports, 2021 onwardCity of Calgary, City Clerk's Office
Councillor duties, compensation and benefits (council pay)City of Calgary, Office of the Councillors
Election results by voting station, 2013, 2017, 2021, 2025City of Calgary Open Data (datasets fhmw-xp86, atsy-3a4w, kiuh-sx23, gqvk-p23x)
2010 general election official results (by ward, with incumbent and acclamation markers)Elections Calgary (PDF; read by etl/extract_results_2010.py)
By-election results: 2015 Calgary Board of Education (Wards 11 & 13)Elections Calgary
By-election results: 2025 Calgary Catholic School District (Wards 4 & 7, 11 & 12)City of Calgary Open Data (fydv-pihp, vkin-p7cs)
Official results summaries with incumbent and acclamation flags, 2013 and 2017City of Calgary Open Data (ibk8-8j45, wfy7-ea5g)
2018 Olympic plebiscite results by voting stationCity of Calgary Open Data (c683-z2p7)
2021 ballot questions (fluoride, equalization, daylight saving time) and Senate nominee electionCity of Calgary Open Data (h2nm-bsrz, snnx-73ca)
Council and Committee VotesCity of Calgary Open Data (ruq3-99hx), electronic votes from Oct. 2020
Confirmed Council minutes, 2010–2020 (roll call votes)City of Calgary, City Clerk's Office (yearly PDFs, read by etl/extract_minutes_votes.py)
Integrity Commissioner reports with a finding of breach, and the repeal of the code of conduct (May 2025)City of Calgary, Integrity and Ethics Office
Ward boundaries for each electoral eraCity of Calgary Open Data (mjit-gete, au4g-xjwh, bxgr-t8xb, tz8z-hyaz)
2010 ward boundaries and eligible electors by ward (Census By Ward 2010)City of Calgary Open Data (fbu6-4bnu)
Communities by WardCity of Calgary Open Data (jd78-wxjp)
Official turnout and voter statisticsElections Calgary results pages and 2013/2017 final turnout reports
Campaign disclosure statements, 2017, 2021 and 2025Elections Calgary (scanned PDFs, read by OCR)
Campaign disclosure statements, 2025 Calgary Catholic School District by-electionElections Calgary (scanned PDFs, transcribed)
Ward population, age and sex, labour force (2021 census) and household income (2016 census)City of Calgary Open Data: census tabulated by ward (k4pr-cznc, b5q8-82zn, wj3a-wgmh)
Ward education and commuting (2021 census)City of Calgary ward profiles
Community services, recreation facilities and transit stopsCity of Calgary Open Data (x34e-bcjz, hxfu-6d96, muzh-c9qc)
Contains information licensed under the Open Government Licence – City of Calgary. PolitiWard is an independent project; the City does not endorse these analyses. Other sources retain their own terms.

Policy positions, comparisons and compass

Issue positions use a reviewed selection of decisions, not the number of Yes votes in a keyword topic. Each decision explains its alternatives, what Yes and No meant, and its source. A reviewer explicitly assigns the direction of a comparable choice on a narrowly defined policy measure.

The score is 50 × (1 + the mean of signed choices): zero means all reviewed choices favoured the low-labelled policy and 100 means all favoured the high-labelled policy. Within one policy package or budget, reviewed choices share one family’s weight. Each independent family then has equal weight. An amendment is unscored unless its specific meaning has been reviewed. Two independent families are required; absent and unrecorded votes contribute nothing.

The range beside a position removes one independent decision family at a time. It describes sensitivity to the selected evidence, not a statistical confidence interval, future-vote prediction or general ideological identity. Case selection and differing proposals matter. Scores across council terms can describe different decisions and must be read with their evidence dates.

Every reviewed decision explains why it was selected and how related votes are grouped. The selection ledger records the January–June 2026 H-GO application frame: ten applications explicitly mentioning H-GO in confirmed minutes, eight scored, one with differing policy-approval and final-reading votes left unscored, and one commercial-use DC proposal excluded from the residential measure. This bounded frame does not represent all land-use applications. Other policy areas remain curated selections.

The current-term coverage table counts independent families since each current member’s term began. Older career votes cannot fill those gaps. A verified continuation-day vote uses its actual date in policy histories and date filters while retaining the source meeting’s start date and original roll-call link.

The policy compass uses two chosen measure scores with fixed axes. The Council voting alignment map separately places similar voting records together using multidimensional scaling; its orientation does not establish left/right or any other ideological axes. Agreement always has a shared-vote denominator.

Recorded votes, attributed statements and campaign commitments remain distinct. Sources with only a month or year retain that precision; date filters include a statement if its possible date interval overlaps the selected range. Undated statements are excluded by date filters. A vote, Council adoption and documented implementation are separate milestones; a missing milestone is not a broken-promise finding.

Selected explicitly named public-hearing roll calls supplement gaps in the electronic snapshot and link to confirmed minutes. Other missing individual votes remain unknown, including the unnamed supporters of the 2024 citywide rezoning final reading. Sponsorship and committee roles require explicit documentation; an appointment record does not prove continued service beyond its recorded term.

Funding concentration uses readable itemized candidate gifts for the stated election scope. Party and third-party advertiser gifts remain separate. Verified organization links describe the named donor’s business activities using primary sources, without inferring personal employers or corporate families. Shared donors and similar votes do not establish influence. Missing listings and name matching affect coverage.

Inspect the policy data and scoring rationales · Explore issues · Compare politicians

Privacy, terms and corrections

PolitiWard has no accounts, advertising, analytics or cookies. It republishes public election and council records and never shows contributors' street addresses. Contributor types and identity matches are inferred from names and may be wrong; a contribution alone does not establish influence, agreement with a candidate, or unlawful conduct.

Privacy explains the 14-day server log and how disputed entries are handled; how to report a mistake; terms of use, including reuse under CC BY 4.0.

Accessibility and licences

The interface supports keyboard navigation, a skip link, labelled charts, reduced motion and tables or downloadable records for examining the figures. If a control or chart prevents access, report the page and the task you were trying to complete (see how to report a mistake on the Privacy page).

Self-hosted fonts: Barlow Semi Condensed and Public Sans (SIL Open Font License). Maps are drawn from the City of Calgary's ward and voting subdivision boundaries.