{
  "$comment": "Machine-readable companion to https://valem.run/calculators/singapore/self-employed. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/singapore/self-employed",
  "dataUrl": "https://valem.run/calculators/singapore/self-employed.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Singapore self-employed model by Valem (https://valem.run/calculators/singapore/self-employed), CC BY 4.0.",
    "note": "Covers the model — the expression of each rule and the arrangement of the catalog. The rates and thresholds themselves are law and are not licensed by anyone; the cited sources are where they come from."
  },
  "verificationUrl": "https://valem.run/calculators/singapore/self-employed/verify",
  "country": "singapore",
  "countryName": "Singapore",
  "formula": "self-employed",
  "formulaName": "Self-employed",
  "title": "Self-Employed Tax Calculator Singapore",
  "answer": "Your net income as a self-employed person in Singapore is net trade income minus the compulsory MediSave contribution and income tax at the resident progressive rates, which start at zero on the first 20,000 SGD.",
  "lang": "en",
  "currency": "SGD",
  "taxYear": "2026",
  "verification": {
    "claim": "shape-only",
    "statement": "The rates in this model are illustrative. Its 3 self-test cases confirm the engine reproduces the shape of the charge, but the schedule is not the official one, so the amount will not match a real bill. The cited sources name the document that would replace it.",
    "selfTestCases": 3,
    "ratesAreIllustrative": true,
    "sourcesCheckedOn": "2026-08-22"
  },
  "sources": [
    {
      "label": "IRAS — Individual income tax rates for residents",
      "url": "https://www.iras.gov.sg/taxes/individual-income-tax/basics-of-individual-income-tax/tax-residency-and-tax-rates/individual-income-tax-rates",
      "checked": "2026-08-22"
    },
    {
      "label": "CPF — MediSave contributions for self-employed persons",
      "url": "https://www.cpf.gov.sg/member/growing-your-savings/saving-as-a-self-employed-person",
      "checked": "2026-08-22"
    }
  ],
  "terminalOutput": "netIncome",
  "inputs": [
    {
      "name": "netTradeIncome",
      "type": "number",
      "label": "Annual net trade income (SGD)",
      "minimum": 0
    }
  ],
  "outputs": [
    {
      "name": "medisave",
      "type": "number",
      "label": "MediSave contribution",
      "format": "number",
      "formula": "$round(netTradeIncome <= $const.medisaveFloor ? 0 : netTradeIncome * $const.medisaveRate, 2)"
    },
    {
      "name": "incomeTax",
      "type": "number",
      "label": "Income tax",
      "format": "number",
      "formula": "($i := netTradeIncome; $round($const.r2 * $max([0, $min([$i, $const.b2]) - $const.b1]) + $const.r3 * $max([0, $min([$i, $const.b3]) - $const.b2]) + $const.r4 * $max([0, $min([$i, $const.b4]) - $const.b3]) + $const.r5 * $max([0, $min([$i, $const.b5]) - $const.b4]) + $const.r6 * $max([0, $min([$i, $const.b6]) - $const.b5]) + $const.r7 * $max([0, $min([$i, $const.b7]) - $const.b6]) + $const.r8 * $max([0, $min([$i, $const.b8]) - $const.b7]) + $const.r9 * $max([0, $min([$i, $const.b9]) - $const.b8]) + $const.r10 * $max([0, $min([$i, $const.b10]) - $const.b9]) + $const.r11 * $max([0, $min([$i, $const.b11]) - $const.b10]) + $const.r12 * $max([0, $min([$i, $const.b12]) - $const.b11]) + $const.r13 * $max([0, $i - $const.b12]), 2))"
    },
    {
      "name": "netIncome",
      "type": "number",
      "label": "Net income / year",
      "format": "number",
      "formula": "$round($max([0, netTradeIncome - medisave - incomeTax]), 2)"
    }
  ],
  "testCases": [
    {
      "description": "90,000 SGD net trade income — a typical full-time freelancer",
      "given": {
        "netTradeIncome": 90000
      },
      "expect": {
        "medisave": 7200,
        "incomeTax": 4500,
        "netIncome": 78300
      }
    },
    {
      "description": "35,000 SGD — part-time",
      "given": {
        "netTradeIncome": 35000
      },
      "expect": {
        "medisave": 2800,
        "incomeTax": 375,
        "netIncome": 31825
      }
    },
    {
      "description": "250,000 SGD — a well-paid consultant",
      "given": {
        "netTradeIncome": 250000
      },
      "expect": {
        "medisave": 20000,
        "incomeTax": 30700,
        "netIncome": 199300
      }
    }
  ],
  "spec": {
    "id": "self-employed-singapore",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "netTradeIncome": {
          "type": "number",
          "minimum": 0
        },
        "medisave": {
          "type": "number",
          "readOnly": true
        },
        "incomeTax": {
          "type": "number",
          "readOnly": true
        },
        "netIncome": {
          "type": "number",
          "readOnly": true
        }
      },
      "required": [
        "netTradeIncome"
      ]
    },
    "constants": {
      "medisaveRate": 0.08,
      "medisaveFloor": 6000,
      "b1": 20000,
      "b2": 30000,
      "b3": 40000,
      "b4": 80000,
      "b5": 120000,
      "b6": 160000,
      "b7": 200000,
      "b8": 240000,
      "b9": 280000,
      "b10": 320000,
      "b11": 500000,
      "b12": 1000000,
      "r2": 0.02,
      "r3": 0.035,
      "r4": 0.07,
      "r5": 0.115,
      "r6": 0.15,
      "r7": 0.18,
      "r8": 0.19,
      "r9": 0.195,
      "r10": 0.2,
      "r11": 0.22,
      "r12": 0.23,
      "r13": 0.24
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ \"netTradeIncome\": 90000 }"
      }
    ],
    "derivations": [
      {
        "path": "$.medisave",
        "expr": "$round(netTradeIncome <= $const.medisaveFloor ? 0 : netTradeIncome * $const.medisaveRate, 2)"
      },
      {
        "path": "$.incomeTax",
        "expr": "($i := netTradeIncome; $round($const.r2 * $max([0, $min([$i, $const.b2]) - $const.b1]) + $const.r3 * $max([0, $min([$i, $const.b3]) - $const.b2]) + $const.r4 * $max([0, $min([$i, $const.b4]) - $const.b3]) + $const.r5 * $max([0, $min([$i, $const.b5]) - $const.b4]) + $const.r6 * $max([0, $min([$i, $const.b6]) - $const.b5]) + $const.r7 * $max([0, $min([$i, $const.b7]) - $const.b6]) + $const.r8 * $max([0, $min([$i, $const.b8]) - $const.b7]) + $const.r9 * $max([0, $min([$i, $const.b9]) - $const.b8]) + $const.r10 * $max([0, $min([$i, $const.b10]) - $const.b9]) + $const.r11 * $max([0, $min([$i, $const.b11]) - $const.b10]) + $const.r12 * $max([0, $min([$i, $const.b12]) - $const.b11]) + $const.r13 * $max([0, $i - $const.b12]), 2))"
      },
      {
        "path": "$.netIncome",
        "expr": "$round($max([0, netTradeIncome - medisave - incomeTax]), 2)"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "Self-employed net income",
          "layout": "vertical",
          "components": [
            {
              "id": "illustrativeNotice",
              "type": "alert",
              "variant": "warning",
              "label": "What this model leaves out",
              "text": "'A self-employed person in Singapore contributes to MediSave only — not to the Ordinary or Special CPF accounts an employee builds — which is why the compulsory deduction is so much smaller than a salaried equivalent, and why retirement adequacy is left to you. The 8% modelled here is the full rate for someone under 35; it rises with age to 10.5% at 50 and above, phases in gradually between 6,000 and 18,000 SGD of net trade income, and is capped in practice — none of which is applied here, so the contribution is approximate. Personal reliefs, which can be substantial, are not modelled and would raise the net figure. Not tax advice.'"
            },
            {
              "id": "inputField",
              "type": "numericField",
              "label": "Annual net trade income (SGD)",
              "bind": "$.netTradeIncome",
              "placeholder": "90000"
            },
            {
              "id": "tiles",
              "type": "group",
              "layout": "horizontal",
              "components": [
                {
                  "id": "netIncomeTile",
                  "type": "statTile",
                  "label": "Net income / year",
                  "bind": "$.netIncome",
                  "format": "number"
                },
                {
                  "id": "medisaveTile",
                  "type": "statTile",
                  "label": "MediSave contribution",
                  "bind": "$.medisave",
                  "format": "number"
                },
                {
                  "id": "incomeTaxTile",
                  "type": "statTile",
                  "label": "Income tax",
                  "bind": "$.incomeTax",
                  "format": "number"
                }
              ]
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "items": [
                {
                  "label": "IRAS — Individual income tax rates for residents",
                  "url": "https://www.iras.gov.sg/taxes/individual-income-tax/basics-of-individual-income-tax/tax-residency-and-tax-rates/individual-income-tax-rates",
                  "date": "2026-08-22"
                },
                {
                  "label": "CPF — MediSave contributions for self-employed persons",
                  "url": "https://www.cpf.gov.sg/member/growing-your-savings/saving-as-a-self-employed-person",
                  "date": "2026-08-22"
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "90,000 SGD net trade income — a typical full-time freelancer",
        "given": {
          "$.netTradeIncome": 90000
        },
        "expect": {
          "$.medisave": 7200,
          "$.incomeTax": 4500,
          "$.netIncome": 78300
        }
      },
      {
        "description": "35,000 SGD — part-time",
        "given": {
          "$.netTradeIncome": 35000
        },
        "expect": {
          "$.medisave": 2800,
          "$.incomeTax": 375,
          "$.netIncome": 31825
        }
      },
      {
        "description": "250,000 SGD — a well-paid consultant",
        "given": {
          "$.netTradeIncome": 250000
        },
        "expect": {
          "$.medisave": 20000,
          "$.incomeTax": 30700,
          "$.netIncome": 199300
        }
      }
    ]
  }
}
