Schedule Templates & Recurring Shifts

Complete guide to saving entire weekly schedules as reusable templates, copying them to future weeks/months, and creating recurring shift patterns. Eliminate repetitive schedule creation by reusing proven schedules.

8 min readManager & Head Manager

What Are Schedule Templates?

Schedule Templates let you save entire weeks or months of shifts and copy them to new date ranges. Instead of manually recreating the same 40+ shifts every week, save your proven schedule once and reuse it instantly.

Perfect for:

  • • Businesses with repeating weekly patterns (restaurants, retail, gyms)
  • • Seasonal schedule changes (summer vs winter staffing)
  • • Multi-location businesses copying proven schedules to new locations
  • • Holiday schedules you reuse year after year
  • • Any schedule that repeats predictably

How It Works (Simple)

  1. 1. Save: Select a date range (June 1-7) and click "Save as Template"
  2. 2. Name: Give it a name like "Standard Week" or "Summer Schedule"
  3. 3. Apply: Pick a new start date (July 1) and XShift recreates all shifts
  4. 4. Done: Same shifts, different dates. 3 hours saved.

Saving Schedule Templates

Accessing Save Template

  • • Navigate to: Schedule page (/{orgId}/schedule)
  • • Button location: Top toolbar, "Save as Template"
  • • Available to: MANAGER and HEAD_MANAGER roles only
  • • Opens template save modal

Template Save Form

Required Fields:

1. Template Name (required)

  • • Text input field
  • • Example: "Standard Week", "Summer Schedule", "Holiday Coverage"
  • • Free-form text (no restrictions)
  • • Used to identify template later

2. Description (optional)

  • • Text area for notes
  • • Example: "Standard weekly pattern for regular season"
  • • Helps remember when to use this template

3. Start Date (required)

  • • Date picker
  • • Beginning of date range to save
  • • Example: June 1, 2025 (this week's Monday)

4. End Date (required)

  • • Date picker
  • • End of date range to save
  • • Must be AFTER start date
  • • Maximum range: 90 days
  • • Error if end before start: "Start date must be before end date"
  • • Error if exceeds 90 days: "Date range cannot exceed 90 days"

What Gets Saved

Template includes:

  • • All shifts within selected date range
  • • Shift start times and end times
  • • Location assignments for each shift
  • • Required staff counts (requiredCount field)
  • • Day offset from start date (calculated automatically)
  • • Duration in days (calculated from start/end dates)
  • • Total shift count (calculated from date range)
  • • Total hours across all shifts (calculated)
  • • Unique employee count (calculated from assignments)

What does NOT get saved:

  • • Employee assignments (shifts will be unassigned when applied)
  • • Shift status (DRAFT/PUBLISHED - uses org default when applied)
  • • Specific dates (only relative day offsets saved)

Saving the Template

  • • Click "Save Template" button at bottom of modal
  • • API call: POST /api/orgs/{orgId}/schedule-templates
  • • Validates all required fields filled
  • • Validates date range (start before end, max 90 days)
  • • Fetches all shifts in date range from database
  • • Error if no shifts found: "No shifts found in date range"
  • • Success: Template created with unique ID
  • • Success toast: "Template saved! ID: {id} ({X} shifts)"
  • • Example: "Template saved! ID: abc123 (42 shifts)"
  • • Modal closes automatically
  • • Template added to template library

Template Metadata

Every template shows:

  • • Template name and description
  • • Total shifts (e.g., 42 shifts)
  • • Duration in days (e.g., 7 days)
  • • Total hours (e.g., 336 hours)
  • • Unique employees (e.g., 12 employees)
  • • Original start date (when template was created)
  • • Created date (timestamp)

Applying Schedule Templates

Accessing Apply Template

  • • Navigate to: Schedule page (/{orgId}/schedule)
  • • Button location: Top toolbar, "Apply Template"
  • • Available to: MANAGER and HEAD_MANAGER roles only
  • • Opens template application modal
  • • Modal title: "Apply Template"

Template Application Form

Required Fields:

1. Select Template (required)

  • • Dropdown of saved templates
  • • Shows template name + shift count
  • • Example: "Standard Week Schedule (42 shifts)"
  • • Only shows active templates for your organization

2. Target Start Date (required)

  • • Date picker
  • • When to start applying template
  • • Example: July 1, 2025 (next month)
  • • All shifts created relative to this start date

3. Location Filter (optional)

  • • Multi-select dropdown
  • • Filter which locations to apply template to
  • • Leave empty to apply all locations
  • • Example: Only create shifts for "Downtown Store"
  • • Skips shifts from other locations in template

4. Staffing Multiplier (optional)

  • • Number input (default: 1.0)
  • • Range: 0.5x to 2.0x
  • • Adjusts required staff counts when applying
  • • Example: 0.75x for slow week (3 staff becomes 2)
  • • Example: 1.5x for busy season (4 staff becomes 6)
  • • Rounds to nearest whole number (minimum 1)

5. Day Offset Selection (optional)

  • • Checkboxes for each day offset in template
  • • Choose which days from template to apply
  • • Example: Template has 7 days (0-6), select only 0-4 (Mon-Fri)
  • • Skips unselected day offsets
  • • Leave all checked to apply full template

Preview Before Applying

  • • "Preview" button shows what will be created
  • • Displays all shifts grouped by day offset
  • • Shows shift titles, times, locations
  • • Shows total shifts to be created
  • • Lists all locations involved
  • • Calculate date range: targetStart + durationDays
  • • Review before confirming application

Applying the Template

  • • Click "Apply Template" button to confirm
  • • API call: POST /api/orgs/{orgId}/schedule-templates/{id}/apply
  • • Validates target start date provided
  • • Validates staffing multiplier (0.5 - 2.0 range)
  • • Fetches template with all template shifts
  • • Error if template not found: "Template not found"

What Happens During Application

For each template shift:

  1. 1. Check location filter (skip if location not selected)
  2. 2. Check day offset filter (skip if day not selected)
  3. 3. Calculate actual shift date: targetStart + dayOffset
  4. 4. Apply staffing multiplier to required count
  5. 5. Create new shift with calculated date and adjusted count
  6. 6. Shift status: DRAFT or PUBLISHED (based on org settings)
  7. 7. All shifts created as unassigned (no employee assignments)

Success Confirmation

  • • Success toast: "X shifts created successfully!"
  • • Example: "42 shifts created for July 1 - July 7"
  • • All new shifts appear in calendar immediately
  • • Modal closes automatically
  • • Calendar auto-refreshes to show new shifts
  • • Response includes: shiftsCreated count, startDate, endDate

Example Application:

Template: "Standard Week Schedule" (42 shifts, June 1-7)
Target Start: July 1, 2025
Location Filter: "Downtown Store" only
Staffing Multiplier: 1.0x (no change)
Day Offsets: All selected (0-6)

Result: Creates 42 new shifts for July 1-7 at Downtown location with same times and required counts as original template.

Template Library

Viewing All Templates

  • • Navigate to: Schedule page
  • • Click "Manage Templates" button (or view templates dropdown)
  • • API call: GET /api/orgs/{orgId}/schedule-templates
  • • Returns all active templates for your organization
  • • Sorted by creation date (newest first)

Template List Display

Each template shows:

  • • Template name (e.g., "Standard Week Schedule")
  • • Description (if provided)
  • • Total shifts (e.g., "42 shifts")
  • • Duration in days (e.g., "7 days")
  • • Created date (e.g., "Created: Jan 15, 2025")
  • • Action buttons: Apply, Delete

Deleting Templates

  • • Click trash icon next to template
  • • Confirmation prompt: "Are you sure you want to delete this template?"
  • • Must click "Confirm" to proceed
  • • API call: DELETE /api/orgs/{orgId}/schedule-templates/{id}
  • • Template soft-deleted (isActive set to false)
  • • Does NOT delete shifts created from this template
  • • Success toast: "Template deleted successfully"
  • • Template removed from list

Template Limits

  • • Unlimited templates per organization
  • • Maximum date range per template: 90 days
  • • Templates never expire (save once, use forever)
  • • Can apply same template unlimited times
  • • Each application creates independent shifts

Recurring Shifts

Recurring Shifts let you create repeating shift patterns (daily, weekly, monthly, or custom) and generate all shifts at once for a date range. Perfect for shifts that happen on a regular schedule like "Every Monday and Wednesday" or "Every 3 days".

Accessing Recurring Shift Creator

  • • Navigate to: Schedule page (/{orgId}/schedule)
  • • Button location: Top toolbar, "Create Recurring Shifts"
  • • Available to: MANAGER and HEAD_MANAGER roles only
  • • Opens recurring shift creation modal
  • • Modal title: "Create Recurring Shifts"

Recurring Shift Form

Required Fields:

1. Shift Title (required)

  • • Text input field
  • • Example: "Morning Shift", "Cashier - Evening", "Security Patrol"
  • • Applied to all created shifts

2. Location (required)

  • • Dropdown of locations
  • • All shifts created at same location

3. Start Time (required)

  • • Time picker (HH:MM format)
  • • Example: 09:00 AM
  • • Applied to all shifts

4. End Time (required)

  • • Time picker (HH:MM format)
  • • Must be AFTER start time
  • • Can be next day for overnight shifts
  • • Maximum 24-hour duration

5. Required Count (required)

  • • Number input (default: 1)
  • • How many employees needed per shift
  • • Range: 1-99

6. Recurrence Pattern (required)

  • Daily: Every day
  • Weekly: Every week on selected days
  • Monthly: Specific day of month (e.g., 1st, 15th)
  • Custom: Every X days

7. Days of Week (if weekly)

  • • Checkboxes for Mon, Tue, Wed, Thu, Fri, Sat, Sun
  • • Select which days to create shifts
  • • Example: Check Mon, Wed, Fri for MWF pattern
  • • Must select at least one day

8. Custom Frequency (if custom)

  • • Number input (e.g., 3 for "every 3 days")
  • • Range: 1-30 days

9. Start Date (required)

  • • Date picker
  • • When recurrence begins
  • • First shift created on this date

10. End Date (required)

  • • Date picker
  • • When recurrence stops
  • • Must be AFTER start date
  • • Maximum range: 90 days from start
  • • Error if exceeds 90 days: "Date range cannot exceed 90 days"

Creating Recurring Shifts

  • • Click "Create Recurring Shifts" button to submit
  • • API call: POST /api/orgs/{orgId}/shifts/recurring
  • • System calculates all dates matching pattern within date range
  • • Example: Weekly on Mon/Wed/Fri from Jan 1 - Jan 31 = ~13 shifts
  • • All shifts created with same title, location, times, required count
  • • Shift status: DRAFT or PUBLISHED (based on org settings)
  • • All shifts created as unassigned (no employee assignments)
  • • Success toast: "X recurring shifts created successfully!"
  • • Example: "13 recurring shifts created successfully!"
  • • All shifts appear in calendar immediately
  • • Modal closes automatically

Important Notes

After creation:

  • • Each shift is independent (no ongoing link to recurrence pattern)
  • • Can edit shifts individually after creation
  • • Can delete shifts individually
  • • Changing one shift does NOT affect others
  • • To modify all shifts: Delete and recreate recurring pattern

Recurring Pattern Examples

📅 Daily Pattern

Pattern: Daily
Start: June 1, 2025
End: June 7, 2025
Result: 7 shifts (one per day)

📅 Weekly Pattern (Mon/Wed/Fri)

Pattern: Weekly on Monday, Wednesday, Friday
Start: June 1, 2025 (Monday)
End: June 30, 2025
Result: 13 shifts (M/W/F throughout June)

📅 Custom Frequency (Every 3 Days)

Pattern: Custom - Every 3 days
Start: June 1, 2025
End: June 30, 2025
Result: 10 shifts (June 1, 4, 7, 10, 13, 16, 19, 22, 25, 28)

Real-World Examples

🍔 Weekly Restaurant Rollover

Scenario: Every Sunday, the manager needs next week's schedule. June 1-7 schedule was perfect—42 shifts across breakfast, lunch, dinner.

Old way: 4 hours manually recreating 42 shifts
With templates: Save "Standard Week" template once. Every Sunday, apply template to next Monday. Done in 2 minutes.
Time saved: 3 hours 58 minutes per week

☀️ Seasonal Gym Schedule Swap

Scenario: June 1st arrives. Time to switch from "Winter Schedule" (fewer morning classes) to "Summer Schedule" (more morning, fewer evening).

Old way: 6 hours rebuilding entire schedule from memory
With templates: Load "Summer Schedule" template, apply to June 1. Done in 90 seconds.
Time saved: 5 hours 58 minutes

🏥 Healthcare 4-Week Planning

Scenario: Hospital requires 4-week advance scheduling for nursing staff. Standard 2-week rotation pattern needs to cover 8 weeks.

Old way: 16 hours creating 8 weeks of shifts manually
With templates: Save "2-Week Rotation" template. Apply 4 times (Week 1, Week 3, Week 5, Week 7). Done in 8 minutes.
Time saved: 15 hours 52 minutes

🛍️ Multi-Location Retail Expansion

Scenario: Downtown store's schedule is perfect. New suburban location opens with same shift pattern needed.

Old way: 5 hours manually recreating all 35 shifts for new location
With templates: Save downtown schedule as template. Apply to suburban location with location filter. 3 minutes.
Time saved: 4 hours 57 minutes

Permissions & Access

Required Role

  • • MANAGER role: Can save and apply templates
  • • HEAD_MANAGER role: Can save and apply templates
  • • EMPLOYEE role: Cannot access template features

Manager Permission Check

  • • Permission: canSaveShiftTemplates
  • • HEAD_MANAGER: Always allowed (always true)
  • • MANAGER without permission record: Allowed by default (defaults true)
  • • MANAGER with explicit permission: Allowed if canSaveShiftTemplates = true
  • • MANAGER with permission disabled: Blocked if canSaveShiftTemplates = false
  • • Error if blocked: "Permission denied. You do not have permission to save shift templates. Contact your Head Manager to enable this permission."

Organization Isolation

  • • Can only access templates in your organization
  • • Templates filtered by orgId automatically
  • • Cannot view or apply templates from other organizations
  • • Error if unauthorized: "Unauthorized"

Best Practices

✅ Use Descriptive Names

Name templates clearly: "Standard Week", "Summer Busy Season", "Holiday Reduced Hours". Avoid generic names like "Template 1" that won't make sense 6 months later.

✅ Add Descriptions

Use the description field to note when to use this template. Example: "Use during summer months (June-Aug) when morning classes are busier."

✅ Save After Perfecting Schedule

Don't save a template until you've refined the schedule and confirmed it works well. Templates should represent your "proven" schedules.

✅ Use Staffing Multiplier for Variations

Instead of creating separate templates for busy/slow weeks, save one "Standard Week" template and use 1.5x multiplier for busy weeks, 0.75x for slow weeks.

✅ Review After Applying

Applied shifts start as drafts (or published based on settings). Always review newly created shifts before publishing to employees to catch any needed adjustments.

Get Started

Log in to your manager dashboard and start saving schedule templates.

Go to Schedule →
Schedule Templates - Save & Reuse Weekly Schedules | XShift AI