Rotapulse accepts shift data in several ways. The default tab is Smart Upload: drop any rota file and it figures out the format for you. If you prefer to work with the strict Rotapulse CSV template, paste from a spreadsheet, or type a single shift, those options are on the same panel. Once data lands, every row is validated, scored, and placed on the team grid automatically.
Drop any CSV, TSV, or XLSX rota file. Rotapulse auto-detects the source format, fingerprints the columns, and pre-fills the mapping for you. Works with exports from Rotacloud, Deputy, BrightHR, TfL rosters, and most other tools without any pre-formatting.
Copy a block of cells from Excel or Google Sheets and paste it into the ingest text area. Rotapulse detects columns by header name.
Add a single shift by hand using the form fields. Useful for testing a specific scenario or adding one-off shifts without a full rota file.
All four ingest sources (Smart Upload, CSV template, paste, and manual) flow through the same validation and scoring pipeline. A pasted row and an uploaded row are treated identically once they clear the header check.
Smart Upload is the default tab on the ingest panel and the recommended route for teams exporting rotas from any scheduling tool. You do not need to reformat your file or match the Rotapulse column names. The upload engine handles that step.
Drop your file
Drag a .csv, .tsv, or .xlsx file onto the drop zone, or click to browse. Files up to 10 MB are accepted. There is no minimum; a single-day rota is fine.
Format detection
The engine fingerprints the file structure against a library of known vendor exports. If it recognises the source (for example "Looks like: Rotacloud export, 87% match") it selects the right mapping profile automatically. Unknown formats fall through to manual column mapping, with the engine's best guess already filled in.
Column mapping review
A mapping table shows which of your columns the engine has matched to Rotapulse fields. Each match is labelled exact, likely, or guess. You can adjust any mapping before proceeding; changes are remembered across uploads from the same source.
Grid and day-code modes
Standard CSVs (one row per shift) use row mode. If your rota is laid out as a grid with shift codes in the cells (E for early, L for late, N for nights and so on), switch to grid mode and define what each code means once. Transport for London roster format has its own dedicated mode that interprets TfL day codes automatically.
Preview and commit
Before anything is written, you see a preview grid showing the shifts as Rotapulse will store them: worker names, start/end times, job types. Fix any mapping issues, then click Import. The data is validated row-by-row and any rejected rows are listed with a plain-English reason.
If Smart Upload misidentifies your format
Adjust the column mapping manually and import. The engine will remember your corrections for the next upload from the same source. You can also switch to the CSV Template tab to use the strict Rotapulse format, which never requires mapping.
Smart Upload fingerprints the file structure against a library of known vendor exports. The tools listed below are auto-detected. If your file does not match any of them it falls through to generic CSV or XLSX detection, with the column matcher filling in its best guess and the mapping UI letting you fix anything it got wrong.
Missing a tool? Drop the file in anyway. If the matcher gets enough columns right we still ingest cleanly; if not, send us a sample so we can add it to the library.
Headers are matched by name, case-insensitive. Column order does not matter. Extra columns are silently ignored. You do not need to strip your export down to just these fields.
| Column | Type | Example | Notes |
|---|---|---|---|
| start | ISO 8601 datetime | 2026-04-21T06:00:00 | Shift start in UTC. Include the date, not just the time. |
| end | ISO 8601 datetime | 2026-04-21T14:00:00 | Shift end in UTC. Must be after start. Overnight shifts are fine; end can be the next day. |
| break_minutes | integer | 30 | In-shift rest in minutes. Use 0 if no break was taken. Below-minimum breaks raise a warning. |
| job_type | string | clinical | Sector role. Accepted values: generic, driver, clinical, manual. Defaults to generic if omitted. |
| Column | Type | Example | Notes |
|---|---|---|---|
| worker_ref | string | EMP-001 | Your internal employee ID. Use this to match shifts to the same person reliably. |
| worker_name | string | Alice Brennan | Display name. If you provide worker_ref, name is optional but shown on the grid. |
| Column | Type | Example | Notes |
|---|---|---|---|
| worker_role | string | Night supervisor | Free-text role label shown on the grid and worker drilldown. Does not affect scoring. |
| shift_ref | string | SHF-4421 | Your internal shift ID. Useful for tracing grid rows back to your source system. |
| shift_tag | string | nights | Custom shift label (early, late, nights, etc.). Displayed on the cell tooltip. |
| travel_minutes_before | integer | 40 | Door-to-door commute before the shift, in minutes (0–240). Deducted from the rest window before daily-rest checks run, per the HSE RR446 door-to-door principle. |
A minimal valid CSV for two workers over two days. This is enough to produce scores and populate the grid.
worker_ref,worker_name,start,end,break_minutes,job_type EMP-001,Alice Brennan,2026-04-21T06:00:00,2026-04-21T14:30:00,30,clinical EMP-001,Alice Brennan,2026-04-22T06:00:00,2026-04-22T14:30:00,30,clinical EMP-002,Ben Okafor,2026-04-21T22:00:00,2026-04-22T06:00:00,20,generic EMP-002,Ben Okafor,2026-04-22T22:00:00,2026-04-23T06:00:00,20,generic
Alice has two day shifts with a 30-minute break each. Ben has two consecutive night shifts. After upload, Alice will likely score green; Ben will score amber or red depending on rest between his nights and his prior shift history.
Every row is checked before scoring runs. Validation is per-row; a bad row does not block the rest of the file. After upload you see a row-by-row error report so nothing silently goes missing.
Once rows pass validation they move through a fixed pipeline, in order:
Times without a date
Use full ISO 8601 datetimes: 2026-04-21T06:00:00, not 06:00. The scorer needs the date to compute rest gaps between shifts.
Local times instead of UTC
Send UTC. If your rota tool exports local times, subtract the offset before uploading. BST is UTC+1 in summer, so a 7am BST start is 06:00 UTC.
No worker_ref and inconsistent worker_name spelling
If you rely on worker_name, use it exactly the same on every row for the same person. "A. Brennan" and "Alice Brennan" become two different workers.
Missing break_minutes column
Add a break_minutes column with 0 for shifts without a break. A blank value is treated as unknown, not zero, and triggers a warning.
Uploading a single week without prior shifts
The cumulative fatigue component looks back across prior shifts. Upload the previous 1–2 weeks first to get accurate scores for the current week.
Start free: up to 10 workers, no credit card. Your first scored grid takes about 60 seconds from signup.