Skip to main content

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​

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.

warning

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​

  1. 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).
  2. 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.
  3. 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.
  4. 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 base and variable, the slip's own fields, every Salary Component abbreviation (each starting at zero) and annual_taxable_earning — for example gender == "Female" or base > 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".
  5. 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.

warning

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.

note

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​

  1. 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.
  2. 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.
  3. Submit. A Submit Proof button appears on the submitted declaration and carries the rows across.
  4. 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:

  1. 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.
  2. 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​

MessageCause
"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​

  1. 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.
  2. On each Salary Structure Assignment, fill the Flexible Benefits table with those components and set Maximum Benefit Amount — the employee's yearly envelope.
  3. The employee opens /app/employee-benefit-application and 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.
  4. 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 MethodAccrual ComponentAccrues to the ledgerReaches the payslipOffered in the claim picker
Accrue and payout at end of payroll periodMust be tickedEvery cycleAs an earning in the final cycle, for the accrued balance less anything already paid on that componentNo
Accrue per cycle, pay only on claimMust be tickedEvery cycleOnly through an Employee Benefit Claim, plus the unclaimed balance in the final cycle if Payout Unclaimed Amount in Final Payroll Cycle is tickedYes
Allow claim for full benefit amountMust be offNeverOnly through an Employee Benefit ClaimYes
BlankMust be offNeverNeverNo

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.

warning

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​

  1. 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.
  2. 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.
  3. 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.

warning

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​

  1. 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.
  2. Set the employee's Relieving Date. Gratuity cannot be calculated without one, and you will see "Please set Relieving Date for employee: …".
  3. Open /app/gratuity and 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.
  4. 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.
warning

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.

warning

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; numbered HR-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; numbered HR-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; numbered HR-INCOME-.######. Income from outside payroll that still counts toward the annual taxable total.
  • Employee Benefit Application (/app/employee-benefit-application) — saved, then submitted; numbered HR-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; numbered HR-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.
note

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:

  1. sums taxable earnings from earlier slips in the period, plus Taxable Earnings Till Date from the assignment;
  2. 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;
  3. adds Employee Other Income for the same employee, period and company;
  4. subtracts deductions tagged Exempted from Income Tax, the exemption total and the Standard Tax Exemption Amount;
  5. runs the result through the slabs;
  6. applies Other Taxes and Charges;
  7. subtracts tax already deducted this period;
  8. 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.

FieldWhat it holds
CTCTaxable earnings before exemptions for the whole period, plus non-taxable earnings
Income from Other SourcesSum of submitted Employee Other Income
Non Taxable EarningsEarnings whose component has Is Tax Applicable unticked, past, present and projected
Deductions before tax calculationDeductions tagged Exempted from Income Tax, past, present and projected
Tax Exemption DeclarationTotal exemption less the standard amount
Standard Tax Exemption AmountThe slab's flat allowance
Annual Taxable AmountTotal earnings less the four rows above
Income Tax Deducted Till DateTax on earlier slips plus this one
Future Income TaxWhat is still to come this period
Current Month Income TaxThe figure written to the deduction row
Total Income TaxDeducted 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.

warning

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​

FieldEffect when setEffect when blank or off
Effective fromMust be on or before the payroll period start dateRequired; cannot be blank
CompanyOverwrites Currency with the company's default on saveCurrency stays as typed, and Income Tax Computation reports a Standard Tax Exemption of zero for this slab
CurrencyMust match the employee's salary currency on the assignmentRequired; cannot be blank
DisabledEvery slip using it stops with "Income Tax Slab: … is disabled". Editable after submitSlab is live
Allow Tax ExemptionDeclarations, proofs and Exempted from Income Tax deductions all reduce taxable incomeOnly the standard exemption applies
Standard Tax Exemption AmountSubtracted from annual taxable earningsNo flat allowance
Taxable Income Relief Threshold LimitIncome at or below it is untaxedTreated as zero

What submitting does​

DocumentWhen you submit itWhen you cancel it
Income Tax SlabNothing outside itself; the slab becomes selectable on assignmentsNothing. Slips keep using it — only Disabled and Effective from are checked
Employee Tax Exemption DeclarationA Submit Proof button appears; later slips in the period subtract Total Exemption AmountLater slips stop subtracting it
Employee Tax Exemption Proof SubmissionFrom the final cycle of the period, slips read this instead of the declarationReverts to the declaration, or to nothing
Employee Other IncomeAmount is added to annual taxable income on later slips in that period and companyRemoved from the total
Employee Benefit ApplicationBecomes the source of benefit amounts for that employee and period, replacing the assignmentThe assignment becomes the source again, unless Mandatory Benefit Application is on
Employee Benefit ClaimCreates and submits an Additional Salary: same component, amount, payroll date, overwrite off, referencing the claimGARP does nothing further — the Additional Salary it created is not cancelled
Gratuity, Pay via Salary Slip onCreates and submits an Additional Salary the same way; status stays Unpaid until the slip carrying it is submittedResets the status, but cancelling still tries to write accounting entries even though no accounts are set
Gratuity, Pay via Salary Slip offPosts 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 appearsReverses the GL entries and resets the status
Salary SlipWrites 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 onDeletes those ledger rows and flips the linked records back to Unpaid

Who can do what​

RecordSystem ManagerHR ManagerHR UserEmployee
Income Tax SlabFull, with submit, cancel, amendSameSameNone
Tax Exemption Category and Sub CategoryCreate, read, write, deleteSameSameNone
Employee Tax Exemption DeclarationFull, with submitSameSameFull, with submit
Employee Tax Exemption Proof SubmissionFull, with submitSameSameFull, with submit
Employee Other IncomeNoneFull, with submitFull, with submitFull, with submit
Employee Benefit ApplicationFull, with submitSameSameCreate, read, write, delete — no submit
Employee Benefit ClaimFull, with submitSameSameCreate, read, write, delete — no submit
Employee Benefit LedgerRead, report, print, email, export, shareSameRead and report onlySame as System Manager
Gratuity and Gratuity RuleNoneCreate, read, write, delete — no submitSameNone

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.

note

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.