{
  "$comment": "Machine-readable companion to https://valem.run/calculators/croatia/vat. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/croatia/vat",
  "dataUrl": "https://valem.run/calculators/croatia/vat.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "Croatia pdv (vat) model by Valem (https://valem.run/calculators/croatia/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/croatia/vat/verify",
  "country": "croatia",
  "countryName": "Croatia",
  "formula": "vat",
  "formulaName": "PDV (VAT)",
  "title": "PDV Kalkulator 2026 — Croatia VAT calculator",
  "answer": "Croatian VAT is 25% as the general rate with reduced rates of 13% and 5%, and registration becomes compulsory once taxable supplies exceed 60,000 EUR in either the previous or the current calendar year — a threshold raised from 40,000 EUR in 2025.",
  "lang": "en",
  "currency": "EUR",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 6 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": 6,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-10-05"
  },
  "sources": [
    {
      "label": "Porezna uprava — Oporezivanje potrosnje: opca i snizene stope PDV-a",
      "url": "https://porezna-uprava.gov.hr/hr/oporezivanje-potrosnje/4743",
      "checked": "2026-10-05"
    },
    {
      "label": "Porezna uprava — Porez na dodanu vrijednost: prag za upis u registar",
      "url": "https://porezna-uprava.gov.hr/hr/3-porez-na-dodanu-vrijednost-pdv/4269",
      "checked": "2026-10-05"
    }
  ],
  "terminalOutput": "mustRegister",
  "headlineOutput": "vatAmount",
  "inputs": [
    {
      "name": "amount",
      "type": "number",
      "label": "Amount",
      "minimum": 0
    },
    {
      "name": "direction",
      "type": "string",
      "label": "Direction",
      "enum": [
        "add",
        "remove"
      ]
    },
    {
      "name": "category",
      "type": "string",
      "label": "What is being supplied",
      "enum": [
        "standard",
        "reduced1",
        "reduced2"
      ]
    },
    {
      "name": "annualTurnover",
      "type": "number",
      "label": "Turnover this year",
      "minimum": 0
    },
    {
      "name": "reverseCharge",
      "type": "boolean",
      "label": "B2B reverse charge applies"
    },
    {
      "name": "priorYearTurnover",
      "type": "number",
      "label": "Turnover last year",
      "minimum": 0
    }
  ],
  "outputs": [
    {
      "name": "rate",
      "type": "number",
      "formula": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : $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": "priorYearTurnover > $const.registrationThreshold or annualTurnover > $const.registrationThreshold"
    }
  ],
  "testCases": [
    {
      "description": "S1 100.00 EUR net at the standard rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "priorYearTurnover": 0
      },
      "expect": {
        "vatAmount": 25,
        "grossAmount": 125,
        "netAmount": 100
      }
    },
    {
      "description": "S2 125.00 EUR gross back to net at the standard rate",
      "given": {
        "amount": 125,
        "direction": "remove",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "priorYearTurnover": 0
      },
      "expect": {
        "netAmount": 100,
        "vatAmount": 25
      }
    },
    {
      "description": "S3 100.00 EUR net at the 5% rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "reduced1",
        "reverseCharge": false,
        "annualTurnover": 0,
        "priorYearTurnover": 0
      },
      "expect": {
        "vatAmount": 5,
        "grossAmount": 105
      }
    },
    {
      "description": "S4 100.00 EUR net at the 13% rate",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "reduced2",
        "reverseCharge": false,
        "annualTurnover": 0,
        "priorYearTurnover": 0
      },
      "expect": {
        "vatAmount": 13,
        "grossAmount": 113
      }
    },
    {
      "description": "S5 either year over 60,000 EUR forces registration",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 10000,
        "priorYearTurnover": 70000
      },
      "expect": {
        "mustRegister": true
      }
    },
    {
      "description": "S6 both years under the threshold",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 50000,
        "priorYearTurnover": 50000
      },
      "expect": {
        "mustRegister": false
      }
    }
  ],
  "spec": {
    "id": "vat-croatia",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number",
          "minimum": 0
        },
        "direction": {
          "type": "string",
          "enum": [
            "add",
            "remove"
          ]
        },
        "category": {
          "type": "string",
          "enum": [
            "standard",
            "reduced1",
            "reduced2"
          ]
        },
        "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
        },
        "priorYearTurnover": {
          "type": "number",
          "minimum": 0
        }
      }
    },
    "constants": {
      "standardRate": 0.25,
      "reducedRate1": 0.05,
      "reducedRate2": 0.13,
      "registrationThreshold": 60000
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'amount': 100, 'direction': 'add', 'category': 'standard', 'reverseCharge': false, 'annualTurnover': 0, 'priorYearTurnover': 0 }"
      }
    ],
    "derivations": [
      {
        "path": "$.rate",
        "expr": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : $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": "priorYearTurnover > $const.registrationThreshold or annualTurnover > $const.registrationThreshold"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "VAT",
          "layout": "vertical",
          "components": [
            {
              "id": "note",
              "type": "staticText",
              "text": "The registration threshold rose to 60,000 EUR on 1 January 2025, from 40,000 EUR, and is tested against both the previous and the current calendar year. Registration follows the month after the threshold is crossed, or by 15 January where last year is the trigger."
            },
            {
              "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": "category",
                  "type": "selectField",
                  "label": "What is being supplied",
                  "bind": "$.category",
                  "helperText": "The rate follows the category. Exports and intra-EU supplies are zero-rated or exempt — a different mechanism, not a rate you pick here.",
                  "options": [
                    {
                      "value": "standard",
                      "label": "Standard — 25%"
                    },
                    {
                      "value": "reduced1",
                      "label": "Reduced — 5%"
                    },
                    {
                      "value": "reduced2",
                      "label": "Reduced — 13%"
                    }
                  ]
                },
                {
                  "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": "Turnover this year",
                  "bind": "$.annualTurnover"
                },
                {
                  "id": "priorYearTurnover",
                  "type": "numericField",
                  "label": "Turnover last year",
                  "bind": "$.priorYearTurnover"
                }
              ]
            },
            {
              "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 for this category",
                  "value": "$.rate"
                },
                {
                  "label": "VAT registration required",
                  "value": "$.mustRegister"
                }
              ]
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 2,
              "items": [
                {
                  "label": "Porezna uprava — Oporezivanje potrosnje: opca i snizene stope PDV-a",
                  "url": "https://porezna-uprava.gov.hr/hr/oporezivanje-potrosnje/4743",
                  "date": "2026-10-05",
                  "covers": [
                    "standardRate",
                    "reducedRate1",
                    "reducedRate2"
                  ]
                },
                {
                  "label": "Porezna uprava — Porez na dodanu vrijednost: prag za upis u registar",
                  "url": "https://porezna-uprava.gov.hr/hr/3-porez-na-dodanu-vrijednost-pdv/4269",
                  "date": "2026-10-05",
                  "covers": [
                    "registrationThreshold"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "S1 100.00 EUR net at the standard rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.priorYearTurnover": 0
        },
        "expect": {
          "$.vatAmount": 25,
          "$.grossAmount": 125,
          "$.netAmount": 100
        }
      },
      {
        "description": "S2 125.00 EUR gross back to net at the standard rate",
        "given": {
          "$.amount": 125,
          "$.direction": "remove",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.priorYearTurnover": 0
        },
        "expect": {
          "$.netAmount": 100,
          "$.vatAmount": 25
        }
      },
      {
        "description": "S3 100.00 EUR net at the 5% rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "reduced1",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.priorYearTurnover": 0
        },
        "expect": {
          "$.vatAmount": 5,
          "$.grossAmount": 105
        }
      },
      {
        "description": "S4 100.00 EUR net at the 13% rate",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "reduced2",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.priorYearTurnover": 0
        },
        "expect": {
          "$.vatAmount": 13,
          "$.grossAmount": 113
        }
      },
      {
        "description": "S5 either year over 60,000 EUR forces registration",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 10000,
          "$.priorYearTurnover": 70000
        },
        "expect": {
          "$.mustRegister": true
        }
      },
      {
        "description": "S6 both years under the threshold",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 50000,
          "$.priorYearTurnover": 50000
        },
        "expect": {
          "$.mustRegister": false
        }
      }
    ]
  }
}
