payroll-accounting2026-07-27

Form EA & Form E Generation: Employer Year-End Statutory Payroll Reporting

A practical Malaysian employer guide to Form EA, e-CP8D and e-E: close payroll, separate employees from contractors, reconcile annual totals, generate reports and file in the correct order.

GetPay Engineering Team
Updated: 2026-10-11

TL;DR (Key Takeaways)

  • Close and reconcile the January-to-December payroll before generating anything; Form EA, C.P.8D and Form E must all trace back to the same employee-level annual totals.
  • Give each employee Form EA by the last day of February, then submit and sign e-CP8D before attempting e-E; Form E is due by 31 March of the following year under HASiL's published employer guidance.
  • Do not put a genuine independent contractor on Form EA merely because the payment was booked to salary expense; classify the relationship from contracts, control, statutory treatment and payroll evidence.
  • GetPay currently generates a yearly Borang E PDF and per-employee Form EA PDFs from payroll runs. The repo's separate accounting workflow also prepares a Form E employee-listing workbook and populates an official CP8D template, but the web app does not expose a generic CP8D TXT download.

What is the correct Form EA, e-CP8D and e-E sequence?

For employers evaluating Form EA and Form E generation in accounting software in Malaysia, the key control is one reconciled dataset, not the PDF button.

The year-end sequence is:

  1. Freeze the payroll records for January through December.
  2. Reconcile every employee's gross remuneration, employee deductions, employer contributions and net pay to payslips, statutory records and bank payments.
  3. Resolve employee, director, partner and contractor classifications before generating statutory documents.
  4. Generate one Form EA for each person who received remuneration from employment and give it to that employee by the last day of February of the following year.
  5. Prepare the employee-level C.P.8D dataset from the same locked annual totals.
  6. Upload, review and formally sign e-CP8D first. A draft upload is not the same as a completed submission.
  7. Complete the e-E employer summary and declaration only after e-CP8D has been submitted.
  8. Submit e-E by 31 March of the following year and retain both acknowledgements with the year-end payroll pack.

This order prevents a common failure: trying to complete e-E while C.P.8D is absent or still a draft. Form EA goes to the employee; Form E and C.P.8D go to HASiL. One does not replace another.

What payroll data must be locked before generation?

Build a calendar-year control table with one row per employee. The minimum useful columns are:

Control fieldPrimary evidenceYear-end test
Employee name and identificationEmployee master and verified identity recordNo duplicate person under spelling variants
Employment start and end datesContract, resignation or termination recordService period agrees with months paid
Gross remunerationPosted payslips and approved payroll runsMonthly sum equals annual total
EPF employee and employer portionsPayroll detail and KWSP submission evidenceContributions agree by employee and month
SOCSO and EIS employee and employer portionsPayroll detail and PERKESO evidenceContributions agree by employee and month
PCB and CP38Payroll deductions and HASiL payment evidenceAmount withheld agrees with amount remitted
Benefits and accommodationBenefit register and payroll adjustmentsTaxable items are not hidden in reimbursements
Tax-exempt allowances or perquisitesPolicy, receipts and payroll codingExempt and taxable portions are separated
Net payPayslip net and bank paymentDifferences are explained, not forced
Employment statusContract and actual working relationshipEmployees are separated from contractors

Use posted payroll evidence, not a year-end spreadsheet assembled from memory. GetPay's annual aggregation reads payslips linked to payroll runs for the selected calendar year and excludes runs marked VOID. That is a sound starting point, but it does not replace a reconciliation to bank and statutory evidence.

Review zeroes as carefully as non-zero amounts. Missing PCB, EPF or SOCSO may be correct, or may expose incomplete data or a misclassified relationship.

What must Form EA contain?

Form EA, also called C.P.8A, is the employee's annual statement of remuneration from employment. HASiL's published form is organised into employer details, employee details, employment income and benefits, deductions or relief information, employee statutory contributions, and tax already deducted.

A practical Form EA review should cover:

  • employer name, employer reference or TIN, registration details and address;
  • employee name, identification or passport number, job title, payroll number, EPF number and SOCSO number where applicable;
  • employment start and end dates when the person did not work for the full year;
  • salary, wages, overtime, leave pay, fees, director fees, commissions and bonuses in the correct income lines;
  • perquisites, allowances, benefits-in-kind, living accommodation, ESOS benefits, gratuity, arrears and compensation where applicable;
  • tax-exempt allowances or benefits shown separately from taxable remuneration;
  • the employee's qualifying EPF and SOCSO contributions;
  • PCB, CP38 and zakat deductions where applicable; and
  • the employer officer's name, designation, contact details and preparation date.

Do not collapse every payment into “gross salary.” For example, director fees, bonuses, benefits-in-kind and accommodation have their own presentation. Likewise, employer contributions are not the same as employee contributions: Form EA asks for relevant employee-paid statutory amounts, while payroll accounting also records the employer's cost.

GetPay's Form EA PDF is generated per employee from that employee's annual payslip totals. The current implementation carries the employee's name, identification number, EPF number, SOCSO number, tax category, designation, gross pay, EPF, SOCSO, EIS, PCB and number of payroll runs into the annual summary. The PDF routes salary, director fees or allowances to different lines using recorded payroll information.

Some official-form fields are not fully derived by the current generator. Items such as employee TIN, CP38, zakat, taxable benefits and tax-exempt allowances may require review or completion. Treat the generated PDF as a controlled draft supported by the payroll ledger, not as permission to skip the employer's final accuracy check.

How do Form E and C.P.8D differ?

Form E, or CP 8B, is the employer-level annual return and declaration. C.P.8D is the employee-level schedule supporting that return. The employer summary answers questions such as employee headcount and movements, while C.P.8D carries each employee's identity, status, remuneration and deduction details.

The records should conserve:

Total employee gross in C.P.8D
= total employment remuneration used for Form E
= sum of the final Form EA employment amounts, subject to genuine presentation differences

The word “employee” matters in every line of that equation. Do not increase Form E new-hire or leaver counts with genuine contractors. Do not omit a former employee merely because the person is inactive when the report is generated: if that person received employment remuneration during the calendar year, their annual data still belongs in the year-end review.

GetPay's Annual Filings panel uses a year-scoped list based on actual payroll history, not only the currently active employee roster. The Borang E PDF aggregates the selected year's non-void payroll data and shows a per-employee CP8D-style table with gross remuneration, employee EPF, SOCSO, EIS and PCB totals. The same screen offers a separate Form EA PDF for each person paid in that year.

The PDF is a record-keeping and review artifact. Filing still takes place through MyTax using the method and format prescribed by HASiL for that year.

Are part-timers and contractors included in Form EA?

“Part-time” describes hours; “contractor” describes the legal and commercial relationship. A part-time worker can still be an employee. Conversely, a genuine freelancer paid per class, project or deliverable may be a contractor even if the bookkeeper used a salary-like description.

Use evidence rather than the expense label:

EvidenceMore consistent with employmentMore consistent with independent contracting
Work controlEmployer sets hours, method and supervisionService provider controls method and delivery
Pay basisRecurring payroll with payslipInvoice, claim or agreed service fee
Statutory treatmentEmployee payroll and applicable deductionsNo employee payroll deductions, subject to actual legal position
Benefits and leaveEmployment benefits or paid leaveCommercial terms, no employee benefits
DocumentationEmployment contractService agreement or purchase order
Accounting workflowPayroll register and employee liabilityVendor, bill or contractor-payment workflow

Review the whole relationship and seek professional advice if the evidence conflicts.

The repo's CSguru precedent is useful: certain part-time teaching payouts were verified as contractor re-engagements and deliberately excluded from Form EA, even though earlier bookkeeping could place similar names in salary-oriented reports. That decision was based on the underlying engagement and payment evidence, not on the word “allowance.”

GetPay's employee register currently supports EMPLOYEE, PARTNER and DIRECTOR_OWNER. It does not expose a CONTRACTOR employee type. A genuine contractor should therefore not be added as an employee merely to make the Form EA generator include them. Keep contractor accounting and any applicable contractor reporting in the appropriate non-payroll workflow.

How does GetPay generate the year-end documents?

In the GetPay payroll screen, the Annual Filings panel lets an authorised administrator select a calendar year, preview the Borang E PDF and preview a separate Form EA PDF for each person with payroll data in that year. Downloads contain sensitive identification and remuneration data, so both routes are admin-gated.

The repo also has a re-runnable accounting workflow:

./venv/bin/python accounting/cli.py form-ea generate --year YYYY --all
./venv/bin/python accounting/cli.py form-ea generate --year YYYY --employee "Employee Name"
./venv/bin/python accounting/cli.py form-e generate --year YYYY

The form-ea command creates per-employee PDFs from the calendar-year annual totals. The form-e command creates a Form E PDF and an employee-listing XLSX for review or manual entry. A separate accounting/populate_cp8d.py script reads that listing and populates the official CP8D workbook used by the repo's filing workflow.

That distinction is important: the current web app does not expose a general CP8D TXT export button. Do not promise one-click e-CP8D filing. Prepare the upload using HASiL's current prescribed template and format, validate the employee rows, then submit it in MyTax.

How should payroll accounting reconcile to the statutory reports?

The year-end tax summary should trace back to the payroll ledger without turning accounting categories into tax conclusions. GetPay's posted payroll accrual currently uses these verified journal lines:

LineGetPay accountAmount basis
Debit5100 Salary, Allowance & WageGross for EMPLOYEE rows
Debit5200 EPF & SOCSO employer sideEmployer EPF, SOCSO and EIS
Debit5210 HRDF LevyHRDF for employee rows
Debit2200 Partner/director drawingsGross for PARTNER and DIRECTOR_OWNER rows
Credit2500 Accrued ExpensesTotal of the debit lines

For example, if employee gross is RM100,000, employer statutory cost is RM13,000 and HRDF is RM1,000, the earned entry is Dr 5100 RM100,000, Dr 5200 RM13,000, Dr 5210 RM1,000 and Cr 2500 RM114,000. When the related bank outflows are recognised, the settlement side is Dr 2500 and Cr the mapped bank account.

This journal proves the payroll cost and liability cycle, but it does not by itself prove Form EA classification. Account 2200 deliberately separates partner or director drawings from employee salary in GetPay. A director fee, employee salary and contractor service fee can have different reporting consequences even when cash left the same bank account.

Perform three tie-outs:

  1. Payroll to Form EA: each employee's annual payslips equal their Form EA source totals.
  2. Payroll to C.P.8D/Form E: the employee schedule and employer totals equal the locked payroll population.
  3. Payroll to GL and bank: gross, employer costs, liabilities and settlements explain the posted journals and actual cash.

Investigate differences; never plug Form E to the general ledger with an unexplained adjustment.

What should be checked immediately before submission?

  • Confirm the selected year is the calendar year ending 31 December, not the company's financial year.
  • Confirm all intended payroll runs are present and void runs are excluded.
  • Check former employees as well as the active roster.
  • Resolve duplicate identities, name variants and missing identification or TIN fields.
  • Review salary, fees, bonuses, allowances, benefits, accommodation and exempt items separately.
  • Reconcile employee EPF, SOCSO, EIS, PCB and CP38 to statutory evidence.
  • Confirm contractors have not been included merely because of a salary expense code.
  • Give each employee their reviewed Form EA by the published deadline.
  • Validate every C.P.8D row and total, then submit and sign e-CP8D first.
  • Complete e-E only after e-CP8D is accepted.
  • Download the e-CP8D and e-E acknowledgements and retain them with the final annual control table.

A useful close pack contains the frozen employee-level reconciliation, final Form EA copies, the submitted C.P.8D data, the filed Form E, both acknowledgements, and notes explaining every classification or reconciliation exception. That is what turns “form generation” into an auditable year-end payroll process.

Frequently Asked Questions

Which must be submitted first, e-CP8D or e-E?

Submit and formally sign e-CP8D first. The employer workflow recorded in GetPay's accounting knowledge base shows that an e-E submission can be blocked until C.P.8D has moved beyond draft and been signed. After e-CP8D is accepted, complete and sign e-E.

When must a Malaysian employer provide Form EA and file Form E?

HASiL's published employer guidance says Form EA or EC must be prepared and given to the employee by the last day of February of the following year. Form E together with C.P.8D is due by 31 March of the following year. Confirm the current year's portal notices before filing.

Should an independent contractor receive Form EA?

Not merely because the payment was called an allowance or posted to a salary account. Form EA reports remuneration from employment. A genuine contractor payment should follow the contractor's actual tax and documentation treatment; review the contract and working relationship when classification is unclear.

Can GetPay generate a CP8D TXT file from the payroll page?

Not in the current code reviewed for this article. GetPay's Annual Filings panel generates the Borang E PDF and per-employee Form EA PDFs. A separate repo accounting script populates the official CP8D workbook, but there is no generic CP8D TXT download exposed by the web app.

Sources & Ground Truth

Direct LHDN MyInvois Submission Engine

Ready to automate your Malaysian e-invoicing & bookkeeping?

GetPay handles 100% compliant e-invoices, multi-bank reconciliation, and statutory payroll out of the box.

Get Started Free

Related Articles