Case study · B2B SaaS · Desktop app
Shift Schedule 2.0
Redesigning how creator agencies staff round-the-clock chat coverage, from one-off shifts to recurring schedules with safe edits.
- Role
- Lead product designer: research, flows, UI, specs
- Team
- Hez (design), Yanfei (PM), engineering
- Timeline
- Jun 2025 to Dec 2025, 2.0 → 2.0.1 → Shift records
- Toolkit
- Figma, prototypes, AI for synthesis, QA and specs
Context
Infloww is the operating system for creator agencies on OnlyFans, Fansly, MYM and Fanvue. Agencies employ teams of chatters who answer fans for each creator around the clock. Shift schedule is where an agency owner decides which employee covers which creator, and when. Gaps mean unanswered fans and lost revenue; double-booking means paying two people for one seat.
Version 1 let owners create one shift at a time. As agencies grew to dozens of creators and three or four shifts per creator per day, scheduling became a weekly chore of re-entering the same slots.
Old version vs. new version
The project started from a backend problem: employee reports showed bad data, and the team traced it to how shifts were stored. Rebuilding the data structure was the chance to redesign the whole module. I audited the live version (app v5.5.0, June 2025) screen by screen and marked every problem.
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
The same employee and creator could hold several records in the same time slot, so cells collapsed into “+5 more”. Large agencies loaded every shift in one go, which strained the page.
✓Solution
One row per creator, no duplicates, load more
A conflict check blocks duplicate or overlapping shifts when they are created, so every cell shows real coverage. Creators load in pages with “Load more”.
2Problem · Create shift
One time slot per save
Users could only fill in one time slot each time they opened the form, and every open fetched data again. Times had to be picked from preset shift chips.
✓Solution
A whole day’s coverage in one save
“Add shift” stacks time slots, including overnight ones marked “(next day)”. Clicking a creator’s cell opens the form with that creator filled in.
3Problem · Shift settings
A page of templates to maintain first
Before scheduling, admins had to create time templates in Shift Settings. Agencies ended up with dozens of near-duplicates like 3:09–3:50 AM and 3:09–4:09 AM.
✓Solution
Shift settings removed
Times are entered right in the form, with a 9:00am – 5:00pm default and 15-minute steps. One less page to learn and nothing to clean up.
4Problem · Recurrence
Repeats with no end and no way back
“Repeat ends: Never” was allowed, and there was no way to change one occurrence without touching the whole series.
✓Solution
Bounded series with three edit scopes
Daily and weekly series run within a date range of up to 2 months. Edit and delete ask for “This shift”, “This and following” or “All shifts” and state what happens to past shifts.
5Problem · Data model
A plan and a work record were the same thing
Creating a plan wrote the work record at the same moment. Changing or deleting plans then broke the data in employee reports.
✓Solution
Plans and records are separate
The record is generated the day before the shift (N−1). Deleting future plans keeps existing records, and past shifts can only be edited from the records page.
6Problem · Shift history
History was hard to clean up
No multi-select or batch delete, and a row of creator chips repeated what the dropdown already showed.
✓Solution
Shift records with batch actions
One filter bar, checkboxes for batch delete, and Details, Edit and Delete on every row. Export sends the file by email.
Listening to agencies
Before committing to a direction, the PM and I ran calls with three agencies of different sizes. Each one showed us how they schedule today, including the outside tools they pay for.
Agency A
Timeless Talent
- Tag chatters as regular or extra
- Show how many chatters cover each creator
- Uses Hubstaff for scheduling today
Agency B
Top Drawer Management
- Tier groups to filter down fast
- Assign by employee group or creator group
- Delete every schedule for a departing employee
Agency C
Higher Sphere
- Plan by week, then check each day for gaps
- Colour by shift type: morning, day, night
- Collect chatter availability before scheduling
From insight to decision
| What we heard | Design decision | Status |
|---|---|---|
| “We need to see gaps for each creator immediately, they chat 24/7.” | Creator rows × day columns. An empty cell is a gap; clicking it opens the form with that creator pre-filled. | Shipped 2.0 |
| The same 3–4 shifts repeat every day, including overnight. | Recurring daily and weekly shifts, multiple time slots per save, overnight shifts labelled “(next day)”. | Shipped 2.0 |
| Large teams think in groups and tags, not names. | Filters for employee group, employee, creator tag and creator. Multi-select pickers summarise as “3 employees selected”. | Shipped 2.0 |
| When someone leaves, all their shifts have to go. | Scoped deletes for a series, plus batch delete in Shift records. | 2.0 + Records |
| Day, week and month views. | New calendar header (Today, ‹ ›, Month Year) built to take a view switch later. | Shipped 2.0.1 |
| Chatter availability and per-creator performance. | Logged as the next phase. Both need data the product does not collect yet. | Backlog |
AI 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.
3Bilingual specs
One spec for a cross-language team
Every annotation in the file is in English and Chinese, so PM, copy and engineers read the same rule. AI drafted the translations; I reviewed product terms like “shift data” and “recurring” so they matched the UI.
Output: fewer clarification rounds during build.
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:
12 flows, each prototyped end to end
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.
Overlap
Wed 7:00pm – 10:00am (next day) clashes with Thu 9:00am – 5:00pm. A “Scheduling conflict” message returns the user to the form they came from.
Over 24 hours
A single slot longer than 24h is blocked, with the same message for one-time and daily shifts.
Sales settings
If the agency does not allow several chatters per creator, selecting more than one employee shows a warning on Create.
Permissions
Users without scheduling permission see an explanation, not a disabled mystery button.
Past shifts
Past shifts can only be edited from the Shift data page.
过去的 shifts 只能在 “shift data” 页面修改
Relationship removed
Removing a creator–employee link in Manage creators or Manage employees asks whether to cancel linked future shifts. Records are kept.
Daylight saving
A notice explains that shift times do not shift automatically when clocks change.
Long lists
Pickers cap at 120px, exactly four rows, then scroll. The calendar lazy-loads creators with “Load more”.
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.
Shift records
The old “Shift history” tab became Shift data, then a full Shift records page: multi-select and batch delete, edits for past records, an export sent by email, and a creator picker redesigned to show nicknames and handle very long names.
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




































