Five months of customer-driven design on a construction platform. Safety managers needed to verify worker credentials on site and manage thousands of qualifications from the office — I designed the full system: mobile Safety Cards in the field, a web workers table for ops at scale, bulk assign flows, and the admin layer that defines how every tag behaves.
Every feature in this case study came from customer feedback and requests — not a roadmap brainstorm. Safety managers on active job sites needed to verify who was qualified to work. Office admins needed to manage compliance across hundreds of workers and dozens of qualification types. The product didn’t have a unified way to do either.
“This makes my life on the site so much easier.”— Safety manager, field user
Supervisors had to call the office or dig through spreadsheets to confirm whether a worker’s OSHA, first aid, or equipment certifications were current. On a busy job site, that delay is a safety risk.
Project admins managing 500–1,000 workers had no single view of who was compliant, who was expiring, and which tags were missing attachments or expiry dates entirely.
Some tags required expiry dates, some didn’t. Some needed proof attachments, others didn’t. Without a configurable system, every screen had to hard-code exceptions.
I worked alongside one other designer, a PM, and an engineering manager. I owned design across all four surfaces below — from mobile field flows to the web admin configuration layer.
Customer feedback arrived as feature requests and pain points. I turned those into structured flows with validation rules, empty states, and error handling — before any screen was built.
The same qualification grammar — tag, expiry, attachments, compliance status — had to work on a phone in the field and in a 1,000-row web table. I defined the shared patterns both surfaces followed.
Expired vs. expiring vs. no expiry. Tag assigned but no data uploaded. Bulk assign with shared or per-worker dates. I designed for these states explicitly, not as afterthoughts.
Five months of build cycles meant constant refinement with the EM and dev team — adjusting modal flows, table column behavior, and mobile form validation as we learned what worked in production.
Three layers, one data model. Admins configure qualification tags. Office users operate at scale through the workers table. Field users verify credentials on site through the Safety Card.
Define qualification tags, categories, expiry rules, colors, and abbreviations. The configuration layer that drives behavior everywhere else.
Filter, export, configure columns, and bulk-assign qualifications to hundreds of workers. The admin command center for compliance at scale.
View, assign, and edit a worker’s qualifications from the directory. NFC write for physical card sync. Read-only mode for restricted users.
From the directory, any contact gets a Safety Card — a live view of their qualifications with expiry status, proof attachments, and the ability to assign or edit on the spot.
The Safety Card shows all assigned qualifications with clear expiry status — active, expiring, or expired. If a worker has none, the empty state prompts assignment immediately instead of showing a dead end.
Pick a qualification tag, set an expiry date if the tag requires it, and attach proof via camera, photo library, or file upload. Validation adapts: mandatory expiry shows errors on save; optional expiry stays flexible.
Editing opens a bottom drawer where only expiry date and attachments are editable — the tag itself is locked. Deleting requires a confirmation alert with irreversible-action language.
The workers table is where project admins live. Dynamic qualification columns, configurable visibility, powerful filters, bulk actions, and CSV export — all built for sites managing hundreds or thousands of workers.
Each qualification tag becomes a column showing expiry date, attachment status, or explicit states like “no data uploaded” or “tag not assigned.” Admins configure which columns are visible per project.
Filter by company, project, worker status, qualification tag, and expiry state (expired, upcoming, no expiry, custom range). Export selected workers to CSV with or without attachments.
Select workers, choose a single qualification tag, then set expiry dates per worker or apply one date to all. Toggle off if any individual date changes. Attach proof per worker. Validation blocks assign until required fields are complete.
Before any qualification can be assigned on mobile or web, an admin defines it here — name, abbreviation, color, category, and whether an expiry date is required.
CRUD for qualification tags and categories. Set expiry requirements, notice periods, and tag colors. Delete actions include destructive confirmations explaining platform-wide impact — because removing a tag removes it from every worker profile.
Feedback came throughout the five-month build — not just at the end. These represent the kind of response we heard as features shipped.
“This makes my life on the site so much easier.”
— Safety manager, field user“I used to spend half my Monday chasing expired certs. Now I filter the table and bulk-assign in ten minutes.”
— Project admin, web user“Being able to pull up someone’s Safety Card right from the directory — that’s exactly what we asked for.”
— Site superintendent“The bulk assign saved us during onboarding week. Forty new workers, one OSHA tag, done.”
— Safety coordinatorA complete qualification system across mobile and web — from field verification to admin operations to platform configuration.
When every feature traces back to a real request, prioritization becomes obvious. The hard part isn’t deciding what to build — it’s designing it so the same logic works on a phone and in a 1,000-row table.
Tags Management wasn’t glamorous, but it was the foundation. Once expiry-required vs. optional was a tag-level setting, every form on mobile and web could adapt automatically instead of hard-coding exceptions.
“No qualifications to display,” “please select a date,” “worker has tag but no data uploaded” — these aren’t polish. They’re the moments where users either trust the system or abandon it.
Assigning one qualification to one worker is a form. Assigning one tag to forty workers is a table with a “same date for all” toggle, per-row overrides, and validation that blocks until every required field is filled. Same action, different design.