Payroll — Import a pay run from Excel/CSV¶
Manual test plan for the Import from Excel/CSV wizard on a Draft pay run — uploading a spreadsheet of hours/amounts, mapping its columns, fixing any problems on-screen, and importing the numbers into the pay run. This sits alongside the Tanda and Deputy imports on the same pay run. Read How testing works first.
What this feature does
It fills in an existing Draft pay run from a spreadsheet — it does not create a new pay run, finalise it, or send anything to the ATO. You always review and can fix every row before the numbers are saved. Nothing is locked in until you click Import into pay run, and even then the run stays a Draft you can keep editing.
You will need: a payroll company with at least two employees, and a Draft pay run. A spreadsheet program (Excel, Numbers, or Google Sheets) to make .xlsx / .csv files. A couple of the safety cases are marked 🔧 and need a developer to check the saved numbers.
Make yourself a sample file (save as .csv or .xlsx). One row per employee per pay item:
| Employee | Pay Item | Hours | Rate |
|---|---|---|---|
| emma@yourco.com.au | Ordinary Earnings | 38 | 45 |
| james@yourco.com.au | Ordinary Earnings | 40 | 50 |
Use the real email addresses of your employees in the Employee column — that gives the cleanest match.
A. Opening the import¶
A1 — The action appears only on a Draft¶
Steps 1. Open a pay run that is Finalised or Lodged. Open the actions menu (⋯ / "Actions"). 2. Now open a Draft pay run and open its actions menu.
✅ Pass if Import from Excel/CSV shows only on the Draft pay run (next to Import from Tanda / Deputy), and is absent on Finalised/Lodged runs.
❌ Fail if it shows on a Finalised or Lodged pay run — 🔴 Blocker (a locked/lodged run must never be editable).
A2 — Launch the wizard¶
Steps 1. On a Draft pay run, click Import from Excel/CSV.
✅ Pass if a dialog opens on the Upload step with a file picker.
❌ Fail if nothing opens or the page errors — 🟠 Major.
A3 — Cancel leaves the pay run untouched¶
Steps 1. Open the wizard, then close it (✕ / click outside) without importing. 2. Look at the pay run figures.
✅ Pass if the pay run is completely unchanged.
❌ Fail if any figure changed just from opening/closing the wizard — 🟠 Major.
A4 — Reopening starts fresh¶
Steps 1. Upload a file and move to the review step, then close the wizard. 2. Open Import from Excel/CSV again.
✅ Pass if it starts again at the Upload step with nothing carried over from last time.
❌ Fail if it reopens mid-way showing the previous file's rows — 🟡 Minor.
B. Uploading the file¶
B0 — Download the example template¶
Steps
1. On the Upload step, click Download example template (the "New to this?" link).
2. Open the downloaded pay-run-import-template.xlsx.
✅ Pass if a spreadsheet downloads with the columns Employee, Pay Item, Hours, Amount, a short hint under/for each, and a few example rows showing the three ways to enter a line (hours only, hours + rate, amount only).
❌ Fail if the link errors, downloads an empty/broken file, or the download does nothing — 🟡 Minor.
B0a — A template-based file needs no manual mapping¶
Steps 1. Fill in the downloaded template with real employees and save it. 2. Upload it and look at the Map columns step.
✅ Pass if the columns are already mapped (Employee → Employee, Pay Item → Pay Item, Hours → Hours, Amount → Amount) so you can go straight to review — you can still change them.
❌ Fail if a file made from the template still comes up completely unmapped — 🟡 Minor.
B1 — Accepts .csv and .xlsx¶
Steps
1. Upload a .csv sample. Repeat with an .xlsx sample.
✅ Pass if both are accepted and move you to the Map columns step.
❌ Fail if a valid .csv or .xlsx is rejected — 🟠 Major.
B2 — A wrong file type is refused politely¶
Steps
1. Try to upload a .pdf, .docx, or image.
✅ Pass if it's refused with a clear message (e.g. "Use a .csv or .xlsx file") — no crash.
❌ Fail if it accepts the file and then errors confusingly, or the wizard breaks — 🟠 Major.
B3 — Oversized file¶
Steps 1. Try a very large file (over ~5 MB).
✅ Pass if it's refused with a size message rather than hanging.
❌ Fail if the wizard freezes with no explanation — 🟡 Minor.
C. Mapping the columns¶
C1 — Map the required columns¶
Steps 1. After upload, on Map columns, tell the wizard which column is the Employee, which is the Pay Item, and which holds Hours and/or Amount. 2. Continue to the review step.
✅ Pass if you can point each field at a column heading from your file and continue.
❌ Fail if you can't select your columns, or valid headings aren't offered — 🟠 Major.
C2 — Missing a required column is blocked¶
Steps 1. Leave the Employee (or Pay Item) mapping empty and try to continue.
✅ Pass if the wizard won't proceed until Employee and Pay Item are mapped, and at least one of Hours/Amount is mapped.
❌ Fail if it proceeds with nothing mapped and then everything is unmatched — 🟡 Minor.
D. Review — matching employees¶
The review grid shows one row per line from your file, colour-coded: green = ready, amber = needs you to confirm, red = a problem to fix.
D1 — Exact email match is ready (green)¶
Steps 1. Use a file where the Employee column has employees' exact email addresses. 2. Look at the Employee column in the review grid.
✅ Pass if those rows show the matched employee's name as ready/green with no dropdown to pick.
❌ Fail if an exact, unique email doesn't match the right employee — 🔴 Blocker (wrong person could be paid).
D2 — A name (not email) asks you to confirm (amber)¶
Steps 1. Use a file where the Employee column has names instead of emails (e.g. "Emma Chen"). 2. Look at those rows.
✅ Pass if each name row is amber with a dropdown to pick the exact employee — it is never auto-accepted, even when there's only one obvious match.
❌ Fail if a name is silently auto-matched and committed without you confirming — 🔴 Blocker (this is the guard against paying the wrong person).
D3 — Two people, same name¶
Steps 1. Have two employees with the same name (or use a name that matches two people). Put that name in the file.
✅ Pass if the row is amber and the dropdown lists all the matching people to choose from.
❌ Fail if it silently picks one of them — 🔴 Blocker.
D4 — Unknown employee (red)¶
Steps 1. Put an email/name in the file that isn't any employee.
✅ Pass if the row is red / Unmatched and cannot be imported until fixed or excluded.
❌ Fail if an unknown employee slips through — 🟠 Major.
D5 — Employee not on this pay run but active in the company¶
Steps 1. Put in the file an active employee who wasn't included when the Draft was created (and who works in this pay period).
✅ Pass if the row shows a clear "will be added" badge, so you can see they're being pulled into the pay run before you commit (and you can exclude the row if you didn't mean to).
❌ Fail if an extra person is added with no visible indication — 🟠 Major.
D6 — A terminated / not-yet-started employee is not added 🔧 Needs developer setup¶
Steps 1. Put in the file an employee whose employment doesn't cover this pay period (finished before it, or starts after it).
✅ Pass if they are not silently added — the row is flagged (not "will be added"). A developer can confirm no pay line was created for them.
❌ Fail if a terminated or not-yet-started employee gets added and paid — 🔴 Blocker.
E. Review — pay items and values¶
E1 — Known pay item matches and shows its tax/super treatment¶
Steps 1. Use a common pay item name your company has (e.g. "Ordinary Earnings").
✅ Pass if the row matches the pay item as ready/green. (Its tax/super treatment is what's set up for that pay item — the import doesn't change it.)
❌ Fail if a clearly-named standard pay item won't match — 🟠 Major.
E2 — Unrecognised pay item asks you to pick (red/amber)¶
Steps 1. Put a pay item label your company doesn't have (e.g. "Weekend Penalty") in the file.
✅ Pass if the row flags the pay item as not recognised and lets you pick the correct one from your company's list.
❌ Fail if an unrecognised pay item is silently dropped or mapped to the wrong one — 🔴 Blocker (wrong pay item = wrong tax/super).
E3 — Hours only (keeps the existing rate)¶
Steps 1. For an employee who already has that pay item line on the Draft (with a rate), put only Hours in the file (leave the rate/amount blank). 2. Import, then open the employee's pay.
✅ Pass if the hours update and the existing rate is kept (hours × existing rate).
❌ Fail if the rate is wiped to zero or changed — 🔴 Blocker (would underpay).
E4 — Hours and rate together¶
Steps 1. Provide both Hours and Rate for a line.
✅ Pass if both are applied (the line uses the hours and the rate from the file).
❌ Fail if either value is ignored — 🟠 Major.
E5 — A flat amount¶
Steps 1. Provide only an Amount (e.g. a $1,200 bonus/allowance), no hours.
✅ Pass if the line is set to that dollar amount.
❌ Fail if the amount is dropped or doubled — 🟠 Major.
E6 — New pay item line with hours but no rate is stopped¶
Steps 1. For an employee who does not already have that pay item, put Hours but no rate (e.g. Overtime, 5 hours, blank rate). 2. Try to import.
✅ Pass if that line is refused with a clear "rate required" message — it is not silently saved as $0.
❌ Fail if it saves the hours at a $0 rate (the person's hours produce no pay) — 🔴 Blocker.
E7 — Messy numbers are read or flagged¶
Steps
1. Try amounts written as $1,250.00, and a cell with letters like abc.
✅ Pass if $1,250.00 reads as 1250, and abc is flagged as an invalid value to fix (not silently treated as 0).
❌ Fail if text like abc becomes 0 and gets paid — 🟠 Major.
F. Fixing problems on-screen¶
F1 — Resolve with the dropdowns¶
Steps 1. On an amber/red employee or pay-item cell, use the dropdown to pick the right one.
✅ Pass if the row turns ready once both the employee and pay item are chosen.
❌ Fail if picking has no effect — 🟠 Major.
F2 — Edit a value in place¶
Steps 1. Change a quantity or amount directly in the grid — e.g. type a rate into a row that had hours only.
✅ Pass if the edit is accepted and (importantly) that typed rate is actually used when you import — see F5.
❌ Fail if the cell won't edit — 🟡 Minor.
F3 — Exclude a row¶
Steps 1. Tick exclude on a row you don't want.
✅ Pass if the excluded row is skipped and no longer blocks importing, and it is not imported.
❌ Fail if an excluded row is still imported — 🟠 Major.
F4 — Import is blocked until everything is resolved¶
Steps 1. Leave one row unresolved (amber/red) and not excluded.
✅ Pass if the Import into pay run button stays disabled until every remaining row is either resolved or excluded.
❌ Fail if you can import with unresolved rows still showing — 🔴 Blocker.
F5 — Typed-in rate is honoured (not dropped)¶
Steps 1. Take a row that came in as hours only. Type a rate into its Amount cell in the grid. 2. Import, then open the employee's pay.
✅ Pass if the line uses the rate you typed (hours × your typed rate) — the number you entered is not thrown away.
❌ Fail if the line ignores your typed rate (e.g. imports at $0 or keeps hours-only) — 🔴 Blocker.
G. Importing¶
G1 — Successful import summary¶
Steps 1. With all rows ready, click Import into pay run.
✅ Pass if you get a success message with a count (e.g. "Imported 2 employees"), the wizard closes, and the pay run refreshes.
❌ Fail if it reports success but nothing changed, or errors with no message — 🟠 Major.
G2 — Partly-blocked lines are reported, not hidden¶
Steps 1. Import a batch where one line can't apply (e.g. the E6 rate-required case, if reachable).
✅ Pass if the summary tells you how many succeeded and how many failed, so nothing is silently skipped.
❌ Fail if a line quietly fails to import with no mention — 🟠 Major.
H. After importing¶
H1 — Lines and totals are correct¶
Steps 1. Open each imported employee's pay.
✅ Pass if the pay item lines match the file (right hours/amounts), and the pay run's gross recalculates (e.g. 38 hrs × $45 = $1,710). Tax/super update from the pay as normal.
❌ Fail if a line or the gross is wrong — 🔴 Blocker.
H2 — People not in the file are untouched¶
Steps 1. Before importing, note an employee (or a pay line) not mentioned in your file. 2. Import, then re-check them.
✅ Pass if anyone/anything not in the file is left exactly as it was — importing never zeroes out people you didn't include.
❌ Fail if an omitted employee's pay is wiped or changed — 🔴 Blocker.
H3 — Re-importing a corrected file is safe¶
Steps 1. Import a file. Then fix a number in the spreadsheet and import the same file again into the same Draft.
✅ Pass if the second import overwrites the changed lines (no doubling) — e.g. changing 38 hrs to 40 hrs shows 40, not 78.
❌ Fail if re-importing adds duplicate lines or adds the hours on top of the old ones — 🔴 Blocker.
H4 — Re-import doesn't duplicate leave loading 🔧 Needs developer setup¶
Steps 1. For an employee who gets leave loading, import some Annual Leave hours; then change the hours and import again. 2. A developer checks the saved pay lines.
✅ Pass if there is exactly one leave-loading line, recalculated for the latest leave hours — not one extra line added each time you re-import.
❌ Fail if each re-import adds another leave-loading line (inflating gross, tax and super) — 🔴 Blocker.
H5 — Recalculation happens on its own¶
Steps 1. Right after importing, view the pay run.
✅ Pass if tax, super and net are recalculated from the imported lines without you pressing a "recalculate" button.
❌ Fail if figures stay stale until some other action — 🟠 Major.
I. Permissions & safety¶
I1 — Needs payroll access¶
Steps 1. As a user without payroll permission, try to reach the import.
✅ Pass if the action isn't available / is refused.
❌ Fail if someone without payroll access can import pay data — 🔴 Blocker.
I2 — Adding employees respects the plan limit 🔧 Needs developer setup¶
Steps 1. On a plan at its employee limit, use a file whose "will be added" employees would exceed the cap.
✅ Pass if the import is stopped with an upgrade/limit message rather than quietly adding people over the cap.
❌ Fail if the import bypasses the employee-seat limit — 🟠 Major.
I3 — Added employees get their leave set up 🔧 Needs developer setup¶
Steps 1. Import a file that adds an eligible employee to the pay run (the D5 case). 2. A developer confirms the added employee has their leave (Annual/Personal) tracking rows.
✅ Pass if an auto-added employee accrues leave the same as one added manually.
❌ Fail if an auto-added employee is missing leave tracking (leave wouldn't accrue) — 🟠 Major.
J. Wide layout (pay items across columns)¶
Some spreadsheets put one row per employee with a column for each pay type (e.g. Weekday Pay, Wage Saturday, Wage Sunday) — usually with a rate column right next to each. This is the Wide layout. It's the same import wizard; you just tell it the file is Wide and point it at the column pairs.
Make yourself a wide sample (one row per employee):
| Last Name | First name | Proper | Weekday Pay | $Rate | Wage Saturday | $Rate | Amount as per payrun |
|---|---|---|---|---|---|---|---|
| Chen | Emma | Emma Chen | 38 | 45 | 0 | 55 | (ignored) |
| Wilson | James | James Wilson | 40 | 50 | 6 | 60 | (ignored) |
J1 — Choosing Wide and mapping the employee¶
Steps 1. Upload the wide file. On Map columns, choose Wide. 2. Pick how the employee's name is stored: a single full-name column (e.g. "Proper"), or a First + Last pair of columns.
✅ Pass if switching to Wide shows the wide mapping options, and you can point at either a full-name column or a First + Last pair.
❌ Fail if the Wide option is missing or the employee mapping can't be set — 🟠 Major.
J2 — Mapping the pay-item column groups¶
Steps 1. Add a pay item entry for each pay type: pick its Hours column, its Rate column (optional), and the pay item it corresponds to (e.g. Weekday Pay → Ordinary Earnings). 2. Add another for the next pay type (e.g. Saturday → your Saturday/penalty pay item). 3. Leave any reconciliation columns (e.g. "Amount as per payrun", "Diff") unmapped.
✅ Pass if you can add one entry per pay type, choose the pay item for each from your company's list, and Preview stays disabled until each entry has at least a Hours column and a pay item chosen.
❌ Fail if you can't map a pay type to a pay item, or Preview lets you continue with an incomplete entry — 🟠 Major.
J3 — Preview explodes the row into one line per pay type¶
Steps 1. Preview the wide file.
✅ Pass if each employee row becomes one review line per pay type that has hours — e.g. Emma → one "Ordinary Earnings" line (38 hrs); a pay type with 0 hours is skipped (no empty line). The reconciliation columns are not imported.
❌ Fail if a 0-hour pay type creates a $0 line, or a reconciliation column shows up as a pay item — 🟠 Major.
J4 — Names need confirming (bulk)¶
Steps 1. In the review grid (wide files usually match by name, not email), look at the employee column. 2. Click Confirm all unique matches.
✅ Pass if each name that matches exactly one employee is shown as needing confirmation, and the one Confirm all unique matches button resolves them all at once — names are never silently auto-matched, and anyone whose name matches two people still needs a manual pick.
❌ Fail if a name is silently auto-matched, or the bulk button resolves a name that matches two different employees — 🔴 Blocker.
J5 — Importing a wide file lands the right lines¶
Steps 1. After confirming, import, then open each employee's pay.
✅ Pass if the pay lines match the file (e.g. Emma 38 hrs × $45 = $1,710; James 40 hrs × $50 = $2,000) and the pay run's gross recalculates.
❌ Fail if a line is wrong or a mapped pay type is missing — 🔴 Blocker.