[{"data":1,"prerenderedAt":1102},["ShallowReactive",2],{"announcements":3,"blog-/blog/switching-from-bamboohr-migration-guide":46,"blog-related-/blog/switching-from-bamboohr-migration-guide":464},[4,28],{"id":5,"title":6,"active":7,"body":8,"description":14,"extension":19,"link":20,"linkText":21,"meta":22,"navigation":7,"order":23,"path":24,"seo":25,"stem":26,"__hash__":27},"announcements/announcements/ios-app-launch.md","The BookYourPTO iPhone app is here — leave, approvals & expenses on the go. Android coming soon",true,{"type":9,"value":10,"toc":15},"minimark",[11],[12,13,14],"p",{},"The BookYourPTO mobile app is now on the App Store for iPhone. Book leave, approve requests, and claim expenses from anywhere. Android coming soon.",{"title":16,"searchDepth":17,"depth":17,"links":18},"",2,[],"md","/mobile-app","Get the app",{},13,"/announcements/ios-app-launch",{"title":6,"description":14},"announcements/ios-app-launch","3qzUfXAJGPpl9sqLZf2eXpxXxhWkZ3n1BDP0fapqL9c",{"id":29,"title":30,"active":7,"body":31,"description":35,"extension":19,"link":38,"linkText":39,"meta":40,"navigation":7,"order":41,"path":42,"seo":43,"stem":44,"__hash__":45},"announcements/announcements/data-import.md","Move your team over from 48 HR and payroll platforms — employees, leave history and departments",{"type":9,"value":32,"toc":36},[33],[12,34,35],{},"Data Import & Migration is live. Upload a CSV or Excel export from your current HR or payroll system and BookYourPTO reads the column headers, works out which of 48 platforms it came from, and maps the fields for you — with 63 built-in templates covering everything from BambooHR, Rippling and Workday to Collage HR, Folks HR, Payworks and Wagepoint. Nothing is written until you approve the preview, and a completed import can be rolled back for 72 hours. BambooHR, Timetastic, Employment Hero and Zoho People can be connected directly over their APIs, so there is no file to export at all. Settings → Data Import, for administrators and executives, on every plan.",{"title":16,"searchDepth":17,"depth":17,"links":37},[],"/switch-from","See the platforms",{},14,"/announcements/data-import",{"title":30,"description":35},"announcements/data-import","MvYRLBetKwuvH2CJd2LvSm2chpmyLpInw_paM6_39lY",{"id":47,"title":48,"author":49,"body":50,"date":450,"description":451,"extension":19,"image":452,"meta":453,"navigation":7,"path":454,"readTime":455,"seo":456,"stem":457,"tags":458,"__hash__":463},"blog/blog/switching-from-bamboohr-migration-guide.md","Switching from BambooHR: What to Export, What to Check, and How to Sequence the Cutover","AnHourTec Team",{"type":9,"value":51,"toc":437},[52,55,58,63,66,69,92,95,102,106,109,114,121,124,203,228,241,245,254,261,265,268,274,280,286,292,301,310,314,317,323,329,335,341,345,348,354,360,366,372,378,382,388,391,394,398,401,427,430],[12,53,54],{},"Most teams who decide to move off an HR platform stall at the same point. Not the decision — that part is usually settled weeks earlier. They stall at the moment someone asks \"so what do we actually do about the data?\", nobody has a confident answer, and the project quietly slides another quarter.",[12,56,57],{},"This guide is the answer for teams leaving BambooHR. It is deliberately unglamorous: what to export, what will be wrong in the export, what order to do things in, and where the genuine risks are. Most of it applies to any HR migration, but the specifics here are BambooHR's.",[59,60,62],"h2",{"id":61},"start-by-deciding-what-you-are-actually-migrating","Start by Deciding What You Are Actually Migrating",[12,64,65],{},"The instinct is to move everything. Resist it. A migration that tries to bring across five years of every record type takes three months and usually gets abandoned. A migration that brings across the three things people use daily takes an afternoon.",[12,67,68],{},"For a leave and time-off migration, that is:",[70,71,72,80,86],"ol",{},[73,74,75,79],"li",{},[76,77,78],"strong",{},"The employee directory"," — names, work emails, job titles, departments, start dates, and reporting lines.",[73,81,82,85],{},[76,83,84],{},"Leave balances"," — where everyone currently stands, per leave type.",[73,87,88,91],{},[76,89,90],{},"Leave history"," — past and upcoming approved time off.",[12,93,94],{},"Everything else — documents, performance reviews, benefits enrolment, historical payroll — is a separate decision, and for most teams the honest answer is that it stays in the old system for its retention period and is archived rather than migrated. Deciding that explicitly is much better than discovering it halfway through.",[12,96,97,98,101],{},"The one thing worth arguing about is ",[76,99,100],{},"how much history",". Two years of leave history is usually plenty: it covers the current and previous leave year, which is what people actually reference. Ten years is a data-cleaning project wearing a migration costume.",[59,103,105],{"id":104},"getting-the-data-out-of-bamboohr","Getting the Data Out of BambooHR",[12,107,108],{},"BambooHR gives you two routes. Which one you use changes the shape of the work considerably.",[110,111,113],"h3",{"id":112},"the-file-export","The file export",[12,115,116,117,120],{},"The standard path is ",[76,118,119],{},"People → Employee List → Export",", choosing CSV and selecting the fields you want. It is straightforward and it is what most teams use.",[12,122,123],{},"A BambooHR employee export typically carries columns along these lines:",[12,125,126,130,131,130,134,130,137,130,140,130,143,130,146,130,149,130,152,130,155,130,158,130,161,130,164,130,167,130,170,130,173,130,176,130,179,130,182,130,185,130,188,130,191,130,194,130,197,130,200],{},[127,128,129],"code",{},"Employee #",", ",[127,132,133],{},"First Name",[127,135,136],{},"Last Name",[127,138,139],{},"Preferred Name",[127,141,142],{},"Email",[127,144,145],{},"Job Title",[127,147,148],{},"Department",[127,150,151],{},"Division",[127,153,154],{},"Location",[127,156,157],{},"Reports To",[127,159,160],{},"Hire Date",[127,162,163],{},"Employment Status",[127,165,166],{},"Mobile Phone",[127,168,169],{},"Work Phone",[127,171,172],{},"Work Ext",[127,174,175],{},"Home Email",[127,177,178],{},"Date of Birth",[127,180,181],{},"Gender",[127,183,184],{},"Marital Status",[127,186,187],{},"Address Line 1",[127,189,190],{},"Address Line 2",[127,192,193],{},"City",[127,195,196],{},"State/Province",[127,198,199],{},"ZIP Code",[127,201,202],{},"Country",[12,204,205,206,130,209,130,212,130,215,130,218,130,221,130,224,227],{},"Time off comes from a separate export, with its own shape — typically ",[127,207,208],{},"Employee",[127,210,211],{},"Type",[127,213,214],{},"Start",[127,216,217],{},"End",[127,219,220],{},"Amount",[127,222,223],{},"Status",[127,225,226],{},"Note",".",[12,229,230,231,234,235,240],{},"Two details in there will bite you if you are mapping by hand. ",[76,232,233],{},"Dates come out in US format"," (MM/DD/YYYY), which means anything before the 13th of a month is ambiguous to a parser expecting DD/MM/YYYY and will silently import as the wrong date rather than failing. And ",[76,236,237,239],{},[127,238,157],{}," is a name, not an email",", so linking managers requires matching on a display name that may not be unique in a large directory.",[110,242,244],{"id":243},"the-api","The API",[12,246,247,248,253],{},"BambooHR also has an API, authenticated with an API key plus your account subdomain. If your destination system can talk to it directly, this is the better route: no export step, no file to keep track of, no stale snapshot, and you can pull again later rather than redoing the whole exercise if you find a problem. BookYourPTO connects to BambooHR this way — you can see how that works on the ",[249,250,252],"a",{"href":251},"/switch-from/bamboohr","switch from BambooHR"," page.",[12,255,256,257,260],{},"Whichever route you take, do the export ",[76,258,259],{},"twice",": once early as a dry run so you can see the real shape of your data, and once on cutover day so what you load is current.",[59,262,264],{"id":263},"clean-the-directory-before-you-import-not-after","Clean the Directory Before You Import, Not After",[12,266,267],{},"This is the step that determines whether the migration is pleasant. Open the dry-run export in a spreadsheet and work through this list. It is worth an hour.",[12,269,270,273],{},[76,271,272],{},"Duplicate email addresses."," Sort by email and look. Duplicates usually mean someone was created twice, or a contractor was converted to an employee without merging. Decide which record wins now, because most import tools will either skip the second one or create two people, and neither is what you want discovered later.",[12,275,276,279],{},[76,277,278],{},"Missing emails."," Anyone without a work email cannot be matched by leave history and cannot be invited to log in. Shift workers and site staff are the usual gap. Either source the addresses or accept that those people are entered by hand afterwards.",[12,281,282,285],{},[76,283,284],{},"Terminated employees still in the export."," Filter them out unless you specifically want them, and be deliberate — importing leavers into a per-user-priced system is an expensive way to keep an archive.",[12,287,288,291],{},[76,289,290],{},"Department names that are nearly the same."," \"Engineering\", \"engineering\", and \"Eng\" will create three departments. Normalise them in the spreadsheet.",[12,293,294,297,298,300],{},[76,295,296],{},"Managers who are not in the file."," If a ",[127,299,157],{}," value names someone who was filtered out or never existed as an employee record, the reporting line will not resolve. Check the manager column against the email column before you load.",[12,302,303,306,307,309],{},[76,304,305],{},"Leave types."," List the distinct values in the ",[127,308,211],{}," column of your time-off export. That list is what your new system needs to have configured, and it is almost always shorter and messier than people expect — a handful of real types plus two or three that were created once and never used again.",[59,311,313],{"id":312},"sequence-the-cutover","Sequence the Cutover",[12,315,316],{},"Order matters, because the records depend on each other.",[12,318,319,322],{},[76,320,321],{},"Employees first, then departments, then leave history."," Leave history references an employee by email, so it has nothing to attach to if the people are not there yet. Departments need to exist before employees can be assigned to them — though most import tools will create a missing department automatically from the employee row, which is usually what you want. Manager relationships resolve last, after every employee record exists, because you cannot point at a record that has not been created.",[12,324,325,328],{},[76,326,327],{},"Pick a quiet week."," Not month-end, not the week before a holiday period, and not while someone critical is away. The migration itself is short; the questions afterwards are not.",[12,330,331,334],{},[76,332,333],{},"Freeze bookings for the changeover."," A day is normally enough. Tell people that requests made on Tuesday will need re-entering, and almost nobody will make one.",[12,336,337,340],{},[76,338,339],{},"Run both systems read-only in parallel for one leave cycle."," Do not keep double-entering — that is how data diverges — but leave BambooHR accessible for a month so you can check anything that looks wrong against the source. Then export a final archive and decommission.",[59,342,344],{"id":343},"verify-before-you-trust-it","Verify Before You Trust It",[12,346,347],{},"The temptation after a successful-looking import is to declare victory. Spend twenty minutes on these instead.",[12,349,350,353],{},[76,351,352],{},"Count the rows."," Employees imported versus employees in the file, minus whatever you deliberately excluded. If the numbers do not reconcile exactly, find out why before doing anything else.",[12,355,356,359],{},[76,357,358],{},"Check three balances by hand."," Pick a long-tenured employee, a recent joiner, and someone who has taken an unusual pattern of leave. Compare their balance in the new system against BambooHR. Getting all three right is strong evidence the arithmetic is correct; getting the recent joiner wrong usually means pro-rating was not applied.",[12,361,362,365],{},[76,363,364],{},"Check a date near the start of a month."," This is the US-date-format trap. Find a leave request that started on, say, the 3rd of a month and confirm it did not import as the 3rd of a different month.",[12,367,368,371],{},[76,369,370],{},"Spot-check the org chart."," Open the reporting tree and look for anyone reporting to the wrong person or to nobody. Name-matched manager fields are the most common source of quiet errors.",[12,373,374,377],{},[76,375,376],{},"Confirm nobody was emailed."," A good import creates employee records without notifying anyone, so you control when people are invited. Check this before you import 200 people, not after.",[59,379,381],{"id":380},"what-you-do-not-have-to-migrate","What You Do Not Have to Migrate",[12,383,384,385],{},"Worth saying plainly, because it removes a lot of anxiety: ",[76,386,387],{},"you do not need to migrate anything you can archive.",[12,389,390],{},"Old performance reviews, historical documents, benefits records from three plan years ago — export them, store them somewhere durable with an access policy, and note the retention period. That is a filing decision, not a migration, and treating it as one takes weeks off the project.",[12,392,393],{},"The things that must move are the things people touch weekly. Everything else can be looked up in an archive on the rare occasion it is needed.",[59,395,397],{"id":396},"the-realistic-timeline","The Realistic Timeline",[12,399,400],{},"For a team of fifty, a leave-and-directory migration done properly is roughly:",[402,403,404,410,416,421],"ul",{},[73,405,406,409],{},[76,407,408],{},"Half a day"," — dry-run export, clean the directory, list the leave types.",[73,411,412,415],{},[76,413,414],{},"An hour"," — configure leave types and policies in the new system to match.",[73,417,418,420],{},[76,419,414],{}," — the actual import, plus verification.",[73,422,423,426],{},[76,424,425],{},"A week"," — people asking where things are, and one or two records you fix by hand.",[12,428,429],{},"The half-day of cleaning is the part everyone wants to skip and the part that determines how the other three go. If you take one thing from this guide, take that.",[12,431,432,433,436],{},"Moving from something other than BambooHR? The same sequence applies — the export mechanics change, the cleaning and the ordering do not. Our ",[249,434,435],{"href":38},"switch from"," pages cover the export steps for the platforms we see most often.",{"title":16,"searchDepth":17,"depth":17,"links":438},[439,440,445,446,447,448,449],{"id":61,"depth":17,"text":62},{"id":104,"depth":17,"text":105,"children":441},[442,444],{"id":112,"depth":443,"text":113},3,{"id":243,"depth":443,"text":244},{"id":263,"depth":17,"text":264},{"id":312,"depth":17,"text":313},{"id":343,"depth":17,"text":344},{"id":380,"depth":17,"text":381},{"id":396,"depth":17,"text":397},"2026-08-14","The hard part of leaving an HR system isn't the new system — it's getting your data out cleanly and picking a cutover date that doesn't strand a month of leave history. A practical guide for teams moving off BambooHR.","https://images.unsplash.com/photo-1484480974693-6ca0a78fb36b?w=1200&h=630&fit=crop",{},"/blog/switching-from-bamboohr-migration-guide","8 min read",{"title":48,"description":451},"blog/switching-from-bamboohr-migration-guide",[459,460,461,462],"migration","bamboohr","data import","guides","uWzz7fNS5dlxU_6t87n27TKL2gc322VCH9-MHcw2riw",[465,770,949],{"id":466,"title":467,"author":49,"body":468,"date":758,"description":759,"extension":19,"image":760,"meta":761,"navigation":7,"path":762,"readTime":763,"seo":764,"stem":765,"tags":766,"__hash__":769},"blog/blog/data-import-migration.md","Data Import & Migration: Bring Your Team Across from 48 Platforms",{"type":9,"value":469,"toc":747},[470,474,477,480,487,491,494,514,531,535,542,545,562,566,569,572,591,598,602,605,612,615,618,624,630,636,642,646,653,656,659,663,666,691,694,697,701,704,711,714,718,721,741,744],[59,471,473],{"id":472},"the-empty-account-problem","The Empty Account Problem",[12,475,476],{},"Every trial of every HR product starts the same way. You sign up, you land on a dashboard, and the dashboard is empty. Before you can evaluate anything — the calendar, the balances, the approval flow — you have to put a hundred people into it.",[12,478,479],{},"So you open a spreadsheet in one window and an \"Add employee\" form in the other, and you type. Around person twelve you stop, decide you will finish it later, and later never arrives. The product was never the problem. The data entry was.",[12,481,482,483,486],{},"Data Import & Migration is our attempt to delete that step entirely. It lives at ",[76,484,485],{},"Settings → Data Import",", and it takes the export file you already have from whatever system you are currently on and turns it into a populated account.",[59,488,490],{"id":489},"what-it-imports","What It Imports",[12,492,493],{},"Three things, which between them are what a leave system actually runs on:",[402,495,496,502,508],{},[73,497,498,501],{},[76,499,500],{},"Employees"," — names, work and home emails, job titles, departments, divisions, employee IDs, start and end dates, employment type, work location, phone numbers, addresses, dates of birth, opening annual and sick leave balances, and the manager each person reports to.",[73,503,504,507],{},[76,505,506],{},"Leave History"," — past and upcoming time off, with dates, type, day count, status, and the original note.",[73,509,510,513],{},[76,511,512],{},"Departments"," — names and codes, either imported directly or created automatically from the department column on your employee rows.",[12,515,516,517,520,521,130,524,130,527,530],{},"Files can be ",[76,518,519],{},"CSV or Excel"," (",[127,522,523],{},".csv",[127,525,526],{},".xlsx",[127,528,529],{},".xls","), up to 25MB and 10,000 rows each. If you would rather start from a known-good shape than from your old system's export, there is a downloadable sample file for each of the three data types.",[59,532,534],{"id":533},"_48-platforms-63-templates","48 Platforms, 63 Templates",[12,536,537,538,541],{},"The part that does the work is a registry of ",[76,539,540],{},"63 built-in templates covering 48 HR and payroll platforms",". Each template knows what that platform's export actually looks like — its column names, its date format, and how its status values map onto ours.",[12,543,544],{},"The global list covers what you would expect: BambooHR, Rippling, Deel, Gusto, ADP Workforce Now and ADP Run, Workday, SAP SuccessFactors, Oracle HCM Cloud, UKG, Paylocity, Paycom, Namely, Justworks, TriNet, Insperity, HiBob, Personio, Remote.com, Sage HR, Freshteam, Zenefits, Ceridian Dayforce, Paychex Flex, Timetastic, Vacation Tracker, Calamari, Absence.io, WhosOff, Deputy, Homebase, When I Work, OnPay, Square Payroll, QuickBooks Payroll.",[12,546,547,548,551,552,130,555,130,558,561],{},"The ",[76,549,550],{},"Canadian"," coverage is deliberately deep, because it is the part most products skip: Collage HR, Employment Hero (formerly Humi), Folks HR, Payworks, Rise People, Wagepoint, Payment Evolution, Avanti Software, Nethris, Knit People, PurelyHR, and Wave Payroll. Folks is a Quebec product whose exports come out in English or French depending on the account language, so its templates carry both spellings — ",[127,553,554],{},"Prénom",[127,556,557],{},"Date d'embauche",[127,559,560],{},"Date de départ"," — and a French export auto-detects exactly like an English one.",[59,563,565],{"id":564},"how-detection-works","How Detection Works",[12,567,568],{},"You do not tell the system which platform your file came from. It works it out.",[12,570,571],{},"When you upload, the wizard reads your header row and scores it against every template. If one matches at least 60% of its mappable columns, that template wins and the mapping is applied wholesale — column names, date format, status vocabulary, all of it.",[12,573,574,575,130,577,130,580,130,583,586,587,590],{},"If nothing matches — a hand-built export, a file someone has already edited, a platform we do not have a template for — it falls back to generic detection. Every destination field carries a list of known aliases, so ",[127,576,160],{},[127,578,579],{},"Start Date",[127,581,582],{},"Date of Joining",[127,584,585],{},"Commencement Date"," and ",[127,588,589],{},"Date Hired"," all resolve to the same field. Anything the aliases miss goes through fuzzy string matching, which catches the near-misses that exact matching does not.",[12,592,593,594,597],{},"And whatever it decides, ",[76,595,596],{},"you can change it",". The mapping step is a list of your columns with a dropdown next to each. Required fields are marked. Columns you do not want are skipped. If the detector guessed wrong, you fix it in two clicks — and if you have a recurring import in a shape we do not recognise, you can save your own mapping as a reusable template for next time.",[59,599,601],{"id":600},"nothing-is-written-until-you-say-so","Nothing Is Written Until You Say So",[12,603,604],{},"This is the design decision the rest of the feature is built around.",[12,606,607,608,611],{},"The wizard has four steps — ",[76,609,610],{},"upload, map, preview, import"," — and the first three write nothing to your organisation. The preview step applies your mapping to the file and validates the rows, then shows you the result: how many are clean, how many carry a warning, how many have errors, and what each error actually is. Bad dates, missing required fields, malformed emails, employees referenced in a leave file who do not exist yet.",[12,613,614],{},"You look at that, and then you decide. If it looks wrong, go back to the mapping step and fix it. Nothing has happened yet.",[12,616,617],{},"Once you do run the import, it processes in batches with live progress, and every row lands with a status you can inspect afterwards: success, warning, error, or skipped. If a row failed, you can see which one and why rather than being told \"17 rows failed\" and left to guess.",[12,619,620,623],{},[76,621,622],{},"Duplicates are skipped, never overwritten."," If an email already exists in your organisation, that row is marked skipped and the existing person is left exactly as they were. Running the same file twice does not duplicate anyone, and it does not quietly clobber edits you made after the first run.",[12,625,626,629],{},[76,627,628],{},"Managers resolve last."," You cannot point at a record that does not exist yet, so employees are created first and reporting lines are wired up in a final pass, matching on either email or name. This is why a manager column that names someone excluded from the file will not resolve — the person genuinely is not there.",[12,631,632,635],{},[76,633,634],{},"Leave types are created as needed."," If your history contains a type your account does not have yet, it gets created rather than failing the row, and imported leave records are flagged as imported so they are distinguishable from requests booked in BookYourPTO.",[12,637,638,641],{},[76,639,640],{},"Nobody gets an email."," Imported employees are created with a random temporary password and a forced password change, but no notification goes out. You control when your team is invited — which matters, because importing 200 people should not send 200 emails at 4pm on a Tuesday.",[59,643,645],{"id":644},"the-72-hour-undo","The 72-Hour Undo",[12,647,648,649,652],{},"Every import records what it created. For ",[76,650,651],{},"72 hours"," after it completes, one button reverses it — the users, the departments, the leave records, the leave types it created along the way, and the manager links it set.",[12,654,655],{},"This exists because the preview, however good, is not the same as seeing the data in the actual product. Sometimes an import is technically correct and still wrong: you brought across leavers you meant to exclude, or two years of history when you wanted one, or you realise the department mapping should have been to divisions. Before rollback, fixing that meant deleting a hundred records by hand or asking support to intervene. Now it means clicking undo and running the file again.",[12,657,658],{},"Rollback also means the sensible first move with a large migration is simply to try it. You are three days from being able to change your mind.",[59,660,662],{"id":661},"four-platforms-need-no-file-at-all","Four Platforms Need No File At All",[12,664,665],{},"For some systems, exporting a file is an unnecessary round trip. Four platforms connect directly:",[402,667,668,674,680,685],{},[73,669,670,673],{},[76,671,672],{},"BambooHR"," — API key plus your account subdomain",[73,675,676,679],{},[76,677,678],{},"Timetastic"," — API key",[73,681,682,679],{},[76,683,684],{},"Employment Hero (formerly Humi)",[73,686,687,690],{},[76,688,689],{},"Zoho People"," — sign in with Zoho",[12,692,693],{},"Connect once and BookYourPTO pulls employees and leave history over the API. No export, no download, no upload, and you can re-sync whenever you want rather than repeating the whole exercise. This is genuinely the better path if you are on one of the four — it removes the snapshot problem, where the file you imported on Monday is already out of date by the time you finish checking it on Wednesday.",[12,695,696],{},"Every other platform in the list imports from a file. That is not a limitation we are hiding: most HR systems either have no public API, gate it behind an enterprise tier, or require a partner agreement to use. A CSV export is the one thing everybody has.",[59,698,700],{"id":699},"guardrails","Guardrails",[12,702,703],{},"A few limits worth knowing about, all of them there for a reason.",[12,705,706,707,710],{},"Data import is restricted to ",[76,708,709],{},"administrators and executives"," — it creates users and can alter your org chart, so it is not something an employee account can reach. Files are capped at 25MB and 10,000 rows. An organisation can have at most five imports in flight at once, and can start at most five per hour, which is enough for any real migration and not enough to be used as a bulk-write endpoint.",[12,712,713],{},"Everything is scoped to your organisation at every step. An import can only read and write within the org of the person running it.",[59,715,717],{"id":716},"the-shortest-path","The Shortest Path",[12,719,720],{},"If you are evaluating BookYourPTO right now, the fastest way to a useful trial is:",[70,722,723,729,735,738],{},[73,724,725,726,728],{},"Export your employee list from your current system as CSV. Most platforms have a one-click export; the ",[249,727,435],{"href":38}," pages have the exact click path for the ones we see most.",[73,730,731,732,734],{},"Go to ",[76,733,485],{},", pick your platform, and upload.",[73,736,737],{},"Look at the preview. Fix anything the mapping got wrong.",[73,739,740],{},"Import. Check three people you know well.",[12,742,743],{},"Ten minutes, and the dashboard has your actual team on it — real departments, real reporting lines, real leave history — which is the only state in which you can properly judge whether the product suits you.",[12,745,746],{},"If something in your export does not map cleanly, tell us. Each of the 63 templates started as somebody's real file, and the list gets longer the same way.",{"title":16,"searchDepth":17,"depth":17,"links":748},[749,750,751,752,753,754,755,756,757],{"id":472,"depth":17,"text":473},{"id":489,"depth":17,"text":490},{"id":533,"depth":17,"text":534},{"id":564,"depth":17,"text":565},{"id":600,"depth":17,"text":601},{"id":644,"depth":17,"text":645},{"id":661,"depth":17,"text":662},{"id":699,"depth":17,"text":700},{"id":716,"depth":17,"text":717},"2026-08-26","Upload a CSV or Excel export from your old HR system and BookYourPTO works out where it came from, maps the columns, and shows you what it will create before creating anything. 48 platforms, 63 templates, four direct API connections, and a 72-hour undo.","https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=1200&h=630&fit=crop",{},"/blog/data-import-migration","9 min read",{"title":467,"description":759},"blog/data-import-migration",[767,461,459,768],"release notes","onboarding","1C60JZLBP0P-vsFVQmLqTrrUmucVsBRUhve91LNMthw",{"id":771,"title":772,"author":49,"body":773,"date":935,"description":936,"extension":19,"image":937,"meta":938,"navigation":7,"path":939,"readTime":940,"seo":941,"stem":942,"tags":943,"__hash__":948},"blog/blog/statutory-holidays-canada-multi-province-teams.md","One Holiday Calendar Will Not Survive a Multi-Province Team",{"type":9,"value":774,"toc":927},[775,778,786,790,793,799,802,806,809,815,821,827,833,837,840,847,855,859,862,868,874,880,886,899,903,906,909,912,916,919],[12,776,777],{},"Hire your second employee in another province and your holiday calendar quietly becomes wrong. Not dramatically — nobody gets fired over it — but wrong in the way that produces a payroll correction in February, an awkward Slack message in August, and a slow erosion of confidence in the numbers your leave system reports.",[12,779,780,781,785],{},"The cause is almost always the same. The company was founded in one province, someone entered that province's statutory holidays as ",[782,783,784],"em",{},"the"," holiday list, and the system has been treating that list as universal ever since. It worked perfectly until it didn't.",[59,787,789],{"id":788},"canada-does-not-have-one-holiday-list","Canada Does Not Have One Holiday List",[12,791,792],{},"There is a federal set of statutory holidays, and there is a set for each province and territory, and they are not the same. Some days are observed almost everywhere — New Year's Day, Good Friday, Canada Day, Labour Day, Christmas Day. Others are genuinely regional: BC Day, Family Day in the provinces that have it, Saint-Jean-Baptiste Day in Quebec, and so on. Federally regulated employers follow a different list again from provincially regulated ones in the same city.",[12,794,795,796],{},"This post is not going to enumerate them, because the lists change, the rules around substitution and holiday pay differ by jurisdiction, and getting that detail from a blog rather than from your provincial employment standards office is how errors happen. What matters here is the structural fact: ",[76,797,798],{},"the correct holiday list is a property of the employee, not of the company.",[12,800,801],{},"Almost every problem in this area comes from software — or a spreadsheet — that assumes otherwise.",[59,803,805],{"id":804},"what-actually-breaks","What Actually Breaks",[12,807,808],{},"The failure is rarely the calendar looking wrong. It is the arithmetic downstream of the calendar.",[12,810,811,814],{},[76,812,813],{},"Leave deduction."," A statutory holiday inside a leave period should not usually consume a day of the employee's entitlement. If your system is holding the wrong list for someone, their week off either costs them a day it shouldn't or fails to cost them one it should. Neither is visible until someone reconciles a balance by hand.",[12,816,817,820],{},[76,818,819],{},"Working-day counts."," Anything that counts business days — notice periods, accrual, probation milestones, deadline calculations — is silently using the wrong denominator for anyone whose region does not match the default list.",[12,822,823,826],{},[76,824,825],{},"Coverage planning."," A manager in Toronto looks at the team calendar in early August and sees a normal working Monday, because the company list has no BC Day on it. Two of their four people are in Vancouver and are not working. This one is usually discovered at 9am.",[12,828,829,832],{},[76,830,831],{},"Payroll."," The most expensive version, and the one that surfaces last.",[59,834,836],{"id":835},"the-off-by-one-problem-underneath-it","The Off-By-One Problem Underneath It",[12,838,839],{},"There is a second, sneakier failure that sits below the list itself, and it is worth naming because it produces the most confusing bug reports.",[12,841,842,843,846],{},"A public holiday is a ",[782,844,845],{},"calendar day",". Canada Day is July 1st — not a moment in time, just a date. But software loves to store dates as precise instants, and an instant always belongs to some time zone. Store July 1st as midnight in one zone and read it back in another and it can silently become June 30th. Now the holiday renders on the wrong square, a one-day leave appears to span two, and the deduction lands against the wrong day.",[12,848,849,850,854],{},"The result looks identical to a wrong holiday list, which is why the two get confused. The distinction matters when you are diagnosing it: a wrong list means the holiday is absent or shouldn't be there; an off-by-one means the right holiday is present on the wrong day, and it will usually be off by exactly one in a consistent direction. We wrote about the general shape of this in ",[249,851,853],{"href":852},"/blog/managing-pto-across-time-zones-remote-teams","managing PTO across time zones",", and it applies just as much to a team spread across Canada as one spread across continents.",[59,856,858],{"id":857},"what-to-check-in-your-system","What to Check in Your System",[12,860,861],{},"Whatever you are using, these are the questions that separate a holiday calendar that will hold up from one that will need a correction next year.",[12,863,864,867],{},[76,865,866],{},"Is the holiday region set per employee, with a sensible org-wide fallback?"," Not a global setting. Not a per-department setting, unless your departments happen to map cleanly onto provinces, which they will stop doing the first time someone relocates. Per employee, defaulting to the organisation's region so you are not entering it forty times.",[12,869,870,873],{},[76,871,872],{},"Can you override an individual day for an individual person?"," Real employment throws up cases the standard list does not cover: a federally regulated contract, a collective agreement with additional observed days, an employee who works a schedule where a particular holiday is substituted. If the only way to handle these is to abandon the automatic calendar entirely, you will end up maintaining the whole thing by hand.",[12,875,876,879],{},[76,877,878],{},"Does leave deduction actually consult the employee's list?"," This is the one worth testing rather than assuming. Book a leave period for an employee in a province with a regional holiday, spanning that holiday, and check the deducted day count against what you expect. It takes five minutes and it is the only way to know.",[12,881,882,885],{},[76,883,884],{},"Does the shared calendar render each person's holidays, or one list for everyone?"," A manager looking at their team should see the days each of those people is actually not working.",[12,887,888,891,892,898],{},[76,889,890],{},"Where does the list come from, and how does it stay current?"," Hand-entered lists rot. Someone maintains them in year one, that person changes role, and by year three the calendar is confidently displaying last year's dates. A system that sources holidays from a maintained public dataset — BookYourPTO uses ",[249,893,897],{"href":894,"rel":895},"https://date.nager.at/",[896],"nofollow","Nager.Date"," for public holidays across more than 100 countries — removes an annual chore that is very easy to forget.",[59,900,902],{"id":901},"a-sensible-way-to-set-it-up","A Sensible Way to Set It Up",[12,904,905],{},"For a team spread across Canada, the configuration that causes the least trouble looks like this.",[12,907,908],{},"Set the organisation's default region to wherever most of your people are — usually the head office province. Set the region individually for everyone who differs, at onboarding, and treat it as real employment data rather than a display preference, because it drives deduction arithmetic. Handle genuine exceptions with per-employee overrides on specific days rather than by forking the whole calendar. Then, once a year, spot-check a leave request that spans a regional holiday for someone outside the default province.",[12,910,911],{},"That last step is the one people skip. It is also the only one that would have caught any of the failures above before payroll did.",[59,913,915],{"id":914},"worth-getting-right-early","Worth Getting Right Early",[12,917,918],{},"None of this is difficult. It is just easy to defer, because the cost of getting it wrong is invisible for exactly as long as everyone works in the same province — and the moment that stops being true, the system does not warn you. It just quietly starts producing numbers that are slightly off for a subset of your team.",[12,920,921,922,926],{},"If you are running a Canadian team across more than one province, our ",[249,923,925],{"href":924},"/leave-management-canada","leave management for Canada"," page covers how per-employee holiday regions, overrides, and deduction rules fit together. And if you are currently maintaining any of this by hand in a spreadsheet, that is the thing to fix first — everything above assumes the calendar is at least being applied consistently, which a spreadsheet cannot guarantee.",{"title":16,"searchDepth":17,"depth":17,"links":928},[929,930,931,932,933,934],{"id":788,"depth":17,"text":789},{"id":804,"depth":17,"text":805},{"id":835,"depth":17,"text":836},{"id":857,"depth":17,"text":858},{"id":901,"depth":17,"text":902},{"id":914,"depth":17,"text":915},"2026-07-30","If you employ people in more than one province, a single company-wide holiday list is already wrong for someone. Here's what breaks, why it's usually invisible, and what to check in your leave system.","https://images.unsplash.com/photo-1503614472-8c93d56e92ce?w=1200&h=630&fit=crop",{},"/blog/statutory-holidays-canada-multi-province-teams","7 min read",{"title":772,"description":936},"blog/statutory-holidays-canada-multi-province-teams",[944,945,946,947],"canada","public holidays","leave management","compliance","jNe9_WnNVSXjI_UGUm2bWD1Nywu6fIiWhmfpcKQa3mI",{"id":950,"title":951,"author":49,"body":952,"date":1091,"description":1092,"extension":19,"image":1093,"meta":1094,"navigation":7,"path":1095,"readTime":940,"seo":1096,"stem":1097,"tags":1098,"__hash__":1101},"blog/blog/overlapping-time-off-requests-team-coverage.md","When Two People Want the Same Week Off",{"type":9,"value":953,"toc":1082},[954,957,960,964,967,974,977,981,987,993,999,1002,1006,1009,1012,1015,1019,1022,1025,1029,1032,1040,1047,1051,1054,1060,1066,1072,1076,1079],[12,955,956],{},"A manager opens two requests. Both are for the same week in August. The team is four people and at least two need to be around. Both requesters have the balance. Both have a reason. Neither request is unreasonable.",[12,958,959],{},"There is no clever answer here — one of them is getting a no. The question is whether that no arrives as a policy or as a judgment call, because those two things feel completely different to the person receiving them, even when the outcome is identical.",[59,961,963],{"id":962},"the-rule-has-to-exist-before-the-conflict","The Rule Has to Exist Before the Conflict",[12,965,966],{},"Most teams do have a rule. It is just undocumented, applied inconsistently, and known only to the manager. When the conflict arrives, the manager reaches for whichever version feels defensible in the moment — first come first served, or seniority, or who took the last good slot, or who asked more politely.",[12,968,969,970,973],{},"Each of those is a legitimate tiebreaker. Choosing among them ",[782,971,972],{},"after"," seeing the two names is the problem. That is what makes an approval feel personal, and it is what generates the \"she always gets the summer weeks\" conversation that quietly poisons a team.",[12,975,976],{},"Write the rule down. Publish it where people book. It does not need to be elaborate, and it will not make anyone happy about being declined — but it converts a verdict into an outcome, which is a much easier thing to accept.",[59,978,980],{"id":979},"pick-one-primary-rule","Pick One Primary Rule",[12,982,983,986],{},[76,984,985],{},"First come, first served"," is the most common and the easiest to defend, because it is fully observable: whoever submitted first wins, and everyone can see their own timestamp. Its weakness is that it rewards planning ahead in a way that compounds — the same organised people win every year — and it punishes anyone whose plans depend on someone else's schedule.",[12,988,989,992],{},[76,990,991],{},"Rotation"," fixes the compounding. If Priya had the last week of August last year, she is behind Marcus this year. It requires you to keep a record, which is trivial if your leave history is in one place and painful if it is in email.",[12,994,995,998],{},[76,996,997],{},"Business criticality"," is the honest one for teams where the work genuinely differs: whoever is holding the release, the client, or the on-call rotation stays. It is defensible right up until it always lands on the same person, at which point you have a staffing problem disguised as a leave problem.",[12,1000,1001],{},"Most teams end up with first-come-first-served as the primary rule, rotation as the tiebreaker for genuinely contested peak weeks, and business criticality as a stated override that is used rarely and explained when it is.",[59,1003,1005],{"id":1004},"define-coverage-as-a-number","Define Coverage as a Number",[12,1007,1008],{},"\"We need enough people around\" is not a rule; it is a feeling. \"At least two of the four of us, and at least one who can handle a production incident\" is a rule. It can be checked before approving instead of argued about afterwards.",[12,1010,1011],{},"The exercise is worth doing per team rather than per company, because the shape differs. A support rota has a hard floor. A research team may genuinely be able to go to zero for a week in August. A team of one has no coverage rule at all, only a handover plan.",[12,1013,1014],{},"Once the number is written down, the approval decision mostly makes itself, and the manager stops being the person who says no and becomes the person who reports what the constraint is.",[59,1016,1018],{"id":1017},"blackout-periods-used-sparingly","Blackout Periods, Used Sparingly",[12,1020,1021],{},"Some organisations have weeks where leave genuinely cannot happen: a retail peak, a fiscal close, a planned migration weekend. Naming those periods in advance is fairer than declining requests one at a time, because it lets people plan around them a year out rather than discovering the constraint when they have already booked flights.",[12,1023,1024],{},"Two rules of thumb keep blackouts from breeding. Publish them at the start of the leave year, not when someone asks. And keep them genuinely rare — a calendar with six blackout periods is not a coverage policy, it is a company that has decided its people cannot take leave, and it will show up in retention long before it shows up in a survey.",[59,1026,1028],{"id":1027},"make-the-conflict-visible-before-it-is-submitted","Make the Conflict Visible Before It Is Submitted",[12,1030,1031],{},"The best version of this problem is the one that never reaches the manager. If an employee can see, while they are choosing dates, that two teammates are already off that week, a good number of conflicts resolve themselves — people shift by a few days, or split a week, or simply pick the adjacent one.",[12,1033,1034,1035,1039],{},"That is the entire argument for a shared team calendar sitting next to the booking form rather than in a separate system nobody opens. It turns a hidden constraint into an obvious one at the exact moment it is actionable. Our own ",[249,1036,1038],{"href":1037},"/staff-holiday-planner","staff holiday planner"," view exists for this reason: the request form and the team's booked leave are the same screen, so who is already off is not something you have to go and find out.",[12,1041,1042,1043,1046],{},"There is a privacy consideration worth being deliberate about. Some organisations show leave ",[782,1044,1045],{},"type"," on the shared calendar, which means everyone can see who is on sick leave or parental leave. Most should not. Showing that someone is unavailable is a coverage fact; showing why is personal, and the distinction is worth configuring rather than defaulting.",[59,1048,1050],{"id":1049},"say-no-properly","Say No Properly",[12,1052,1053],{},"When you do decline, three things make it land better, and none of them are about tone.",[12,1055,1056,1059],{},[76,1057,1058],{},"Cite the rule, not the person."," \"Coverage floor is two and Marcus booked on the 3rd\" is a fact. \"I need you here that week\" is a preference, even when it is true.",[12,1061,1062,1065],{},[76,1063,1064],{},"Offer the adjacent option in the same message."," Declining without a counter-proposal makes the employee do the work of restarting. Declining with \"the week before is completely clear\" usually ends the conversation there.",[12,1067,1068,1071],{},[76,1069,1070],{},"Do it quickly."," A request that sits for two weeks and then gets declined is worse than one declined the same day, because the employee has been planning in the meantime. If your approval queue routinely runs long, that is the actual problem — the tiebreaker rule is a distraction from it.",[59,1073,1075],{"id":1074},"the-underlying-point","The Underlying Point",[12,1077,1078],{},"Overlapping requests are not a sign that anything has gone wrong. They are what happens when a team of finite size wants time off during the finite number of weeks that are pleasant to take it. You cannot design them away.",[12,1080,1081],{},"What you can do is make the constraint visible, the rule public, and the answer fast. Do those three and the same August conflict that used to generate a week of quiet resentment becomes a two-minute conversation about moving a booking. The decision does not change. The experience of it does.",{"title":16,"searchDepth":17,"depth":17,"links":1083},[1084,1085,1086,1087,1088,1089,1090],{"id":962,"depth":17,"text":963},{"id":979,"depth":17,"text":980},{"id":1004,"depth":17,"text":1005},{"id":1017,"depth":17,"text":1018},{"id":1027,"depth":17,"text":1028},{"id":1049,"depth":17,"text":1050},{"id":1074,"depth":17,"text":1075},"2026-07-09","Overlapping leave requests are a coverage problem, not a fairness problem — but they become a fairness problem the moment your rule for resolving them is invisible. Here's how to write one people accept.","https://images.unsplash.com/photo-1521791136064-7986c2920216?w=1200&h=630&fit=crop",{},"/blog/overlapping-time-off-requests-team-coverage",{"title":951,"description":1092},"blog/overlapping-time-off-requests-team-coverage",[946,1099,1100],"team coverage","approval workflows","ssLHWu7gPe5E-CHAg77uQixQjtyUW6NKLqaB9I7gV84",1787807120966]