Jobflo Mobile
The phone app reps use to pick up, lock and finish their Jobflo tasks.
Jobflo Mobile is the phone app for the people who work Jobflo's workflows in the field: sales reps, project coordinators and crew leads. It shows the tasks a rep is allowed to see, lets them pick work from a shared pool, and turns each task into a form they can finish on a roof or in a driveway. I designed it in Figma and built most of the Flutter screens.
Problem
Reps were running their day from the web app on a phone browser. It worked, but barely.
- No clear list of today's work. My tasks, the team's shared pool, and overdue items all lived on different web pages.
- Locks nobody could see. The web app locks a task for 15 minutes while someone works it. On a phone there was no way to tell who held it or when it ran out.
- Forms built for a desk. Long inspection forms, photo uploads and rich text did not fit a small screen.
Goal
One app where a rep opens their day, sees what is due and what is free to grab, and finishes a task without calling the office. The Laravel app stays the source of truth: the phone reads what the server says and writes only through the mobile API, so permissions never drift between web and mobile.
My role
Product design and Flutter front end. I designed the screens in Figma, then built the dashboard, workflow list, task detail, task options, profile, offline cache and dark mode in Flutter, working with the lead engineer who owned the Laravel side. We shipped it to TestFlight and ran two sprints of feature and bug work after that.
Approach
Every screen answers one question for the rep:
- Home: what do I owe today? Four counters, then My Tasks and Workbasket grouped by day.
- Workflow: what else is out there? One tab per workflow, with grouping, sorting and filters in a sheet.
- Task: what exactly do I do, and is anyone else on it? A read-only review first, then an explicit Start Task.
- Result: what did I send? A summary of every answer and photo after submit.
The rule I kept: hide actions the rep cannot take instead of greying them out. A disabled "Complete Task" reads as "try again later", so if the server says no, the button is not there.
Try it
Opening a task used to take the 15 minute lock without telling anyone, so a rep who only wanted to look had already blocked their teammates. Now a task opens as a review screen and the lock starts on Start Task, with a countdown under the header and a warning before it runs out. The prototype below runs the screens from the Figma file on the same demo data the app ships with: seven jobs, three Workbasket queues and the locks already held on them. Claim something from the Workbasket, start the site survey, fill it in and submit.
1/7 ยท Home. Switch between My Tasks and Workbasket. The counters follow your work.
Work locks you can see
- "Locked by" chips on every card, so nobody opens a task someone else is working
- Lock countdown with an Extend hold action before it expires
- Drafts survive a lost lock
My Tasks and Workbasket
- Personal work and the team's shared pool side by side
- Claim from the pool in one tap; counts match the web app
Display options
- Group by deadline, type, subtype or lock state
- Sort and filter by assignee, lock state, subtype and case
Built for the field
- Offline cache, plus a queue that sends completed tasks once the signal is back
- Haptics on key actions, and a dark mode that does not glare in a truck at night
More listedProjects
Contact
Have a project? Say hello at



