npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dutch-tax-income-calculator

v26.2.0

Published

NPM package with functionality to calculate Dutch Tax Income

Readme

dutch-tax-income-calculator-npm

NPM package with functionality to calculate Dutch Tax Income

Installation

npm install --save dutch-tax-income-calculator

Usage

The package exports three members: SalaryPaycheck (gross → net), netToGross (net → gross), and constants (the underlying tax tables).

Gross to net (SalaryPaycheck)

import { SalaryPaycheck } from 'dutch-tax-income-calculator';

const paycheck = new SalaryPaycheck(
  {
    income: 36000,
    allowance: false,
    socialSecurity: true,
    older: false,
    hours: 40,
  },
  'Year',
  2026,
  { checked: false }
);
console.log(paycheck);
/* OUTPUT:
{
  grossHour: 17.31,
  grossDay: 141.18,
  grossWeek: 692.31,
  grossMonth: 3000,
  grossYear: 36000,
  inputGrossYear: 36000,
  taxFreeYear: 0,
  grossAllowance: 0,
  taxableYear: 36000,
  taxFree: 0,
  payrollTax: -2916,
  payrollTaxMonth: -243,
  socialTax: -9954,
  socialTaxMonth: -829.5,
  taxWithoutCredit: -12870,
  taxWithoutCreditMonth: -1072.5,
  labourCredit: 5498.04,
  labourCreditMonth: 458.17,
  generalCredit: 2714.29,
  generalCreditMonth: 226.19,
  taxCredit: 8212.33,
  taxCreditMonth: 684.36,
  incomeTax: -4657.67,
  incomeTaxMonth: -388.14,
  netYear: 31342.33,
  netAllowance: 0,
  netMonth: 2611.86,
  netWeek: 602.74,
  netDay: 122.91,
  netHour: 15.07
}
*/

new SalaryPaycheck(salaryInput, startFrom, year, ruling):

  • salaryInput.income: gross amount, denominated in whatever unit startFrom specifies
  • salaryInput.allowance: whether income already includes the 8% holiday allowance (vakantiegeld)
  • salaryInput.socialSecurity: whether social security contributions apply
  • salaryInput.older: whether the person has reached retirement (AOW) age
  • salaryInput.hours: contracted hours per week
  • startFrom: 'Year' | 'Month' | 'Week' | 'Day' | 'Hour' — which unit income is expressed in
  • year: tax year to calculate for (see constants.years for supported years)
  • ruling: { checked: boolean, choice?: 'normal' | 'young' | 'research' } — the 30% ruling (30%-regeling)

Net to gross (netToGross)

Given a target net income, finds the gross salary that produces it:

import { netToGross } from 'dutch-tax-income-calculator';

const result = netToGross(
  {
    amount: 31342.33,
    field: 'netYear',
    holidayAllowanceIncluded: false,
  },
  {
    period: 'Year',
    year: 2026,
    allowance: false,
    socialSecurity: true,
    older: false,
    hours: 40,
    ruling: { checked: false },
  }
);
console.log(result.grossYear); // 36000

netToGross(target, options):

  • target.amount: the net figure to solve for
  • target.field: 'netYear' | 'netMonth' — which net field amount refers to
  • target.holidayAllowanceIncluded: whether amount already includes the holiday allowance payout (netAllowance)
  • options: the same shape SalaryPaycheck accepts, except period replaces startFrom and must match target.field ('Year' for netYear, 'Month' for netMonth)

netToGross returns the full SalaryPaycheck result computed at the solved gross — the same shape as the forward calculation above. Because every internal amount is rounded to 2 decimals, more than one gross value can occasionally round to the identical net; in that case netToGross returns { grossLow, grossHigh } (the plateau bounds) instead of guessing a single number. If no gross produces the target net, it throws an error naming the nearest achievable net.

Constants

import { constants } from 'dutch-tax-income-calculator';

Exposes the underlying tax tables and thresholds used for the calculation — years, rulingThreshold, rulingMaxSalary, lowWageThreshold, payrollTax, socialPercent, generalCredit, labourCredit, and more (see data.json).