A member portal and dues system for a labor union
A member portal with online dues, grievance tracking, and document access — so members stop calling the hall for things they can see themselves.
- Client
- Labor union (NDA)
- Industry
- Labor union & membership
- Services
- Custom software, Digital transformation
- Portal
- Status, dues history, documents
- Dues
- Recurring Stripe, nightly reconcile
- Cases
- Member file, steward queue
A regional labor union was running its entire membership operation on a combination of spreadsheets, paper dues cards, and three-ring binders stacked in a back office. Dues were collected at the hall or mailed in as checks, then reconciled by hand at the end of each month. Grievances were logged on paper forms and tracked through a single coordinator who held all institutional knowledge about every open case. Members who needed anything — a copy of the collective bargaining agreement, confirmation of their dues standing, the status of a grievance — called the hall during business hours and waited.
The problem
The union's leadership knew the system was fragile. One coordinator leaving would take years of grievance history with them. One missed reconciliation would create a dues dispute that could affect a member's coverage. But replacing institutional muscle memory with software meant more than buying a tool — it meant migrating years of records, training members across wide age and technology ranges, and doing it without disrupting ongoing contract administration during an active bargaining cycle.
Key constraints:
- The dues ledger had to be authoritative from day one — partial or approximate data would undermine member trust and create liability.
- Grievance records contained sensitive labor relations information and required fine-grained access controls separating member-facing views from steward and staff views.
- Adoption had to be voluntary at launch. Members could not be forced off legacy channels while the new system was unproven.
What we built
We delivered a web application with five primary modules:
- Member portal — authenticated self-service access to membership status, dues history, and personal records, with profile management and communication preferences.
- Online dues collection — recurring Stripe subscriptions aligned to each member's dues schedule, with automated receipts, failed-payment retries, and reconciliation against the ledger.
- Grievance system — structured submission form for members, a steward-facing case queue with status tracking and internal notes, and automated status notifications back to the member at each stage.
- Document library — versioned CBA storage and chapter-specific document distribution, with role-gated access so members see only what applies to their unit.
- Communications hub — staff-authored announcements delivered by email and surfaced in the portal dashboard, replacing a patchwork of mailing lists and phone trees.
The architectural decision that made the dues side work was treating Stripe as the source of truth for payment events and PostgreSQL as the source of truth for membership status — never conflating the two. A reconciliation service runs nightly, compares Stripe payment records against ledger entries, and flags any discrepancies for staff review before they become disputes. This meant the union always had a clean audit trail and members could see an accurate dues balance without staff intervention.
How we approached it
We sequenced the build to retire the highest-risk exposures first. The dues ledger migration came before anything member-facing. We worked directly with the union's bookkeeper to clean, normalize, and import payment history, validating totals at every step against the original spreadsheets. Only after the ledger was confirmed accurate did we open the payments module to a small pilot group.
Grievance tracking came second, deployed to stewards only at first so they could validate the workflow against their existing binders before members could see case status. This surface area contained the most sensitive data and the most complex access logic, and we did not want members encountering a half-configured system.
The member-facing portal launched later with the document library and dashboard already populated. Because members joined a working system rather than an empty one, the first session had something to show. We ran in-person orientation sessions at the hall and provided the union's administrative staff with a short video walkthrough they could share with members who called in — converting inbound support calls into portal registrations.
Change management was deliberate. We kept phone and walk-in service available throughout, which reduced resistance and gave us a clear signal: members were choosing the portal because it was faster, not because the alternative was removed.
What we will not claim
No dues-collection lift, no admin-time cut, no self-service adoption rate. Those percentages are not in this repo. The public claim is the system: a portal members can open after hours, dues that reconcile against Stripe, and a grievance queue that is not a binder on one person's desk.
If your organization is running critical member or operational data on spreadsheets and manual processes, start a build with us or learn more about our custom software development practice.
Built with
- Next.js
- Node.js
- PostgreSQL
- Stripe