Back to projects

Mayor’s Service Corps · Civic Service Platform

Turning a manual city service into a scalable operating system

I designed a 0→1 staff platform that helps city employees manage residents, generate snow-removal tasks, coordinate volunteer work, handle exceptions, and report program outcomes—all in one connected system.

Mayor’s Service Corps staff platform
Role
Product Designer
Team
1 Designer · 1 PM · 4 Engineers
Scope
UX Research · Product Strategy · System Design · Interaction Design · Prototyping
Timeline
Aug 2023 – Jan 2024

The system

One snowfall, one connected system

A single snowfall sets off an entire chain of work: residents request help, staff verify eligibility, tasks are generated, volunteers claim and complete them, exceptions are resolved, and the city tracks the outcome.

What looks like a simple task dashboard is actually a system connecting residents, volunteers, city staff, snow events, deadlines, and exceptions.

01Resident requests help
02Staff verifies
03Snow event
04Tasks generated
05Volunteers claim
06Work completed
07Exceptions resolved
08Event closed

Core objects

  • Resident
  • Snow Event
  • Task
  • Volunteer
  • Ticket

The problem

One snowfall triggered hours of manual coordination

Before the platform, staff relied on phone calls, spreadsheets, and fixed assignments to coordinate snow-removal requests.

Volunteer availability was unpredictable. When someone dropped out or skipped a task, staff had to manually follow up, reassign work, and piece together what had happened across different records.

Before workflow

Resident request
Staff records manually
Staff assigns volunteers
Staff follows up
Reassign unfinished work
  • Scattered records
  • Manual assignment
  • Repeated follow-up
  • Limited visibility

The problem wasn’t just inefficiency. The entire service depended on people manually keeping the system together.

The turning point

I thought I was digitizing a workflow.
I was actually defining its rules.

My first instinct was to turn the existing process into a digital workflow.

But once I connected the screens into complete flows, harder questions surfaced:

Q01

When does a task become active?

Q02

What happens if it snows again?

Q03

Who is eligible to receive service?

Q04

What happens when work isn’t finished on time?

The rules live between the objects

Snow Event
Tasks
Residents
Volunteers
Tickets

The challenge shifted from designing individual screens to defining how the system should behave.

Product decision 01

One rule simplified the entire time model

My original design asked staff to manage three separate moments: when snow started, when tasks should activate, and when tasks were due. Each introduced additional inputs and dependencies.

Mayor’s Service Corps — generate tasks before

Before · 3 inputs

INPUTSnow starts
INPUTTasks activate
INPUTTasks due

The actual policy was much simpler:

Staff now enters only “Snow stopped at.” Tasks activate at that time, and the system automatically calculates the 48-hour deadline.

Mayor’s Service Corps — generate tasks after

After · 1 input

STAFF ENTERSSnow stopped at
AUTOTasks activate
AUTOTasks due

One input replaced three dependent time controls.

Product decision 02

Designing for when reality changes

Then came an edge case that broke the happy path:

But editing the time wasn’t really a separate task—it happened because conditions had changed. So I stopped creating more actions and modeled everything around the snow event itself.

Before · 3 actions

It snowed again
Edit event times
End event

After · 1 context

ONE PLACEEdit Snow Event

When snowfall continues, staff updates the “Snow stopped at” time. The system recalculates the 48-hour window, while staff decides whether completed tasks need to be serviced again.

Instead of introducing a new “Reopened” status, those tasks simply return to Open, while their previous completion remains in Task History.

When it snows again

Snow stops
Tasks activate
Some tasks complete
❄ Snow again
Update snow stopped time
New 48h window
STATUSCompleted
STATUSOpen
Previous completion stays in Task History.
Mayor’s Service Corps — edit snow event

One event context

  • 01Update snow stopped time
  • 02Handle completed tasks
  • 03Extend deadline
  • 04Close event
  • 05Delete event

Product decision 03

Designing exceptions without designing endless screens

Tickets capture the cases that need human intervention.

Initially, I designed different resolution interfaces for different ticket types. It worked—but every new ticket type would require another interface and another implementation path.

Mayor’s Service Corps — old ticket resident requestMayor’s Service Corps — old ticket task issueMayor’s Service Corps — old ticket hours certificate
Different type
Different interface
More implementation paths

So I asked a different question:

I consolidated ticket handling into one reusable panel with five consistent sections:

  • Status
  • Request
  • Related Record
  • Resolution
  • Ticket Details

Only two things change by ticket type: what record it references and what outcomes are available.

Mayor’s Service Corps — generic ticket panel

Configuration, not new screens

TicketRelated recordOutcomes
Resident requestResidentCreate / Reject
Task issueTaskUpdate / Resolve
Hours certificateVolunteerApprove / Reject

I turned variation into configuration.

Designing around reality

Not everything happens inside the product

Residents often request service by phone, but they may not have their eligibility documents ready during the call.

Instead of forcing document upload into intake, I designed the resident lifecycle around what actually happens offline. A resident can be created as Pending, send documents later by email or text, and become Active once staff uploads and verifies everything.

① Create profileResident calls
② Documents missingPending
③ Email / SMSDocuments arrive
④ VerifyStaff uploads
⑤Active
⑥Eligible for tasks

STEP 01 · PENDING

Resident calls — profile created as Pending
Mayor’s Service Corps — resident create

STEP 02 · DOCUMENTS

Documents arrive later by email / SMS — staff uploads
Mayor’s Service Corps — resident documents

↓  Staff verifies everything and activates the resident

STEP 03 · ACTIVE

Active — now eligible for task generation
Mayor’s Service Corps — resident activate

Full system

Seven workflows. One connected system.

The final platform connects the full lifecycle of the service—from resident intake and snow-event setup to task completion, exception handling, and reporting.

Resident

Create
Pending
Active

↓  Active residents feed task generation

Snow event

Generate Tasks
Edit / Extend
Close

↓  Each event creates tasks

Task

Open
Accepted
In Progress
Completed
Not Completed

↓  Exceptions from any object become tickets

Tickets

Unclaimed
Claimed
Resolved

↓  Everything rolls up

Report

Snow Season Outcomes

Seven flows

  • Create Task
  • Resident Intake
  • Document Activation
  • Generate Tasks
  • Edit Snow Event
  • Tickets
  • Reports

Edge cases

The happy path was only half the product

I treated edge cases as part of the core experience—not cleanup after the main flow was finished. Each one helped expose another rule the system needed to make explicit.

01

Duplicate address

Detect an existing resident and link to their profile.
Mayor’s Service Corps — edge duplicate address

02

Missing documents

Explain why the resident isn’t eligible.
Mayor’s Service Corps — edge missing documents

03

Upload failure

Preserve progress and let staff retry.
Mayor’s Service Corps — edge upload failure

04

Snow continues

Update the event instead of creating another one.
Mayor’s Service Corps — edge snow continues

05

Deadline missed

Close unfinished tasks as Not Completed.
Mayor’s Service Corps — edge deadline missed

06

Staff unavailable

Allow another staff member to take over a ticket.
Mayor’s Service Corps — edge staff unavailable

Reports

Turning operations into a story the city can share

Once the workflow was connected, the same system could show what the program accomplished across an entire snow season.

I redesigned reporting around external communication—not daily operations—highlighting snow events, completed tasks, completion rate, residents served, and volunteer contribution. Staff can export the results as a one-page report for city communication and outreach.

Mayor’s Service Corps — season report dashboard Mayor’s Service Corps — season report export

What the report highlights

  • Snow events
  • Tasks completed
  • Completion rate
  • Residents served
  • Volunteer contribution

Impact

From manual coordination to civic infrastructure

The platform turned a fragmented service into a workflow staff could execute, track, and scale.

For the program

More volunteer participation

Volunteers could independently discover and claim work.

Higher task completion

Every task had a visible lifecycle from Open to Completed.

Greater service capacity

The program could coordinate support for more residents.

For staff

Less manual coordination

Fewer manual assignments and follow-ups.

Faster task management

Tasks could be generated and updated in batches.

Shared visibility

Residents, tasks, snow events, and exceptions lived in one system.

The system made the city’s goodwill actionable, trackable, and scalable.

Reflection

I started by designing a dashboard.
I ended up designing its rules.

This project changed how I think about complex product design.

The hardest problems weren’t individual screens. They were the invisible rules connecting them: when a task becomes active, who is eligible, what happens when conditions change, and how exceptions return to the system.

My role evolved from designing interfaces to defining workflows, states, edge cases, and implementation logic with stakeholders and engineers.

Most importantly, I learned that not every decision belongs to the interface. Some belong to staff, some to policy, and some to the system. Good product design starts by knowing the difference.

The takeaway

Good systems don’t just support the happy path. They make messy reality manageable.