Part 5 · People and team
Shifts
Build schedules for regular and unionised employees, get warned before publishing what labour standards or the collective agreement let people refuse, fill a shift from the call list, hand payroll hours that are already coded, averaging included, and destroy by hand the records whose retention is over.
Watch it

The Shifts app decides who works when. It is for the person who builds schedules, for the managers who approve swaps and close pay periods, and for every employee, who sees their shifts there, answers offers and declares their availability. It works for a non-unionised team, where Québec's Act respecting labour standards (LNT) sets the rules, and for a unionised team, where the collective agreement raises them.
Overview#
Everything starts from working conditions. A Labour standards (Québec) record ships with the app and carries the LNT floor. A collective agreement is entered as a second record that raises that floor (overtime thresholds, premiums, notice, minimum call-back, order of offers). Each employee is attached to one record. When a value in the agreement is less favourable than the LNT, the LNT applies, and the record says so.
A shift template describes a standard shift: its hours, its break, its type (Day, Evening, Night, Weekend, On call). A schedule covers a period, often two weeks, and is filled from templates. It goes through three states: Draft, Published, Closed. Before publishing, the app checks the schedule and lists warnings. It never prevents publishing: labour standards give the person a right to refuse, they do not forbid asking.
Once a schedule is published, every change is written to the change log: before, after, who, when, and the employee's answer when one is required. Nobody edits or deletes this log. In a grievance, it is the evidence.
A shift that becomes free is an open shift. It is offered to one person at a time, in the order of the call list (seniority, rotation or inverse seniority). Every offer, refusal and skipped person is timestamped, with the reason for the skip.
Finally, a pay period gathers the hours actually worked and turns them into coded lines: regular hours, overtime, premiums, call-back and 3-hour minimums, on-call pay, holiday indemnity, benefits. Under averaging of hours, overtime is counted on the average of the period. The CSV file it produces goes to your payroll provider.
Payroll records are kept at least six years. After that, Destroy old records erases them by hand, except what is under dispute.
Here is the current week of the demonstration as a calendar: the support centre's day, evening and night shifts, and the weekend on-call at the top. The demonstration company works in French: its names, and the messages it recorded, stay in French in the English screenshots.

In the calendar, each shift takes its employee's colour: the one on their employee record, or the one you chose for yourself. The shift is painted with a softened background, and the same colour shows in the filter legend and in the detail popover. An employee with no colour keeps Odoo's usual per-employee colour: the shift template no longer colours the calendar. See Give each employee a colour in the calendar.
The employee record remains the one in Employees. If your organisation also keeps its certification, grievances and official seniority, see Labour relations: Shifts does not replace that file, it applies the agreement to the schedule.
Configuration#
Access and rights#
| Role | What it opens |
|---|---|
| Shifts / Employee | The Me menu: their shifts, the offers made to them, their swaps, availability, benefits and the changes that concern them. They also see published schedules and call lists. |
| Shifts / Manager | Everything else: working conditions, templates, schedules, offers, approvals, pay periods, destruction of old records. |
Two points before granting access. Each person's employee record must be linked to their user, otherwise they see no shift. And call lists are posted, as collective agreements require: every employee sees the seniority date and counters of their colleagues on the list.
A shift manager runs schedules, offers and payroll without Employees officer rights. The Shifts tab of the employee record (working conditions, seniority, hourly rate, payroll number, variable hours, dispute hold) needs those rights as well: without them, Odoo opens the employee's public profile, which has none of these fields. The person who links employees to their working conditions therefore needs both roles.
Settings#
The app has no settings screen. Everything that varies is set in the working conditions. Public holidays are those of the company's working calendar, under Employees > Configuration. The one exception is the colour of shifts in the calendar, which follows the Shifts by employee rule, shipped under Settings > Colors > Automatic rules and reserved to the administration.
Master data#
- Under Shifts > Configuration > Working conditions, review the labour-standards record. If a collective agreement covers part of the staff, create its record: tabs Hours and overtime (averaging included), Scheduling (call-back, minimum presence, on call), Premiums, Offers and swaps, Taxable benefits.
- Under Shifts > Configuration > Shift templates, create your standard shifts.
- On each employee record, Shifts tab (Employees rights required): working conditions, seniority date, usual hourly rate, payroll number, and Variable or non-continuous hours when it applies. The usual day of each weekday comes from the person's working calendar.
- If needed, create call lists under Shifts > Scheduling > Call lists.
- If needed, give each employee a colour for the calendar (see Give each employee a colour in the calendar).
Here is the Premiums tab of the demonstration's agreement: an evening and a night premium as a percentage with a minimum per hour, and a weekend premium as an amount per hour.

A premium is defined by a time window (which may cross midnight), by whole days or by public holidays. It can provide an enhanced rate above a number of hours, the majority-of-hours rule, and dates in force.
Getting started#
The shortest path through a first period:
- Create a schedule under Shifts > Scheduling > Schedules, with its dates and department.
- Click Add shifts, choose the templates, days and people.
- Click Check and read the Warnings tab.
- Fix what needs fixing, then click Publish. Each person is notified.
- At the end of the period, create the pay period, compute it and export it.
Common tasks#
Build a schedule#
A draft schedule is filled with Add shifts or by hand, in the Shifts tab. For the next period, Copy to the next period takes the same shifts with shifted dates. Nothing is sent while the schedule is a draft.
Check before publishing#
Check screens the schedule and fills the Warnings tab. The checks cover:
- notice (5 days under the LNT, or the agreement's);
- more than 2 hours beyond the usual day, read weekday by weekday in the person's working calendar (8 hours on Monday and 10 on Friday is a regular schedule), and more than 14 hours in 24;
- for variable or non-continuous hours, only more than 12 hours in 24, instead of the two limits above. That is the case when the box is ticked on the employee, when their working calendar has flexible hours, or, for that day only, when they work a split shift (two shifts started the same day at least an hour apart);
- more than 50 hours in the week; under averaging, 50 hours on the average of the period, and a week beyond 50 hours under an individual agreement;
- the 32 consecutive hours of weekly rest;
- the meal break after 5 hours;
- rest between two shifts, overlaps, declared unavailability and shifts still open.
Weekly limits also count shifts from neighbouring schedules, and the whole averaging period when it runs past the schedule. On call at home is not work (s. 57): it raises no notice warning and asks no answer.

Each warning cites the section involved and says whether the person may refuse. You can publish despite a warning: the warning stays on record.
Publish a schedule#
Publish moves the schedule to Published and notifies each person. The Changes button at the top of the form opens the log of that schedule.

Change a published schedule#
Adding, moving, reassigning or cancelling a shift on a published schedule is allowed, with a reason. The change goes to the log and the person is notified. If the change falls inside the notice period, it waits for their answer: Accept or Refuse, recorded once. The notice they receive says so, and its link goes straight to the change to accept or refuse.
Extending an announced shift without going past the daily limits of s. 59.0.1 asks no answer and keeps the original notice date: the Act gives no right to refuse that extension.

The log is under Shifts > Me > Change log. An employee sees only what concerns them.
Fill an open shift#
A shift with nobody on it is an open shift. Under Shifts > Scheduling > Open shift offers, the offer goes to the first eligible person on the call list, with an answer time. Someone already working or unavailable is skipped, with the reason recorded. A refusal or a missed deadline moves the offer to the next person. Depending on the agreement, a refusal can count as hours offered, and a number of refusals removes the person from the list. The next person's activity comes from the schedule's responsible, never from the colleague who just refused, and every notice is written whole in the language of the person who reads it. When the list runs out, the responsible receives an activity and a notice, signed by the company.

The call list shows each person's seniority date, hours offered and accepted, and refusals. Reset the counters starts a new cycle.

Approve a swap#
An employee can give a shift to a colleague or exchange it for one of theirs, under Shifts > Me > Swaps. The colleague accepts first. Then, if the agreement requires it, a manager approves. The warnings the swap would raise are recorded on the request: the manager sees them before deciding.

Declare availability#
Under Shifts > Me > Availability, each person states when they are available or not, as a standard week or by dates. Checks and offers take it into account.
Declare a benefit#
Under Shifts > Me > Benefits, an employee declares an overtime meal, a taxi home, parking, a uniform or a subsidised meal, and attaches the receipt. The app marks the benefit taxable, not taxable or to check, separately for Québec and federally, and says why. The manager approves, then the benefit goes into the pay period.
- Meal or taxi says whether it was Provided by the employer (a meal served or ordered, a taxi paid directly) or Reimbursed on receipts. A provided meal or taxi needs no receipt; a reimbursement does. For example, a reimbursed overtime meal without a receipt can be non-taxable federally and taxable in Québec.
- The 2 hours required are read on the overtime planned on the shift: a person sent home early keeps the exemption.
- A taxi home is taxable federally by default: the CRA has published no exception for a taxi after overtime. A manager can exempt it by filling Federal exemption, justification; the justification is added to the reason.
- For a subsidised meal, the person enters the Cost of food and preparation and the Price paid by the employee. The amount computes itself: the difference, taxable on both sides, or zero when the price covers the cost. Without the cost, the benefit stays "to check".

Close a pay period#
Before computing, enter the hours actually worked on the shifts that ran differently (actual start, end, break), then click Close on the schedule: a closed schedule only accepts those actual hours.
Under Shifts > Payroll > Pay periods, create the period, click Compute, review the lines, then Export for payroll. The export produces the CSV file and locks the period. Reopen remains possible if a correction is needed.

The codes (REG, OT, PSOIR, PNUIT, CBTOP and the others) are those of your working conditions. Your payroll provider receives them as they are. Three lines deserve a word:
- MINTOP tops a shorter presence up to the 3-hour minimum (s. 58): regular shifts less than an hour apart count as one presence. CBTOP does the same for a call-back.
- ONCALL carries the on-call pay, when the working conditions provide one; it is marked taxable in Québec and federally.
- OTAVG only appears under averaging: the premium alone for hours already paid at the usual rate in an earlier pay period of the same averaging period.
Set up averaging of hours#
Averaging (s. 53) counts overtime on the average of several weeks rather than week by week. It is set on the working conditions, Hours and overtime tab, Averaging of hours (LNT art. 53) group.
- In Averaging of hours, choose Collective agreement or Individual written agreement.
- Enter the Averaging period (weeks): at least 2, and at most 4 under an individual agreement.
- Enter the Averaging cycle starts on date: periods follow one another from the pay week that contains this date.
- Under a collective agreement, enter if needed the Longest averaging period allowed (weeks) that your legal advice retains; 0 means no limit.
- Save. An individual agreement longer than 4 weeks, or a period without a start date, is refused with a message.

A period's overtime is its regular hours (paid leave included, s. 52) minus the weekly threshold of the working conditions (40 hours under the LNT) per week: 37 hours then 47 hours give 4 hours. It is paid with the pay period that contains the last day of the averaging period; until then, hours are paid at the usual rate. Under an individual agreement, hours beyond 50 in a week remain overtime in that week and leave the average.
Pay on-call time and the 3-hour minimum#
Both are set on the working conditions, Scheduling tab.
- Minimum presence (h): a person who comes to work and works fewer than 3 consecutive hours is paid at least 3 hours (s. 58). When the nature of the work justifies it, choose the Exception to the 3-hour minimum: Work that needs several presences a day or Work usually done in full within 3 hours. The whole section then falls.
- Minimum also for a remote call-back: a call-back handled by telephone or remotely does not bring the person to work, and s. 58 does not apply to it. Tick the box if the agreement still grants its minimum. On the shift, the Handled remotely box marks that call-back.
- A shift shortened by force majeure is marked Force majeure: no 3-hour minimum.
- In the On call at home (LNT art. 57) group, On-call pay is None by default, since the LNT does not require paying on-call time. Choose Amount per hour on call or Flat amount per on-call period, then the On-call amount.

Destroy old records#
Hours, premiums, indemnities and benefits are supporting documents of the pay: they are kept at least six years after the end of the year they relate to, longer while a grievance, a complaint or a tax objection is under way. After that, the private sector privacy act asks to destroy or anonymise them. The app destroys them, by hand only.
- If there is a dispute, first tick Keep for a dispute on the schedule concerned, or on the person's record (Shifts tab), and note the Dispute.
- Under Shifts > Configuration > Destroy old records, read the Destroy what ends before date and the counts: schedules and their shifts, pay periods, benefit events, availability, and Old records kept.
- Tick I understand that the destruction cannot be undone, then select Destroy and confirm.

The result is shown and written to the server log. Nothing is destroyed automatically.
- The cut-off falls 6 years (never fewer) after the end of the year, with a month's margin for hours worked in late December and paid in January.
- Records that belong together stay or go together: a pay period and the shifts it paid, a benefit and its shift, a swap and both its schedules. A schedule under dispute therefore keeps its pay and its benefits.
- Only a shift manager destroys, and only for the companies of their account.
- The time bank balance does not move: the net of the destroyed periods is carried over on the person's record, in Time bank carried over (h).
Give each employee a colour in the calendar#
A person's colour is set once, on their employee record, and follows them in every calendar sorted by employee. You need HR rights to open the record. Colour rules are described in To-do, Notepad and Timer.
- Under Employees > Employees > Employees, open the person's record.
- Under the tags, select Color and pick the shade: a swatch, an Odoo colour or a free colour.
- Save the record.
- For a colour only you will see, select Displayed color instead, then My color.
- So that each new employee gets a distinct shade, the administration opens the Shifts by employee rule under Settings > Colors > Automatic rules and chooses a Fallback swatch there.
- For employees who already have shifts, the administration selects Assign missing colors on the same rule.
In the shifts calendar, each shift takes its employee's colour, with a softened background, and the same colour in the filter legend and in the detail popover. With a fallback swatch, the shade received is written on the employee record, where it can be changed like any other colour. Without a swatch, Assign missing colors draws from a default palette.
The menus, one by one#
Shifts has four groups. Me and Scheduling open to every shift employee; Payroll and Configuration are reserved to managers.
Shifts > Me > My shifts opens your own shifts, as a calendar or a list.
Shifts > Me > Shifts offered to me opens the offers awaiting your answer, with the deadline.
Shifts > Me > Swaps opens your swap or give-away requests, and those a colleague sends you.
Shifts > Me > Availability opens what you declared, as a standard week or by dates.
Shifts > Me > Benefits opens your declared benefits, with the tax verdict of each.
Shifts > Me > Change log opens the changes that concern you, and, for a manager, the whole log. Changes awaiting an answer carry the Accept and Refuse buttons.
Shifts > Scheduling > Schedules opens the schedules, most recent first.
Shifts > Scheduling > Shifts (managers) opens every shift as a calendar, a list or a pivot table, filtered by default on shifts that are not cancelled. In the calendar, each shift carries its employee's colour.
Shifts > Scheduling > Open shift offers (managers) opens the offers, with their current rank and state.
Shifts > Scheduling > Call lists opens the posted lists, with everyone's seniority and counters.
Shifts > Payroll > Pay periods and Shifts > Payroll > Pay lines open the periods, then their coded lines, as a pivot table or a list.
Shifts > Configuration > Working conditions, Shift templates and Days of the week hold the master data. Days of the week serve whole-day premiums; leave them as they are.
Shifts > Configuration > Destroy old records (managers) counts, then destroys, what is past its retention. See Destroy old records.
Reference#
Shift template form fields#
| Field | Description | Required or default |
|---|---|---|
| Name | The name of the standard shift | Required |
| Code | A short code, shown in lists | Optional |
| Starts at, Ends at | The shift's hours; the end may cross midnight | Required |
| Meal break (min) | The length of the break | Optional |
| Paid break | Tick when the person cannot leave the workstation during the break (LNT s. 79) | Unticked |
| Type | Day, Evening, Night, Weekend or On call | Day |
| Position, Department | The position is carried to the shifts created from the template | Optional |
Schedule form fields#
| Field | Description | Required or default |
|---|---|---|
| Name | What the period is called | Required |
| From, To | The dates covered | Required |
| Department | The department the schedule is for | Optional |
| Responsible | The person who publishes; they hand out the offers' activities | Optional |
| Published At, Checked At | Stamped by the app | Automatic |
| State | Draft, Published or Closed | Draft |
| Keep for a dispute, Dispute | Keeps the schedule, and what is linked to it, out of the destruction | Unticked |
Call list form fields#
| Field | Description | Required or default |
|---|---|---|
| Name | The name of the list | Required |
| Agreement | The working conditions that govern it | Required |
| Position, Department | The pool concerned | Optional |
| Order of offers | Seniority, rotation or inverse seniority | Empty: the order of the working conditions |
| Counters since | Start of the current cycle | Today |
Reports and exports#
The pay period produces a CSV file on export: one line per employee and code, with hours, rate, amount and, for benefits, the Québec and federal tax verdicts. Other lists export through the standard export.
Automations#
A scheduled action runs every five minutes over open offers: an offer whose deadline has passed is recorded as "no answer" and moves to the next person. Paid hours, warnings and tax verdicts compute on their own, without settings. The destruction of old records is never scheduled: it is run by hand. When the Shifts by employee rule has a Fallback swatch, a newly created employee immediately gets the swatch's least used shade, written on their record.
Public pages and portal#
The app exposes no public page and no portal access. Each employee works in it through their user account.
Modules that extend this application#
No module extends it for now. The calendar's colours come from two modules documented elsewhere: the colour module, in To-do, Notepad and Timer, and its bridge for employees, in Employees. Labour relations keeps the certification, grievances and official seniority alongside: the two apps are read together without depending on each other.
Understanding#
Why warnings do not block. The LNT gives the person the right to refuse a shift announced too late or a day that runs too long. It does not forbid the employer from asking. An app that blocked publishing would also block a legitimate arrangement. So it warns, and the warning stays on record.
Why the log cannot be edited. In arbitration, the question is what was posted, changed and answered, and when. A log the manager could correct would prove nothing. Even a manager reads it without being able to touch it, and an answer is recorded once.
Why the LNT stays beneath the agreement. An agreement can provide better than the law, never less. When an entered value is less favourable, the app applies the LNT and says so on the record, rather than letting an input error through.
Why averaging pays at the end of the period. The overtime of an averaging period is only known on its last day. Paying it earlier would mean guessing the next week. Hours are therefore paid at the usual rate, then the pay period that contains the last day pays the overtime, or only its premium when the hours were already paid.
Why destroy rather than anonymise. In a small team, the night shift of one position on Tuesdays points to one person. Removing the name is not enough, and Québec's regulation on anonymisation requires an analysis under competent supervision and a register. Destruction is the other way the Act provides, and it promises nothing it cannot keep.
Why the colour comes from the employee, not the template. A calendar where every day shift has the same colour does not say who is working. So the colour follows the person, the same in every calendar sorted by employee; the shift's template stays readable in its label. A shade given by the fallback swatch stays put: a new employee gets the least used one, and nothing already given changes when the swatch grows.
What the app does not do.
- It computes no deductions and produces neither RL-1 nor T4 slips. Deductions stay with the payroll provider.
- Its rules were reviewed against the texts and the Revenu Québec, CRA and CNESST guides in September 2026, without a lawyer's or a tax specialist's opinion. Have these points confirmed before relying on them: whether a shift added or a day extended beyond the limits with less than 5 days' notice may be refused for the added hours only or for the whole day, and whether moving the start of an announced shift may be refused (the app asks an answer for both); the federal treatment of a taxi home (taxable by default); a Québec overtime meal whose amount is not reasonable (the app makes the whole meal taxable); the 3-hour minimum of a remote call-back and on-call pay in the holiday indemnity (the app says no to both); averaging under a collective agreement beyond 8 weeks, the CNESST's example (4 hours or 2) and the right to refuse beyond 50 hours under averaging; the retention period of the hours shift by shift.
- Averaging authorised by the CNESST (s. 53, 1st paragraph) is not a separate choice.
- Under averaging, the holiday indemnity still caps each week at the weekly threshold, which may slightly under-count it.
- Destruction erases; it does not anonymise. The regulation on anonymisation requires a re-identification risk analysis and a register, which no button can promise. The employee record belongs to Employees and is not touched.
- A shift that crosses two weeks counts entirely in the week it starts.
- Holiday indemnity eligibility (absence the day before or after) is not checked. The indemnity is computed at the usual rate, without premiums.
- There is no time clock: actual hours are entered on the shifts.
- My color for a colleague is chosen on their employee record: a person without HR rights cannot open that record, and so cannot set their own colour there (known limit).
Troubleshooting#
An employee sees no shift. Their employee record is not linked to their user, or they do not have the Shifts / Employee group. Check both.
The Payroll or Configuration menu does not appear. It is reserved to the Shifts / Manager group.
An answer to an offer is refused. The answer time had run out. The offer has already moved to the next person.
A change waits for an answer when you meant to impose it. It falls inside the notice period. The person may refuse it; that is their right, and it is why the app waits.
An exported period refuses changes. An exported period is locked. Use Reopen, correct, then export again.
A closed schedule refuses a change. A closed schedule only accepts actual hours (start, end, break).
The Shifts tab does not appear on the employee record. It needs both the Shifts / Manager group and Employees rights: without the latter, Odoo opens the public profile, which has no such tab.
The destruction destroys nothing, or less than expected. What is under dispute stays, with what is linked to it: a schedule where a person under dispute appears, a pay period that paid a kept shift. The Old records kept count says so before destroying.
A subsidised meal stays "to check". Its Cost of food and preparation is not entered.
An employee's shifts keep Odoo's usual colour. Their record has no Color, or the Shifts by employee rule has been turned off. Give them a colour on their record, or ask the administration to select Assign missing colors on the rule.
See also#
- Employees: the person's record, position and department.
- Labour relations: certification, collective agreement, official seniority and grievances.