flowchart TD
A["Add Employee
(Basic Info + Job Details)"] --> B["Redirected straight
into Edit"]
B --> C["Set up Work Schedule —
fixed days, or mark as
flexible — before any
further save"]
C --> D["Active / On-boarding —
normal portal access"]
D --> E{"Employment ends?"}
E -- No --> D
E -- Yes --> F["Status changed to a
separated status +
End of Contract date
(both required together)"]
F --> G["TA Portal access ends
3 days after that date"]
G --> H{"Rehired later?"}
H -- Yes --> I["Status changed back —
same record, full
access resumes"]
H -- No --> J["Record stays on file"]
Employee records live under Employees in the sidebar. The list shows every employee across every client, filterable by status. The search box matches across most of an employee's record — name, email, employee ID, client, role, address, phone, bank details, emergency contacts, and salary/rate details — so a client rate, VA rate, currency, frequency, or effective date typed into search will surface the matching employee. A sort dropdown next to search reorders the list by most/least recently updated (Newest/Oldest), or by Client Rate / VA Rate, high to low or low to high. Click a row's Edit button to open that employee's full record, or Add Employee at the top to start a new one.
Both the list's expanded row and the Add/Edit form are organized into tabs instead of one long scroll:
Fields with a red * are required. Clicking Save with any of them empty highlights the missing ones instead of submitting — nothing is silently dropped. A tab with an unfilled required field inside it also carries a red * next to its own label, so you can spot which section needs attention without opening every tab.
Click Add Employee and fill in Basic Information and Job Details — the two sections that exist before the record itself does. Use the Search client & job button next to Client to pick from an existing job posting; it fills in Client, Client Code, and Role for you (those three fields are read-only otherwise).
You're taken straight into Edit after saving, not back to the list. That's deliberate — the very next thing every new employee needs is a Work Schedule, and that can't be set until the record exists (it needs a real employee ID to attach to).
If you're bringing back someone who already has an employee record in the system (see Ending an Employment for why records aren't deleted), search for them from the Add Employee flow instead of creating a duplicate. Reuse mode skips onboarding and sets status straight to Hired — all of that employee's history stays attached to the same record.
Required fields you'll fill in when adding, and can update any time after:
| Field | Notes |
|---|---|
| Employee ID | The unique identifier used for TA Portal login and every internal lookup. Must be unique — the save is blocked with an error if it's already in use by another employee. |
| Email Address | Required. Secondary Email is optional. |
| First / Last Name | Required. |
| Primary Address | Street, Region, Province, City, Zip, Country — all required. Region/Province/City cascade from each other. |
| Secondary Address, Phone | Optional. |
| Field | Notes |
|---|---|
| Status | Required. See Ending an Employment for what changing this to a separated status requires. |
| Client / Client Code / Role / Job Code | Read-only — set via Search client & job. |
| Date Hired | Required. |
| End of Contract | Required only once Status isn't Hired/On-boarding/Pooling — see Ending an Employment. |
| Milestone dates (First Month, EOP 3rd Month, 6/9 Months, 1/2/3 Year) | Computed from Date Hired — the same dates that surface on the Dashboard calendar. |
Open the Job Details & Schedule tab and click Edit Schedule in the Leave Balance & Work Schedule section to set a start and end time (and an optional break) for each day of the week this employee actually works. Days left blank stay days off.
The record can't be saved until either a fixed schedule or a flexible-schedule note is in place. This applies to every edit, not just new employees — an old record missing both will block the next time anyone touches it, until one is set.
Overnight and 24-hour shifts are supported. If an employee's End Time is earlier than their Start Time (e.g. 10:00 PM – 6:00 AM), it's treated as a normal overnight shift, not an error — the hours are counted as landing the next day. Setting the End Time equal to the Start Time (e.g. 8:00 AM – 8:00 AM) means a full 24-hour shift.
Saving the schedule automatically recalculates two things elsewhere:
Overtime, On-Call pay rate, and Stipend settings also live in this same editor — see the next section for where those feed into payroll.
Some employees genuinely don't work a fixed set of hours (project-based, fully flexible arrangements). For these, uncheck This employee has a fixed day-by-day schedule at the top of the editor instead of forcing a day grid that doesn't reflect reality. The grid disappears and two fields take its place:
| Field | Notes |
|---|---|
| Schedule Note | Required — a short explanation of the arrangement (e.g. "Flexible hours, averages ~35/week"). This is informational only; it doesn't feed any calculation. |
| Agreed Hours | Optional here. If left blank, expected-hours calculations default to a 40-hour week until a real number is entered — set it directly (e.g. 30 for someone who reliably works 6 hrs/day, or 750 for a monthly figure) whenever the actual total is known. |
| Frequency | Weekly or Monthly — how to read the Agreed Hours number above. Most no-fixed-schedule employees are Weekly; use Monthly for someone whose agreed hours were only ever negotiated as a monthly total (a Monthly value is converted to a weekly-equivalent internally wherever a weekly figure is needed, e.g. margin estimates). |
Turning "no fixed schedule" back off doesn't remove the schedule requirement — it just switches back to needing at least one real day filled in on the grid.
A no-fixed-schedule employee's timesheet in the TA Portal doesn't get an automatic unpaid-break deduction — that check is skipped entirely when there's no day-of-week schedule to compare against.
Agreed Hours is a real hard cap, gated by Allow Overtime. If a no-fixed-schedule employee's period total goes over their Agreed Hours (converted to that period's expected amount) and Allow Overtime isn't checked for them, the TA Portal blocks them from submitting that timesheet — same enforcement as a fixed-schedule employee. Check Allow Overtime (in this same Work Schedule editor) for anyone who's expected to occasionally exceed their agreed hours.
The rate field next to Allow Overtime is a
multiplier (e.g. enter 1.25 for 1.25× the base rate), the same convention as
the On-Call rate field next to it — not a percent increase.
For a Monthly-rate employee with Allow Overtime checked, this stops being just a submission gate: any cumulative hours for the calendar month (both pay periods combined) that exceed Agreed Hours are automatically paid as overtime at the configured multiplier — see the Payroll Processing manual's "Overtime Pay" badge for how that's calculated and shown. Make sure Agreed Hours and Agreed Hours Frequency (Monthly) are set accurately for these employees — that figure is the actual cap their overtime pay is measured against, not just a display number.
The Salary & Bank Details tab holds two independent rates: what the employee is paid (VA Rate) and what the client is billed (Client Rate). Each has its own frequency and, as of this update, its own currency.
| Field | Notes |
|---|---|
| Client Rate | What the client is billed. For VA Rate + Flat Fee billing this is the flat fee amount instead — see below. |
| Client Currency | The currency the client is billed in. Independent of Staff Currency — a client can be billed in CAD while the employee is paid in USD. |
| Billing | The client-billing frequency (Hour/Day/Week/Month/Quarter/Year), or VA Rate + Flat Fee for cost-plus-fee arrangements. |
| VA Rate | What the employee is actually paid. |
| Staff Currency | The currency the employee is paid in. |
| Frequency | The staff pay frequency. |
| Effective Date | Required on every save. The real date this rate (or any other salary field) starts applying — see the callout below for what it actually drives. |
Whenever either currency is set to CAD, a small reference line appears underneath that dropdown showing today's rate (e.g. "1 CAD ≈ 0.7267 USD, Bank of Canada") — pulled live, for context only. It doesn't change what gets saved.
Effective Date controls the payroll mid-period rate split (see the Payroll Processing Manual's "Rate changed mid-period" badge) — enter the date the new rate should actually start paying out, not today's date if you're processing the change a few days late. Every rate change is also logged with this same date for the audit trail, so it stays consistent between what payroll actually did and what the change history shows.
Changing Frequency, not just Rate, is also tracked — if you move an employee from Hourly to a fixed Monthly rate (or any other frequency change) mid-period, payroll splits and prices that period automatically, shown as its own "Frequency changed mid-period" badge on the Payroll tab (separate from the rate-change badge above). Same rule applies: Effective Date is what payroll uses to decide where the split falls.
Next to Client Rate, a live Margin % shows what this arrangement is worth after paying the employee — (Client − VA) ÷ Client, normalized to an hourly basis first so a mismatched frequency (e.g. client billed weekly, staff paid monthly) doesn't produce a meaningless number.
When Client Currency and Staff Currency differ, the VA side is converted using the live CAD/USD rate before comparing, and the margin line notes that a conversion was applied. If the pair can't be converted (anything involving PHP — the live rate only covers CAD↔USD), the margin doesn't show at all; instead you'll see "Can't show margin — no conversion available for this currency pair", so a real mismatch is never silently misread as a good or bad number.
This margin is a planning estimate, not the exact figure a payroll run produces — it uses this employee's own Agreed Hours (Weekly) to estimate a typical month's hours, not the real working-day count for a specific pay period (which varies with holidays). It's close, but for the exact number, check the Margin Alerts tab described in the Payroll Processing Manual.
Saving is blocked once the margin is confirmed zero or negative — fix the Client Rate or VA Rate first. This only applies once a bad margin is actually confirmed; it does not block saving when the margin simply can't be verified (e.g. a currency pair the live rate can't convert) — that's "unknown," not "confirmed bad."
When Billing is set to VA Rate + Flat Fee, worked hours bill to the client at cost (VA Rate × hours, no markup), and the Client Rate field becomes a flat fee added once per invoice on top — this is the entire profit on that employee. No percentage margin is shown for this arrangement, since there's nothing meaningful to compare the flat fee against. If Client Currency and Staff Currency differ here, a note shows the fee's converted value in the staff's currency, purely for reference.
A $0 flat fee means this employee generates zero margin beyond any on-call/stipend lines — flagged both here and on the Payroll tab's Margin Alerts, and blocks saving until it's fixed (same rule as the negative-margin block above).
This form is where these get attached to an employee, not where the day-to-day workflow around them is documented — each has its own manual for that. Leave Balance lives inside the Job Details & Schedule tab, alongside Work Schedule; HMO and Loans share their own HMO & Loans tab, which only appears once you're editing an existing employee — there's nothing to attach a loan or HMO plan to until the record exists:
Both HMO and Loans have a Regenerate unpaid action for rolling a stale schedule forward without touching terms that are already paid — see the Payroll Processing Manual before manually re-entering a schedule from scratch.
Assign client-side approvers per employee — the people who review and approve that employee's timesheets from the Partner Portal. Pick from the client's existing approver list; there's no cap on how many can be assigned to one employee.
Change Status to one of the six separated statuses to end an employment: Terminated, Resigned, Endo, Client Withdrawn, Va Withdrawn, or Awol.
End of Contract becomes required the moment you pick one of these. Save is blocked without it — this date is what everything below is calculated from, so it has to be accurate, not a placeholder.
Submitting the form shows a confirmation warning summarizing exactly what's about to happen before you commit to it:
Rehiring uses the same record. Change Status back to an active value (e.g. Hired) and portal access resumes immediately — no End of Contract date is required for that direction, and nothing about the employee's prior history is affected.
| Issue | What to check |
|---|---|
| Save button is disabled and nothing happens | Check for the red Work Schedule banner — either at least one day needs a real start and end time, or (if "no fixed schedule" is checked) a Schedule Note needs to be filled in. |
| "The end of contract field is required" on save | Status is set to something other than Hired/On-boarding/Pooling. Fill in End of Contract, it's now tied directly to how long that employee keeps portal access. |
| Save fails with an Employee ID error | That Employee ID is already assigned to a different employee record — IDs must be unique across the whole system. Double-check for a typo or an existing record before assuming it's a new hire. |
| Client / Role / Job Code won't let me type | Those three are read-only by design — use Search client & job to change them. |
| Agreed Hours looks wrong after editing the schedule | For a fixed-schedule employee, it's recalculated automatically from whatever days/times are configured — check the schedule itself rather than editing Agreed Hours directly. For a no-fixed-schedule employee it's the opposite: it's a plain manual field (or blank, defaulting to 40) and won't change on its own. |
| A former employee says they can't log into the TA Portal anymore | Expected 3 days after their End of Contract date. If they need longer, that's a deliberate exception, not a bug — there's no toggle for it, contact engineering if this needs to happen. |
| Margin % isn't showing next to Client Rate | Either the billing is VA Rate + Flat Fee (no percentage margin for that arrangement — see Salary & Margin), or Client Currency and Staff Currency differ with no conversion path (a PHP pair). Check the warning text under the field for which case it is. |
| Save button is greyed out and I can't figure out why | Check for a red margin warning under Client Rate first — Save is blocked once a margin is confirmed zero or negative (or the flat fee is $0). If that's not it, check for the Work Schedule banner instead (see Work Schedule) — both conditions disable Save the same way. |