It is 9:40pm on the Tuesday before payday and your office manager is in a spreadsheet, hand-fixing 47 punches that never got a clock-out. Three cleaners will be paid off a guess, one will get shorted and call you at 6am, and the two hours of overtime somebody worked at the Riverside account will land in the wrong week.
None of that is a software problem. It is a sequencing problem: the export button got pressed before the data was ready.
Exporting payroll from janitorial software is an eight-stage sequence: close the pay period, clear punch exceptions, map your payroll provider's required columns, pull the time detail rather than the summary, reconcile hours against schedule, apply pay rules, validate the file, then import and archive it. The export itself is stage four.
Below is each stage, what goes in, what comes out, and the condition that has to be true before you move forward. Work them in order and the file lands in your payroll provider on the first upload.
Stage 1: Set the pay period close date and the punch cutoff
Input: your pay calendar and your payroll provider's submission deadline. Output: a written close date, a cutoff time, and a locked date range in the software.
Janitorial payroll has a wrinkle most industries do not: your crews work at night. A shift that starts Friday at 10:00pm and ends Saturday at 2:30am touches two calendar days, and if your pay period ends Friday, it may touch two pay periods.
Decide once, in writing, how you handle a shift that crosses the period boundary. The two workable rules are: attribute the whole shift to the day it started, or split it at midnight. Pick one, tell your bookkeeper, and never change it mid-year.
Then set a punch cutoff that gives you room. If your provider needs the file by Wednesday 2pm for a Friday deposit, close the period Sunday night and set your exception cutoff for Monday at noon. That leaves a full day for stages 2 and 3.
Move on when: the period start and end datetimes are locked in the system and every supervisor knows the cutoff.
Stage 2: Clear every punch exception before you export
Input: the raw punch list for the closed period. Output: zero open exceptions, each correction signed off by a supervisor.
An exception is any punch that cannot be paid as-is. In commercial cleaning, five kinds cover almost all of them.
- Missing clock-out: the cleaner finished, walked to the car and drove off. Common at accounts with no cell service in the basement.
- Out-of-geofence punch: the clock-in registered outside the location radius. Usually a wide parking lot, sometimes a real problem.
- Duplicate punch: two clock-ins ten seconds apart because the page did not confirm.
- Impossible duration: a 14-hour shift on a 3-hour account, which is always a missing clock-out in disguise.
- Unscheduled shift: someone worked a site they were not assigned to, typically a callout cover.
Fix these in the time system, not in the spreadsheet after export. A correction made in the spreadsheet leaves no audit trail, and the audit trail is the whole point of keeping electronic records.
Every edit should carry three things: the original value, the corrected value, and who approved it. If your software does not force that, keep a simple correction log tab and paste it into the period folder.
Move on when: the exception queue is empty and every manual edit has an approver name on it.
Stage 3: Ask your payroll provider exactly what columns the import file needs
Input: your payroll provider's import template or spec sheet. Output: a one-page column map you reuse every period.
This is the stage almost everyone skips, and it is the reason the same file gets rejected twelve pay periods in a row. Call your provider, ask for their generic time import template, and build the map once.
| Field | What payroll systems usually expect | What breaks it |
|---|---|---|
| Employee identifier | The payroll system's own employee ID, not the name | Two cleaners named Maria S.; IDs with leading zeros stripped by Excel |
| Hours | Decimal hours to two places (7.25) | Exporting HH:MM (7:15), which imports as a text string or as 7 hours |
| Date | MM/DD/YYYY, one row per day worked | ISO dates, or a single summed row for the whole period |
| Earnings code | REG, OT, HOL, PTO or the provider's equivalent | Blank code, which defaults everything to regular |
| Department or job code | Your location or account code, if you cost by site | Location names with commas in them, which split the CSV |
| Pay rate | Omitted if rates live in payroll; included if the cleaner has site-specific rates | Sending a rate that overrides the correct one in payroll |
Write the map down with the exact header spelling your provider wants. Header text usually has to match character for character.
Move on when: you have a blank template file with correct headers saved in your payroll folder, ready to receive data.
Stage 4: Export the time detail, not the summary
Input: the closed, cleaned period. Output: a CSV with one row per employee per day per location.
Summary exports feel efficient and cost you every time. A single line reading "Deshawn Porter, 78.50 hours" cannot be split into regular and overtime by workweek, cannot be allocated across two accounts, and cannot be defended if the hours are ever questioned.
Pull detail. In most janitorial platforms this is a report called time detail, timesheet detail, or punch detail, filtered to your locked date range, all locations, all team members, with an approved-only filter if the system has one.
Then handle the CSV correctly. Do not double-click it open in Excel and re-save. Excel will helpfully convert 00456 into 456 and turn some date formats into something your provider will reject.
If your team clocks in through a phone browser, confirm the export is showing punches in your local time zone rather than UTC. A six-hour offset on a night shift moves hours to the wrong day and, sometimes, into the wrong workweek.
Move on when: the raw file opens with correct dates, correct time zone, and one row per shift.
Stage 5: Reconcile exported hours against the schedule
Input: exported actual hours plus scheduled hours for the same range. Output: a variance figure per account, with every material gap explained.
This is the stage that turns payroll from a clerical chore into a management tool. You are asking one question: did we pay for hours we planned to pay for, and if not, why?
Here is the arithmetic on an illustrative account. Meridian Office Park is 62,000 square feet, cleaned five nights a week by a four-person crew scheduled four hours each, on a biweekly pay period.
- Scheduled: 4 cleaners × 4 hours × 5 nights × 2 weeks = 160.00 hours
- Exported actual: 168.75 hours
- Variance: 8.75 hours, or about 5.5 percent over
Now break the 8.75 down instead of shrugging at it. In this example: 3.50 hours belong to a strip-and-wax work order that should carry a project code and be billed, not buried in the recurring route. 3.25 hours came from one cleaner clocking in roughly 20 minutes early every night. 2.00 hours came from a corrected missing punch, offset by 0.00 elsewhere.
At an assumed $18.00 base rate, those 3.25 early-arrival hours are $58.50 before any burden, on one account, in one pay period. Across twelve accounts and twenty-six periods it stops being rounding error.
Move on when: every account's variance is either under your tolerance or has a named cause written next to it.
Stage 6: Apply the pay rules your time software does not calculate
Input: reconciled detail hours. Output: hours split by earnings code, with overtime computed on the correct basis.
Time tracking software records when people worked. Pay rules decide what those minutes are worth, and the two are not the same job. Four rules matter most in janitorial.
Overtime is per workweek, not per pay period. Under the FLSA, non-exempt employees earn at least one and one-half times their regular rate for hours over 40 in a fixed, recurring 168-hour workweek. A biweekly period with 38 hours in week one and 44 in week two produces 4 overtime hours, not zero.
Two rates in one week means a blended overtime rate. If a cleaner runs a $17 route Monday through Wednesday and a $20 medical account Thursday and Friday, the overtime premium is calculated on the weighted average regular rate for that week, not on whichever rate happened to apply on the 41st hour.
Rounding has to be neutral. Rounding punches to the nearest quarter hour is permitted, provided it does not, over time, systematically favor the employer. Rounding down only is not a policy, it is a liability.
Travel between sites during the shift is generally hours worked. If a cleaner finishes one building and drives to a second on the same night, that drive time is typically compensable. Home to first site and last site to home usually is not. Decide how you capture it, because a geofenced clock-out at site one and a clock-in at site two produces a gap that nothing fills automatically.
Convert everything to decimal hours before it leaves your hands.
| Minutes | Decimal | Minutes | Decimal |
|---|---|---|---|
| 5 | 0.08 | 35 | 0.58 |
| 10 | 0.17 | 40 | 0.67 |
| 15 | 0.25 | 45 | 0.75 |
| 20 | 0.33 | 50 | 0.83 |
| 25 | 0.42 | 55 | 0.92 |
| 30 | 0.50 | 60 | 1.00 |
Move on when: total hours by earnings code equal total reconciled hours. REG plus OT plus PTO plus holiday must tie back exactly.
Stage 7: Validate the file before you upload it
Input: the mapped, coded file. Output: a file that passes every check below, saved with a date-stamped filename.
Pre-upload validation checklist
- Row count matches the number of shifts you expected for the period
- Every employee ID in the file exists in payroll, spelled and padded identically
- No employee appears who was terminated before the period start
- Every active cleaner who worked appears at least once
- Hours column contains only numbers with two decimals, no colons, no text
- No single daily row exceeds a plausible shift length for your operation
- No negative hours and no zero-hour rows
- Dates all fall inside the locked period range
- Earnings codes match your provider's exact code list
- Location or department codes contain no commas or line breaks
- Grand total hours matches your stage 5 reconciled total to the penny
- File saved as CSV UTF-8, named with company, period end date and version
The grand total check is the one that catches nearly everything. If your reconciled total was 1,842.25 hours and the file sums to 1,839.00, stop. Do not upload and sort it out later.
Move on when: all twelve boxes are checked and the totals tie.
Stage 8: Import, review the preview register, and archive the file
Input: the validated CSV. Output: a submitted payroll and a complete period folder.
Most payroll providers give you a preview or draft register after import and before submission. Read it. Specifically, check the three things a bad import does not announce.
- Total gross wages against last period's gross. A swing you cannot explain by known hires, terminations or a holiday means something imported wrong.
- Overtime dollars as a share of gross. A sudden jump usually means workweek boundaries got misread.
- Any employee with zero hours who should have hours, and any with hours who should have none.
Then archive. Create a folder per pay period containing the raw export, the corrections log, the reconciliation worksheet, the final import file, and the confirmation from your provider. Five files, one folder, named by period end date.
Federal rules require payroll records to be kept for at least three years, and the records on which wage computations are based, including time cards and work schedules, for at least two years. State rules can be longer. Storage is cheap and reconstructing a period from memory is not possible.
Done when: payroll is submitted, the register matches your reconciled totals, and the period folder is complete.
Frequently asked questions
Can I just email the CSV to my payroll company instead of importing it?
You can, and many small operators do, but you inherit their keying errors and lose a business day. If your provider offers a self-service time import, use it. Ask for their template and their error log format. Once the column map in stage 3 is built, importing takes less time than writing the email.
What do I do when a cleaner forgets to clock out?
Correct it to the scheduled end time only if the supervisor confirms the work was completed, and record who approved the edit. Never leave the shift open and never guess silently. If the same person misses punches three periods running, that is a coaching issue, not a payroll issue, and it belongs in a conversation rather than a spreadsheet.
Should I round punches to the nearest 15 minutes?
Only if the rounding is neutral, meaning it rounds both up and down at the midpoint and does not consistently favor you over time. Rounding down only is not permitted. Many operators skip rounding entirely and pay to the minute in decimal hours, which removes the argument and makes reconciliation cleaner.
How do I handle a cleaner who works two accounts at different pay rates in one week?
Export the hours by location so each rate stays separate, and let payroll calculate a weighted average regular rate for any overtime that week. Do not average the rates yourself in the spreadsheet. Send detail rows with location codes and let the payroll engine do the math it was built for.
How long should I keep the exported payroll files?
Federal recordkeeping rules set a floor of three years for payroll records and two years for the underlying time records. Several states require longer, and unemployment or workers comp audits can reach back further. Keeping the full period folder for seven years costs almost nothing and answers most audit questions in one click.
Where CleanTrack360 fits in this sequence
CleanTrack360 does not run payroll and does not try to. What it produces is the clean input for stages 1 through 5: geofenced GPS clock-in and clock-out that runs in the crew's phone browser with no app to install, a default 150 m radius you can adjust per location, and scheduled shifts to reconcile actual hours against. Reports export to CSV, so the detail file you take into your column map comes out of one place rather than three.
Plans start at $99 a month for up to 5 team members, $199 for up to 20, and $249 for up to 50, priced per plan rather than per user. There is a 14-day free trial with no credit card, which is long enough to run one full pay period through the sequence above and see whether your exception queue actually empties before the cutoff.