Case study · B2B SaaS · Desktop app
Shift Schedule 2.0
Redesigning how creator agencies manage round-the-clock chat coverage — from one-off shifts to recurring schedules with safer, more flexible editing.
- Role
- Lead product designer: research, flows, UI, specs
- Team
- Hez (design), Yanfei (PM), engineering
- Timeline
- Jun – Aug
- Toolkit
- Figma, prototypes, AI for synthesis, QA and specs
Context
The product
Infloww
An operating system for creator agencies, covering OnlyFans, Fansly, MYM and Fanvue.
The job
24/7 chat coverage
Chatters answer fans for each creator around the clock. Shift Schedule decides which employee covers which creator, and when.
The problem
One shift at a time
Version 1 created shifts one by one. With dozens of creators and several shifts a day, owners re-entered the same details every week.
Project at a glance
Timeless TalentTop Drawer ManagementHigher Sphere+ 2 more
Shift typesOne timeDailyWeekly
ActionsCreateEditDeleteDuplicate
This shiftThis and followingAll shifts
Overlapping shiftsOver 24 hoursPast shiftsPermissionsDaylight savingRemoved creator links
Old version vs. new version
The project started with a backend issue: inaccurate employee reports led the team to trace the problem back to how shifts were structured and stored.
This uncovered an opportunity to rethink the entire scheduling experience, not just fix the underlying data model.
I conducted a screen-by-screen audit of the live product, documenting usability issues, workflow friction, and opportunities for improvement.
Problems and how the design solves them
Six problems from the audit, each paired with the change that fixes it.
1Problem · Calendar
The calendar hid shifts and loaded everything at once
Multiple shift records for the same employee and creator could overlap within the same time slot, causing calendar cells to collapse into “+5 more” and making actual coverage difficult to see.
For larger agencies, loading all shifts at once also put unnecessary strain on page performance.
✓Solution
One row per creator, no duplicates, load more
Introduced shift conflict validation to prevent duplicate or overlapping assignments, keeping calendar cells clear and making team coverage easier to understand.
Reworked the calendar to load creators progressively, with a “Load more” option instead of loading every shift at once.
2Problem · Create shift
One time slot per save
Users could only add one time slot per form submission, and reopening the form triggered another data fetch. Shift times also had to be selected from preset options.
✓Solution
A whole day’s coverage in one save
Users can stack multiple time slots with “Add shift”, including overnight shifts clearly marked with “(next day)”. Clicking a creator’s cell automatically opens the form with that creator preselected.
3Problem · Shift settings
A page of templates to maintain first
Before creating shifts, admins had to set up time templates in Shift Settings. Over time, agencies accumulated dozens of nearly identical templates, such as 3:09–3:50 AM and 3:09–4:09 AM.
✓Solution
Shift settings removed
Shift Settings was eliminated. Users can enter times directly in the form, with a default 9:00 AM–5:00 PM schedule and 15-minute increments. One less page to manage, and no template clutter.
4Problem · Recurrence
Recurring shifts had no end date or editing flexibility
Users could set shifts to repeat indefinitely, with no clear way to modify or delete a single occurrence without affecting the entire series.
✓Solution
Bounded recurrence with three editing scopes
Daily and weekly recurring shifts are limited to a date range of up to two months. When editing or deleting, users can choose from three scopes: “This shift”, “This and following” or “All shifts”, with clear explanations of how each option affects past shifts.
5Problem · Data model
A plan and a work record were the same thing
Creating a shift plan automatically generated a work record. As a result, editing or deleting plans could unintentionally affect employee report data.
✓Solution
Plans and records are separate
Work records are generated one day before the scheduled shift (N−1). Deleting future shift plans no longer removes existing records, while past shifts can only be edited from the Records page.
6Problem · Shift history
History was hard to clean up
Users couldn't select or delete multiple records at once. Repeated creator chips also duplicated information already available in the dropdown filter.
✓Solution
Shift records with batch actions
A unified filter bar replaces redundant creator chips. Checkboxes enable batch deletion, while each row provides quick access to Details, Edit, and Delete. Exported files are delivered directly via email.
Listening to agencies
Before committing to a direction, the PM and I ran calls with 5 agencies of different sizes. Each one showed us how they schedule today, including the outside tools they pay for.
From insight to decision
What we heard
“We need to see gaps for each creator immediately, they chat 24/7.”
Design decision
Creator rows × day columns. An empty cell is a gap; clicking it opens the form with that creator pre-filled.
Shipped 2.0What we heard
The same 3–4 shifts repeat every day, including overnight.
Design decision
Recurring daily and weekly shifts, multiple time slots per save, overnight shifts labelled “(next day)”.
Shipped 2.0What we heard
Large teams think in groups and tags, not names.
Design decision
Filters for employee group, employee, creator tag and creator. Multi-select pickers summarise as “3 employees selected”.
Shipped 2.0What we heard
When someone leaves, all their shifts have to go.
Design decision
Scoped deletes for a series, plus batch delete in Shift records.
2.0 + RecordsWhat we heard
Day, week and month views.
Design decision
New calendar header (Today, ‹ ›, Month Year) built to take a view switch later.
Shipped 2.0.1What we heard
Chatter availability and per-creator performance.
Design decision
Logged as the next phase. Both need data the product does not collect yet.
BacklogAI in my process
Using AI as a design partner, with a human in the loop
This is an operations feature with a lot of rules. I used AI where it speeds up the boring, error-prone parts of the work, and kept the judgment calls with me, the PM and engineering.
1Synthesis
Call notes to themes in an afternoon
I gave the AI the raw notes from all three agency calls and asked for clusters with supporting quotes. I then checked each cluster against the notes and merged or split them by hand on the FigJam board.
Output: 10 themes and the insight → decision table above.
2Edge-case QA
An adversarial tester for recurring logic
Recurrence breaks in strange places. I asked the AI to act as a QA engineer and attack each flow: overnight shifts, overlaps across days, daylight saving, permissions, deleted relationships.
Output: the edge-case list that became the design audit document.
·Prompt pattern I reused for every flow
# Role You are a QA engineer testing a shift scheduling calendar for agencies. # Rules Shift types: one-time | daily | weekly. Actions: create | edit | delete | duplicate. A shift may cross midnight. Agencies set a timezone. Past shifts are records. # Task For the flow "Edit recurring weekly shift", list cases where the user could lose data, double-book someone or be surprised by the result. For each: the trigger, the expected system response, the message to show.
3Shared skill
A shared Claude skill for the whole team
I turned the research data, product rules and terminology into a Claude skill written in Markdown and shared with the team. Anyone working on scheduling starts from the same context, so the AI gives answers that match how the product really works.
Each iteration adds to the skill, which makes later work faster and keeps designs more accurate over time.
Output: a shared .md skill that raises the team’s efficiency and design accuracy.
4Figma to portfolio
This page was assembled with an agent
I had Claude read the Figma file through the plugin API: it pulled annotations across seven pages, exported the frames you see here and drafted the structure. I edited the story and checked every claim.
Output: a case study built from the source file, not from memory.
The calendar: built around gaps
Owners plan by creator, because a creator without a chatter is the costly failure. Each row is a creator, each column a day, and each chip an employee’s shift. Recurring shifts carry a repeat icon, so a one-off is easy to tell apart.
Creating shifts in one pass
One form handles one-time and recurring shifts. “Add shift” stacks extra time slots so a whole day’s coverage goes in with one save. Two entry points: the “Create shift(s)” button opens a blank form, and clicking a creator’s cell opens it pre-filled.
Smart defaults, agreed with engineering
One time
Today, 9:00am – 5:00pm
Daily
Next 7 days, 9:00am – 5:00pm
Weekly
Next 14 days, 9:00am – 5:00pm
Shifts can be scheduled up to 2 months ahead. “Show only employees assigned to the selected creators” narrows long lists; picking an unassigned employee creates the assignment automatically.
Editing a series without surprises
The riskiest moment is changing a recurring series. Every edit or delete asks for a scope, and the dialog states the consequence for past shifts in plain words. Past shifts are payroll records, so they can only be changed from the Shift data page. Try it:
Edge cases, designed not discovered
Each rule below has its own screen and message in the spec, written in both languages for the engineering team.
Overlapping shiftsOver 24 hoursSales settingsPermissionsPast shiftsRemoved creator linksDaylight savingLong lists
2.0.1: fixing navigation after launch
Week arrows sat at opposite ends of the grid. Someone toggling between weeks wants both buttons under the same thumb, so I moved them together beside “Today” and the month label, the pattern people know from Google Calendar and Outlook.
Before
After
The more universal design shows the month and year at the top: Today, ‹ ›, Month / Year. It also leaves room to add a day / week / month toggle later.
From my design rationale note to the team. The month label was then added to the shared calendar component.
How it came together
- Jun 2025Audit v1
Engineering pain points and early form explorations.
- Jul 30, 2025Agency calls
Three agencies, ten themes, insight → decision table.
- Summer 20252.0 flows
12 flows prototyped, edge cases specced in EN + 中文.
- Sep 10, 2025Dev alignment
Defaults, lazy loading, picker limits agreed with engineering.
- Late 20252.0.1 + Records
Navigation fix, cross-month labels, Shift records.
What I’d do next
- Availability first. Two of the tools agencies showed us collect chatter availability before scheduling. That is the biggest remaining gap.
- Performance in context. Showing how each chatter performs on each creator would make rescheduling a data decision.
- Measure it. Track time to build a week’s schedule and the share of recurring vs. one-time shifts to prove the 2.0 bet.
Happy to walk through the prototypes and specs in a live interview.
Email: hezhustudio@gmail.com




































