Compliance
Thailand government compliance documents: PND1 withholding tax and SSO 1-10 social security filings
Hopshift automatically generates all required Thailand government compliance documents every time you finalize a payroll run. You do not need to use external software, manually build files, or copy data from spreadsheets.
Compliance document generation is a core part of payroll finalization. If any document fails to generate, the finalization is rolled back entirely and the run remains in DRAFT. All documents must succeed before a run is marked FINALIZED.
Documents Generated on Finalization
Every finalized Thailand payroll run produces six documents:
| Document | Format | Submitted to | Deadline |
|---|---|---|---|
| PND1 | Pipe-delimited .txt | Revenue Department (RD) e-filing portal | 15th of following month (e-filing) |
| PND1 PDF | Keep for employer records | n/a | |
| SSO 1-10 | CSV (UTF-8 BOM) | Social Security Office (SSO) portal | 15th of following month |
| SSO 1-10 PDF | Keep for employer records | n/a | |
| Payroll CSV | CSV | Internal use | n/a |
| Payslips ZIP | ZIP | Distribute to employees | n/a |
All documents are stored indefinitely against the run and can be re-downloaded at any time from the run detail page.
Employee Compliance Requirements
Why These Fields Are Mandatory
Thai law requires that PND1 and SSO 1-10 filings include the employee's national ID number, gender, and date of birth on every detail row. Without these fields, Hopshift cannot generate valid government files.
| Required Field | Used in | Where to set it |
|---|---|---|
| National ID number (13 digits) | PND1, SSO 1-10 | Employee profile → Personal information |
| Gender | PND1 (title field: นาย / นาง / นางสาว) | Employee profile → Personal information |
| Date of birth | PND1 | Employee profile → Personal information |
How the Compliance Gate Works
The compliance check runs at two points:
-
Payroll wizard preview: Before a run is created, Hopshift checks every selected employee. Any employee missing one or more required fields shows a red Missing compliance data badge. The Create Run button is disabled until all employees pass.
-
Finalization: A second check runs when you click Finalize Payroll. If any employee in the run is still missing data (for example, if data was deleted after the run was created), finalization is blocked with a specific error identifying the affected employees.
How to Fix Missing Compliance Data
- In the payroll wizard (or from the employee list), click the flagged employee's name to open their profile.
- Navigate to Personal information.
- Enter the missing fields: National ID, Gender, Date of birth.
- Save the profile.
- Return to the payroll wizard: the compliance check re-runs automatically and the badge should clear.
Updating an employee profile after a run has been finalized does not automatically update the compliance documents. You must use the Regenerate Documents function on the run detail page to rebuild the files with the corrected data.
PND1: Monthly Withholding Tax Return
What is PND1?
PND1 (ภ.ง.ด.1: Por Ngor Dor 1) is the monthly withholding tax return that employers must file with the Revenue Department (กรมสรรพากร) for all employment income payments. It covers income under Section 40(1) (regular salary and wages) and Section 40(2) (bonus and other employment benefits).
Every month you pay employees, you must:
- Withhold income tax from each employee's pay
- File the PND1 return declaring the amounts withheld
- Remit the withheld tax to the Revenue Department
Hopshift calculates the withholding amounts and generates the filing: you only need to download it and upload it to the RD portal.
Filing Deadlines
| Method | Deadline |
|---|---|
| Paper filing (in person) | 7th of the following month |
| E-filing via RD portal | 15th of the following month |
E-filing gives you an extra 8 days compared to paper filing. Hopshift generates the PND1 in the exact format required for e-filing, so there is no reason to file on paper.
The PND1 e-Filing Format
The PND1 file Hopshift generates is a pipe-delimited (|) UTF-8 text file with no BOM. It follows the Revenue Department's specified format exactly.
File structure:
HEADER_LINE
DETAIL_LINE_1
DETAIL_LINE_2
...
DETAIL_LINE_NHeader row fields (pipe-separated, in this order):
| Position | Field | Example | Description |
|---|---|---|---|
| 1 | Employer tax ID | 1234567890123 | 13-digit employer tax ID |
| 2 | Branch code | 000000 | 6-digit branch code; 000000 = head office |
| 3 | Filing sequence | 0 | 0 = normal; 1 = amended |
| 4 | Tax month | 02 | Zero-padded month number |
| 5 | Tax year (BE) | 2569 | Buddhist Era year (Gregorian + 543) |
| 6 | Tax section | 50(1) | Income section code |
| 7 | Total records | 12 | Count of employee detail rows |
| 8 | Total income | 480000.00 | Sum of all income amounts |
| 9 | Total WHT | 18500.00 | Sum of all withholding tax amounts |
Detail row fields (one row per employee):
| Position | Field | Example | Description |
|---|---|---|---|
| 1 | Sequence | 1 | Row number starting from 1 |
| 2 | Employee tax ID | 1100600123456 | Employee's 13-digit national ID |
| 3 | Title (Thai) | นาย | นาย (Mr) / นาง (Mrs) / นางสาว (Miss) |
| 4 | First name | สมชาย | Thai first name |
| 5 | Last name | ใจดี | Thai last name |
| 6 | Address | 123 ถนนสุขุมวิท | Employee address |
| 7 | Payment date (Thai) | 28022569 | Date income was paid in DDMMYYYY BE format |
| 8 | Income type | 40(1) | 40(1) salary or 40(2) bonus |
| 9 | Income amount | 40000.00 | Gross income for the period |
| 10 | WHT amount | 1541.67 | Withholding tax deducted |
| 11 | WHT condition | 1 | Condition code (default: 1) |
Example file excerpt:
1234567890123|000000|0|02|2569|50(1)|3|120000.00|4625.01
1|1100600123456|นาย|สมชาย|ใจดี|123 ถนนสุขุมวิท แขวงคลองเตย|28022569|40(1)|40000.00|1541.67|1
2|1100600654321|นาง|สมหญิง|รักงาน|456 ถนนพระราม 9|28022569|40(1)|45000.00|1833.33|1
3|1100600789012|นางสาว|มาลี|สวยงาม|789 ถนนรัชดา|28022569|40(1)|35000.00|1250.01|1Filename pattern:
PND1_{TaxID13}_{Branch6}_{YearBE4}_{Month2}_{FormType2}_{Seq2}.txt
Example: PND1_1234567890123_000000_2569_02_01_01.txtHow to Download and Submit PND1
- Open the finalized payroll run from Payroll → run detail page.
- In the Documents section, click PND1 (e-filing).
- Save the
.txtfile to your computer. - Log in to the Revenue Department e-filing portal at efiling.rd.go.th.
- Navigate to ภ.ง.ด.1 and use the upload/import function.
- Upload the
.txtfile. The portal will validate and confirm acceptance. - Remit the total WHT amount by the deadline.
You can also download PND1 PDF for a printable, human-readable version of the same data: useful for internal records or accountant review.
SSO 1-10: Monthly Social Security Contributions
What is SSO 1-10?
SSO 1-10 (แบบ สปส. 1-10) is the monthly contribution schedule filed with the Social Security Office (สำนักงานประกันสังคม). It declares each insured employee's wages and the corresponding contribution amounts for both the employee and employer.
Both the employee and employer contribute 5% of the employee's gross wage each month, subject to a ceiling and floor. Hopshift deducts the employee's share from their pay and calculates the employer's matching contribution separately.
Filing Deadline
SSO 1-10 is due by the 15th of the following month. Late filing may result in a surcharge on top of the contribution amount.
Contribution Rates and Limits
| Rate | Wage Ceiling (2026+) | Wage Ceiling (before 2026) | Wage Floor | |
|---|---|---|---|---|
| Employee contribution | 5% | THB 17,500/month | THB 15,000/month | THB 1,650/month |
| Employer contribution | 5% | THB 17,500/month | THB 15,000/month | THB 1,650/month |
Calculation logic:
contribution_base = max(actual_wage, 1,650) // apply floor
contribution_base = min(contribution_base, 17,500) // apply ceiling (2026+)
employee_contribution = contribution_base × 5%
employer_contribution = contribution_base × 5%Examples for 2026:
| Monthly Gross Wage | Contribution Base | Employee (5%) | Employer (5%) | Combined |
|---|---|---|---|---|
| THB 9,000 | THB 9,000 | THB 450.00 | THB 450.00 | THB 900.00 |
| THB 17,500 | THB 17,500 | THB 875.00 | THB 875.00 | THB 1,750.00 |
| THB 25,000 | THB 17,500 (capped) | THB 875.00 | THB 875.00 | THB 1,750.00 |
| THB 1,200 | THB 1,650 (floored) | THB 82.50 | THB 82.50 | THB 165.00 |
The ceiling increased from THB 15,000 to THB 17,500 effective 2026. Hopshift automatically applies the correct ceiling based on the payroll run year: you do not need to update any settings.
The SSO 1-10 CSV Format
The SSO 1-10 file Hopshift generates is a CSV with a UTF-8 BOM prefix (\uFEFF). The BOM is required so that the file opens correctly in Thai-language Excel installations without garbling Thai characters.
Summary (header) block fields:
| Field | Example | Description |
|---|---|---|
| Employer SSO account number | 1234567890 | 10-digit SSO account |
| Branch code | 00 | Branch identifier |
| Company name | บริษัท ตัวอย่าง จำกัด | Registered company name |
| Contribution period | 02/2569 | Month/BE year |
| Insured person count | 12 | Number of employee rows |
| Total wages | 480000.00 | Sum of all actual wages |
| Total employee contributions | 10500.00 | Sum of employee 5% shares |
| Total employer contributions | 10500.00 | Sum of employer 5% shares |
| Grand total | 21000.00 | Employee + employer + surcharge |
| Surcharge | 0.00 | Late-payment surcharge (0 if filed on time) |
Employee detail row fields:
| Field | Example | Description |
|---|---|---|
| Sequence | 1 | Row number starting from 1 |
| Citizen ID | 1100600123456 | 13-digit national ID |
| Title (Thai) | นาย | นาย / นาง / นางสาว |
| Full name | สมชาย ใจดี | Employee full name |
| Actual wage | 40000.00 | Gross wage for the period |
| Contribution base | 17500.00 | Wage after applying floor/ceiling |
| Employee contribution | 875.00 | Employee's 5% share |
| Employer contribution | 875.00 | Employer's 5% share |
| Remarks | `` | Optional: e.g., ลาออก for resigned employees |
How to Download and Submit SSO 1-10
- Open the finalized payroll run from Payroll → run detail page.
- In the Documents section, click SSO 1-10 CSV.
- Save the
.csvfile to your computer. - Log in to the Social Security Office portal at www.sso.go.th or ssoinscl.sso.go.th.
- Navigate to the monthly contribution upload section.
- Upload the
.csvfile. The portal will validate and confirm the import. - Pay the total contribution amount (employee + employer) by the 15th.
You can also download SSO 1-10 PDF for a human-readable version suitable for accountant review or physical records.
Buddhist Era Year Conversion
All Thai government documents use Buddhist Era (BE) years. The BE year is calculated by adding 543 to the Gregorian year. Hopshift handles this conversion automatically: you will see BE years in document headers and filenames.
| Gregorian Year | Buddhist Era Year |
|---|---|
| 2024 | 2567 |
| 2025 | 2568 |
| 2026 | 2569 |
| 2027 | 2570 |
| 2028 | 2571 |
Dates in the PND1 file are formatted as DDMMYYYY using the BE year. For example, 28 February 2026 (Gregorian) becomes 28022569 in the PND1 file.
Regenerating Documents
If you need to regenerate compliance documents after a run has been finalized (for example, because you corrected an employee's name, address, or national ID), use the Regenerate Documents function.
When to Regenerate
- An employee's name was misspelled on their profile when the run was finalized
- An employee's national ID was entered incorrectly
- An employee's address was incomplete or wrong
- A technical error occurred during the original generation
How to Regenerate
- Navigate to Payroll and open the finalized run.
- On the run detail page, click Regenerate Documents.
- Confirm the action in the dialog that appears.
- Hopshift re-runs all six document generators using the current state of all employee profiles.
- The new documents overwrite the previously stored versions.
- A confirmation message appears when generation is complete.
Regenerating documents permanently overwrites the previously stored files. If you need the original versions, download them before regenerating. Previous document versions are not recoverable.
Regeneration does not change any payroll figures (salary amounts, WHT amounts, SSO contributions). It only rebuilds the document files. If you need to correct a payroll amount, you cannot regenerate: the run is locked after finalization and a corrective run is required.
Regeneration Checklist
Before regenerating, verify:
- You have downloaded and archived any documents you may need to reference later
- The employee profile data is now correct (name, national ID, gender, date of birth, address)
- You understand that all six documents will be rebuilt simultaneously
Upcoming Compliance Documents
The following documents are planned for future releases:
| Document | Description | Status |
|---|---|---|
| PND1a | Annual withholding tax summary (year-end) | Coming soon |
| 50 Tawi (ใบ 50 ทวิ) | Annual tax withholding certificate issued to each employee | Coming soon |
Audit Trail
All compliance-related actions are recorded in the audit log:
| Action | Logged Information |
|---|---|
| Payroll finalized | Admin name, timestamp, run ID |
| Document downloaded | Admin name, document type, timestamp |
| Documents regenerated | Admin name, timestamp, reason (if provided) |
The audit log is accessible from the run detail page under Activity. This log is useful for demonstrating to auditors that filings were generated and downloaded in a timely manner.
Common Issues
"Missing compliance data" blocking finalization
Cause: One or more employees in the run are missing National ID, gender, or date of birth on their profile.
Fix: Click the employee's name in the error message to go directly to their profile. Fill in all three fields and save. Return to the payroll run and attempt finalization again.
PND1 file rejected by the RD portal
Possible causes:
- The employer tax ID or branch code in your company settings is incorrect
- The file was modified after download (do not open or edit the
.txtfile) - The portal is experiencing issues
Fix: Check your company's tax ID and branch code in Settings → Company. Download a fresh copy of the PND1 file (do not use a previously opened version) and re-upload.
SSO CSV shows garbled characters in Excel
Cause: The file was opened without recognizing the UTF-8 BOM, or Excel did not detect the encoding correctly on your machine.
Fix: The file has a UTF-8 BOM prefix which should cause Excel to open it correctly. If characters still appear garbled, use the Excel "Get Data from Text/CSV" import wizard and explicitly select UTF-8 encoding. For portal upload, the encoding is handled automatically and this is not an issue.
Documents generated with old employee data
Cause: Employee profile data was updated after the run was finalized.
Fix: Use Regenerate Documents on the run detail page to rebuild all documents with the current profile data.