Retool Setup Guide: Pilot MVP
Retool Setup Guide: Pilot MVP
Prerequisites
- Retool apps from State Authority and Weekly Cycle Flow setup
- Airtable base with Pilot MVP tables created
- Email capability (manual for pilot, templates provided)
Overview
This guide adds 8 pages to support the 25-user pilot:
- UserOnboarding - Register new pilot users
- GarmentOnboarding - Register new garments with barcodes
- AllocationWorkbench - Manual garment allocation for cycles
- PilotDashboard - Overview of pilot status and metrics
- CommunicationLog - Track all user communications
- FeedbackCapture - Log user feedback
- DataExport - Export pilot data for analysis
- Enhanced ExceptionWorkflow - Pilot-specific exception handling
Page 1: UserOnboarding (YFT-AdminConsole)
Purpose
Register new pilot users with all required information.
Layout
┌─────────────────────────────────────────────────────────────┐
│ User Onboarding Pilot: 23/25 users │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐│
│ │ New User Registration ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ││
│ │ Basic Information ││
│ │ Name: [____________________] ││
│ │ Email: [____________________] ││
│ │ Phone: [____________________] ││
│ │ ││
│ │ Shipping Address ││
│ │ Address 1: [____________________] ││
│ │ Address 2: [____________________] ││
│ │ City: [__________] State: [__] ZIP: [_____] ││
│ │ ││
│ │ Subscription ││
│ │ Weekly Anchor: [Monday ▼] (delivery day preference) ││
│ │ Payment Method: [____________] (reference only) ││
│ │ ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ││
│ │ Fit Profile (Initial) ││
│ │ Top Size: [M ▼] Bottom Size: [32 ▼] ││
│ │ Body Type: [Athletic ▼] ││
│ │ Style: [☑ Casual] [☐ Professional] [☑ Minimal] ││
│ │ Colors: [☑ Neutrals] [☑ Darks] [☐ Brights] ││
│ │ Notes: [________________________________] ││
│ │ ││
│ │ [Create User & Fit Profile] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Recently Onboarded ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Name Joined Anchor First Cycle ││
│ │ Alice Test Jan 10 Monday 2024-W03 ✓ ││
│ │ Bob Test Jan 11 Tuesday 2024-W03 ✓ ││
│ │ Carol Test Jan 12 Wednesday Pending ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
getPilotUserCount
// Resource: YFT-Airtable
// Action: List Records
// Table: Users
// Filter: {operational_state} != 'Closed'
// Return: COUNT
createUser
// Resource: YFT-Airtable
// Action: Create Record
// Table: Users
// Fields: Form values
createFitProfile
// Resource: YFT-Airtable
// Action: Create Record
// Table: FitProfiles
// Fields: Fit form values + user_id link
// Run after createUser completes
getRecentUsers
// Resource: YFT-Airtable
// Action: List Records
// Table: Users
// Sort: created_at DESC
// Limit: 10
Components
- pilotCapacityIndicator (Text/Progress)
- Value:
${getPilotUserCount.data.length} / 25 users - Color: Green if < 25, red if >= 25
- Value:
- userForm (Form Container)
- All user fields as inputs
- Validation: Required fields, email format, ZIP format
- fitProfileSection (Collapsible Container)
- Size selectors
- Style multi-select checkboxes
- Color preference checkboxes
- Notes textarea
- createButton (Button)
- Label: “Create User & Fit Profile”
- Disabled if: Pilot at capacity (25 users)
- On click:
- Run
createUser - On success, run
createFitProfilewith new user_id - Show success notification
- Reset form
- Run
- recentUsersTable (Table)
- Data:
getRecentUsers.data - Columns: display_name, created_at, weekly_anchor, first_cycle_status
- Data:
Page 2: GarmentOnboarding (YFT-WarehouseOps)
Purpose
Register new garments with barcode scanning.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Garment Onboarding Inventory: 87 items │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Register New Garment ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ││
│ │ Barcode: [________________] [Generate] ││
│ │ ││
│ │ Product Info ││
│ │ SKU: [____________] (e.g., TOP-CREW-BLK) ││
│ │ Category: [Top ▼] ││
│ │ Size: [M ▼] Color: [Black ▼] ││
│ │ ││
│ │ Initial Condition ││
│ │ Condition Grade: [A ▼] ││
│ │ Max Wear Limit: [50] ││
│ │ ││
│ │ [Register Garment] ││
│ │ ││
│ │ ✓ G001 registered ✓ G002 registered ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Quick Entry Mode (Batch) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ SKU Template: [TOP-CREW-BLK] Size: [M] Color: [BLK]││
│ │ ││
│ │ Scan barcodes continuously: ││
│ │ [________________] → Auto-registers with template ││
│ │ ││
│ │ Batch Progress: 12 registered this session ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Inventory Summary by Size ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Size Tops Bottoms Dresses Total Available ││
│ │ XS 5 3 2 10 8 ││
│ │ S 8 5 4 17 15 ││
│ │ M 12 8 6 26 22 ││
│ │ L 10 7 5 22 20 ││
│ │ XL 6 4 3 13 12 ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
createGarment
// Resource: YFT-Airtable
// Action: Create Record
// Table: Garments
// Fields: {
// "barcode": "",
// "sku": "",
// "category": "",
// "size": "",
// "color": "",
// "condition_grade": "",
// "max_wear_limit": ,
// "asset_state": "Available",
// "wear_count": 0,
// "wash_count": 0,
// "repair_count": 0
// }
generateBarcode
// Transformer: Generate unique barcode
const prefix = 'YFT';
const timestamp = Date.now().toString(36).toUpperCase();
const random = Math.random().toString(36).substring(2, 6).toUpperCase();
return `${prefix}-${timestamp}-${random}`;
getInventorySummary
// Resource: YFT-Airtable
// Action: List Records
// Table: Garments
// Group by: size, category
// Aggregate: count total, count where asset_state = 'Available'
Components
- barcodeInput (Text Input)
- Placeholder: “Scan or enter barcode”
- On blur: Check for duplicates
- generateBarcodeButton (Button)
- On click: Set barcodeInput.value = generateBarcode transformer
- garmentForm (Form Container)
- SKU, Category, Size, Color selects
- Condition grade selector
- Max wear limit input (default: 50)
- registerButton (Button)
- On click: Run
createGarment, show success, clear form
- On click: Run
- quickEntryContainer (Container)
- Template fields for batch entry
- Continuous scan mode
- Session counter
- inventorySummaryTable (Table)
- Data:
getInventorySummary.data(transformed) - Rows: Sizes, Columns: Categories
- Data:
Page 3: AllocationWorkbench (YFT-AdminConsole)
Purpose
Manually allocate garments to cycles based on fit profiles.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Allocation Workbench │
├─────────────────────────────────────────────────────────────┤
│ ┌───────────────────────┐ ┌─────────────────────────────┐ │
│ │ Cycles to Allocate │ │ User Fit Profile │ │
│ │ ───────────────── │ │ ───────────────────────── │ │
│ │ ○ C-125 Alice (M) │ │ Alice Test │ │
│ │ ● C-126 Bob (L) ← │ │ Top: M Bottom: 32 │ │
│ │ ○ C-127 Carol (S) │ │ Style: Casual, Minimal │ │
│ │ ○ C-128 Dan (XL) │ │ Colors: Neutrals, Darks │ │
│ │ │ │ Notes: "Prefers loose fit" │ │
│ └───────────────────────┘ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Available Garments (filtered for Bob's fit) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ☐ G012 TOP-CREW-NAV (L) Casual ★★★★☆ ││
│ │ ☐ G015 TOP-HENLEY-GRY (L) Casual ★★★★★ ││
│ │ ☐ G021 BTM-CHINO-KHK (34) Casual ★★★★☆ ││
│ │ ☐ G045 BTM-JEAN-BLU (34) Casual ★★★☆☆ ││
│ │ ☐ G067 DRS-POLO-BLK (L) Professional ★★★★☆ ││
│ │ ││
│ │ [Show All] [Filter: Tops Only] [Filter: Bottoms Only] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Current Allocation for C-126 (Bob) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Target: 3 items | Selected: 2 items ││
│ │ ││
│ │ ✓ G015 TOP-HENLEY-GRY (L) [Remove]││
│ │ ✓ G021 BTM-CHINO-KHK (34) [Remove]││
│ │ + (need 1 more item) ││
│ │ ││
│ │ [Save Allocation] → Creates Box, reserves garments ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
getCyclesToAllocate
// Resource: YFT-Airtable
// Action: List Records
// Table: Cycles
// Filter: AND(
// {cycle_state} = 'Scheduled',
// OR({box_id} = '', LEN({box_id}) = 0)
// )
// Sort: week_id ASC
getUserFitProfile
// Resource: YFT-Airtable
// Action: List Records
// Table: FitProfiles
// Filter: {user_id} = ''
getAvailableGarments
// Resource: YFT-Airtable
// Action: List Records
// Table: Garments
// Filter: {asset_state} = 'Available'
// Additional filter based on fit profile (in transformer)
filterGarmentsForFit
// Transformer: Score and filter garments for user's fit
const profile = getUserFitProfile.data[0];
const garments = getAvailableGarments.data;
return garments
.map(g => {
let score = 0;
// Size match
if (g.size === profile.top_size && g.category === 'Top') score += 3;
if (g.size === profile.bottom_size && g.category === 'Bottom') score += 3;
// Style match
const styles = profile.style_preference || [];
// ... style matching logic
// Color match
const colors = profile.color_preference || [];
const avoidColors = profile.avoid_colors || [];
// ... color matching logic
return { ...g, fitScore: score };
})
.filter(g => g.fitScore > 0)
.sort((a, b) => b.fitScore - a.fitScore);
saveAllocation
// Transformer that:
// 1. Creates Box record with planned_contents
// 2. Links Box to Cycle
// 3. Updates Cycle with box_id
Components
- cyclesToAllocateList (List)
- Data:
getCyclesToAllocate.data - Display: User name, sizes
- Selection: single
- Data:
- fitProfileCard (Container)
- Show when: Cycle selected
- Display all fit profile fields
- availableGarmentsTable (Table)
- Data:
filterGarmentsForFit - Columns: barcode, sku, size, style (inferred), fit score (stars)
- Multi-select checkbox
- Data:
- categoryFilterButtons (Button Group)
- “All”, “Tops Only”, “Bottoms Only”, “Dresses Only”
- allocationSummary (Container)
- Target item count (configurable, default: 3)
- Selected items list with remove buttons
- saveAllocationButton (Button)
- Disabled if: Selected count < target
- On click: Run
saveAllocation
Page 4: PilotDashboard (YFT-AdminConsole)
Purpose
Overview of pilot status, health metrics, and KPIs.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Pilot Dashboard Week: 2024-W03 │
├─────────────────────────────────────────────────────────────┤
│ ┌───────────┬───────────┬───────────┬───────────┐ │
│ │ Users │ Inventory│ Cycles │ Returns │ │
│ │ ─────── │ ─────── │ ─────── │ ─────── │ │
│ │ 23/25 │ 87 total │ 18 active│ 3 overdue│ │
│ │ Active │ 72 avail │ this week│ ⚠ │ │
│ └───────────┴───────────┴───────────┴───────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ This Week's Cycles ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ████████████████████████░░░░░░ ││
│ │ Scheduled: 3 | Committed: 5 | Shipped: 8 | Delivered: 2││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌───────────────────────┐ ┌─────────────────────────────┐ │
│ │ Attention Needed │ │ Recent Activity │ │
│ │ ───────────────── │ │ ───────────────────────── │ │
│ │ ⚠ 3 overdue returns │ │ 10:32 Box received (Bob) │ │
│ │ ⚠ 2 users on hold │ │ 10:15 Cycle shipped (Eve) │ │
│ │ ⚠ 1 unresolved issue │ │ 09:45 User onboarded │ │
│ │ │ │ 09:30 Feedback logged │ │
│ │ [View Exceptions] │ │ 09:00 Scheduling ran ✓ │ │
│ └───────────────────────┘ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Pilot KPIs (Week to Date) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Metric Value Target Status ││
│ │ Cycle Completion Rate 94% 95% 🟡 ││
│ │ On-Time Delivery 92% 90% 🟢 ││
│ │ Return Compliance 88% 90% 🟡 ││
│ │ Fit Satisfaction 4.2/5 4.0/5 🟢 ││
│ │ Exception Rate 6% 10% 🟢 ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
getPilotStats
// Multiple queries or a transformer that computes:
// - Active users count
// - Available inventory count
// - Active cycles count
// - Overdue returns count
getThisWeekCycles
// Resource: YFT-Airtable
// Action: List Records
// Table: Cycles
// Filter: {week_id} = ''
// Group by: cycle_state
getRecentEvents
// Resource: YFT-Airtable
// Action: List Records
// Table: Events
// Sort: timestamp DESC
// Limit: 20
getAttentionItems
// Transformer combining:
// - Overdue returns (from Cycles)
// - Users on hold (from Users)
// - Unresolved feedback (from PilotFeedback)
getPilotKPIs
// Transformer computing:
// - Cycle completion rate = closed cycles / total cycles
// - On-time delivery = on-time / total delivered
// - Return compliance = returned on time / total returns due
// - Fit satisfaction = avg fit_rating from PilotFeedback
// - Exception rate = cycles with exceptions / total cycles
Components
- statCards (Container with 4 cards)
- Users, Inventory, Cycles, Returns
- Color coding for status
- cycleProgressBar (Stacked Progress)
- Segments for each cycle state
- Counts below
- attentionList (List)
- Data:
getAttentionItems - Priority indicators
- Link to relevant page
- Data:
- activityFeed (List)
- Data:
getRecentEvents.data(formatted) - Timestamp, description
- Data:
- kpiTable (Table)
- Data:
getPilotKPIs - Columns: Metric, Value, Target, Status indicator
- Data:
Page 5: CommunicationLog (YFT-AdminConsole)
Purpose
Track and log all user communications.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Communication Log [+ Log New] │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Filter: [All Types ▼] [All Users ▼] [This Week ▼] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Communications (47 total) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Date User Type Status ││
│ │ Jan 15 Alice Test BoxShipping ✓ Sent ││
│ │ Jan 15 Bob Test ReturnReminder1 ✓ Sent ││
│ │ Jan 14 Carol Test OverdueWarning ✓ Sent ││
│ │ Jan 14 Dan Test DeliveryConfirmed ✓ Sent ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Log New Communication ││
│ │ ──────────────────────────────────────────────────────│││
│ │ User: [Select User ▼] │ │
│ │ Cycle: [Select Cycle ▼] (optional) │ │
│ │ Type: [BoxShipping ▼] │ │
│ │ Channel: [Email ▼] │ │
│ │ Subject: [________________________________] │ │
│ │ Notes: [________________________________] │ │
│ │ │ │
│ │ [Log as Sent] │ │
│ │ │ │
│ │ 💡 Use email templates: [View Templates] │ │
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
getCommunications
// Resource: YFT-Airtable
// Action: List Records
// Table: CommunicationEvents
// Filter: Based on filter selections
// Sort: sent_at DESC
logCommunication
// Resource: YFT-Airtable
// Action: Create Record
// Table: CommunicationEvents
// Fields: Form values + sent_at = NOW(), sent_by = current operator
Components
- filterBar (Container)
- Type filter (comm_type options)
- User filter
- Date range filter
- communicationsTable (Table)
- Data:
getCommunications.data - Columns: sent_at, user_name, comm_type, channel, status
- Data:
- logForm (Form Container)
- User selector
- Cycle selector (optional, filtered by user)
- Type selector
- Channel selector
- Subject input
- Notes textarea
- logButton (Button)
- On click: Run
logCommunication, clear form
- On click: Run
- templatesLink (Link/Button)
- Opens email templates reference (modal or new tab)
Page 6: FeedbackCapture (YFT-AdminConsole)
Purpose
Log and manage user feedback and fit observations.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Feedback & Observations [+ New Feedback] │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Unresolved Feedback (5) ││
│ │ ───────────────────────────────────────────────────── ││
│ │ Sev User Type Description ││
│ │ 🔴 Carol Test FitIssue "Pants too tight" ││
│ │ 🟡 Bob Test StyleFeedback "More casual options" ││
│ │ 🟢 Alice Test Positive "Love the quality!" ││
│ │ 🟡 Dan Test Suggestion "Earlier delivery" ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Selected: Carol Test - Fit Issue ││
│ │ ──────────────────────────────────────────────────────│││
│ │ Reported: Jan 14 | Cycle: C-120 | Garment: G021 │ │
│ │ │ │
│ │ Description: "The pants (G021) were too tight in the │ │
│ │ waist. I usually wear 32 but these felt like 30." │ │
│ │ │ │
│ │ Fit Rating: ★★☆☆☆ (2/5) │ │
│ │ Would Wear Again: No │ │
│ │ │ │
│ │ Operator Notes: [_____________________________] │ │
│ │ Action Taken: [_____________________________] │ │
│ │ │ │
│ │ [Update Fit Profile] [Flag Garment] [Mark Resolved] │ │
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Log New Feedback ││
│ │ ──────────────────────────────────────────────────────│││
│ │ User: [Select ▼] Cycle: [Select ▼] Garment: [▼] │ │
│ │ Type: [FitIssue ▼] Severity: [Medium ▼] │ │
│ │ Fit Rating: [★★★☆☆] │ │
│ │ Would Wear Again: [☐] │ │
│ │ Description: [________________________________] │ │
│ │ [Submit Feedback] │ │
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
getUnresolvedFeedback
// Resource: YFT-Airtable
// Action: List Records
// Table: PilotFeedback
// Filter: {resolved} = FALSE
// Sort: severity DESC, reported_at ASC
createFeedback
// Resource: YFT-Airtable
// Action: Create Record
// Table: PilotFeedback
// Fields: Form values + reported_at = NOW()
resolveFeedback
// Resource: YFT-Airtable
// Action: Update Record
// Table: PilotFeedback
// Fields: {
// "resolved": true,
// "resolved_at": NOW(),
// "operator_notes": "",
// "action_taken": ""
// }
Components
- unresolvedTable (Table)
- Data:
getUnresolvedFeedback.data - Columns: severity (icon), user, type, description (truncated)
- Row selection: single
- Data:
- feedbackDetailContainer (Container)
- Full feedback details
- Operator notes input
- Action taken input
- actionButtons (Button Group)
- “Update Fit Profile” → Opens UserManager with fit profile edit
- “Flag Garment” → Adds note to garment
- “Mark Resolved” → Run
resolveFeedback
- newFeedbackForm (Form Container)
- All feedback fields
- Star rating component for fit_rating
Page 7: DataExport (YFT-AdminConsole)
Purpose
Export pilot data for analysis.
Layout
┌─────────────────────────────────────────────────────────────┐
│ Data Export │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Export Options ││
│ │ ───────────────────────────────────────────────────── ││
│ │ ││
│ │ Date Range: [Jan 1] to [Jan 31] ││
│ │ ││
│ │ Data Sets to Export: ││
│ │ ☑ Users (with fit profiles) ││
│ │ ☑ Cycles (all states) ││
│ │ ☑ Garments (with utilization) ││
│ │ ☑ Events (state changes) ││
│ │ ☑ Feedback ││
│ │ ☑ Communications ││
│ │ ││
│ │ Format: [CSV ▼] ││
│ │ ││
│ │ [Generate Export] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Quick Reports ││
│ │ ───────────────────────────────────────────────────── ││
│ │ [Cycle Summary] [Utilization Report] [Fit Analysis] ││
│ │ [Exception Report] [KPI Dashboard Export] ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Generated Files ││
│ │ ───────────────────────────────────────────────────── ││
│ │ pilot-export-2024-01-15-cycles.csv [Download] ││
│ │ pilot-export-2024-01-15-users.csv [Download] ││
│ │ pilot-export-2024-01-15-feedback.csv [Download] ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
Queries
exportUsers
// Resource: YFT-Airtable
// Action: List Records
// Table: Users
// Join with FitProfiles
// Format for CSV
exportCycles
// Resource: YFT-Airtable
// Action: List Records
// Table: Cycles
// Include computed fields (durations, etc.)
exportGarments
// Resource: YFT-Airtable
// Action: List Records
// Table: Garments
// Compute utilization metrics
Components
- dateRangePicker (Date Range)
- Start and end date
- datasetCheckboxes (Checkbox Group)
- Select which tables to export
- formatSelector (Select)
- CSV, JSON options
- generateExportButton (Button)
- On click: Run selected export queries
- Generate downloadable files
- quickReportButtons (Button Group)
- Pre-configured report exports
- generatedFilesList (List)
- Show recent exports with download links
Page 8: Enhanced ExceptionWorkflow
See Weekly Cycle Flow guide for base ExceptionWorkflow. Add these pilot-specific enhancements:
Additional Pilot Features
- Feedback Integration
- Show related feedback for user/cycle
- Quick “Log Feedback” button
- Communication History
- Show all communications sent to user
- “Send Communication” button
- Fit Profile Update
- When resolving fit issues, option to update profile
- Pilot-Specific Resolutions
- “Skip Next Cycle” - Give user a week off
- “Swap Inventory” - Replace garments with better fit
- “Refund Credit” - Issue pilot credit
Verification Checklist
After completing setup:
- UserOnboarding creates user + fit profile
- GarmentOnboarding registers garments with barcodes
- AllocationWorkbench filters by fit and saves allocations
- PilotDashboard shows all KPIs correctly
- CommunicationLog tracks all communications
- FeedbackCapture logs and resolves feedback
- DataExport generates downloadable files
- ExceptionWorkflow has pilot-specific options
Navigation Structure
YFT-AdminConsole
├── Dashboard (State Authority)
├── PilotDashboard (NEW)
├── UserManager (State Authority)
├── UserOnboarding (NEW)
├── CycleManager (State Authority)
├── AllocationWorkbench (NEW)
├── SchedulingMonitor (Weekly Cycle Flow)
├── CommitmentMonitor (Weekly Cycle Flow)
├── ExceptionWorkflow (Weekly Cycle Flow + Pilot enhancements)
├── CommunicationLog (NEW)
├── FeedbackCapture (NEW)
├── EventViewer (State Authority)
└── DataExport (NEW)
YFT-WarehouseOps
├── GarmentScanner (State Authority)
├── GarmentOnboarding (NEW)
├── BoxPacker (State Authority)
├── FulfillmentQueue (Weekly Cycle Flow)
├── ShipmentDashboard (Weekly Cycle Flow)
├── ReceivingStation (Weekly Cycle Flow)
└── InspectionStation (Weekly Cycle Flow)