{
  "$comment": "Machine-readable companion to https://valem.run/calculators/france/vat. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/france/vat",
  "dataUrl": "https://valem.run/calculators/france/vat.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "France tva (vat) model by Valem (https://valem.run/calculators/france/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/france/vat/verify",
  "country": "france",
  "countryName": "France",
  "formula": "vat",
  "formulaName": "TVA (VAT)",
  "title": "Calcul TVA 2026 — France VAT calculator",
  "answer": "French TVA is 20% as the taux normal, 10% intermédiaire on restaurants and passenger transport, 5,5% réduit on most food and books, and 2,1% on press publications. The franchise en base ends at 85 000 EUR for goods or 37 500 EUR for services.",
  "lang": "en",
  "currency": "EUR",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 11 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": 11,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-10-05"
  },
  "sources": [
    {
      "label": "Legifrance - CGI art. 278, 278-0 bis, 279: taux normal 20%, reduits 5,5% et 10%",
      "url": "https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006069577/LEGISCTA000006179654/",
      "checked": "2026-10-05"
    },
    {
      "label": "Legifrance - CGI art. 298 septies: taux de 2,1% (presse, France metropolitaine)",
      "url": "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044983740",
      "checked": "2026-10-05"
    },
    {
      "label": "impots.gouv.fr - Les regimes d'imposition a la TVA: seuils de franchise en base",
      "url": "https://www.impots.gouv.fr/professionnel/les-regimes-dimposition-la-tva",
      "checked": "2026-10-05"
    }
  ],
  "terminalOutput": "payerFrom",
  "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",
        "superReduced",
        "reduced1",
        "reduced2"
      ]
    },
    {
      "name": "annualTurnover",
      "type": "number",
      "label": "Turnover this calendar year",
      "minimum": 0
    },
    {
      "name": "reverseCharge",
      "type": "boolean",
      "label": "B2B reverse charge applies"
    },
    {
      "name": "supplyType",
      "type": "string",
      "label": "What do you supply",
      "enum": [
        "goods",
        "services"
      ]
    }
  ],
  "outputs": [
    {
      "name": "rate",
      "type": "number",
      "formula": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : category = 'superReduced' ? $const.superReducedRate : $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": "supplyType = 'goods' ? annualTurnover > $const.registrationThresholdGoods : annualTurnover > $const.registrationThresholdServices"
    },
    {
      "name": "payerFrom",
      "type": "string",
      "formula": "supplyType = 'goods' ? (annualTurnover > $const.registrationThresholdGoodsMajore ? 'immediately' : annualTurnover > $const.registrationThresholdGoods ? '1 January next year' : 'not required') : (annualTurnover > $const.registrationThresholdServicesMajore ? 'immediately' : annualTurnover > $const.registrationThresholdServices ? '1 January next year' : 'not required')"
    }
  ],
  "testCases": [
    {
      "description": "S1 100.00 EUR net at the taux normal",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "supplyType": "goods"
      },
      "expect": {
        "vatAmount": 20,
        "grossAmount": 120,
        "netAmount": 100
      }
    },
    {
      "description": "S2 120.00 EUR gross back to net at 20%",
      "given": {
        "amount": 120,
        "direction": "remove",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "supplyType": "goods"
      },
      "expect": {
        "netAmount": 100,
        "vatAmount": 20
      }
    },
    {
      "description": "S3 100.00 EUR net at the 10% taux intermediaire",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "reduced2",
        "reverseCharge": false,
        "annualTurnover": 0,
        "supplyType": "goods"
      },
      "expect": {
        "vatAmount": 10,
        "grossAmount": 110
      }
    },
    {
      "description": "S4 200.00 EUR net at the 5,5% taux reduit",
      "given": {
        "amount": 200,
        "direction": "add",
        "category": "reduced1",
        "reverseCharge": false,
        "annualTurnover": 0,
        "supplyType": "goods"
      },
      "expect": {
        "vatAmount": 11,
        "grossAmount": 211
      }
    },
    {
      "description": "S5 1000.00 EUR net of press at 2,1%",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "superReduced",
        "reverseCharge": false,
        "annualTurnover": 0,
        "supplyType": "goods"
      },
      "expect": {
        "vatAmount": 21,
        "grossAmount": 1021
      }
    },
    {
      "description": "S6 goods under the base limit: franchise stands",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 80000,
        "supplyType": "goods"
      },
      "expect": {
        "mustRegister": false,
        "payerFrom": "not required"
      }
    },
    {
      "description": "S7 goods between base and majore: TVA from next January",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 90000,
        "supplyType": "goods"
      },
      "expect": {
        "mustRegister": true,
        "payerFrom": "1 January next year"
      }
    },
    {
      "description": "S8 goods over the majore limit: TVA immediately",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 95000,
        "supplyType": "goods"
      },
      "expect": {
        "mustRegister": true,
        "payerFrom": "immediately"
      }
    },
    {
      "description": "S9 services between base and majore: the lower pair applies",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 40000,
        "supplyType": "services"
      },
      "expect": {
        "mustRegister": true,
        "payerFrom": "1 January next year"
      }
    },
    {
      "description": "S10 services over the majore limit",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 42000,
        "supplyType": "services"
      },
      "expect": {
        "mustRegister": true,
        "payerFrom": "immediately"
      }
    },
    {
      "description": "S11 services turnover that would be safe for goods",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 80000,
        "supplyType": "services"
      },
      "expect": {
        "mustRegister": true,
        "payerFrom": "immediately"
      }
    }
  ],
  "spec": {
    "id": "vat-france",
    "version": "1.0.0",
    "schema": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number",
          "minimum": 0
        },
        "direction": {
          "type": "string",
          "enum": [
            "add",
            "remove"
          ]
        },
        "category": {
          "type": "string",
          "enum": [
            "standard",
            "superReduced",
            "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
        },
        "payerFrom": {
          "type": "string",
          "readOnly": true
        },
        "supplyType": {
          "type": "string",
          "enum": [
            "goods",
            "services"
          ]
        }
      }
    },
    "constants": {
      "standardRate": 0.2,
      "superReducedRate": 0.021,
      "reducedRate1": 0.055,
      "reducedRate2": 0.1,
      "registrationThresholdGoods": 85000,
      "registrationThresholdGoodsMajore": 93500,
      "registrationThresholdServices": 37500,
      "registrationThresholdServicesMajore": 41250
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'amount': 100, 'direction': 'add', 'category': 'standard', 'reverseCharge': false, 'annualTurnover': 0, 'supplyType': 'goods' }"
      }
    ],
    "derivations": [
      {
        "path": "$.rate",
        "expr": "category = 'reduced1' ? $const.reducedRate1 : category = 'reduced2' ? $const.reducedRate2 : category = 'superReduced' ? $const.superReducedRate : $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": "supplyType = 'goods' ? annualTurnover > $const.registrationThresholdGoods : annualTurnover > $const.registrationThresholdServices"
      },
      {
        "path": "$.payerFrom",
        "expr": "supplyType = 'goods' ? (annualTurnover > $const.registrationThresholdGoodsMajore ? 'immediately' : annualTurnover > $const.registrationThresholdGoods ? '1 January next year' : 'not required') : (annualTurnover > $const.registrationThresholdServicesMajore ? 'immediately' : annualTurnover > $const.registrationThresholdServices ? '1 January next year' : 'not required')"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "VAT",
          "layout": "vertical",
          "components": [
            {
              "id": "note",
              "type": "staticText",
              "text": "France is the only country here whose threshold has TWO axes: the figure depends on what you sell AND there are two of them for each. Pass the base limit (85 000 EUR for goods, 37 500 EUR for services) and the franchise en base ends from the following 1 January; pass the higher majore limit (93 500 EUR / 41 250 EUR) and it ends immediately, mid-year, so TVA is due on the operation that crossed it. Both pairs have applied since 1 January 2025. These are the metropolitan rates: the overseas departements apply their own lower figures under the same code, and the 2,1% shown here is the press rate under article 298 septies - reimbursed medicines also carry 2,1% under a separate provision not cited on this page."
            },
            {
              "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": "Taux normal - 20%"
                    },
                    {
                      "value": "superReduced",
                      "label": "Taux particulier - 2,1% (press publications)"
                    },
                    {
                      "value": "reduced1",
                      "label": "Taux reduit - 5,5% (most food, books, non-alcoholic drinks)"
                    },
                    {
                      "value": "reduced2",
                      "label": "Taux intermediaire - 10% (restaurants, passenger transport)"
                    }
                  ]
                },
                {
                  "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 calendar year",
                  "bind": "$.annualTurnover"
                },
                {
                  "id": "supplyType",
                  "type": "selectField",
                  "label": "What do you supply",
                  "bind": "$.supplyType",
                  "helperText": "Each activity carries TWO figures. Passing the base limit ends the franchise from next January; passing the higher \"majore\" limit ends it on the spot, mid-year.",
                  "options": [
                    {
                      "value": "goods",
                      "label": "Sales of goods - 85 000 EUR base, 93 500 EUR majore"
                    },
                    {
                      "value": "services",
                      "label": "Services - 37 500 EUR base, 41 250 EUR majore"
                    }
                  ]
                }
              ]
            },
            {
              "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"
                },
                {
                  "label": "Registration takes effect",
                  "value": "$.payerFrom"
                }
              ]
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 2,
              "items": [
                {
                  "label": "Legifrance - CGI art. 278, 278-0 bis, 279: taux normal 20%, reduits 5,5% et 10%",
                  "url": "https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006069577/LEGISCTA000006179654/",
                  "date": "2026-10-05",
                  "covers": [
                    "standardRate",
                    "reducedRate1",
                    "reducedRate2"
                  ]
                },
                {
                  "label": "Legifrance - CGI art. 298 septies: taux de 2,1% (presse, France metropolitaine)",
                  "url": "https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044983740",
                  "date": "2026-10-05",
                  "covers": [
                    "superReducedRate"
                  ]
                },
                {
                  "label": "impots.gouv.fr - Les regimes d'imposition a la TVA: seuils de franchise en base",
                  "url": "https://www.impots.gouv.fr/professionnel/les-regimes-dimposition-la-tva",
                  "date": "2026-10-05",
                  "covers": [
                    "registrationThresholdGoods",
                    "registrationThresholdGoodsMajore",
                    "registrationThresholdServices",
                    "registrationThresholdServicesMajore"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "S1 100.00 EUR net at the taux normal",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.vatAmount": 20,
          "$.grossAmount": 120,
          "$.netAmount": 100
        }
      },
      {
        "description": "S2 120.00 EUR gross back to net at 20%",
        "given": {
          "$.amount": 120,
          "$.direction": "remove",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.netAmount": 100,
          "$.vatAmount": 20
        }
      },
      {
        "description": "S3 100.00 EUR net at the 10% taux intermediaire",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "reduced2",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.vatAmount": 10,
          "$.grossAmount": 110
        }
      },
      {
        "description": "S4 200.00 EUR net at the 5,5% taux reduit",
        "given": {
          "$.amount": 200,
          "$.direction": "add",
          "$.category": "reduced1",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.vatAmount": 11,
          "$.grossAmount": 211
        }
      },
      {
        "description": "S5 1000.00 EUR net of press at 2,1%",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "superReduced",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.vatAmount": 21,
          "$.grossAmount": 1021
        }
      },
      {
        "description": "S6 goods under the base limit: franchise stands",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 80000,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.mustRegister": false,
          "$.payerFrom": "not required"
        }
      },
      {
        "description": "S7 goods between base and majore: TVA from next January",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 90000,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.mustRegister": true,
          "$.payerFrom": "1 January next year"
        }
      },
      {
        "description": "S8 goods over the majore limit: TVA immediately",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 95000,
          "$.supplyType": "goods"
        },
        "expect": {
          "$.mustRegister": true,
          "$.payerFrom": "immediately"
        }
      },
      {
        "description": "S9 services between base and majore: the lower pair applies",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 40000,
          "$.supplyType": "services"
        },
        "expect": {
          "$.mustRegister": true,
          "$.payerFrom": "1 January next year"
        }
      },
      {
        "description": "S10 services over the majore limit",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 42000,
          "$.supplyType": "services"
        },
        "expect": {
          "$.mustRegister": true,
          "$.payerFrom": "immediately"
        }
      },
      {
        "description": "S11 services turnover that would be safe for goods",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 80000,
          "$.supplyType": "services"
        },
        "expect": {
          "$.mustRegister": true,
          "$.payerFrom": "immediately"
        }
      }
    ]
  }
}
