How the Indonesia Pajak kendaraan (vehicle tax) calculator is verified

Inputs

InputFieldType
Vehicle sale value, NJKB (IDR)vehicleValuenumber
Weighting coefficient (bobot), 1 or moreweightCoefficientnumber
Which car you own in Jakarta (same name, NIK or address)ownershipstring
Battery-electric car (exempt from 1 April 2026)electricboolean
New car — first handover, so BBNKB is duenewCarboolean

The formula

Each derived value below is computed by the Valem engine from the expression shown, in this order. Nothing else runs — there is no hidden code path.

Derived valueFieldFormula (JSONata)
PKB tax base (NJKB × bobot)taxBase$round($n(vehicleValue) * $clampFloorCap($n(weightCoefficient), 1, null), 2)
Pkb RatepkbRateelectric ? 0 : (ownership = 'fifth' ? $const.pkbRate5 : (ownership = 'fourth' ? $const.pkbRate4 : (ownership = 'third' ? $const.pkbRate3 : (ownership = 'second' ? $const.pkbRate2 : $const.pkbRate1))))
PKB / yearpkbAnnual$round(taxBase * pkbRate, 2)
BBNKB 12.5% (first handover)bbnkbnewCar and $not(electric) ? $round($n(vehicleValue) * $const.bbnkbRate, 2) : 0
First year, PKB + BBNKBfirstYearTotal$round(pkbAnnual + bbnkb, 2)

Rates and thresholds

The expressions above read these as $const. They are the figures the annual refresh replaces, so they live as data rather than being written into the formulas — which is what makes a year-on-year change a one-line diff instead of an edit to arithmetic.

ConstantValue
pkbRate10.02
pkbRate20.03
pkbRate30.04
pkbRate40.05
pkbRate50.06
bbnkbRate0.125

Test vectors (5)

Every case is executed against this model on each build, by the Java engine and independently by a JavaScript one. A mismatch of a single cent fails the build, so the page cannot ship advertising a figure the model no longer produces.

Case 1 — K1 a new first car with a Rp300 million NJKB and bobot 1.05: PKB Rp6,300,000, BBNKB Rp37,500,000

given vehicleValue300000000
given weightCoefficient1.05
given ownershipfirst
given electricno
given newCaryes
expect taxBase315000000
expect pkbRate0.02
expect pkbAnnual6300000
expect bbnkb37500000
expect firstYearTotal43800000

Case 2 — K2 the same car as a second car: PKB at 3%

given vehicleValue300000000
given weightCoefficient1.05
given ownershipsecond
given electricno
given newCarno
expect pkbAnnual9450000
expect bbnkb0
expect firstYearTotal9450000

Case 3 — K3 a fifth car pays 6%

given vehicleValue200000000
given weightCoefficient1
given ownershipfifth
given electricno
given newCarno
expect pkbRate0.06
expect pkbAnnual12000000

Case 4 — K4 a battery-electric car is exempted from PKB and BBNKB (Kepgub 446/2026)

given vehicleValue500000000
given weightCoefficient1
given ownershipfirst
given electricyes
given newCaryes
expect pkbAnnual0
expect bbnkb0
expect firstYearTotal0

Case 5 — K5 coefficient 1 on a Rp100 million car: PKB Rp2,000,000, BBNKB Rp12,500,000

given vehicleValue100000000
given weightCoefficient1
given ownershipfirst
given electricno
given newCaryes
expect taxBase100000000
expect pkbAnnual2000000
expect bbnkb12500000

Sources

Check it yourself — and reuse it

The whole model as JSON — inputs, outputs, formulas, vectors and sources in one re-runnable document.

This model is published under CC BY 4.0: use it, adapt it, build on it, with attribution. The licence covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds are law, and nobody licenses those; the sources above are where they come from.

← Back to the Indonesia Pajak kendaraan (vehicle tax) calculator

Built with Valem — a live, verifiable calculator you can fork and embed.