Read this as
The 60-second version.
← the FitForms case study
Case study · Mobile · Native UX

The desktop was only half the product

My job — translate desktop FitForms to mobile, not shrink it. I triaged what earns a place on a phone, then rebuilt the nav, inbox, and Canva-style form builder to feel native in the hand.

Role
UI/UX Designer
Timeline
Apr to Jul 2026
Team
1 Product Manager + 1 Designer (me)
2,000 +
studios in F45 rollout
400 +
users · UK / US / AU
$55→$199
the price jump the work supports
In one line

Translating desktop to mobile isn’t shrinking; it’s deciding what a phone is actually for, then redesigning those few things to feel native, not ported.

I scoped mobile with a triage matrix: triage, respond, search and light building earn the phone; deep configuration stays on desktop. Then I rebuilt the sidebar into a bottom-tab model, the table into a triage-signal inbox, and the desktop Canva-style editor into a live-form canvas you edit by touch. Three pieces below are pulled out live: the triage matrix, the triage signal, and the search bar with its edge cases.

01

It already ran on a phone. That was the problem.

It already opened on a phone, as a desktop app squeezed until it fit, that broke the moment you tried to do anything.

Before · the same desktop, whatever the screen size
  • A hamburger hiding a desktop sidebar. The primary navigation was two taps and a mental map away.
  • Panels that collapsed into vertical text. “Section Group” ran down the screen one letter at a time.
  • The builder was a scrolling form of settings. Nothing you could see was the thing you were making.
  • No sense of touch. Hit targets, gestures and reachability were whatever the desktop happened to leave behind.
the organizing principle
Responsive made it fit. It didn’t make it usable. Those are two different jobs, and only one of them had been done.
After · the rebuild

The same product, rebuilt as a native app you run with one hand. Every screen below is the real thing, captured from the working build.

Inbox · triage signal
Inbox · triage signal
To-action / Actioned / All, a form strip, and the red dot marker on every row.
01 / 04
browse the app
Captured live from the working build · the builder is interactive further down ↓
02

Triage on the floor

Before drawing a screen, I decided what a phone is for. An owner between classes needs a different product than one at a desk.

I sorted every desktop feature against one question: is this something you do on the floor, in the gaps of a working day? The things you do standing up (check who came in, reply, look someone up, tweak a live form) became the mobile floor. The things you do sitting down once a quarter (wire up Mindbody, change billing, manage the team) stayed on desktop, where width and focus actually help. “Both” was a deliberate answer too, not a cop-out: pick an accent on your phone, fine-tune the system later.

FeaturePhoneDesktop
Triage submissionsThe one thing owners do between classes. It has to be one-thumb, so the phone is its primary home.
Primary homeSupported / lighterNot here
03

From a sidebar to a thumb

Nine sidebar destinations became five bottom tabs plus a floating Create button. Everything else was demoted or moved to desktop.

The nav model · before → after
Why bottom tabs, and glass

The five tabs are the destinations you return to constantly; Create is a floating button rather than a tab, because starting a form is the app’s whole reason to exist and it should be one thumb-tap from anywhere. In-screen actions (search, filter, back) live in iOS-style glass pills at the top, where a thumb can reach them without hunting. The desktop’s rarer destinations didn’t get a cramped home on mobile; they got an honest one on desktop.

04

One question per row: does this need me?

On a phone, one question matters: does this one need me? So the inbox is built around a three-state triage signal.

Real inbox row · tap a state
Mara VossNew
New Member Intake · 14m ago
Mentioned shoulder rehab. Wants beginner reformer.

Unactioned. A red dot means it still needs a human; the inbox surfaces these first.

The signal has exactly three states: unactioned needs a reply, viewed means someone opened it but didn’t act, actioned is done. It’s the same object everywhere: in the row, in the count-tabs at the top of the inbox, and in the header of the detail screen. Below it, submissions swipe to advance their state, so clearing the queue is a thumb flick, not a trip into a menu. Everything else on the row (the form, the age, a teammate’s “viewing now” pip) is secondary to that one dot.

Real screens · the triage split, side by side
To action · 8
To action · 8
The default worklist: only what still needs a human.
Actioned · 5
Actioned · 5
The same list, cleared; kept for reference, never in the way of the queue.
1
Count-tabs
To-action / Actioned / All, each carrying its live count, the same triage split as the marker.
2
Per-form strip
A horizontal rail to narrow to one form without leaving the list.
3
Marker + swipe
The red dot leads every row; swipe a row to advance its state.
05

One submission, full screen

Detail goes full-screen, and the list becomes a gesture: swipe to the next person without going back.

Swipe to move, one tap to clear · real screens
Detail screen, swipe down for the previous submission
swipe down
Swipe down and the previous submission slides back in.
Mark as actioned button above the submission card
tap
Mark as actioned clears the current one in a tap.
Actioned confirmation with Undo and swipe-up prompt
swipe up
It parks with Undo a tap away; swipe up for the next.

The sticky footer speaks the form’s own language (a class booking gets “Mark as confirmed,” a waiver gets “Mark as received”), so the action always matches the job. Marking one actioned plays a small celebrate moment and parks the card at the bottom of the screen, with undo one tap away, so a mistaken swipe is never destructive. The swipe between submissions locks to a single axis once it commits, and resists at the first and last record so you always feel the edge of the list.

Real screens · the whole submission, then the two actions
Data · the answers
Data · the answers
The full answer set grouped by section, with “1 / 13” and “opened by” up top.
01 / 03
browse detail
1
Position in the queue
“1 / 13” in the header; swipe up or down to the next submission without going back.
2
Data / Activity
The whole answer set, grouped, with comments and history rolled into Activity.
3
“Opened by” presence
Who on the team has already looked, so two people don’t action the same lead.
06

The builder was the hard part. I kept all of it.

The builder is a design tool, a canvas of the real form. The hard part: keeping that Canva-like directness with room for only one panel at a time.

Information architecture · three panels → one canvas
Desktop · 3 panels at once
Fields
Canvas
Preview
Mobile · canvas + summoned sheets
Canvas = the live formtap a field → toolbar · tap + → insert
AddDesignDetailsAgent
Where it started · the desktop builder
FitForms · desktop builder
The desktop FitForms form builder
An editable canvas alongside a persistent details panel, with per-field mandatory and conditional-logic controls always in view. The whole job was folding this into one thumb-reachable column without losing a capability.
On mobile · build view vs member view, one tap apart
Canvas · you edit
Canvas · you edit
The real member-facing form, edited in place; inline “+” between every field.
Preview · members see
Preview · members see
The same canvas, one tap into a true fill-in preview; no separate mode to learn.
+
Inline inserts
A “+” sits between every field. Tap it and the library drops the field at that exact spot.
Tap-to-select toolbar
Selecting a field floats a contextual bar: drag, edit, duplicate, required, delete. Core fields are protected.
Steps as chips, dock below
Sections live in a chip strip; Add / Design / Details / Agent live in a bottom dock, each opening one focused sheet.
The bet that made it work

Instead of splitting build and preview into separate modes, the canvas is the member-facing form the whole time; editing happens directly on it, and heavier controls are summoned as bottom sheets only when you need them. The field editor keeps all three desktop capabilities: General, a real Logic tab (show-this-field-when conditions, with operators that change by field type), and per-field Design overrides. Even conditional logic, the thing you’d expect to drop on mobile, survived intact, because it’s the reason the builder is worth more than a form of settings.

the hard part, kept
Anyone can list field types in a menu. Keeping a Canva-style canvas (inline inserts, a floating toolbar, real conditional logic) legible on a 390-pixel screen is the actual work.
07

Three ways to start

Create is one tap: describe it to the Agent, start from a template, or open a blank canvas.

Build with FitForms Agent
Describe the outcome; it drafts the steps, fields and logic, knowing the required Mindbody fields.
Start from a template
Standard, Link-in-Bio, Prize, Membership and Mindbody: the campaign types the platform is built around.
+
Start from scratch
Straight into the canvas builder with an empty form.
1 · Build with the Agent · prompt → draft → canvas
Agent input screen
1 · Describe it. Plain language, with example prompts to borrow.
Agent drafting
2 · It drafts. Picks fields, groups steps, wires validation.
Agent result
3 · Open in builder. “11 fields across 3 steps”; land in the canvas.
2 · Start from a template · browse, filter, pick
Template gallery list
Browse. Every template as a list or grid, filter chips up top.
Template filter
Filter. Narrow to Membership, Prize, Links, Mindbody.
Template selected
Pick. A sticky footer carries you into the canvas.

The template gallery carries the same categories as desktop, but reflowed for the phone with a filter row and an Agent card pinned to the top, because on a phone, describing what you want is often faster than scrolling a grid. Whatever path you choose, they all land in the same canvas, so there’s one builder to learn, not three.

3 · Start from scratch · the real app, live · tap Create → Start from scratch to open the builder
Load the live builder
the real prototype · loads on tap to keep the page fast
Live canvas · select a field for its toolbar, insert between fields, or open Add / Design / Details / Agent
every path ends in the same canvas:
one builder to learn, not three (・‿・)
08

A search bar is judged by how it fails

You look someone up mid-conversation, half-remembering their name. So search spans name, email, phone, form and notes, and tells you what to try when it finds nothing.

Cancel
Recent searches
  • Phone numbers normalise. Typing +61412 matches +61 412 884 119; separators are stripped on both sides, and the highlight still lands on the formatted digits.
  • Results show why they matched. A hit in a note or a form surfaces a labelled excerpt with the term highlighted, not just the name.
  • Empty is two-tier. First the plain “no matches”, then contextual nudges: which fields were searched, “try phone or email”, and a special hint when your query looks like a phone number.
  • Recents remember. A completed search is saved, de-duplicated, capped, and each entry can be removed one at a time or cleared at once.
why the empty state matters most
A results list is a query away. The measure of a search bar is what it does when it fails you. And that’s the screen I spent the longest on.
Real screens · idle, a hit, and nothing found
Idle · recents
Idle · recents
Before you type: recent searches, each removable, the whole list clearable.
01 / 03
browse search
1
Matched on a note
“shoulder” wasn’t in the name; it was in an internal note, and the result says so.
2
Labelled excerpt
The field name plus a trimmed excerpt with the term highlighted, exactly the toy above.
3
Status stays visible
Each hit still carries its triage status, so search is a triage surface too.
09

Native, but still the same system

Everything reads as iOS and as FitForms at once: native conventions carry the interaction, the v2 system carries the brand. No new tokens.

Locked palette
Coral primary, indigo Agent, six category strokes, used verbatim.
Light + dark
Both themes fall out of one variable set; no forked screens.
1.75
Light on a small screen
Stroke icons at 1.75 weight, glass pills, an iOS keyboard: the small stuff that sells “native”.
09 · a  ·  Brand & theme: the “both” from the matrix, on a phone

Pick an accent on the floor; wire the whole system at a desk. So the phone carries a real editor, with one guardrail: contrast is checked live, as you pick.

Theme · identity
Theme · identity
Logo, colours and type, with a re-scan from the studio URL.
01 / 03
brand & theme
Why the contrast check lives here

On a phone, in daylight, between classes, it’s easy to pick a brand colour that looks fine on your screen and fails for a member on theirs. So the colour editor runs a WCAG contrast ratio the moment you choose, and if it’s under bar, it doesn’t just warn, it offers the nearest accessible value as a one-tap fix. It’s the small kind of guardrail that keeps a fast, on-the-floor edit from quietly shipping an unreadable form.

Real screens · the rest of the system, done to the same bar
Settings · appearance
Settings · appearance
Account and appearance, including the dark-mode toggle.
01 / 04
the supporting cast

The other half of the product

Read the desktop case study →The FitForms desktop redesignWhere this started: the Prize, Membership and Links builders and their member pages, each rebuilt around a live preview on the v2 design system.

What I'd carry forward

The build is done and on track to ship, just not public yet, so these are convictions I’ll stand behind, not launch metrics I’d invent.

The decision I’m surest of is triaging before designing; naming the mobile floor up front is the reason this became a native app instead of a shrunk-down desktop. The bet I’ll defend hardest is the canvas builder: keeping build and preview as one surface is what makes a phone feel like the real product, not a companion to it. And the search empty-states are the detail I’d point a skeptic to first, because handling failure well is what earns trust on the floor. The day it launches, the numbers I’ll watch are whether owners actually build on their phones and whether triage between classes gets faster; until then, I’m accountable to the reasoning, and the reasoning holds.

New message

Goes straight to my inbox — no list, no spam.