HR & Payroll
Note: desktop feature. This chapter describes the TechieCRM desktop application. HR & Payroll is not yet available in the web portal: the web shows a read-only list of any records synced from the desktop (to the HR users only, see Who can open HR & Payroll), and none of the dialogs, toolbars, right-click actions or automations described below exist there yet.
A self-contained HR suite inside TechieCRM: people (departments, positions, teams, employees), time & attendance (punches, shifts, roster, overtime rules), leave (types, balances, requests with approval) and payroll (pay cycles, effective-dated pay, holiday pay, pay runs). (No source-CRM equivalent; distilled from the ERP22 HR module.)
In this chapter - Who can open HR & Payroll - The HR & Payroll board and its four views - HR Setup: departments, positions, teams, shifts, leave types, pay cycles, holidays, rules - Employees - Time & attendance: punches, roll-up, approving days - Leave: balances, requests, approvals - Payroll: pay cycles, running payroll, approving and paying
Who can open HR & Payroll
HR & Payroll holds employee records, pay, leave and interview notes, so it is not open to everyone (October 2026). Only MASTER and the logins your administrator lists as HR users can open it. Everyone else:
- does not see the HR & Payroll button on the icon bar, and is not offered it as a shortcut;
- is told "HR & Payroll is open only to the people your administrator has listed as HR users" if they reach it any other way (a ribbon command, a saved shortcut), and nothing opens;
- does not see the HR & Payroll tab in Settings (unless they are an administrator, who sees it to manage the list);
- cannot read HR data from anywhere else in the program either: the HR records themselves refuse a login that is not an HR user.
Choosing the HR users. An administrator (MASTER, or a login allowed to manage users) opens Settings ▸ HR & Payroll ▸ HR & Payroll access, ticks the people who run HR (hiring, interviews, payroll, discipline) and presses Save HR users. The list is kept in your office database, so every computer follows it: a refused click takes effect within a minute, and the icon bar on other computers updates at their next sign-in or cloud check-in.
Until the list is saved, only MASTER can open HR & Payroll. The first time an administrator signs in after this update, a note beside their name says "HR & Payroll is now limited to the HR users you choose", with Choose HR users (opens the setting) and Got it.
If the list cannot be read (the office database cannot be reached), only MASTER can open HR & Payroll, and anyone else is told the list could not be read and why. This is deliberate: when TechieCRM cannot tell who is an HR user, it keeps HR closed rather than open.
On a computer signed in with MongoDB only (no office database; October 2026). Such a computer follows the copy of the list kept in your TechieCRM cloud (the same copy the web portal uses). You count as listed by your CRM user ID (the one linked to your TechieCRM ID) or by your TechieCRM ID's e-mail. The copy is read in the background when you sign in, at each cloud check-in and after each cloud sync, so the HR & Payroll button can take a moment to appear after you sign in. Only MASTER can open HR & Payroll there when:
- the computer is not connected to the TechieCRM cloud, or the cloud does not answer;
- the copy has not been read yet, is damaged, or has not been read for more than 35 minutes;
- nobody has saved the list yet.
Anyone else is told the list could not be read and why. Such a computer cannot change the list: Settings ▸ HR & Payroll ▸ HR & Payroll access shows it greyed, with a note to change it on the web (Workspace Admin ▸ Preferences ▸ HR & Payroll ▸ Choose who can open HR & Payroll) or on a desktop signed in to your office database.
The Entrepreneur Dashboard's team view keeps working for team leads and line managers who are not HR users: it reads who reports to whom, not anyone's pay, leave or notes.
On the web portal and the local portal (October 2026). The same list closes HR & Payroll there too. On the web it opens for the workspace administrator (always), anyone linked to MASTER, and the HR users; everyone else does not see it in the left-hand menu or the shortcut strip, and its address answers You don't have access to HR & Payroll with the reason. A web user counts as listed by their sign-in e-mail or by a CRM user ID linked to their TechieCRM ID. Until the list is saved, or while it cannot be read, only the administrator and MASTER get in.
- One list everywhere. The office database keeps the list. Each desktop copies it to the TechieCRM cloud after you save it and after every cloud sync, and the web reads that copy. An administrator can also change it on the web (Workspace Admin ▸ Preferences ▸ HR & Payroll ▸ Choose who can open HR & Payroll); the next desktop to sync writes that change into the office database. If the list was changed in both places between two syncs, the later change wins.
- The local portal with a Config database reads and writes the office database's list directly (Administrator Guide A13).
Pay stays on HR users' devices. Every computer, phone and local portal still receives the employee directory (name, number, contact details, department, position, manager, status), so other modules keep showing who works here. Pay and private HR details (pay rate, wage, commission, currency, hourly or salaried, rating, notes, emergency contact) are sent only to a device whose signed-in TechieCRM ID may open HR & Payroll. This program's own HR & Payroll reads your office database, so nothing changes here when this computer has no HR user signed in to the cloud.
(This list is a stopgap. A later update brings teams and rights, where an "HR" team decides this; your HR users list becomes that team's members, so nobody gains or loses access on the day it changes.)
The board
Icon bar ▸ HR & Payroll (HR users and MASTER only; see above). The first dropdown switches views: | View | Rows | Filters | |---|---|---| | Employees | one row per employee: status icon (active / applicant / on leave / terminated / retired), department, position, employment, pay, hired | Active / each status / All | | Timesheets | one row per employee-day: worked, regular, overtime, leave, late/early, status | To approve / Open / Approved / Rejected / Last 30 days | | Leave | requests: type, dates, days, status | Open / Approved / Rejected / Cancelled / All | | Payroll | pay lines: period, hours by kind, gross, pay date, status | Draft / Approved / Paid / Void / All | Toolbar: New (employee, or leave request on the Leave view), Run payroll…, HR Setup…, Column Setup (one setup per view: Employees / Timesheets / Leave / Payroll; see Chapter 20), Refresh. The header counts employees, pending leave, days to approve, draft pay lines. Right-click a row for the view's actions (approve/reject a day, approve/reject a request, approve/pay a line).
HR Setup (do this first)
HR Setup… has tabs, each a list with a form: - Departments, Positions, Teams. A team is a real group of people: a name, a lead, its members, and whether it is a sales team.
About the source-CRM "team code" (corrected, September 2026). A team can carry a source-CRM code as a label, and earlier wording here said this made HR teams and the source CRM's teams "one set". That is not achievable, and the reason is worth knowing if you are migrating. In the source CRM that code does not identify a team of people; it identifies the database, a synchronised copy of it, left over from an older remote-synchronisation feature. On the reference database every sales record that carries a team shares the same value, which is the database's own id; the rest carry a "no team" marker. Importing that as a team would put your entire sales history into one group named after your database and label it a sales team. So TechieCRM teams are yours, created here; the source code is kept alongside as a note, never used to match the two up. - Shifts: name, from/to times, break minutes (paid or not), working weekdays (
0,1,2,3,4= Mon–Fri), location. - Leave types: name, code, unit (days/hours), annual entitlement, paid, tracks a balance, allow negative, needs manager approval / HR approval, half days. - Pay cycles: name, hourly or salary, period (weekly / bi-weekly / semi-monthly / monthly), a known period start date, pay N days after the period ends, currency. - Holidays: name, date, country/province, paid, optional pay multiplier. - Rules: daily overtime after N hours (× multiplier), double-time after N hours, weekly overtime after N hours, ignore overtime slivers under N minutes, late / early-out grace, automatic unpaid break (shifts over 5 h without break punches), holiday multiplier, rounding.
Employees
New on the Employees view (or right-click ▸ New employee) → the employee dialog: | Tab | Contents | |---|---| | Basic | name, display name, employee number (assigned on create: EMP-00001…), email/phone/cell, department, position, manager, employment type, status, hire / termination dates, country/province, work location, standard hours per day and days per week, links (source-CRM user id, the person's client record, the partner record if the person is also a field partner), emergency contact, notes. | | Pay | pay cycle, hourly or salary, rate/amount, effective date → Assign / change pay (effective-dated history); commission %, currency; the pay history and this employee's pay lines. | | Time | recent days (worked / regular / OT / leave / late), Record punch (in, out, break start/end at a chosen time), Open day…. | | Leave | this year's balances (entitled / used / adjusted / available), New leave request…, Adjust balance…, the requests with Approve (manager) / Approve (HR) / Reject / Cancel. | | Teams | tick the teams the employee belongs to. |
Time & attendance
Employees punch in / out / break start / break end (from the employee dialog, or a manager records them; kiosk/mobile devices are recorded the same way). Each day rolls up automatically: worked time = in→out minus breaks (an unpaid break is deducted automatically on long days without break punches, per Rules), split into regular / overtime / double-time by the daily thresholds; late and early-out minutes come from the employee's scheduled shift (the roster: a shift assigned from a date, optionally to a date). Days with punches are open until the last punch out, then complete. Open day… shows the punches (add/delete manual ones with a note) and the roll-up; Approve day freezes the pay rate on the day; Reject flags it. Approved (or, if you choose, complete) days feed payroll.
Leave
New leave request… (employee dialog, Leave view, or right-click): leave type, from/to, part day (half / quarter for a single day), reason; the dialog shows the available balance and refuses a request that would go negative unless the type allows it. Working days exclude weekends and paid holidays. Approval follows the type: manager, then HR when required (or none: auto-approved). On final approval the balance is deducted (with an audit log) and the leave hours are booked onto each day's timesheet, so payroll pays them (paid types) automatically. Cancel a pending request from the same place.
Applying an approval is one transaction. The balance deduction, its audit-log entry, the leave hours on each day and the request's "applied" mark are written together. If any part fails, none of it is applied (the balance is not deducted and the approval can be retried), and two people approving the same request at the same moment cannot deduct it twice.
Days that are already approved or rejected are left alone. Approve day is a checkpoint (payroll may already have run against that day), so a later leave approval does not rewrite its leave hours. The request is still approved and the balance still deducted; the confirmation message names the days it could not change (for example "1 day(s) (2026-01-05) were already approved/rejected, so their leave hours were not changed. Reconcile those days manually"). Open each of those days from the Timesheets view (double-click the row, or right-click ▸ Open) and adjust it yourself if the leave should be paid.
Payroll
Run payroll…: choose the pay cycle and the period (the list is built from the cycle's start date and
kind), optionally include unapproved (complete) days, Run / refresh. Each employee on that cycle
gets a line: regular / overtime (daily rules plus the weekly threshold) / leave / holiday hours, the
rate in force at period end, pay by kind, and gross. Salaried employees get the period amount.
Gross is pay by kind + commission + allowances - deductions, so a line whose deductions exceed its
pay shows a negative gross, written -$50.00 CAD with the minus sign before the dollar sign
(Chapter 7, How money is written). A pay line whose currency has never been set shows the amount
with no currency code rather than a placeholder.
Select a line to add commission / allowances / deductions; Approve (or Approve all drafts);
Mark paid (+ AP bill) stamps the pay date and, when Financials is on, raises a bill for the employee;
Void cancels a line. Approved, paid and voided lines are all left untouched by later runs; a
voided line keeps the figures it had when you voided it and is never recalculated. Only draft lines
are recomputed; a rerun reports approved and paid lines as already approved/paid (left alone).
Paying a voided period again. When an employee's only line for a period is void, Run / refresh for that period re-issues it: it creates a new draft line, worked out from the current timesheets and rates, and leaves the voided line exactly as it was, as history. Both lines then show in Run payroll (one Void, one Draft), and the new one goes through the usual Draft → Approved → Paid. The message after the run lists everyone re-issued, for example "Re-issued as a new draft line. The voided line stays as history: • Jane Doe (new line #124; voided #99)". Running again recomputes that new draft; it never adds a second one. If the period already has a draft, approved or paid line next to the void one, nothing is re-issued. (Void is still final: the way to pay a voided period is a rerun, never un-voiding the line.)
First re-issue on an older database. Databases set up before this change allowed only one line per employee and period. The first time a run needs to re-issue, TechieCRM updates that rule in its own payroll table (it now allows any number of void lines but still only one live line). If the login cannot do that, the run lists the employee under Not re-issued with the reason, writes nothing for them, and still computes everyone else: sign in once with the MASTER ID (or an ID with SQL admin rights on the database) and run payroll again.
A line must be approved before it can be paid. The order is always Draft → Approved → Paid, so that every paid line shows who approved it and when. Pressing Mark paid on a draft line does nothing except tell you so: "This pay line is still a draft, so it cannot be marked paid yet. Approve it first (Approve selected, or Approve all drafts), then mark it paid." On the board, right-clicking a draft line offers Approve line, and shows Mark paid (approve the line first) greyed out; once the line is approved, right-click offers Mark paid (+ AP bill). The usual run is: Run / refresh, check the lines, Approve all drafts, then Mark paid on each line. If a colleague changes a line while you are looking at it (voids it, say), Mark paid refuses rather than paying it, and asks you to refresh. If Approve all drafts cannot approve a line, it lists that line afterwards instead of skipping it quietly. A line that is already paid cannot be paid again; if its AP bill failed to be raised the first time, pressing Mark paid (+ AP bill) again raises the bill only and leaves the paid date alone.
Voiding a line that was already paid and already billed asks first ("This pay line was already paid and billed (Bill #n). Void it anyway?"), because voiding does not reverse or cancel the bill in Financials: the bill stays exactly as it is and must be dealt with there (Chapter 7). Any other line (draft, approved, or paid but never billed) voids straight away with no extra question.
A paid line can only be undone by voiding it. Once a line is paid it cannot be moved back to approved or to draft; pressing Approve selected on it does nothing except tell you "This pay line is already paid, so it cannot be moved back to approved. The only way to undo a payment is to void the line (Void, then confirm)." Use Void in Run payroll (with the question above when the line was billed). Voiding keeps the paid date and the bill number on the line, so the record of what was paid stays. On the board, right-clicking a paid line shows Undo payment (void the line in Run payroll…) greyed out, to point you there.
A void line is final. It cannot be approved, returned to draft, or paid. (Allowing void → draft would be a way round the rule above: draft → approve → pay again.) Trying it says so, and adds "To pay this period again, run payroll for it: the run issues a new draft line and keeps this one as history." A rerun never changes the void line; it re-issues the period as a new line, as described above. On the board, right-clicking a void line shows Pay this period again (Run payroll for it…) greyed out, to point you there.
Re-approving keeps the original approver. Pressing Approve selected on a line that is already approved changes nothing about who approved it and when; the first approval stands. The one exception is a line that was approved but never recorded who or when (older data): approving it again stamps you and now, which is what lets it be paid. If a colleague pays or voids a line while you are approving it, your approval is refused rather than un-paying it, and you are asked to refresh.
Who gets recorded. Approving/rejecting a day, deciding a leave request, and approving (the first time) or paying a pay line all record the logged-in user in the record's approval columns, the same id whether you use the dialog buttons or the right-click menu on the board.