Build Plan v2 · For Charles Soto

Thanks for the feedback. All decisions locked. Build starts this week.

Your reply closed every open design question. Three remaining design calls (per-operator scheduling flexibility, supervisor login mechanism, correction-task workflow) we resolved on your behalf using industry-standard defaults, explained below. The new features you suggested (supervisor role, floater dashboard, before-and-after photos, ticket SLA labels, multi-role photo approval) are scoped and ready to build.

Section 1

All design decisions, locked in

Nine were your direct answers. The last two we resolved on your behalf with industry-standard defaults so you don't have to think about back-office plumbing. All eleven are explained below. Flip any of them by reply if you disagree.

Project work scheduling

Your answer: Admin picks the employee, system suggests from the Floater pool, then generates the 12-month schedule.

Q2

Supervisor checklist scope

Your answer: Same 68 items as employees, so admin can do a true item-by-item comparison.

Q3

Photo approval flow

Your answer: Operators only see approved photos. (Updated based on your other feedback below: supervisors and admins can both approve, no admin-only bottleneck.)

Q4

Bilingual EN/ES

Your answer: English only for operators and admins. Bilingual toggle stays on the employee portal where it matters.

Q5

Employee capacity cap

Your answer: Soft block when an employee is assigned to a 5th store, plus auto-notify the admin every time the override happens.

Q6

Project work days

Your answer: Same across all stores. Biweekly tasks use Mon to Sat (Thu/Fri/Sat fill the floater's calendar), monthly and long-term tasks can pack onto biweekly cadence days.

Q7

Issue / ticket routing

Your answer: Admin gatekeeps. Employee reports route to SaniFilPro admin first, who triages and forwards to the operator if action is needed.

Q8

Invoice access

Your answer: Admin uploads and manages everything. Operators get read-only download of receipts and full history.

Q9

Offline photo upload

Your answer: Automatic retry is fine. No manual "retry now" button needed.

Q10

Camera capture

Confirmed previously: Live capture only, no gallery picker, no fallback. Zone name + timestamp burned into every photo (Timestamp Camera Basic behavior).

Q1

Supervisor login mechanism

Our call: Email + password (no 2FA). Stronger than a PIN, lighter than the admin login. Matches industry norm for back-office roles, and field managers logging in 5 times a day across different store wifi networks shouldn't be fighting 2FA prompts. Easy to add 2FA later if you ever want to bump it up.

Q11

Correction-task workflow

Our call: When a supervisor flags an item Unsatisfactory + attaches a photo, the next-shift cleaner sees the flag photo at the top of their checklist, re-cleans that zone, then captures a new "after" photo as proof of the fix. Closes the loop with a visual before-vs-after on every flagged issue. ~30 seconds extra per correction, no supervisor re-verification needed.

Q12
Section 2

Role architecture

Your feedback on supervisors and floaters means the role hierarchy needs a refresh. Here's the new layout: four staff roles on the SaniFilPro side, one customer role on yours.

One important clarification first: Operator ≠ Supervisor

These two are easy to mix up because they both sound like management roles. They are on opposite sides of the relationship:

Your original game plan grouped "Cleaners and supervisors" under one Employee role. Your new feedback (rightly) bumps Supervisor up to its own distinct tier with separate access. Here's the full picture:

SaniFilPro Staff (Internal) Sign in with
Admin
SaniFilPro management. Full access across every store, every operator, every record. Approves photos, manages stores, uploads invoices, handles tickets.
email + password + 2FA
Supervisor New
Field manager overseeing about 5 stores' worth of cleaning crews. Visits stores, fills a verification checklist, approves photos, triggers correction tasks when something is off.
email + password
Cleaner
Daily cleaning staff assigned to one store. Bilingual EN/ES. Check in, complete daily checklist, upload photos, check out.
store + 4-digit PIN
Floater New
Project-work specialist who rotates across about 4 stores. Picks which store at check-in. Sees only the project checklist items relevant to that day's assignment, not the full daily checklist.
store picker + 4-digit PIN
Customer (External) Sign in with
Operator
CFA franchise owner. The customer. View-only dashboard for their own store(s). Sees approved photos, daily reports, supervisor notes, tickets they opened, invoices, year-to-date spend.
email + magic link

Operator sits outside the staff hierarchy entirely. They have a completely separate permission tree. A SaniFilPro admin can never accidentally see an operator's personal data, and an operator can never see anything about another operator's store. This is enforced at the database layer, not just the UI.

Section 3

New features from your feedback

Five additions we're committing to based on the suggestions in your reply. Each one is scoped well enough to build now.

1

Ticket priority overhaul

Replace the current Low / Medium / High / Emergency labels with four priorities aligned to your operations: Routine, Important, Urgent, Before Opening. "Before Opening" is special because it implies a time-sensitive resolution before the next store opening, which gives operators clear expectations on response time.

Schema change Admin + Operator UI

v1: just labels. v2 (after launch): automated SLA timers that page on-call staff when "Before Opening" tickets are within 2 hours of store opening time.

2

Supervisor workflow with auto-correction tasks

New supervisor login + dashboard. Supervisors visit stores, fill a verification checklist (same 68 items as employees), and approve photos. If a supervisor marks an item Unsatisfactory and attaches a verification photo, the system automatically creates a correction task for the assigned cleaner on their next check-in.

Example workflow you described:

  1. Supervisor visits the Daytona store, walks through with the checklist.
  2. Marks "Kitchen Floors" as Below Standards, attaches a photo of the grease buildup.
  3. System creates a correction task tied to that store, that zone, that specific checklist item.
  4. When the kitchen cleaner checks in for their next shift, they see "Correction needed: Kitchen Floors. Photo + note attached" at the top of their checklist.
New role New dashboard Schema: supervisors, correction_tasks tables

This closes the quality-control loop. Issues caught by supervisors automatically become required work for cleaners, not buried in emails or text messages.

3

Photo approval gate (multi-role)

Both supervisors AND admins can approve uploaded photos. Eliminates the bottleneck of having one admin be the gate. Operators see approved photos within minutes instead of hours.

An audit trail is kept of who approved what, so if you ever need to know "who signed off on the May 12 Daytona photos", it's one click.

Permission widening Schema: approved_by_user_id
4

Floater dashboard with store picker

Floaters get a separate dashboard tuned to project work. Key differences from a regular cleaner:

  • Step 1 on check-in: pick a store (since they roam ~4 stores)
  • Checklist scope: only the project items scheduled for that store on that day, not the full 40 daily items
  • Calendar view: see their next 14 days of assigned project work, grouped by store
  • Photo workflow: same zone-grouped capture and live-camera rules as a regular cleaner
New role subtype New dashboard Schema: employee_subtype

A floater seeing "Wipe down all tables and chairs" when they came in to scrub the freezer floor would just confuse them. Scoping the checklist to what they're actually doing makes the shift faster.

5

Before-and-after photo workflow

New photo-type distinction. Cleaners can capture "before" photos at the start of their shift to document the state of each zone when they arrived (protecting SaniFilPro if the operator's own staff didn't do their pre-close prep). "After" photos capture finished work, same as today.

In the operator's photo history view, before/after pairs appear side by side under each zone, so you can see "this is what we walked into, this is what we left." Clean visual proof of value delivered.

Schema: photo_type field Optional, not required

Default: "before" capture is optional but surfaced as a quick tile per zone at the start of a shift. We can make it required later if you want it enforced.

Section 4

Per-operator biweekly scheduling (a design call we made for you)

You said "same across all stores: Mon to Sat with monthly + quarterly packed in." We're going to build slightly more flexibility into that, here's why.

What we're doing

Each store gets a list of allowed biweekly days, stored in the database. Default value: Monday through Saturday (matching your spec exactly). The scheduling algorithm respects each store's allowed-days list when generating the 12-month calendar.

// On the stores table
biweekly_allowed_days TEXT[] DEFAULT ['mon','tue','wed','thu','fri','sat']

Why we're making it per-store instead of hardcoded

Right now you're the only operator. Your preference is the default, so nothing changes for you. When you bring on operator #2:

Without the per-store flexibility, you'd be telling them "tough, our system can't do that" — which contradicts the whole operator-first pitch of the platform.

Cost analysis (the boring part)

Building it flexibly now: one extra database column, one multi-select widget in the admin Add Store form, two extra lines in the scheduling algorithm. Maybe 30 minutes of work.

Retrofitting it after launch: database migration, recompute every active project schedule, UI rework, risk of breaking existing operators' confirmed calendars. Days of work, real downtime risk.

Cheap insurance against future you wishing past you had built it flexibly.

How it shows up

Section 5

What we're building next

Phases run in parallel where the database schema permits. We're kicking off Phase 1 this week.

Phase 1 Database schema additions: supervisor role, floater subtype, correction tasks table, photo_type field, biweekly_allowed_days field, new ticket priority enum. ~1 day
Phase 2 Project scheduling algorithm (12-month auto-generate, floater calendar optimization, per-store day constraints, monthly + long-term packed onto biweekly days). ~2 days
Phase 3 Supervisor portal: login, dashboard, store list, verification checklist, photo approval queue, automatic correction-task creation. ~3 days
Phase 4 Floater dashboard: store-picker check-in, scoped project checklist, calendar view, photo upload. ~2 days
Phase 5 Before-and-after photo workflow: zone-tile prompts at shift start, side-by-side rendering in operator photo history, audit trail. ~1 day
Phase 6 Cleaner correction-task UX: top-of-checklist banner with supervisor's flag photo, re-capture flow, auto-mark resolved. ~1 day
Phase 7 Database hosting (Neon Postgres) + Vercel Blob storage + Resend transactional email + production env vars. First seed data: Daytona Speedway store, your operator account, a few demo employees and floaters, full 68-item checklist. ~half day
Phase 8 UAT with you on the test store. Field test with a real cleaning shift. Spanish language validation. Photo upload under low-bandwidth conditions (walk-in cooler). 1-2 weeks of field use

A note on timeline

The day estimates above are heads-down engineering time, not calendar time. Phases run concurrently when the schema permits (the scheduling algorithm and supervisor portal can be built in the same week, for example). Realistic calendar estimate: v2 build complete and ready for your UAT in 2 to 3 weeks.

Build kicks off this week.

Phase 1 starts on the schema additions. You don't need to do anything unless you want to push back on a decision above. The mockups linked in the nav stay live for reference. We will send you a preview link as soon as the supervisor portal and floater dashboard are clickable.