ForHosting KIT · Finance & money

Rotating shift schedule planner

A four-on, four-off cycle from 1 to 16 January 2026 gives 8 working days, 1 to 4 and 9 to 12 January, and 8 rest days. Every date is labelled on or off for one worker's roster. Free in your browser.

  • Free
  • Runs in your browser
  • No sign-up
  • Your data stays on your device
Use it from WebAPIEmailTelegramApp soon
If you enter
Start date
2026-01-01
End date
2026-01-16
On days
4
Off days
4
Cycle offset
0
Worker name
Alex Rivera
You get
Cycle length
8
Pattern
4-on/4-off
Total days
16
Days on
8

A rotating shift schedule planner turns a simple cycle pattern—such as four consecutive working days followed by four rest days—into a day-by-day roster for one worker across any inclusive calendar window. Operations leads, site managers, and payroll teams repeatedly need the same answers: which dates are on, which are off, how many work days fall inside the month, and where the cycle sits when a hire date starts mid-rotation. This capability accepts ISO start and end dates, positive on-block length, rest-block length, and an optional phase offset, then expands a deterministic modular sequence without weekend rules, holidays, or multi-crew optimization.

How a rotating shift cycle works

A rotating pattern is a block of consecutive working days followed by a block of rest days, repeated without regard to weekdays. Four on, four off makes a cycle of 8 days, so the same weekday does not always have the same status. To decide each date, the planner counts days from the first date of your range, adds the cycle offset and finds the position inside the cycle. If that position falls within the working block, the day is on; otherwise it is off. From 1 to 16 January 2026 that gives 8 working days and 8 rest days, a work ratio of 0.5.

When to use it and common mistakes

Use it for continuous operations, site rosters or payroll previews where coverage rolls across the calendar. The most common mistake is forgetting the offset when someone joins mid-rotation, which shifts every later date. Another is expecting weekends or public holidays to be skipped: they are not, so apply those rules afterwards. The range can span at most 366 days, and a rest block of zero means every day is a working day. The planner covers one worker at a time and does not balance several crews.

How long can the date range be?

Longer planning horizons should be split into multiple calls.

Does the planner skip weekends or holidays?

No. Every Gregorian calendar day in the inclusive range is assigned on or off from the pure cycle only. Holiday and weekend exceptions belong in your HR layer.

What if the worker starts in the middle of a rotation?

Set a cycle offset. Zero means the first date is the first working day of a block; a higher number shifts the pattern so the roster matches where the person already is in the rotation.

Can I plan patterns other than four on, four off?

Yes. Choose how many consecutive working days and rest days make up the cycle, from 1 to 90 on and 0 to 90 off. Two on two off, five on two off or seven on seven off all work the same way.

How many working days does the roster show?

It counts them for you. From 1 to 16 January 2026 on a four-on, four-off cycle there are 8 working days and 8 rest days, a work ratio of 0.5, and every date is listed as on or off.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/biz/rotating-shift

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.

curl -X POST https://api.kit.forhosting.com/biz/rotating-shift \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"start_date":"2026-01-01","end_date":"2026-01-16","on_days":4,"off_days":4}'
{
  "start_date": "2026-01-01",
  "end_date": "2026-01-16",
  "on_days": 4,
  "off_days": 4
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "biz.rotating_shift",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Invalid ranges, impossible calendar days, and out-of-range cycle fields fail with invalid_input and are never billed.

What a rotating on/off cycle means for one worker

Rotating shift patterns such as four-on four-off, two-on two-off, or seven-on seven-off are common in continuous operations where coverage must roll evenly across calendar days without fixing the same weekdays every week. The model here is deliberately simple and transparent: each cycle is an on block of consecutive work days followed by an off block of consecutive rest days; the pair repeats from the start of the requested window. Two-on two-off uses two and two. A five-on two-off pattern uses five and two and produces a work ratio near five sevenths, which is useful when you want more work density than a pure half-time rotation. What it does provide is a reproducible single-worker expansion you can export into spreadsheets, time-clock imports, or payroll previews without reimplementing modular arithmetic in every client. Day zero of the cycle is the first day of an on block when cycle_offset is zero. For any day index i counted from start_date (zero-based), day_in_cycle equals the remainder of i plus cycle_offset divided by cycle_length, where cycle_length is on_days plus off_days. If that remainder is strictly less than on_days the day is on; otherwise it is off. Classic four-on four-off therefore uses on_days four and off_days four, a cycle of eight days, and a long-run work ratio of one half. Setting off_days to zero forces every day on inside the window, which is occasionally useful as a baseline always-available roster. This tool does not assign multiple named crews, does not skip public holidays, does not encode night versus day tour labels beyond the binary on/off status, and does not rebalance hours against labor law maxima—those layers belong in your HR system.

Input contract, response shape, and validation rules

The formula field restates the modular rule in plain text for audit trails. POST a JSON body with four required fields and two optional ones. start_date and end_date must be real Gregorian calendar strings in strict YYYY-MM-DD form; the range is inclusive on both ends and end_date must not precede start_date. The inclusive span may be at most three hundred sixty-six days so response size stays bounded for browser and API clients. on_days is a positive integer from one to ninety; off_days is an integer from zero to ninety. cycle_offset defaults to zero and must lie between zero and cycle_length minus one when supplied, so a mid-hire phase cannot point past the end of the cycle. worker_name is an optional label of at most one hundred twenty characters echoed on success when present. Aliases are accepted for ergonomics: from or begin for start_date, to or until for end_date, work_days for on_days, rest_days for off_days, offset or phase for cycle_offset, and name or employee for worker_name. On success the body returns the normalized dates and cycle parameters, pattern as a short string such as four-on slash four-off, total_days, days_on, days_off, work_ratio rounded half-up to six decimals, a roster array of objects each with date, day_in_cycle, and status on or off, plus parallel on_dates and off_dates string arrays for quick filtering. Impossible dates such as the thirty-first of April, a negative span, a span over the maximum, a zero or non-integer on_days, or a cycle_offset equal to or larger than cycle_length fail with invalid_input naming the field; those failures do not consume prepaid balance. Pricing for successful calls is a flat $0.002 with unit item.

Where rotating roster expansion earns its keep

Site supervisors planning a four-on four-off month need a quick list of which calendar dates a technician works before publishing the notice board. Content and SEO landings that rank for rotating shift schedule planner or four-on four-off roster benefit from a live free calculator whose outputs match the paid automation path byte for byte on the shared lib. Prefer this capability when the question is pure cycle expansion for one person; multi-crew fairness, union rules, skill mixes, and leave calendars need a fuller workforce management product. Failed validation is free, so exploratory clients can probe invalid offsets and bad dates safely. HR onboarding flows can pass a hire date as start_date with a non-zero cycle_offset so the new hire joins the existing rotation mid-cycle instead of restarting at day zero. Payroll preprocessors count days_on inside a pay period to cross-check expected ordinary hours before overtime rules apply. Staffing simulators compare work_ratio across candidate patterns—two-on two-off versus four-on four-off versus five-on two-off—without writing custom scripts each time. Integration teams embed the API in internal tools so schedulers never retype modular tables by hand. Keep requests inside the three hundred sixty-six day cap; for multi-year workforce planning, call the endpoint once per year window and stitch results client-side.

Four-on four-off monthly notice boards

Expand a classic 4-on/4-off cycle across a calendar month and post the on_dates list for one technician without building a spreadsheet by hand.

Mid-cycle hire alignment

Set cycle_offset so a new starter’s first day joins the existing rotation phase instead of resetting the pattern to day zero.

Payroll day-count prechecks

Count days_on inside a pay window for a rotating worker and compare expected ordinary days before overtime or premium rules run.

How do I build a four-on four-off roster?

Send start_date and end_date in YYYY-MM-DD, on_days 4, and off_days 4. Optional cycle_offset places the first day mid-cycle. The API returns a day-by-day roster with status on or off.

What does cycle_offset mean?

It is the phase of the cycle on start_date, from 0 through cycle_length-1. Zero means start_date is the first day of an on block. Use a non-zero offset when the window starts mid-rotation.

What does the rotating shift schedule planner cost?

The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.

Read the full KIT documentation →