{
  "$comment": "Machine-readable companion to https://valem.run/calculators/south-africa/vat. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/south-africa/vat",
  "dataUrl": "https://valem.run/calculators/south-africa/vat.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "South Africa vat model by Valem (https://valem.run/calculators/south-africa/vat), 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/south-africa/vat/verify",
  "country": "south-africa",
  "countryName": "South Africa",
  "formula": "vat",
  "formulaName": "VAT",
  "title": "VAT Calculator South Africa 2026 — Add or Remove 15%",
  "answer": "South African VAT is 15%. From 1 April 2026 registration is compulsory above R2.3 million of taxable supplies a year and voluntary from R120,000 — the first increase since 2009.",
  "lang": "en",
  "currency": "ZAR",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 7 self-test cases (below, and re-runnable against the spec). That asserts internal consistency, NOT that the formula matches current law — the cited sources are the evidence for that, and carry the date each was last checked.",
    "selfTestCases": 7,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-10-05"
  },
  "sources": [
    {
      "label": "SARS - Value-Added Tax: standard rate of 15%",
      "url": "https://www.sars.gov.za/types-of-tax/value-added-tax/",
      "checked": "2026-10-05"
    },
    {
      "label": "SARS - Value-Added Tax, What is new? (25 Feb 2026): R2.3m compulsory / R120 000 voluntary from 1 April 2026",
      "url": "https://www.sars.gov.za/types-of-tax/value-added-tax/",
      "checked": "2026-10-05"
    },
    {
      "label": "SARS FAQ - the new threshold for VAT registration (R2.3 million)",
      "url": "https://www.sars.gov.za/faq/what-is-the-new-threshold-for-vat-registration/",
      "checked": "2026-10-05"
    }
  ],
  "terminalOutput": "registrationStatus",
  "headlineOutput": "vatAmount",
  "inputs": [
    {
      "name": "amount",
      "type": "number",
      "label": "Amount",
      "minimum": 0
    },
    {
      "name": "direction",
      "type": "string",
      "label": "Direction",
      "enum": [
        "add",
        "remove"
      ]
    },
    {
      "name": "annualTurnover",
      "type": "number",
      "label": "Taxable supplies per annum",
      "minimum": 0
    },
    {
      "name": "reverseCharge",
      "type": "boolean",
      "label": "B2B reverse charge applies"
    }
  ],
  "outputs": [
    {
      "name": "rate",
      "type": "number",
      "formula": "$const.standardRate"
    },
    {
      "name": "effectiveRate",
      "type": "number",
      "formula": "reverseCharge ? 0 : rate"
    },
    {
      "name": "netAmount",
      "type": "number",
      "formula": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
    },
    {
      "name": "vatAmount",
      "type": "number",
      "formula": "$round(netAmount * effectiveRate, 2)"
    },
    {
      "name": "grossAmount",
      "type": "number",
      "formula": "$round(netAmount + vatAmount, 2)"
    },
    {
      "name": "mustRegister",
      "type": "boolean",
      "formula": "annualTurnover > $const.registrationThreshold"
    },
    {
      "name": "registrationStatus",
      "type": "string",
      "formula": "annualTurnover > $const.registrationThreshold ? 'required' : annualTurnover > $const.registrationThresholdVoluntary ? 'optional' : 'not available'"
    }
  ],
  "testCases": [
    {
      "description": "S1 100.00 ZAR net at 15%",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "vatAmount": 15,
        "grossAmount": 115,
        "netAmount": 100
      }
    },
    {
      "description": "S2 115.00 ZAR gross back to net",
      "given": {
        "amount": 115,
        "direction": "remove",
        "reverseCharge": false,
        "annualTurnover": 0
      },
      "expect": {
        "netAmount": 100,
        "vatAmount": 15
      }
    },
    {
      "description": "S3 reverse charge: the supplier charges no VAT",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": true,
        "annualTurnover": 0
      },
      "expect": {
        "vatAmount": 0,
        "grossAmount": 100
      }
    },
    {
      "description": "S4 above R2.3 million: registration is compulsory",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": false,
        "annualTurnover": 3000000
      },
      "expect": {
        "mustRegister": true,
        "registrationStatus": "required"
      }
    },
    {
      "description": "S5 between R120 000 and R2.3 million: voluntary",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": false,
        "annualTurnover": 800000
      },
      "expect": {
        "mustRegister": false,
        "registrationStatus": "optional"
      }
    },
    {
      "description": "S6 R1.5 million would have been compulsory before 1 April 2026, and is not now",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": false,
        "annualTurnover": 1500000
      },
      "expect": {
        "mustRegister": false,
        "registrationStatus": "optional"
      }
    },
    {
      "description": "S7 below R120 000: registration is not available",
      "given": {
        "amount": 100,
        "direction": "add",
        "reverseCharge": false,
        "annualTurnover": 90000
      },
      "expect": {
        "mustRegister": false,
        "registrationStatus": "not available"
      }
    }
  ],
  "spec": {
    "id": "vat-south-africa",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number",
          "minimum": 0
        },
        "direction": {
          "type": "string",
          "enum": [
            "add",
            "remove"
          ]
        },
        "annualTurnover": {
          "type": "number",
          "minimum": 0
        },
        "reverseCharge": {
          "type": "boolean"
        },
        "rate": {
          "type": "number",
          "readOnly": true
        },
        "effectiveRate": {
          "type": "number",
          "readOnly": true
        },
        "netAmount": {
          "type": "number",
          "readOnly": true
        },
        "vatAmount": {
          "type": "number",
          "readOnly": true
        },
        "grossAmount": {
          "type": "number",
          "readOnly": true
        },
        "mustRegister": {
          "type": "boolean",
          "readOnly": true
        },
        "registrationStatus": {
          "type": "string",
          "readOnly": true
        }
      }
    },
    "constants": {
      "standardRate": 0.15,
      "registrationThreshold": 2300000,
      "registrationThresholdVoluntary": 120000
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'amount': 100, 'direction': 'add', 'reverseCharge': false, 'annualTurnover': 0 }"
      }
    ],
    "derivations": [
      {
        "path": "$.rate",
        "expr": "$const.standardRate"
      },
      {
        "path": "$.effectiveRate",
        "expr": "reverseCharge ? 0 : rate"
      },
      {
        "path": "$.netAmount",
        "expr": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
      },
      {
        "path": "$.vatAmount",
        "expr": "$round(netAmount * effectiveRate, 2)"
      },
      {
        "path": "$.grossAmount",
        "expr": "$round(netAmount + vatAmount, 2)"
      },
      {
        "path": "$.mustRegister",
        "expr": "annualTurnover > $const.registrationThreshold"
      },
      {
        "path": "$.registrationStatus",
        "expr": "annualTurnover > $const.registrationThreshold ? 'required' : annualTurnover > $const.registrationThresholdVoluntary ? 'optional' : 'not available'"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "VAT",
          "layout": "vertical",
          "components": [
            {
              "id": "note",
              "type": "staticText",
              "text": "One rate of 15%, with zero-rated and exempt supplies rather than a reduced band. The registration figures changed on 1 April 2026, the first increase since 2009: compulsory registration from R2.3 million of taxable supplies per annum (up from R1 million) and voluntary registration from R120 000 (up from R50 000). Below R120 000 registration is not available, which is why this page reports a status rather than a yes/no. Worth knowing if you are checking this against SARS directly: the body of SARS's own VAT page still quotes the old R1 million and R50 000 figures, with the increase recorded separately in its \"What is new?\" note - so the page disagrees with itself and the note is the current part."
            },
            {
              "id": "inputs",
              "type": "fieldSet",
              "label": "Your figures",
              "components": [
                {
                  "id": "amount",
                  "type": "numericField",
                  "label": "Amount",
                  "bind": "$.amount",
                  "helperText": "Net amount when adding VAT, gross amount when removing it."
                },
                {
                  "id": "direction",
                  "type": "selectField",
                  "label": "Direction",
                  "bind": "$.direction",
                  "options": [
                    {
                      "value": "add",
                      "label": "Add VAT (net → gross)"
                    },
                    {
                      "value": "remove",
                      "label": "Remove VAT (gross → net)"
                    }
                  ]
                },
                {
                  "id": "reverseCharge",
                  "type": "checkboxField",
                  "label": "B2B reverse charge applies",
                  "bind": "$.reverseCharge",
                  "helperText": "The customer accounts for the VAT, so you charge none."
                },
                {
                  "id": "annualTurnover",
                  "type": "numericField",
                  "label": "Taxable supplies per annum",
                  "bind": "$.annualTurnover"
                }
              ]
            },
            {
              "id": "sep",
              "type": "separatorLine"
            },
            {
              "id": "vatTile",
              "type": "statTile",
              "label": "VAT",
              "value": "$.vatAmount"
            },
            {
              "id": "netTile",
              "type": "statTile",
              "label": "Net",
              "value": "$.netAmount"
            },
            {
              "id": "grossTile",
              "type": "statTile",
              "label": "Gross",
              "value": "$.grossAmount"
            },
            {
              "id": "breakdown",
              "type": "keyValueList",
              "label": "Detail",
              "items": [
                {
                  "label": "Rate applied",
                  "value": "$.effectiveRate"
                },
                {
                  "label": "Statutory rate",
                  "value": "$.rate"
                },
                {
                  "label": "Registration",
                  "value": "$.registrationStatus"
                }
              ]
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 2,
              "items": [
                {
                  "label": "SARS - Value-Added Tax: standard rate of 15%",
                  "url": "https://www.sars.gov.za/types-of-tax/value-added-tax/",
                  "date": "2026-10-05",
                  "covers": [
                    "standardRate"
                  ]
                },
                {
                  "label": "SARS - Value-Added Tax, What is new? (25 Feb 2026): R2.3m compulsory / R120 000 voluntary from 1 April 2026",
                  "url": "https://www.sars.gov.za/types-of-tax/value-added-tax/",
                  "date": "2026-10-05",
                  "covers": [
                    "registrationThreshold",
                    "registrationThresholdVoluntary"
                  ]
                },
                {
                  "label": "SARS FAQ - the new threshold for VAT registration (R2.3 million)",
                  "url": "https://www.sars.gov.za/faq/what-is-the-new-threshold-for-vat-registration/",
                  "date": "2026-10-05",
                  "covers": [
                    "registrationThreshold"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "S1 100.00 ZAR net at 15%",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.vatAmount": 15,
          "$.grossAmount": 115,
          "$.netAmount": 100
        }
      },
      {
        "description": "S2 115.00 ZAR gross back to net",
        "given": {
          "$.amount": 115,
          "$.direction": "remove",
          "$.reverseCharge": false,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.netAmount": 100,
          "$.vatAmount": 15
        }
      },
      {
        "description": "S3 reverse charge: the supplier charges no VAT",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": true,
          "$.annualTurnover": 0
        },
        "expect": {
          "$.vatAmount": 0,
          "$.grossAmount": 100
        }
      },
      {
        "description": "S4 above R2.3 million: registration is compulsory",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": false,
          "$.annualTurnover": 3000000
        },
        "expect": {
          "$.mustRegister": true,
          "$.registrationStatus": "required"
        }
      },
      {
        "description": "S5 between R120 000 and R2.3 million: voluntary",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": false,
          "$.annualTurnover": 800000
        },
        "expect": {
          "$.mustRegister": false,
          "$.registrationStatus": "optional"
        }
      },
      {
        "description": "S6 R1.5 million would have been compulsory before 1 April 2026, and is not now",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": false,
          "$.annualTurnover": 1500000
        },
        "expect": {
          "$.mustRegister": false,
          "$.registrationStatus": "optional"
        }
      },
      {
        "description": "S7 below R120 000: registration is not available",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.reverseCharge": false,
          "$.annualTurnover": 90000
        },
        "expect": {
          "$.mustRegister": false,
          "$.registrationStatus": "not available"
        }
      }
    ]
  }
}
