Skip to main content
This walkthrough runs an end-to-end e-voting session: board elections, by-law changes, motion votes. It uses the VoteCollection and Vote resources. Who is this for: governance automation that needs to spin up scheduled votes (annual board elections, quarterly motion ratification), or integrations that synchronize vote outcomes back to a federation’s records.

Concepts

  • A VoteCollection is one voting session — usually one meeting, one ratification cycle, or one election. It groups one or more Vote records.
  • A Vote is a single question — “Elect Treasurer”, “Approve Article 4 amendment”. A VoteCollection can have many votes voted on together.
  • Voting can be secret (no audit trail of who voted what) or public (each ballot recorded against the voter).

Step 1 — Create the vote collection

unit determines eligibility — only active members in that unit (and any sub-units) can vote. The collection is created in DRAFT. You can add questions and edit eligibility while in DRAFT; once published, the question set is locked. Response:

Step 2 — Add questions (Votes)

For each question, set questionType: Add as many questions as the meeting needs. They appear in the order you create them.

Step 3 — Publish (members get notified)

Once questions are in place, publish:
This sends a notification to every eligible voter — push notification + email — with a link to the vote landing page. After this point, you cannot add or edit questions. You can still postpone the open/close dates.

Step 4 — Open voting

When the meeting starts (or the calendar reaches dateOpen automatically):
Members can now cast ballots via the member dashboard or POST /api/v1/votes/{id}/cast (per question). The GET /api/v1/has_live_votes endpoint returns true for any user with at least one open VoteCollection they haven’t yet voted in — your member app can use this to surface “you have unfinished votes” badges.

Step 5 — Close voting and tally

When dateClose passes (or you close it manually):
Tallying runs automatically. Results are visible immediately on the collection.
Response includes per-question results:

Step 6 — Export results

For board minutes, federation reporting, or external compliance, export the full result set as CSV:
For non-secret votes, the CSV includes each voter and their choice. For secret votes, only the aggregated counts.

Step 7 — Archive

After the results are circulated and the board minutes are signed:
Archived collections are hidden from the default listing (GET /api/v1/vote_collections) but accessible via ?status=ARCHIVED. Results remain queryable indefinitely.

Cloning for the next cycle

To run “the same election” next year, clone instead of recreating:
Copies the questions and choices into a fresh DRAFT. Update candidate names and re-publish.

Common gotchas

The eligibility filter is User.status == ACTIVE AND member of (unit OR child-units) AND isFeeActive. Lapsed members (fee expired) are excluded. To include them, transition them to ACTIVE first via the fee renewal flow.
Notifications respect the member’s notification preferences. If they’ve disabled push + email for “governance” notifications, they won’t be alerted — but they can still cast a vote via the member dashboard while the collection is OPEN. Voters with no email at all are listed in eligibleVoterCount but cannot be reached.
Yes, while the collection is OPEN. Re-cast via POST /api/v1/votes/{id}/cast; the latest choice wins. Once CLOSED, votes are locked.
There’s no native quorum gate. Run the close manually and check turnout against your bylaws before treating the result as binding. For meetings that may not reach quorum, extend dateClose to give more time, or proxy votes (which Orgo doesn’t model — capture as OPEN_TEXT questions and reconcile out-of-band).
Orgo reports raw counts — tie-breaking is governance-level (board chair casts deciding vote, coin flip, runoff election). For a runoff, clone the collection with just the tied candidates and run again.

What to do next