Tax & Benefits
Tax & Benefits decides two things: how much income tax comes off each salary slip, and how perks that are not salary — a yearly benefit allowance, an end-of-service payout — are budgeted, built up and paid. HR and payroll staff run it. Employees touch a small part of it themselves, to declare the tax exemptions they expect to claim and to spend their benefit allowance.
Open it by typing "Tax & Benefits" into the sidebar or the search bar. The name contains an ampersand, so do not try to guess its web address. Each individual record does have a plain web address, quoted throughout this page.
What you probably came here to do
- Understand what GARP will and will not calculate for Indonesia — read this first if you are starting from scratch
- Check that everything needed for a tax run exists
- Set up the tax brackets and attach them to staff
- Let an employee declare a tax exemption and send in the proof
- Add income an employee earned outside our payroll
- Give staff a yearly allowance they can spend on benefits
- Build up an amount each month without paying it out yet — the closest thing to a THR pot
- Pay an employee part of their benefit allowance now
- Work out and pay an end-of-service amount
- See what tax each person is heading for this year
- Work out why a number came out the way it did
What you have to build yourself
Read this before you plan the work. GARP HR ships a generic income tax engine that works in bands, or slabs. It does not ship PPh 21, PTKP, BPJS Kesehatan or BPJS Ketenagakerjaan as ready-made objects.
- Only two countries have built-in tax rules: India and the United Arab Emirates.
- The country-specific extras — house rent allowance exemption, marginal tax relief — run only for India.
- The shared marginal tax relief calculation is an empty placeholder. It returns nothing at all, and its own note says it exists only so that a country pack can replace it.
- Nothing in the product computes an Indonesian statutory figure.
What you do get, on the day a company is created or the day its Country changes, is four Salary Components:
- Income Tax — a Deduction, with Is Income Tax Component ticked
- Basic
- Arrear
- Leave Encashment
India additionally loads House Rent Allowance, Provident Fund and Professional Tax. Indonesia has no such file, so those four are all you get. No Income Tax Slab, no exemption category, no Gratuity Rule and no flexible benefit component is created for you.
The shipped Income Tax component has Is Income Tax Component ticked but Variable Based On Taxable Salary unticked. In that state it computes nothing — it is a label, not an engine. Tick Variable Based On Taxable Salary, leave Amount and Formula empty, and untick Depends on Payment Days.
For PT Maju Jaya that means:
- PPh 21 is modelled as an Income Tax Slab carrying your rates, plus a deduction Salary Component with Variable Based On Taxable Salary ticked.
- PTKP is modelled either as the slab's Standard Tax Exemption Amount or as an Employee Tax Exemption Category the employee declares against.
- Biaya jabatan has no home of its own. Model it as a deduction Salary Component with Exempted from Income Tax ticked, so it comes off taxable income before the slabs run.
- BPJS contributions are ordinary Salary Components with a Formula — an earning for the employer share, a deduction for the employee share — written by whoever configures your payroll.
- THR is either an Additional Salary, covered in Payroll, or an accrual component as described under Accrue without paying.
None of this is wrong; it is just work. Budget time with a payroll consultant and validate the first cycle by hand.
Setup checklist
Everything below has to exist before tax and benefits behave properly.
- A Payroll Period covering the tax year, per company. Periods must not overlap for the same company.
- One submitted Income Tax Slab with Company filled in, referenced from every Salary Structure Assignment.
- A deduction Salary Component with Variable Based On Taxable Salary ticked, in the salary structure. Leave its Amount and Formula empty so the engine fills it, untick Depends on Payment Days so the annual figure is not prorated a second time, tick Round to the Nearest Integer, and tick Is Income Tax Component so it reaches the reports.
- Deductions that should reduce taxable income — biaya jabatan, employee BPJS shares — tagged Exempted from Income Tax, with Allow Tax Exemption ticked on the slab.
- Exemption categories and sub categories, if you use declarations.
- Flexible benefit components with a Payout Method and a matching Accrual Component, plus the Flexible Benefits table and Maximum Benefit Amount on each assignment, if you offer benefits.
- Opening Balances on the assignment for anyone joining mid-period from another employer.
- A Gratuity Rule, and Submit permission on Gratuity, only if you pay end-of-service amounts.
Module availability follows your plan — see Plans and limits.
Set up an income tax slab
- At
/app/income-tax-slab, create a record and type its name — there is no automatic numbering. Set Effective from to the first day of the payroll period, plus Company and Currency (IDR). - Add Taxable Salary Slabs rows in ascending order: From Amount, To Amount, Percent Deduction. Leave To Amount blank on the last row for an open-ended top band.
- Tick Allow Tax Exemption if employees will file declarations, or if any deduction component is tagged Exempted from Income Tax — one flag gates both. Set Standard Tax Exemption Amount for a flat allowance everyone gets with no paperwork.
- Use Condition on a row only when a band applies to some people. It is a small formula, and it can read every Employee field, the assignment's
baseandvariable, the slip's own fields, every Salary Component abbreviation (each starting at zero) andannual_taxable_earning— for examplegender == "Female"orbase > 20000000. A bad expression stops the payroll run, and you will see Name error or the message "Syntax error in condition: … in Income Tax Slab". - Save and Submit, then set the Income Tax Slab field on every Salary Structure Assignment. A slip with a tax component and no slab stops with Missing Tax Slab: "Income Tax Slab not set in Salary Structure Assignment".
Field by field, what each setting on the slab does is listed under Income Tax Slab field reference.
The slab must be effective on or before the payroll period start date, and it must not be Disabled. Both raise a hard error mid-run, not a warning. Note what is not checked: whether the slab has been cancelled. A cancelled slab still calculates tax normally. To retire a slab, tick Disabled — which stays editable after you submit — rather than cancelling it.
When the salary structure has no tax component, a new slip pulls one straight from the Salary Component master — matching the company named in the component's Accounts rows, falling back to components with no company — and shows the alert "Added tax components from the Salary Component master as the salary structure didn't have any tax component." Tick Variable Based On Taxable Salary on the shipped Income Tax component and leave its accounts empty, and it attaches itself to every new slip in every company.
Someone who joined part-way through the year
Where an employee joins mid-period from another employer, fill Taxable Earnings Till Date and Tax Deducted Till Date in the Opening Balances section of their Salary Structure Assignment.
They are read only when the assignment's From Date is on or after the payroll period start. Leave them blank and you get the orange Missing Opening Entries message, but no error.
Collect exemption declarations and proofs
- At
/app/employee-tax-exemption-category, create the categories with their ceilings, then the sub categories under them. A sub category inherits Max Exemption Amount from its category when left blank. Only rows with Is Active appear in pickers. - The employee — the Employee role can create and submit these — opens
/app/employee-tax-exemption-declaration, picks the Payroll Period and adds one row per sub category with a Declared Amount. The Employee list is filtered to Active; the Payroll Period list is filtered to the employee's company. - Submit. A Submit Proof button appears on the submitted declaration and carries the rows across.
- On the Employee Tax Exemption Proof Submission, fill Actual Amount, Type of Proof and Attach Proof per row, then submit. From a blank proof submission you can instead pull rows with Get Details From Declaration.
How the amounts get capped
Both documents cap the same way, in two passes:
- Each row is capped at its sub category's ceiling — labelled Maximum Exempted Amount on the declaration and Maximum Exemption Amount on the proof submission.
- Each category's running total is then capped at the category's own Max Exemption Amount.
The declared figure stays visible in the row. Total Exemption Amount is the capped one.
If it refuses to save
| Message | Cause |
|---|---|
| "Transactions cannot be created for an Inactive Employee …" | Employee Status is Inactive. Suspended and Left are not blocked |
| "More than one selection for … not allowed" | The same sub category appears in two rows |
| "Employee Tax Exemption Declaration already exists for employee … and period …" | Another record exists for that employee and period, including an abandoned draft |
Both forms fetch Currency from the employee's salary structure assignment as soon as you pick the employee. An employee with no Salary Structure Assignment at all therefore cannot file either document, and you will see "There is no Salary Structure assigned to …. First assign a Salary Structure." A draft assignment is enough to satisfy the lookup — it does not have to be submitted. The same fetch runs on Employee Benefit Claim.
Type of Proof is a required free-text field on every proof row. There is no list to configure, so agree a convention before rollout. The Attachments field on the parent is hidden on new forms in favour of the per-row Attach Proof.
Record income from elsewhere
At /app/employee-other-income, set Employee, Payroll Period, Company, an optional Source and the Amount, then submit.
Every submitted record for that employee, period and company is summed into annual taxable income on later slips. There is no cap and no category.
Permissions on this record go to HR Manager, HR User and Employee — but not System Manager, so a pure System Manager sees nothing at that web address.
Give employees a flexible benefit budget
- At
/app/salary-component, create the earning and tick Is Flexible Benefit. Set Max Benefit Amount (Yearly) and a Payout Method, then set Accrual Component to match the method. - On each Salary Structure Assignment, fill the Flexible Benefits table with those components and set Maximum Benefit Amount — the employee's yearly envelope.
- The employee opens
/app/employee-benefit-applicationand picks the Payroll Period and a Date. The components load from the Salary Structure Assignment in force on that Date, and reload whenever Employee or Date changes. One submitted application per employee per payroll period. Row amounts cannot exceed the per-row maximum, and the total cannot exceed the envelope. - In Payroll Settings (
/app/payroll-settings), Mandatory Benefit Application decides what happens when nobody applies: on, benefits are ignored without an application; off — the default — the slip falls back to the amounts on the Salary Structure Assignment.
Choosing a payout method
The three payout methods behave differently enough to be worth a table.
| Payout Method | Accrual Component | Accrues to the ledger | Reaches the payslip | Offered in the claim picker |
|---|---|---|---|---|
| Accrue and payout at end of payroll period | Must be ticked | Every cycle | As an earning in the final cycle, for the accrued balance less anything already paid on that component | No |
| Accrue per cycle, pay only on claim | Must be ticked | Every cycle | Only through an Employee Benefit Claim, plus the unclaimed balance in the final cycle if Payout Unclaimed Amount in Final Payroll Cycle is ticked | Yes |
| Allow claim for full benefit amount | Must be off | Never | Only through an Employee Benefit Claim | Yes |
| Blank | Must be off | Never | Never | No |
The component refuses to save if the pairing is wrong. You will see "Accrual Component must be set for Flexible Benefit Salary Components with accrual payout methods.", or the reverse, "Accrual Component can only be set for Flexible Benefit Salary Components with accrual payout methods."
Each submitted salary slip writes Accrual or Payout rows to the Employee Benefit Ledger, and lists accruals in the read-only Accrued Benefits table on the slip. Cancelling or deleting the slip deletes its ledger rows.
The per-row Max Benefit Amount on a benefit application comes from the Salary Structure Assignment row, not from the component's Max Benefit Amount (Yearly). The component ceiling is only enforced when the assignment is saved. Change the component's ceiling later and existing assignments keep the old figure.
Accrue without paying
A Salary Component with Accrual Component ticked and Is Flexible Benefit off, placed in the salary structure's Earnings table, is worked out every cycle but kept off the payslip.
- The amount lands in the read-only Accrued Benefits table.
- It writes an Accrual row to the ledger with the remark "Accrual Component assigned via salary structure".
- It is not in gross pay, so it is not taxed and not paid.
- To release it, raise an Additional Salary on the same component. The slip writes a Payout row remarked "Accrual Component payout via Additional Salary", and skips payment-days proration on that row because the money covers earlier cycles.
That is the closest thing the product has to a THR accrual, and you build it yourself: no thirteenth-month timing, pro-rata rule or payment deadline is encoded anywhere.
Pay out a benefit claim
- Open
/app/employee-benefit-claim, choose the employee, the Claim Benefit For component and a Payroll Date. Only components on that employee's benefit application or assignment whose Payout Method is one of the two claimable ones appear in the picker. - Yearly Amount comes from the employee's benefit application for the period — or, with no application, from their Salary Structure Assignment. Max Amount Eligible For Claim is computed from the Employee Benefit Ledger: for Accrue per cycle, accrued (including a preview of this cycle's accrual) less paid; for Allow claim for full benefit amount, the yearly amount less paid.
- Enter the Claimed Amount, attach evidence, submit. Submitting creates and submits an Additional Salary with Overwrite Salary Structure Amount off, which lands on the next slip and is taxable unless the component has Is Tax Applicable unticked.
Two rules will stop you:
- Payroll Date cannot be in the past. You will see "Payroll date cannot be in the past. This is to ensure that claims are made for the current or future payroll cycles."
- Only one claim per component per calendar month is allowed, with the error Duplicate Claim Detected.
Both rules exist because ledger rows are written when a slip is submitted, so a second claim in the same cycle could overpay.
Worked example: Sari Dewi's Tunjangan Kesehatan
Component Tunjangan Kesehatan: Earning, Is Flexible Benefit ticked, Payout Method Accrue per cycle, pay only on claim, Accrual Component ticked, Max Benefit Amount (Yearly) 12,000,000. Sari's assignment gives her a Maximum Benefit Amount of 15,000,000 with a Tunjangan Kesehatan row of 12,000,000; her benefit application elects 9,000,000.
monthly accrual 9,000,000 ÷ 12 cycles = 750,000
Jan, Feb, Mar Accrual 750,000 each → ledger accrued 2,250,000, paid 0
April claim Max Amount Eligible = 2,250,000 accrued + 750,000 previewed
= 3,000,000
If she claims the full 3,000,000, the April slip pays it as an earning and writes a Payout row of 3,000,000. But when the same slip computes April's accrual, paid (3,000,000) exceeds accrued (2,250,000) by 750,000, so it subtracts that from April's 750,000, reaches zero, and writes no Accrual row. The ledger is then permanently 750,000 short, and the same subtraction repeats every remaining cycle — accruals stop, and the December unclaimed payout is zero.
Claim only what the ledger has already recorded. Max Amount Eligible For Claim includes the current cycle's accrual, which has not been written yet; claiming all of it stalls the accrual for the rest of the payroll period. Check the Accrual rows on /app/employee-benefit-ledger and claim up to that total instead.
Record a gratuity payout
- At
/app/gratuity-rule, create a rule and type its name. Choose Calculate Gratuity Amount Based On (Current Slab or Sum of all previous slabs), pick the Applicable Earnings Component rows, set Total working Days Per Year (default 365) and Minimum Year for Gratuity, and add slabs with From(Year), To(Year) and Fraction of Applicable Earnings. From(Year) is read-only and fills itself from the previous row's To(Year); To(Year) of 0 means open-ended. - Set the employee's Relieving Date. Gratuity cannot be calculated without one, and you will see "Please set Relieving Date for employee: …".
- Open
/app/gratuityand pick the employee and rule. Work experience is calendar days between joining and relieving, less non-working days, divided by Total working Days Per Year, then adjusted by Work Experience Calculation Method — Round off Work Experience (the default), Take Exact Completed Years, or Manual to type the figure in yourself. The amount uses the applicable components from the employee's last submitted salary slip, taken at their un-prorated default amounts. - Either tick Pay via Salary Slip with a Salary Component and Payroll Date, which creates an Additional Salary, or leave it off, set Expense Account and Payable Account, submit to post the ledger entries, then use Create Payment Entry.
Two details of the day count matter.
- "Non-working days" are Attendance records, not leave applications. With Payroll Settings' Calculate Payroll Working Days Based On set to Leave, it counts Attendance rows with status On Leave whose leave type has Is Leave Without Pay ticked; set to Attendance, it counts rows with status Absent. So unpaid leave that never produced an Attendance record does not reduce the figure.
- Round off Work Experience rounds a .5 to the nearest even number: 4.5 becomes 4, 5.5 becomes 6.
Gratuity and Gratuity Rule grant permissions to HR Manager and HR User only, and those grants include create, read, write and delete but not submit, cancel or amend. Gratuity is a document you have to submit, so out of the box no role can submit one. Add Submit, Cancel and Amend for HR Manager in the Role Permissions Manager before you rely on gratuity.
Worked example: Budi Santoso
Budi joined 1 Sep 2018 and is relieved 31 Aug 2026 — 2,921 calendar days, less 5 days of unpaid leave marked in Attendance, so 2,916. Divided by 365 that is 7.99 years. Round off Work Experience gives 8; Take Exact Completed Years gives 7.989, which fails a Minimum Year for Gratuity of 8 with "Employee: … have to complete minimum 8 years for gratuity". His last slip carries Gaji Pokok 15,000,000 and Tunjangan Jabatan 3,000,000, so the applicable earnings total 18,000,000.
Under Current Slab the calculation is applicable earnings × total years × fraction — the fraction is multiplied by all years of service, not by the years inside the slab. To express a flat nine months' wage at eight years you need a fraction of 9 ÷ 8 = 1.125, which then gives 18,000,000 × 8 × 1.125 = 162,000,000. Change the years and that fraction is wrong.
Current Slab cannot express a flat entitlement such as "nine months' upah at eight years or more" with one row, because the fraction is multiplied by years of service. Either add one slab per year with the fraction set to months divided by years, or switch to Sum of all previous slabs, which accrues per year and suits a graduated UPMK-style table.
Under Sum of all previous slabs, a rule of 0 to 3 at 0.0, 3 to 6 at 0.5, 6 to 9 at 1.0 and 9 upward at 1.5 gives Rina Halim, at 7 years with 10,000,000 of applicable earnings: (3 − 0) × 10,000,000 × 0 = 0, plus (6 − 3) × 10,000,000 × 0.5 = 15,000,000, plus the 1 remaining year in the 6-to-9 band at 1 × 10,000,000 × 1.0 = 10,000,000 — 25,000,000 in total. Note that the zero-fraction first slab still consumes three years.
Nothing here is pre-loaded for Indonesia — the only shipped rules are one for India and three for the UAE. If you use gratuity to model pesangon or UPMK, write the slabs yourself and have them checked. Gratuity is one of the payables a Full and Final Statement pulls in — see Employee lifecycle.
Reports
Two reports live on the Reports card of the workspace, or open them with Cmd/Ctrl + K and the report name. A third, Accrued Earnings Report, is missing from that card but appears under Reports in the Tax & Benefits sidebar.
Income Tax Computation
This projects each employee's full-year position. Filters: Company and Payroll Period (both required), Employee, Department, Employee Status (default Active) and Consider Tax Exemption Declaration (off).
It only includes employees with a submitted Salary Structure Assignment carrying both a salary structure and a non-disabled income tax slab, using the latest assignment by From Date. Otherwise it stops with "No employees found with selected filters and active salary structure".
Columns are built as it runs: Other Income, then one per non-taxable earning component, one per tax-exempted deduction component, one per active exemption category, then Standard Tax Exemption, Total Exemption, Total Taxable Amount, Income Tax (Slab Based), Other Taxes and Charges, Total Applicable Tax, Total Tax Deducted and Payable Tax.
Three things to expect:
- It builds a preview salary slip for every remaining cycle for every employee, so it is slow on a large headcount, and it quietly stops projecting for anyone whose preview raises an error.
- It counts only submitted Proof Submissions unless Consider Tax Exemption Declaration is ticked.
- It looks up the standard exemption by company, so a slab with Company blank shows a Standard Tax Exemption of zero here even though the slip applies it.
Income Tax Deductions
This lists actual deductions by month. Filters: Company, Month and Year (all required), Department and Branch.
It selects rows only from Salary Components with Is Income Tax Component ticked — not Variable Based On Taxable Salary. A PPh 21 component that has only the latter produces an empty report. The PAN Number column appears only for an Indian company.
What is not there
The Payroll workspace also links Provident Fund Deductions and Professional Tax Deductions. Both read a Component Type field that only exists once a company's country is set to India, so on an Indonesian site there is nothing for them to report. No Indonesian statutory output — no BPJS file, no 1721-A1 — ships with the product. See Settings and reports.
Details, limits and edge cases
You can stop here unless a number looks wrong, or you are deciding how to model something. Everything below is reference.
The records in this area
- Income Tax Slab (
/app/income-tax-slab) — you save it, then submit it. You type its name at creation; there is no automatic numbering. It carries Effective from, Company, Currency, Allow Tax Exemption, Standard Tax Exemption Amount, Taxable Income Relief Threshold Limit, Disabled and the Taxable Salary Slabs table. - Taxable Salary Slab — one row in that table inside the form: From Amount, To Amount, Percent Deduction, optional Condition.
- Income Tax Slab Other Charges — another kind of row inside the same form, adding a Percent surcharge on the tax already calculated, optionally bounded by Min Taxable Income and Max Taxable Income.
- Employee Tax Exemption Category (
/app/employee-tax-exemption-category) and Sub Category (/app/employee-tax-exemption-sub-category) — the catalogue of what can be claimed, each with a Max Exemption Amount and Is Active. You type the name of both at creation. - Employee Tax Exemption Declaration (
/app/employee-tax-exemption-declaration) — saved, then submitted; numberedHR-TAX-DEC-.YYYY.-.#####. What the employee says they will claim this payroll period. - Employee Tax Exemption Proof Submission (
/app/employee-tax-exemption-proof-submission) — saved, then submitted; numberedHR-TAX-PRF-.YYYY.-.#####. What they can document, with Type of Proof and Attach Proof per row. - Employee Other Income (
/app/employee-other-income) — saved, then submitted; numberedHR-INCOME-.######. Income from outside payroll that still counts toward the annual taxable total. - Employee Benefit Application (
/app/employee-benefit-application) — saved, then submitted; numberedHR-BEN-APP-.YY.-.MM.-.#####. How an employee splits a yearly flexible benefit budget across components. - Employee Benefit Claim (
/app/employee-benefit-claim) — saved, then submitted; numberedHR-BEN-CLM-.YY.-.MM.-.#####. A request to be paid part of that budget now. - Employee Benefit Ledger (
/app/employee-benefit-ledger) — read-only for every role. One row per Accrual or Payout, written when a salary slip is submitted. - Gratuity (
/app/gratuity,HR-GRA-PAY-.#####), Gratuity Rule (/app/gratuity-rule) and Gratuity Rule Slab — an end-of-service payout calculated from years of service.
Gratuity, Gratuity Rule, Employee Other Income and Employee Benefit Ledger have no link in any workspace or sidebar. Reach them from the search bar or the web addresses above.
How income tax reaches a salary slip
Income Tax Slab ──▶ Salary Structure Assignment (Income Tax Slab field)
│
Exemption Declaration ────┐ │
or Proof Submission ├──────▶│
Employee Other Income ────┘ ▼
Salary Slip ──▶ deduction component with
"Variable Based On Taxable Salary"
The slip works out the whole year first, then divides. In order, it:
- sums taxable earnings from earlier slips in the period, plus Taxable Earnings Till Date from the assignment;
- computes this cycle twice — once at full working days, once at actual payment days — and projects the full-days figure across the cycles still to come;
- adds Employee Other Income for the same employee, period and company;
- subtracts deductions tagged Exempted from Income Tax, the exemption total and the Standard Tax Exemption Amount;
- runs the result through the slabs;
- applies Other Taxes and Charges;
- subtracts tax already deducted this period;
- divides what is left by the remaining cycles.
The number of remaining cycles is a whole-month count from this slip's start date to the payroll period end — or to the employee's Relieving Date if that is earlier. For an employee relieved mid-period, the annual tax lands in fewer, larger instalments.
What the Income Tax Breakup tab shows
The Income Tax Breakup tab shows every intermediate figure. It appears only once CTC is non-zero.
| Field | What it holds |
|---|---|
| CTC | Taxable earnings before exemptions for the whole period, plus non-taxable earnings |
| Income from Other Sources | Sum of submitted Employee Other Income |
| Non Taxable Earnings | Earnings whose component has Is Tax Applicable unticked, past, present and projected |
| Deductions before tax calculation | Deductions tagged Exempted from Income Tax, past, present and projected |
| Tax Exemption Declaration | Total exemption less the standard amount |
| Standard Tax Exemption Amount | The slab's flat allowance |
| Annual Taxable Amount | Total earnings less the four rows above |
| Income Tax Deducted Till Date | Tax on earlier slips plus this one |
| Future Income Tax | What is still to come this period |
| Current Month Income Tax | The figure written to the deduction row |
| Total Income Tax | Deducted till date plus future |
Slab arithmetic
For each row in ascending order, GARP adds (amount in band + 1) × Percent Deduction ÷ 100. The + 1 is deliberate and is not a rounding artefact: a band of 0 to 60,000,000 at 5% yields 3,000,000.05, not 3,000,000. Tick Round to the Nearest Integer on the tax component and the stray cents disappear from the payslip.
Rows with a blank To Amount are treated as open-ended and catch everything above From Amount. Rows whose Condition turns out false are skipped entirely.
Three behaviours are easy to miss:
- If annual taxable earnings do not exceed Taxable Income Relief Threshold Limit, tax is zero and no slab is applied. Left blank the limit is zero, so any positive income is taxed. It is a cliff, not an allowance — exceed it by one rupiah and the whole amount is taxed.
- Other Taxes and Charges is a percentage of the tax, not of income. Use it for a levy on top of tax, not for a second bracket. It is only reached when income clears the relief limit.
- In the final cycle of the payroll period, the slip stops trusting the declaration and uses the submitted Proof Submission instead. An employee who declares and never proves gets the shortfall recovered in the last payslip. This is deliberate: the slip's Deduct Tax For Unsubmitted Tax Exemption Proof check is set automatically once the slip's end date reaches the period end, and you can tick it earlier by hand.
Worked example: monthly PPh 21 for Sari Dewi
PT Maju Jaya, payroll period 1 Jan 2026 to 31 Dec 2026, monthly. Slab PPh 21 2026: 0 to 60,000,000 at 5%, 60,000,000 to 250,000,000 at 15%, 250,000,000 to 500,000,000 at 25%, then higher bands. Standard Tax Exemption Amount 54,000,000. Sari earns Gaji Pokok 12,000,000 and Tunjangan Makan 750,000 a month, both taxable, and files nothing.
January slip. Remaining cycles = 12.
current cycle taxable 12,750,000
projected (12 − 1 cycles) 140,250,000
standard exemption −54,000,000
annual taxable amount 99,000,000
band 1 (60,000,000 − 0 + 1) × 5% 3,000,000.05
band 2 (99,000,000 − 60,000,000 + 1) × 15% 5,850,000.15
total structured tax 8,850,000.20
÷ 12 remaining cycles 737,500.02
An Indonesian practitioner would first take biaya jabatan — 5% of gross capped at 500,000 a month, so 6,000,000 for the year — before PTKP. Their answer is 662,500 a month. The product produces 737,500 until you model biaya jabatan yourself. Add a deduction component "Biaya Jabatan" with Exempted from Income Tax ticked, tick Allow Tax Exemption on the slab, and the annual taxable amount falls to 93,000,000 and the monthly tax to 662,500.02 — matching the practitioner.
A Salary Component Formula does not have min() and max() available to it. Write the biaya jabatan cap as a conditional expression instead: 500000 if (GP + TMK) * 0.05 > 500000 else (GP + TMK) * 0.05.
Income Tax Slab field reference
| Field | Effect when set | Effect when blank or off |
|---|---|---|
| Effective from | Must be on or before the payroll period start date | Required; cannot be blank |
| Company | Overwrites Currency with the company's default on save | Currency stays as typed, and Income Tax Computation reports a Standard Tax Exemption of zero for this slab |
| Currency | Must match the employee's salary currency on the assignment | Required; cannot be blank |
| Disabled | Every slip using it stops with "Income Tax Slab: … is disabled". Editable after submit | Slab is live |
| Allow Tax Exemption | Declarations, proofs and Exempted from Income Tax deductions all reduce taxable income | Only the standard exemption applies |
| Standard Tax Exemption Amount | Subtracted from annual taxable earnings | No flat allowance |
| Taxable Income Relief Threshold Limit | Income at or below it is untaxed | Treated as zero |
What submitting does
| Document | When you submit it | When you cancel it |
|---|---|---|
| Income Tax Slab | Nothing outside itself; the slab becomes selectable on assignments | Nothing. Slips keep using it — only Disabled and Effective from are checked |
| Employee Tax Exemption Declaration | A Submit Proof button appears; later slips in the period subtract Total Exemption Amount | Later slips stop subtracting it |
| Employee Tax Exemption Proof Submission | From the final cycle of the period, slips read this instead of the declaration | Reverts to the declaration, or to nothing |
| Employee Other Income | Amount is added to annual taxable income on later slips in that period and company | Removed from the total |
| Employee Benefit Application | Becomes the source of benefit amounts for that employee and period, replacing the assignment | The assignment becomes the source again, unless Mandatory Benefit Application is on |
| Employee Benefit Claim | Creates and submits an Additional Salary: same component, amount, payroll date, overwrite off, referencing the claim | GARP does nothing further — the Additional Salary it created is not cancelled |
| Gratuity, Pay via Salary Slip on | Creates and submits an Additional Salary the same way; status stays Unpaid until the slip carrying it is submitted | Resets the status, but cancelling still tries to write accounting entries even though no accounts are set |
| Gratuity, Pay via Salary Slip off | Posts two GL entries dated Posting date: credit Payable Account with the employee as party, debit Expense Account, both with Cost Center. Status becomes Unpaid and Create Payment Entry appears | Reverses the GL entries and resets the status |
| Salary Slip | Writes this cycle's Accrual and Payout rows to the Employee Benefit Ledger; flips linked Gratuity and Leave Encashment records to Paid; emails the slip if Email Salary Slip to Employee is on | Deletes those ledger rows and flips the linked records back to Unpaid |
Who can do what
| Record | System Manager | HR Manager | HR User | Employee |
|---|---|---|---|---|
| Income Tax Slab | Full, with submit, cancel, amend | Same | Same | None |
| Tax Exemption Category and Sub Category | Create, read, write, delete | Same | Same | None |
| Employee Tax Exemption Declaration | Full, with submit | Same | Same | Full, with submit |
| Employee Tax Exemption Proof Submission | Full, with submit | Same | Same | Full, with submit |
| Employee Other Income | None | Full, with submit | Full, with submit | Full, with submit |
| Employee Benefit Application | Full, with submit | Same | Same | Create, read, write, delete — no submit |
| Employee Benefit Claim | Full, with submit | Same | Same | Create, read, write, delete — no submit |
| Employee Benefit Ledger | Read, report, print, email, export, share | Same | Read and report only | Same as System Manager |
| Gratuity and Gratuity Rule | None | Create, read, write, delete — no submit | Same | None |
Nobody can create or edit an Employee Benefit Ledger row by hand; the salary slip writes them.
GARP adds no extra rule of its own for restricting who sees whose record here, so that restriction comes only from User Permissions on Employee. The Employee Self Service user type, created when GARP HR is installed, applies exactly that — matching on the Employee record's User ID — and grants read, write, create and delete on Employee Tax Exemption Declaration, Employee Tax Exemption Proof Submission and Employee Benefit Application. It does not grant submit on any of them, and it does not list Employee Benefit Claim or Employee Other Income at all.
None of this area exists in the mobile app. The PWA ships screens for attendance, employee advances, expense claims, leave and salary slips only. Declarations, proofs and benefit applications must be filed from the desk.
Nothing runs overnight
There are no scheduled jobs in this area. GARP does run things automatically each night, but they cover interview reminders, daily work summaries, shift check-in sync and auto-attendance, birthday and work anniversary emails, expired shift assignments, closing expired job openings, leave ledger expiry, leave encashment generation and earned leave allocation.
Nothing accrues a benefit, ages a declaration or recalculates tax overnight. Every figure on this page moves only when someone saves or submits a document, or when a salary slip is submitted.
Related
- Payroll — components, structures, assignments and the monthly run
- Employees — the master record every calculation reads
- Employee lifecycle — separation and full and final settlement, which links gratuity
- Employee self-service — what employees can and cannot reach
- Settings and reports — HR Settings, Payroll Settings and the report list
- Accounting — where gratuity and payroll postings land