Jahangir Nabin
← All projects

One CRM, Five Surfaces: a Political Campaign Platform

A Canadian political-campaign CRM (canvassing, predictive dialing, donations, surveys, and analytics) delivered across web, mobile, a Chrome extension, a Gmail add-on, and a member portal.

Role:
Full-stack developer, second-highest contributor (821 commits); guided 2 intern developers
Period:
2020 – 2022, Democratik (Canada, remote)
  • Angular
  • Node.js
  • AWS Cognito
  • Stripe
  • Leaflet
  • Plivo
  • Pusher
  • Cordova
  • i18n EN/FR
821
Commits on the main client
5
Delivery surfaces
1,100+ files
Client codebase

Context

Democratik is the operating system for political campaigns in Quebec and wider Canada: door-to-door canvassing, predictive and auto-dialing with call logging, SMS and email campaigns, donations, surveys, volunteer coordination, and analytics. Campaign software has an unforgiving audience: volunteers with no training, candidates with no patience, and election deadlines that do not move.

Architecture

Surfaces
Web CRM (Angular)
Mobile (Cordova)
Chrome extension
Gmail add-on
Member portal
Services
Node.js API
AWS Cognito auth
Stripe donations
Pusher realtime
Plivo browser VoIP
Field tools
Journey builder
Canvassing composer
Leaflet territories
Email & form builders

Key decisions

Campaign automation as a visual canvas. The journey builder let campaign staff drag and connect automation steps (triggers, waits, messages, tags) instead of filing requests to developers. Non-technical staff shipping their own automations was the feature that made the product sticky.

Canvassing built as composition. The door-to-door composer assembled surveys, questions, tags, phone actions, and donation asks into scripted field workflows a volunteer could follow on a phone at a stranger's doorstep.

Territory management on real geospatial data. Leaflet dot maps, heat maps, and hand-drawn polygons over a ten-thousand-point address dataset, with rule-driven coloring, turning voter files into something an organizer can actually reason about.

A call center in the browser. Plivo-powered VoIP with multi-party predictive dialing, do-not-call list management, and call-status tracking. No desk phones, no installed softphone, just the CRM tab.

Bilingual as a first-class constraint. Full EN/FR support with automated translation extraction. In Quebec politics, French is not a localization afterthought.

Results

One product delivered across five surfaces: the web CRM, a Cordova mobile app with in-app calling, a Chrome extension surfacing contacts and tasks in the toolbar, a Gmail add-on matching open emails to CRM records, and a member portal handling memberships, renewals, and recurring donations through Stripe. Real-time chat and notifications ran over Pusher; configurable form and email builders, Avery label printing, and gamified goal dashboards rounded out the field toolkit.

What I'd do differently

Establish a shared state-management architecture across surfaces earlier. Each surface solved caching and session state its own way; a common pattern from the start would have cut the duplication we later had to live with.