Skip to content

Payroll — Pay runs & STP lodgement

Manual test plan for the whole pay-run flow: creating and editing a pay run, finalising, lodging to the ATO (Single Touch Payroll), journal posting, the bank (ABA) file, and payslip email. Read How testing works first.

Test/EVTE only — lodgement reports real money to the ATO

Submitting a pay run sends a Single Touch Payroll report to the ATO. Use the test / EVTE environment only. The ATO responses in the 🔧 cases must be produced/simulated by a developer.

You will need: a payroll company with employees who have complete tax/super/bank details, and a developer for the ATO-response and integration cases.


A. Pay runs list

A1 — Filters (status, needs-super, FY)

Steps 1. Go to Payroll → Pay Runs. Change the status, needs-super, and financial-year filters.

✅ Pass if each filter re-scopes the list and resets to page 1; summary cards follow the FY scope.

❌ Fail if a filter has no effect — 🟠 Major.

A2 — New Pay Run (pre-filled)

Steps 1. Click New Pay Run.

✅ Pass if the create form pre-fills from the most recent Regular run (frequency carried, start = previous end + 1 day, end/pay-date auto-calculated), or is blank if there's no prior run.

❌ Fail if the pre-fill dates are wrong — 🟠 Major.

A3 — Sort columns

Steps 1. Click sortable column headers (Pay Period, Gross, Tax, Net, Super).

✅ Pass if the list re-sorts (server-side) and resets to page 1; non-sortable columns (Status, Super status, actions) don't react.

❌ Fail if sorting reorders incorrectly — 🟠 Major.

A4 — "Lodge with ATO" per-row shortcut

Steps 1. On a Finalised, not-yet-lodged row, click Lodge with ATO.

✅ Pass if it opens the pay-run detail with the STP declaration dialog auto-open. Only shown for Finalised + not lodged.

❌ Fail if it shows on an already-lodged run — 🟠 Major.

A5 — "Check ATO status" per-row 🔧 Needs developer setup

Steps 1. On a row that is lodging (Queued/Submitted/Pending), click Check ATO status.

✅ Pass if it fetches the ATO status; it's hidden while auto-polling is active (shows "Automatically checking…").

❌ Fail if it errors or shows when auto-polling — 🟠 Major.

A6 — Super column

Steps 1. In the Super column, click a badge (linked) and a Create button (NotCreated).

✅ Pass if the badge links to the super contribution; Create opens the create-from-pay-run panel pre-selected. A due suffix (Overdue/Due today/Due in N days) shows appropriately.

❌ Fail if the link/create goes to the wrong place — 🟠 Major.

A7 — Delete a Draft from the list

Steps 1. On a Draft row, click trash, confirm.

✅ Pass if delete is offered only for Draft rows and a confirm warns it's permanent.

❌ Fail if a finalised/lodged pay run can be deleted from the list — 🔴 Blocker.

A8 — Summary cards & pagination

Steps 1. Review the earnings/deductions/tax/net/super summary cards (whole filtered set); page through.

✅ Pass if cards reflect the filtered totals (Deductions hides at $0) and pagination works.

❌ Fail if the totals are wrong — 🔴 Blocker (money).


B. Create a pay run

B1 — Create with date validation

Steps 1. In the create form, set an end before start and a pay date before the period start.

✅ Pass if both are rejected (end ≥ start, pay date ≥ start); choosing frequency/start auto-calculates end and pay date (weekend pay dates roll forward).

❌ Fail if invalid dates create a run — 🟠 Major.

B2 — Create

Steps 1. Submit a valid create form.

✅ Pass if it creates ("Pay run created."), opens the new run in Draft, and pre-populates employees with carried-forward pay items.

❌ Fail if creation fails or carried-forward items are missing/wrong — 🔴 Blocker (money).


C. Pay run detail — Draft editing

C1 — Add employees to the run

Steps 1. On a Draft, use Add Employee → select employees → Add.

✅ Pass if only employees not already in the run are offered (select-all works); adding shows partial-success toasts; "All active employees are already in this pay run" when none left.

❌ Fail if a duplicate employee is added — 🟠 Major.

C2 — Remove employees (single & bulk)

Steps 1. Remove one employee (row trash → confirm); select several and Remove from pay run.

✅ Pass if both confirm and remove with a toast; only available on Draft.

❌ Fail if removal is possible on a non-Draft run — 🔴 Blocker.

C3 — Edit the pay period inline

Steps 1. On a Draft, click the period bar, change dates, save.

✅ Pass if it saves ("Pay run updated.") with the same date validation; pay recalculates.

❌ Fail if invalid dates save, or pay doesn't recalculate — 🟠 Major.

C4 — Migration BMS Id (Migration runs) 🔴

Steps 1. On a Migration-type Draft, edit the BMS Id inline.

✅ Pass if it saves ("BMS Id updated"); read-only when non-draft.

❌ Fail if the BMS Id doesn't save — 🔴 Blocker (STP migration).

C5 — Warnings panel doesn't block finalise

Steps 1. Create a Draft with a warning condition (e.g. an employee missing a detail).

✅ Pass if the warnings panel lists issues but explicitly allows finalising ("You can still finalise…").

❌ Fail if warnings block finalise, or aren't shown — 🟠 Major.

C6 — Download payslips (Draft)

Steps 1. On a Draft, use Download Payslips.

✅ Pass if payslip PDFs are generated and downloaded (toast "Downloaded N payslip(s)").

❌ Fail if the download fails — 🟠 Major.

C7 — Delete the pay run

Steps 1. On a Draft, use Delete Pay Run, confirm.

✅ Pass if it deletes and returns to the list. (A pay run that is posted to the ledger, has an ATO submission, or a linked super batch must be blocked from deletion with a clear reason.)

❌ Fail if a posted/lodged/super-linked pay run deletes — 🔴 Blocker.


D. Pay run — employee detail (edit lines)

D1 — Edit pay item quantity / amount 🔴

Steps 1. Open an employee within a Draft run. Inline-edit a pay item's Qty and Amount.

✅ Pass if edits save (debounced/on-blur), the totals recalculate, and a bad value reverts with an error toast. Editable only on Draft (Migration hides Qty/Amount; Finalise-type is read-only).

❌ Fail if amounts are editable on a non-Draft/Finalise run, or a bad value sticks — 🔴 Blocker.

D2 — Add / remove a pay item

Steps 1. Click Add Pay Item, select types, Add. Then delete a pay-item line (X → confirm).

✅ Pass if available types are offered (no duplicates), adding works with partial-success toasts, and removing confirms then removes. Blocked on Finalise-type runs.

❌ Fail if a duplicate pay item is added, or delete has no confirm — 🟠 Major.

D3 — Manual tax override 🔴

Steps 1. Inline-edit Manual Tax; then clear it (X).

✅ Pass if setting a manual tax shows an amber "Manual override" label and uses that value; clearing reverts to calculated ("Tax override cleared — using calculated tax."). Draft only.

❌ Fail if the override doesn't apply or can't be cleared — 🔴 Blocker (money).

D4 — Manual super override 🔴

Steps 1. Inline-edit Manual Super; then clear it.

✅ Pass if it behaves like D3 for super ("Super override cleared — using calculated super.").

❌ Fail if the override doesn't apply/clear — 🔴 Blocker (money).

D5 — Lump Sum E financial year / ETP income date 🔴

Steps 1. On a pay item that is Lump Sum E, set the financial year; on an ETP line, set the income date.

✅ Pass if the fields save (blank = null). These are required for finalise/STP.

❌ Fail if they don't save (finalise would later fail) — 🔴 Blocker.

D6 — Migration previous payroll id 🔴

Steps 1. On a Migration Draft, set the employee's Previous Payroll Id inline.

✅ Pass if it saves per employee (STP migration field).

❌ Fail if it doesn't save — 🔴 Blocker.

D7 — Payslip note

Steps 1. Add a payslip note for the employee (Draft, not Finalise).

✅ Pass if it saves on blur (blank = removed) and appears on the employee's payslip.

❌ Fail if the note doesn't save/appear — 🟡 Minor.

D8 — Navigate between employees & download one payslip

Steps 1. Use Prev/Next and the employee picker; click Download Payslip.

✅ Pass if navigation works (disabled at ends), the "X of N" counter is right, and the single payslip downloads.

❌ Fail if navigation lands on the wrong employee, or the download fails — 🟠 Major.


E. Finalise

E1 — Finalise a Draft pay run 🔴

Steps 1. On a Draft, use Finalise and confirm.

✅ Pass if a confirm warns pay items can't be edited after; finalising shows "Pay run finalised." and locks editing. If auto-post journal is on, the journal posts; if auto-create super is on, a Draft super is created.

❌ Fail if finalise fails on valid data, or leaves the run editable — 🔴 Blocker.


F. STP submission (ATO)

F1 — Submit to ATO with the declaration 🔴

Steps 1. On a Finalised run, click Submit to ATO. In the declaration modal, enter the declarer name, tick the declaration, submit.

✅ Pass if the modal requires a declarer name and the ticked declaration before Lodge is enabled; submitting sends the STP report and the status moves to Submitted/Pending.

❌ Fail if you can submit without the declaration ticked or name entered — 🔴 Blocker.

F2 — Lodge-as-client (accountant) 🔴

Steps 1. As an accountant acting for a client, open the declaration and choose lodge as the business vs as agent.

✅ Pass if the lodge-as radio is available only in a practice→client context; choosing "business" shows the authority note.

❌ Fail if the option appears for a normal (non-practice) user — 🟠 Major.

F3 — Check ATO status 🔧 Needs developer setup

Steps 1. After submitting, ask a developer to make the ATO return accepted, then rejected. 2. Click Check ATO Status.

✅ Pass if it reports "ATO accepted the submission", or "ATO returned N errors" (with the errors panel), or "still processing".

❌ Fail if the status shown doesn't match the ATO response — 🔴 Blocker.

F4 — ATO errors panel & diagnostics 🔧 Needs developer setup

Steps 1. With an ATO rejection, view the ATO Submission Errors panel and the STP Diagnostic panel.

✅ Pass if errors/warnings are listed (informational ones collapsible); the diagnostic panel offers Apply fix / Dismiss on applicable diagnoses.

❌ Fail if apply-fix corrupts data or the errors aren't shown — 🔴 Blocker.

F5 — Send Update 🔧 Needs developer setup

Steps 1. On a successfully-submitted Regular run, use Edit & Send Update → revert to Draft → make a change → re-finalise → Send Update.

✅ Pass if the update path reverts to Draft (with a warning the original submission is preserved), and Send Update re-lodges as an update (the declaration modal can pre-select rejected payees).

❌ Fail if the update path loses the original submission or mis-lodges — 🔴 Blocker.

F6 — Send Replacement (Full File Replacement) 🔧 Needs developer setup

Steps 1. On an eligible submitted run, use Send Replacement / Edit & Send Replacement.

✅ Pass if it's only enabled when FFR is eligible (a clear reason shown when not), and the confirm warns it replaces the original submission.

❌ Fail if FFR is allowed when ineligible — 🔴 Blocker.

F7 — Revert to Draft

Steps 1. On a Finalised/Error/Success run, use Edit / Revert to Draft, confirm.

✅ Pass if revert is state-aware (a Success run warns the original submission is preserved) and unlocks editing. Edit is intentionally hidden while a submission is in-flight (Submitted/Pending).

❌ Fail if you can revert an in-flight run and cause a double lodgement — 🔴 Blocker.

F8 — STP artifacts & history

Steps 1. Use Download XML; open the STP submission history; View payload on a row.

✅ Pass if the request/response XML is downloadable, the history shows each submission (action/status/declarer/errors), and "View payload" opens the artifacts.

❌ Fail if an artifact download or history is broken — 🟠 Major.


G. Journal posting & Xero

G1 — Post pay run to the ledger 🔴

Steps 1. On a non-Draft run (Accounting plan), use Post Pay Run.

✅ Pass if it posts the payroll journal to the general ledger ("Journal entries posted.") — only when not already posted.

❌ Fail if posting produces an unbalanced/wrong journal, or double-posts — 🔴 Blocker (ledger).

G2 — Unpost pay run 🔴

Steps 1. On a posted run, use Unpost Pay Run, confirm.

✅ Pass if a confirm appears and it reverses the journal ("Journal entries reversed.").

❌ Fail if unpost leaves a residual/duplicate ledger entry — 🔴 Blocker.

G3 — Export to Xero 🔧 Needs developer setup

Steps 1. On a non-Draft run with no existing Xero journal, use Export to Xero (choose Draft/Posted).

✅ Pass if it exports and reports "Journal exported to Xero as X. N lines created."

❌ Fail if the export duplicates or posts wrong figures — 🔴 Blocker.


H. Bank (ABA) file

H1 — ABA pre-flight & download 🔴

Steps 1. On a non-Draft run, use Download ABA File.

✅ Pass if a pre-flight modal validates employer + per-employee bank details (OK / Excluded / Needs-attention); Download is disabled until issues are fixed; the payment date defaults to the pay date; the ABA file downloads once valid.

❌ Fail if an ABA file downloads with unresolved bank errors — 🔴 Blocker (bank payments).


I. Payslip email

I1 — Email payslips (all / selected)

Steps 1. Use Email payslips with no rows ticked (emails all), then with specific rows ticked.

✅ Pass if it queues emails ("N payslips queued for sending", "M skipped (no email)"); an optional subject/message can be set; a no-email warning links to add emails.

❌ Fail if it emails the wrong employees or fails silently — 🟠 Major.

I2 — Resend failed

Steps 1. After some emails bounce/fail, use Resend failed (N).

✅ Pass if it re-emails only the Bounced/Failed/NotSent employees (available once at least one was sent).

❌ Fail if resend hits already-delivered employees — 🟠 Major.

I3 — Email status column & summary

Steps 1. Watch the payslip email-status column and the summary line.

✅ Pass if statuses show Sent/Bounced/Not-sent (optimistic "Sending…" resolves within ~60s); the summary counts are clickable filters.

❌ Fail if statuses never resolve or are wrong — 🟠 Major.