Back to All Guides
Core Scheduling

Schedule Creation & Management

Complete guide to creating and managing employee schedules: manual shift creation, editing, deleting, draft vs published workflows, conflict detection, schedule templates, recurring shifts, and publishing. Manager role required.

12 min read
Manager & Head Manager
Manual Scheduling

Accessing the Schedule Page

Navigate to your organization schedule

Navigation

  • Schedule page located in left sidebar navigation
  • Navigate to: /{orgId}/schedule
  • Available to: MANAGER and HEAD_MANAGER roles only
  • EMPLOYEE role cannot access schedule page
  • Page title: "Schedule"
  • Default view: Week view
  • Auto-refreshes every 30 seconds to show latest changes

View Options

  • 3 calendar views available:
  • 1. Day View - Single day with hourly breakdown
  • 2. Week View (Default) - 7-day week starting Monday
  • 3. Month View - Full month calendar grid
  • Switch views using buttons in toolbar
  • Navigation: Previous/Next arrows to change date range
  • Today button to jump back to current date

Creating Shifts Manually

How to create individual shifts

Create Shift Button

  • "+ Create Shift" button in top-right corner
  • Opens shift creation modal
  • Modal title: "Create New Shift"
  • 5 required fields to fill

Shift Creation Form

  • 1. Title (required)
  • - Text input field
  • - Example: "Morning Shift", "Cashier - Evening", "Security Patrol"
  • - Free-form text (no restrictions)
  • 2. Start Date & Time (required)
  • - Combined datetime picker
  • - Select date and time in one field
  • - Format: YYYY-MM-DD HH:MM
  • 3. End Date & Time (required)
  • - Combined datetime picker
  • - Must be AFTER start time
  • - Can be next day for overnight shifts (max 24 hours)
  • - Validation: End must be after start
  • - Validation: Maximum 24-hour duration
  • - Error if end <= start: "End time must be after start time"
  • - Error if > 24 hours: "Shifts cannot exceed 24 hours"
  • 4. Location (required)
  • - Dropdown of existing locations
  • - Shows all active locations in your organization
  • - Auto-creates location if new name entered (if allowed)
  • - Displays staffing requirements if role-based staffing enabled
  • 5. Required Count (required)
  • - Number input (default: 1)
  • - How many employees needed for this shift
  • - If role-based staffing enabled AND location has requirements:
  • * Field becomes LOCKED at total required count
  • * Cannot change (enforces staffing rules)
  • * Example: "This location requires exactly 5 staff (3 from Server, 2 from Chef)"
  • * Error shown if you try different number
  • - If no staffing rules: Can set any number 1-99

Initial Status: DRAFT vs PUBLISHED

  • New shifts start as either DRAFT or PUBLISHED based on org settings
  • If "Require Publish Approval" setting is ENABLED (default):
  • - New shifts created as DRAFT status
  • - NOT visible to employees until published
  • - Shows as PINK in calendar
  • - Must manually publish via "Publish Schedule" button
  • - Gives manager time to review before employees see
  • If "Require Publish Approval" setting is DISABLED:
  • - New shifts immediately created as PUBLISHED
  • - Visible to employees right away
  • - Shows as BLUE in calendar (if fully staffed)
  • - No manual publish step needed
  • Check setting at: Settings → Require Schedule Publish Approval

Creating the Shift

  • "Create Shift" button at bottom of modal
  • Validates all required fields filled
  • Validates end time after start time
  • Validates duration <= 24 hours
  • If role-based staffing enabled: Validates required count matches
  • Success: Shift appears in calendar immediately
  • Success toast: "Shift created! Use Auto-Generate to assign employees."
  • Modal closes automatically
  • Form resets for next shift creation
  • Shift appears in correct date/time slot in calendar

Shift Status & Colors

Understanding shift status indicators

DRAFT Status (Pink/Yellow)

  • Shift not yet published to employees
  • Employees CANNOT see draft shifts
  • Only managers see draft shifts
  • Color coding for DRAFT:
  • - YELLOW background: No employees assigned (needs attention)
  • - LIGHT PINK background: Partially staffed (some assignments)
  • - BRIGHT PINK background: Fully staffed (assignedCount = requiredCount)
  • Fully-staffed DRAFT shifts are ready to publish
  • Bright pink = "This shift is ready to go live!"

PUBLISHED Status (Blue)

  • Shift visible to assigned employees
  • Shows in employee dashboard
  • BLUE background: Upcoming shift, fully staffed
  • GRAY background: Published but understaffed (edge case)
  • Employees receive notifications when published (if enabled)

IN_PROGRESS Status (Purple)

  • Employee has clocked in
  • Shift currently active
  • PURPLE background: Someone actively working
  • Real-time indicator of current work

COMPLETED Status (Green)

  • Employee clocked in AND clocked out successfully
  • Shift ended with timesheet entry
  • GREEN background: Successfully completed
  • Ready for payroll processing

CANCELLED Status (Red)

  • Shift was cancelled by manager
  • RED background: Cancelled
  • Employees notified of cancellation

No-Show Status (Orange)

  • Shift ended but employee never clocked in
  • ORANGE background: No-show alert
  • Indicates attendance issue
  • Manager should follow up with employee

Viewing Shift Details

Click any shift to see full details

Shift Details Modal

  • Click any shift card in calendar to open details
  • Modal shows complete shift information
  • Information displayed:
  • - Shift title
  • - Date and day of week
  • - Start time - End time (formatted as "8:00 AM - 4:00 PM")
  • - Location name
  • - Status badge (DRAFT, PUBLISHED, etc.)
  • - Required count (e.g., "Needs 3 employees")
  • - Assigned employees section:
  • * List of currently assigned employees
  • * Employee names with avatars
  • * Assignment status (ASSIGNED or DROPPED)
  • * "Empty slots" shown if understaffed
  • - Dropped employees section (if any):
  • * Employees who dropped this shift
  • * Shown with DROPPED status badge
  • Action buttons at bottom:
  • - "Edit Shift" button (pencil icon)
  • - "Delete Shift" button (trash icon)
  • - "Close" button

Editing Shifts

Modify existing shift details

How to Edit

  • Click shift card in calendar to open details
  • Click "Edit Shift" button (pencil icon)
  • Opens edit modal with pre-filled current values
  • Editable fields:
  • - Title
  • - Start date/time
  • - End date/time
  • - Location (dropdown)
  • - Status (DRAFT/PUBLISHED)
  • - Required count (if no staffing rules)
  • Same validations as create:
  • - End must be after start
  • - Maximum 24-hour duration
  • - Staffing requirements must match (if enabled)

Saving Changes

  • "Save Changes" button at bottom
  • PATCH request to /api/orgs/{orgId}/shifts/{shiftId}
  • Validates data before saving
  • Success: Modal closes, calendar updates immediately
  • Success toast: "Shift updated successfully"
  • Error toast if validation fails
  • Updating shift does NOT affect existing assignments
  • Assigned employees stay assigned
  • If you change time: Employees see updated time in their dashboard

Permission Requirements

  • Only MANAGER and HEAD_MANAGER can edit shifts
  • EMPLOYEE role cannot edit shifts
  • Must have org access (same orgId)
  • 403 Forbidden if insufficient permissions

Deleting Shifts

Remove shifts from schedule

How to Delete

  • Click shift card to open details modal
  • Click "Delete Shift" button (trash icon)
  • Confirmation prompt appears:
  • "Are you sure you want to delete this shift?"
  • "This will also remove all employee assignments."
  • Must click "Confirm" to proceed
  • Click "Cancel" to abort deletion

What Gets Deleted

  • Shift record is permanently deleted
  • ALL employee assignments for this shift are deleted
  • Employees are unassigned automatically
  • Clock entries (if any) remain for payroll history
  • Deletion is PERMANENT - cannot be undone
  • Employees DO NOT see deleted shifts anymore

Success Confirmation

  • Shift removed from calendar immediately
  • Details modal closes
  • Success toast message:
  • - If had assignments: "Shift deleted! X assignment(s) removed."
  • - If no assignments: "Shift deleted successfully!"
  • Auto-refresh skipped for 5 seconds to prevent flash
  • Error handling:
  • - "Shift not found" if already deleted
  • - "Failed to delete shift" if API error

Publishing Schedules

Make draft shifts visible to employees

Publish Schedule Button

  • Only appears if "Require Publish Approval" setting is enabled
  • Button location: Top toolbar, next to view switcher
  • Shows count of publishable shifts in badge
  • Example: "Publish Schedule (5)" means 5 fully-staffed drafts ready
  • Button is disabled (grayed out) if:
  • - No draft shifts exist
  • - All draft shifts are understaffed
  • - Nothing ready to publish
  • Button enabled (clickable) when:
  • - At least 1 DRAFT shift is fully staffed
  • - Fully staffed = assignedCount === requiredCount

Publish Preview Modal

  • Click "Publish Schedule" button opens preview
  • Modal title: "Publish Schedule"
  • Shows two lists:
  • 1. WILL BE PUBLISHED (green section)
  • - All DRAFT shifts that are fully staffed
  • - Shows shift title, date, time, location
  • - Shows assigned employee count
  • - These will change from DRAFT → PUBLISHED
  • 2. WILL REMAIN DRAFT (yellow section)
  • - DRAFT shifts that are understaffed
  • - Shows what's missing (e.g., "Needs 2 more employees")
  • - These stay DRAFT until fully staffed
  • - Cannot be published yet
  • Bottom of modal:
  • - "Cancel" button (abort, no changes)
  • - "Publish X Shifts" button (proceed with publish)

Publishing Process

  • Click "Publish X Shifts" to confirm
  • API call: POST /api/orgs/{orgId}/schedule/publish
  • What happens:
  • - All fully-staffed DRAFT shifts → PUBLISHED status
  • - Understaffed DRAFT shifts remain DRAFT
  • - Published shifts now visible to employees
  • - Employees see shifts in their dashboard
  • Notifications sent (if enabled in settings):
  • - Email notifications to all assigned employees
  • - Notification type: SCHEDULE_PUBLISHED
  • - Includes shift date, start time, end time
  • - Check setting: Settings → Email Notifications → Schedule Published
  • Success message:
  • - If some remain draft: "X shifts published. Y shifts remain draft (not fully staffed)."
  • - If all published: "All shifts published successfully!"
  • Calendar updates:
  • - Published shifts change from PINK → BLUE
  • - Remaining drafts stay PINK/YELLOW

Filters & Search

Find specific shifts quickly

Search Bar

  • Search input at top of schedule page
  • Placeholder: "Search shifts..."
  • Magnifying glass icon
  • Searches across:
  • - Shift titles
  • - Location names
  • - Case-insensitive matching
  • Real-time filtering as you type
  • Calendar updates immediately to show matching shifts only

Location Filter

  • Dropdown: "All Locations" (default)
  • Filter icon next to dropdown
  • Options:
  • - "All Locations" (shows all shifts)
  • - Individual location names (e.g., "Downtown Store")
  • Selecting a location:
  • - Shows only shifts at that location
  • - Other shifts hidden from calendar
  • - Useful for multi-location organizations

Status Filter

  • Dropdown: "All Statuses" (default)
  • Filter options:
  • - "All Statuses" (shows all)
  • - "Draft" (only DRAFT shifts)
  • - "Published" (only PUBLISHED)
  • - "In Progress" (only IN_PROGRESS)
  • - "Completed" (only COMPLETED)
  • - "Cancelled" (only CANCELLED)
  • Use cases:
  • - View only drafts to see what needs publishing
  • - View only completed to verify timesheet entries
  • - View only in-progress to see active shifts

Combining Filters

  • All three filters work together
  • Example: Search "morning" + Location "Downtown" + Status "Draft"
  • → Shows only draft morning shifts at downtown location
  • Reset filters:
  • - Clear search text
  • - Select "All Locations"
  • - Select "All Statuses"
  • Filtered count shown: "Showing X of Y shifts"

Schedule Templates

Save and reuse schedule patterns

Saving a Template

  • "Save as Template" button in toolbar
  • Opens template save modal
  • Template form fields:
  • 1. Template Name (required)
  • - Example: "Standard Week Schedule", "Holiday Schedule"
  • 2. Description (optional)
  • - Notes about when to use this template
  • 3. Start Date (required)
  • - Beginning of date range to save
  • 4. End Date (required)
  • - End of date range to save
  • What gets saved:
  • - All shifts within date range
  • - Shift titles, times, locations, required counts
  • - Duration in days calculated automatically
  • - Total shift count shown
  • "Save Template" button to confirm
  • Success toast: "Template saved! ID: {id} (X shifts)"
  • Template added to template library

Applying a Template

  • "Apply Template" button in toolbar
  • Opens template application modal
  • Step 1: Select Template
  • - Dropdown of saved templates
  • - Shows template name + shift count
  • - Example: "Standard Week Schedule (42 shifts)"
  • Step 2: Preview Template
  • - Click "Preview" to see what will be created
  • - Shows shifts grouped by day offset
  • - Lists all locations involved
  • - Shows total shifts to be created
  • Step 3: Customize Application
  • - Select target start date (when to apply template)
  • - Filter by locations (optional)
  • - Select which day offsets to include
  • - Staffing multiplier (scale required counts)
  • - Edit individual shift required counts
  • Step 4: Apply
  • - "Apply Template" button
  • - Creates all shifts at new dates
  • - Preserves relative timing from template
  • - Example: If template starts Monday, applying to Wednesday creates shifts starting Wednesday
  • Success: All shifts created and appear in calendar
  • All new shifts have same status as org default (DRAFT or PUBLISHED)

Template Management

  • View all templates: Click "Manage Templates"
  • Template library shows:
  • - Template name
  • - Description
  • - Total shifts
  • - Duration in days
  • - Created date
  • Delete template: Trash icon next to template
  • Edit template: Not supported (create new template instead)

Recurring Shifts

Create repeating shift patterns

Opening Recurring Creator

  • "Create Recurring Shifts" button in toolbar
  • Opens recurring shift creation modal
  • Modal title: "Create Recurring Shifts"

Recurring Shift Form

  • 1. Shift Title (required)
  • - Will be used for all created shifts
  • 2. Location (required)
  • - Dropdown of locations
  • - All shifts created at same location
  • 3. Start Time (required)
  • - Time of day shift starts (HH:MM)
  • 4. End Time (required)
  • - Time of day shift ends (HH:MM)
  • - Can be next day for overnight shifts
  • 5. Required Count (required)
  • - Number of employees per shift
  • 6. Recurrence Pattern (required)
  • - Daily: Every day
  • - Weekly: Every week on selected days
  • - Monthly: Specific day of month
  • - Custom: Define your own pattern
  • 7. Days of Week (if weekly)
  • - Checkboxes for Mon, Tue, Wed, Thu, Fri, Sat, Sun
  • - Select which days to create shifts
  • 8. Start Date (required)
  • - When recurrence begins
  • 9. End Date (required)
  • - When recurrence stops
  • - Maximum 90 days from start

Creating Recurring Shifts

  • "Create Recurring Shifts" button to submit
  • System calculates all dates in range:
  • - Example: Weekly on Mon/Wed/Fri from Jan 1 - Jan 31
  • - Creates ~13 shifts (Mon/Wed/Fri in January)
  • API call: POST /api/orgs/{orgId}/shifts/recurring
  • All shifts created with:
  • - Same title
  • - Same location
  • - Same start/end times (relative to each date)
  • - Same required count
  • - Default status (DRAFT or PUBLISHED based on settings)
  • Success toast: "X recurring shifts created successfully!"
  • All shifts appear in calendar
  • Modal closes
  • Each shift is independent:
  • - Can be edited individually
  • - Can be deleted individually
  • - No ongoing link to recurrence pattern

Conflict Detection

System validates shifts to prevent issues

Automatic Validations

  • System runs these checks when creating/editing shifts:
  • 1. Time Validation
  • - End time must be AFTER start time
  • - Error: "End time must be after start time. For overnight shifts, the end time should be on the next day."
  • 2. Duration Validation
  • - Maximum 24-hour shift length
  • - Error: "Shifts cannot exceed 24 hours. Please create separate shifts for multi-day coverage."
  • 3. Staffing Requirement Validation (if enabled)
  • - Required count must match location requirements
  • - Example: Location needs 5 staff (3 servers + 2 chefs)
  • - Cannot create shift with requiredCount = 3
  • - Error: "Staffing requirements are set for this location. This location requires exactly 5 staff (3 from Server, 2 from Chef)."
  • - Suggestion: "The required staff count is locked based on your staffing rules. To change this, go to Settings → Advanced Scheduling → Staffing Requirements."
  • 4. Permission Validation
  • - Only managers can create/edit/delete shifts
  • - Error: "Insufficient permissions" if employee tries
  • 5. Organization Isolation
  • - Can only access shifts in your organization
  • - Error: "Unauthorized" if wrong orgId

Visual Conflict Indicators

  • Calendar shows staffing status visually:
  • DRAFT shifts:
  • - YELLOW = No assignments (needs attention)
  • - LIGHT PINK = Partially staffed (still needs more)
  • - BRIGHT PINK = Fully staffed (ready to publish)
  • This lets managers quickly see:
  • - Which shifts need employees assigned
  • - Which shifts are ready to go live
  • - Overall schedule completeness at a glance

Auto-Refresh & Real-Time Updates

Schedule stays up-to-date automatically

Auto-Refresh

  • Schedule page auto-refreshes every 30 seconds
  • Fetches latest shifts from server
  • Updates shown in real-time without page reload
  • What triggers refresh:
  • - 30-second timer (automatic)
  • - Cross-tab updates (if you edit in another tab)
  • - Location updates (if locations change)
  • Smart refresh behavior:
  • - Skips refresh for 5 seconds after local actions
  • - Prevents flash when you just deleted/updated a shift
  • - Optimizes API calls (66% reduction from 10s → 30s interval)
  • Console logs show refresh activity:
  • - "Auto-refreshing data..."
  • - "Skipping auto-refresh (recent local mutation)"

Cross-Tab Synchronization

  • If you have multiple tabs open:
  • - Changes in one tab sync to others
  • - Uses browser localStorage events
  • - Keys: "shift-update", "location-update"
  • Example: Create shift in Tab A
  • → Tab B detects storage event
  • → Tab B refreshes to show new shift
  • Ensures all windows show same data

Ready to Create Your First Schedule?

Log in to your manager dashboard and start creating shifts for your team.

How to Create Employee Work Schedules & Manage Shifts | XShift AI