Skip to content

HK IRD employer's return (BIR56A / IR56B / IR56M) — nil-return obligation + WPP auto-fill

Goal (owner, 2026-06-15)

The layered account view + WPP-affiliated tabs were originally planned to auto-fill IR56A/56B/56M from accounting data. ERL has NO full-time employees (incl. the owner). Owner received an IRD notice to return a "56B" form claiming "null". Two parts: 1. RESEARCH (running, background agent a4d43…): which IR56 form must be returned EVEN IF not applicable (nil), which form ERL must file + send, deadlines/thresholds, and how a no-employee/no-director-pay company responds. Official ird.gov.hk citations required. 2. Build IR56 auto-fill into the WPP (a new tab/output) once the correct form is identified — pre-fill from accounting/director/payee data; support a NIL BIR56A.

Notes

  • Likely shape (to confirm via research): BIR56A = annual Employer's Return (must file even if nil); IR56B = per-employee attachment (none if no employees); IR56M = payments to NON-employees (consultants/freelancers above a threshold) — ERL may owe IR56M if it paid freelancers.
  • Implementation deferred until the research lands + owner confirms which form(s) apply. Relates to the WPP launcher/tabs and [[project_erl_incorporation]].

Research findings (2026-06-15, verified against ird.gov.hk)

The form that must be returned even if N/A = BIR56A (the Employer's Return cover form). - BIR56A — once IRD issues it, the employer must complete + sign + return it within 1 month from the date of issue, EVEN with no employees. No-employee case: tick the "NO" box ("did not employ anyone chargeable to Salaries Tax") and sign. (ird.gov.hk/eng/tax/ere.htm; bir56a_notes_e.pdf) - IR56B — per-employee attachment, only when someone was paid. File for a single full-time employee whose annual income reached the Basic Allowance ($132,000 for 2025/26); for directors, married persons, part-timers → report irrespective of amount — but only if they actually received remuneration. An unpaid director has zero income → nothing to report on IR56B. There is NO standalone "nil IR56B." (cer.htm; ir56b_notes_e.pdf) - IR56M (IR6036B cover) — payments to non-incorporated HK service providers who are NOT employees: consultant/agent/broker/freelancer >$25,000/yr, or sub-contractor >$200,000/yr. Only owed if ERL paid such a person; payments to companies are out of scope. (ir56m.pdf; ir6036c_e.pdf; esem_er_56me.pdf)

ERL's actual position (no employees incl. owner; unpaid sole director): return BIR56A as a NIL return (tick NO, sign, ≤1 month). No IR56B. IR56M only if ERL paid an unincorporated local consultant/freelancer/sub-contractor above the threshold — check the GL for such payees. NOTE the IRD notice said "56B null" — the obligation is really the BIR56A nil return; confirm the notice's form type before filing.

WPP auto-fill build (RE-SCOPED 2026-06-15)

  • BIR56A: DROPPED — owner filed the nil return manually. No build needed.
  • IR56B: out of scope — no employees/director pay.
  • IR56M candidate scan: DONE (shipped, not yet promoted).

IR56M build — what shipped (T-045a)

  • lib/accounting/ir56m.ts (pure, 11 unit tests): yearOfAssessmentForIso (period end → HK YA 1 Apr–31 Mar window + "2025/26" label), buildIR56MSchedule (aggregate directory-linked DEBITs by payee for the YA, flag both thresholds; strictly "in excess of"; EXPENSE postings only).
  • lib/accounting/ir56m.server.ts: generateIR56MCandidatesServer({periodEndIso, subsidiaryId}) — walks subsidiary bank txns, counterparty extraction mirrors relatedParty.server (counterpartyDirectoryId → gl[code].payeeId), HKT dates, attributes each payment to its EXPENSE gl code (skips 1120 etc.).
  • lib/accounting/wppCsv.ts ir56mToCsv + WPP route: new csv/ir56m-candidates.csv
  • json/… in the pack, manifest + cover-sheet entries. Scoped to the YA the period-end falls into (NOT the accounting period).
  • Key correctness call: counts EXPENSE accounts only. GL 1120 "Due from Director" is an ASSET (director's-loan movements) — excluding it stops the owner-director being wrongly flagged on gross loan+fee. 5050 = "Subcontractor Fees" (expense, $200k floor in practice).
  • Verified vs real data (YA 2025/26): JC (Jeffero Chan) $85,300 across 13×5050 (the ~$80k of 1120 loan movements correctly dropped from $165,541.93) → >$25k candidate, <$200k; JN (Jake Ngai) $1,500 → below all floors.
  • Owner judgment still needed per row (system can't know): incorporated vs individual; consultant ($25k) vs sub-contractor ($200k); and crucially whether a payee IS the owner/director (JC) — payments to yourself aren't IR56M.

Follow-ups (not built)

  • Optional: a Records/WPP-launcher UI surface for the IR56M list (currently only in the WPP zip). Optional: flag the owner/director payee to auto-exclude.

Log

  • 2026-06-15 created (owner). Research agent launched (HK IRD BIR56A/IR56B/IR56M nil-return rules).
  • 2026-06-15 research DONE + verified vs ird.gov.hk. Answer: BIR56A nil return is the obligation; no IR56B; IR56M only if unincorporated payee >threshold. WPP auto-fill scoped, pending go-ahead.
  • 2026-06-15 owner filed BIR56A nil manually → dropped. Built IR56M candidate scan (T-045a): ir56m.ts + ir56m.server.ts + ir56mToCsv + WPP wiring; 11 unit tests; expense-only scope (excludes 1120 Due-from-Director). Verified vs real data. tsc/lint clean, 133 suite tests pass. NOT yet promoted.