{
  "$comment": "Machine-readable companion to https://valem.run/calculators/china/vat. Formula, inputs, outputs, engine-verified test vectors, cited sources and the re-runnable Valem ModelSpec behind the page.",
  "url": "https://valem.run/calculators/china/vat",
  "dataUrl": "https://valem.run/calculators/china/vat.json",
  "license": {
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "China 增值税 (VAT) model by Valem (https://valem.run/calculators/china/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/china/vat/verify",
  "country": "china",
  "countryName": "China",
  "formula": "vat",
  "formulaName": "VAT",
  "localName": "增值税",
  "localLang": "zh",
  "englishName": "VAT",
  "title": "增值税计算器 2026 — China VAT 13% / 9% / 6%",
  "answer": "China’s VAT Law, in force from 1 January 2026, keeps three rates — 13% on goods, 9% on transport, construction, real estate and listed staples, and 6% on other services — with 0% on exports, while small-scale taxpayers pay a 3% levy rate that is cut to 1% in 2026 and 2027.",
  "lang": "en",
  "currency": "CNY",
  "taxYear": "2026",
  "verification": {
    "claim": "internal-consistency",
    "statement": "The Valem engine reproduces this model's stated formula through 12 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": 12,
    "ratesAreIllustrative": false,
    "sourcesCheckedOn": "2026-10-31"
  },
  "sources": [
    {
      "label": "VAT Law of the PRC (增值税法, in force 1 Jan 2026, 全文有效): art. 9 (small-scale: annual sales not over 5 million yuan), art. 10 (13% / 9% / 6% / 0%), art. 11 (3% levy rate), art. 15 (withholding), art. 23 (threshold, whole amount)",
      "url": "https://fgk.chinatax.gov.cn/zcfgk/c100009/c5237365/content.html",
      "checked": "2026-10-31"
    },
    {
      "label": "MOF and STA Announcement 2026 No. 10 (30 Jan 2026): part 1, threshold of 100,000 yuan of monthly sales; part 3(3)6, small-scale 3% reduced to 1%, 2026–2027, except real estate and land-use rights",
      "url": "https://fgk.chinatax.gov.cn/zcfgk/c102416/c5247434/content.html",
      "checked": "2026-10-31"
    }
  ],
  "terminalOutput": "mustRegister",
  "headlineOutput": "vatAmount",
  "inputs": [
    {
      "name": "amount",
      "type": "number",
      "label": "Amount (CNY)",
      "minimum": 0
    },
    {
      "name": "direction",
      "type": "string",
      "label": "This amount is",
      "enum": [
        "add",
        "remove"
      ]
    },
    {
      "name": "category",
      "type": "string",
      "label": "What is being sold",
      "enum": [
        "standard",
        "reduced1",
        "reduced2",
        "zero",
        "smallScale",
        "simplified"
      ]
    },
    {
      "name": "annualTurnover",
      "type": "number",
      "label": "Annual taxable sales (CNY)",
      "minimum": 0
    },
    {
      "name": "monthlySales",
      "type": "number",
      "label": "Monthly sales (CNY) — small-scale taxpayers",
      "minimum": 0
    },
    {
      "name": "reverseCharge",
      "type": "boolean",
      "label": "Overseas seller — the Chinese buyer withholds the VAT"
    }
  ],
  "outputs": [
    {
      "name": "rate",
      "type": "number",
      "formula": "category = 'reduced1' ? $const.reducedRate1 : (category = 'reduced2' ? $const.reducedRate2 : (category = 'zero' ? $const.zeroRate : (category = 'simplified' ? $const.simplifiedRate : (category = 'smallScale' ? $const.smallScaleReducedRate : $const.standardRate))))"
    },
    {
      "name": "effectiveRate",
      "type": "number",
      "formula": "reverseCharge or belowThreshold ? 0 : rate"
    },
    {
      "name": "netAmount",
      "type": "number",
      "label": "Net",
      "format": "currency",
      "formula": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
    },
    {
      "name": "vatAmount",
      "type": "number",
      "label": "VAT charged by the seller",
      "format": "currency",
      "formula": "$round(netAmount * effectiveRate, 2)"
    },
    {
      "name": "grossAmount",
      "type": "number",
      "label": "Gross",
      "format": "currency",
      "formula": "$round(netAmount + vatAmount, 2)"
    },
    {
      "name": "mustRegister",
      "type": "boolean",
      "formula": "annualTurnover > $const.registrationThreshold"
    },
    {
      "name": "belowThreshold",
      "type": "boolean",
      "formula": "category = 'smallScale' and $n(monthlySales) < $const.monthlyThreshold"
    },
    {
      "name": "withheldVat",
      "type": "number",
      "label": "VAT withheld and remitted by the buyer",
      "format": "currency",
      "formula": "reverseCharge ? $round(netAmount * rate, 2) : 0"
    }
  ],
  "testCases": [
    {
      "description": "V1 1,000 yuan of goods at 13%",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 130,
        "grossAmount": 1130,
        "netAmount": 1000
      }
    },
    {
      "description": "V2 1,130 yuan gross back to net at 13%",
      "given": {
        "amount": 1130,
        "direction": "remove",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "netAmount": 1000,
        "vatAmount": 130
      }
    },
    {
      "description": "V3 construction at 9%",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "reduced1",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 90,
        "grossAmount": 1090
      }
    },
    {
      "description": "V4 consulting at 6%",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "reduced2",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 60,
        "grossAmount": 1060
      }
    },
    {
      "description": "V5 small-scale taxpayer at the 2026 1% rate",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "smallScale",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 10,
        "grossAmount": 1010
      }
    },
    {
      "description": "V6 exported goods are zero-rated",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "zero",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 0,
        "grossAmount": 1000
      }
    },
    {
      "description": "V7 3% simplified levy rate",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "simplified",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 30
      }
    },
    {
      "description": "V8 overseas seller: the buyer withholds 130 at the rate; the seller charges none",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "standard",
        "reverseCharge": true,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "vatAmount": 0,
        "grossAmount": 1000,
        "withheldVat": 130
      }
    },
    {
      "description": "V9 exactly 5 million yuan is still small-scale (“未超过五百万元”)",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 5000000,
        "monthlySales": 100000
      },
      "expect": {
        "mustRegister": false
      }
    },
    {
      "description": "V10 above 5 million yuan: general taxpayer",
      "given": {
        "amount": 100,
        "direction": "add",
        "category": "standard",
        "reverseCharge": false,
        "annualTurnover": 6000000,
        "monthlySales": 100000
      },
      "expect": {
        "mustRegister": true
      }
    },
    {
      "description": "V11 small-scale, monthly sales of 99,999 do not reach the threshold (“未达到起征点”): no VAT",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "smallScale",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 99999
      },
      "expect": {
        "belowThreshold": true,
        "vatAmount": 0,
        "grossAmount": 1000
      }
    },
    {
      "description": "V12 small-scale, monthly sales of exactly 100,000 reach it: 1% on the whole amount",
      "given": {
        "amount": 1000,
        "direction": "add",
        "category": "smallScale",
        "reverseCharge": false,
        "annualTurnover": 0,
        "monthlySales": 100000
      },
      "expect": {
        "belowThreshold": false,
        "vatAmount": 10,
        "grossAmount": 1010
      }
    }
  ],
  "spec": {
    "id": "vat-china",
    "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",
            "zero",
            "smallScale",
            "simplified"
          ]
        },
        "annualTurnover": {
          "type": "number",
          "minimum": 0
        },
        "monthlySales": {
          "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
        },
        "belowThreshold": {
          "type": "boolean",
          "readOnly": true
        },
        "withheldVat": {
          "type": "number",
          "readOnly": true
        }
      }
    },
    "constants": {
      "standardRate": 0.13,
      "reducedRate1": 0.09,
      "reducedRate2": 0.06,
      "zeroRate": 0,
      "simplifiedRate": 0.03,
      "smallScaleReducedRate": 0.01,
      "registrationThreshold": 5000000,
      "monthlyThreshold": 100000
    },
    "library": {
      "layers": [
        {
          "id": "statutory",
          "define": "(\n  /* Shared statutory helpers — the canonical copy (docs/sandbox/d8-statutory-families.md §5.4).\n     DO NOT EDIT A SPEC'S INLINED COPY. Edit this file and run `npm run sync:helpers`; a vitest\n     assertion and a Java assertion both require every inlined copy to be byte-identical to this one.\n\n     Why inlined rather than referenced: the `library` section's `ref` form — a library shared\n     between models — is still proposed, gated on the model-references design (see\n     ../../../../docs/design/library/jsonata-library.md). Inlining keeps each spec self-contained,\n     which is what lets `#e=` embedding, `#share=` import and MCP forking work with no resolver.\n\n     TWO TRAPS, both of which fail SILENTLY and both of which bit during the debt-payoff build:\n\n       1. A library function sees ONLY its arguments. It cannot read the consuming document — not\n          through a bare field name, not through `$`, not through `$$`. Everything these helpers\n          need is passed in. (`$const` is late-bound and so would resolve, but relying on it would\n          couple a shared helper to one spec's constant names.)\n       2. ONE null member wrecks a whole aggregate, and the two engines disagree about how. The JS\n          reference implementation THROWS (\"Argument 1 of function sum must be an array of\n          numbers\"); the Java port can instead yield null for the entire aggregate. Neither gives a\n          partial total, and the null-yielding form is the dangerous one because it is silent. So\n          callers coerce with `$n()` below before aggregating, which makes the behaviour identical\n          in both engines — measured, not assumed: see helpers.test.ts.\n\n       3. A PATH STEP DIRECTLY ON A CALL RESULT RETURNS NOTHING in the Java engine. This matters for\n          every caller of $amortize, which is the one helper here returning an object:\n\n              $amortize(p, r, n, 0).months            -> empty in Java, 360 in JS.  WRONG\n              ($a := $amortize(p, r, n, 0); $a.months) -> 360 in both.               RIGHT\n\n          Bind the result to a variable, then step into it. The JS reference accepts both forms, so\n          this is invisible until the page is served by the real engine, and it fails as a blank\n          field rather than an error. Measured with a probe, not inferred — the field simply does\n          not appear. */\n\n  /* Number coercion with an explicit zero default. The guard against trap 2. */\n  $n := function($v) { $v = null or $not($exists($v)) ? 0 : $number($v) };\n\n  /* ISO date -> its year / month / day parts. String slicing rather than $fromMillis formatting:\n     these are statutory dates (\"2026-04-06\"), and a timezone-sensitive round-trip through millis\n     can shift the day, which silently moves a service anniversary across a band boundary. */\n  $isoY := function($d) { $number($substring($d, 0, 4)) };\n  $isoM := function($d) { $number($substring($d, 5, 2)) };\n  $isoD := function($d) { $number($substring($d, 8, 2)) };\n\n  /* Whole years of completed service between two ISO dates. Counts an anniversary as reached only\n     when the month-and-day has arrived, which is what \"completed years of service\" means in every\n     severance statute — not a 365.25-day division, whose drift crosses a 5-year band boundary in\n     the wrong direction roughly one year in four. */\n  $yearsBetween := function($from, $to) { (\n    $y := $isoY($to) - $isoY($from);\n    $beforeAnniversary := $isoM($to) < $isoM($from)\n      or ($isoM($to) = $isoM($from) and $isoD($to) < $isoD($from));\n    $beforeAnniversary ? $y - 1 : $y\n  ) };\n\n  /* Whole completed months between two ISO dates, same convention. */\n  $monthsBetween := function($from, $to) { (\n    $m := ($isoY($to) - $isoY($from)) * 12 + ($isoM($to) - $isoM($from));\n    $isoD($to) < $isoD($from) ? $m - 1 : $m\n  ) };\n\n  /* Inclusive count of days between two ISO dates — both endpoints counted, because a leave year\n     runs from its first day to its last and an employee present on both is present for both.\n     Pro-rata accrual is then $proRataDays(a, b) / $proRataDays(yearStart, yearEnd). */\n  $proRataDays := function($from, $to) {\n    ($toMillis($to) - $toMillis($from)) / 86400000 + 1\n  };\n\n  /* Progressive charge across bands. `$bands` is ordered lowest-first, each {\"upTo\": n, \"rate\": r};\n     the final band's `upTo` is omitted or null to mean \"no ceiling\". Each band's rate applies ONLY\n     to the slice of the amount inside it — the single most common error in a hand-written bracket\n     walk is applying the top rate to the whole amount. Returns 0 for a non-positive amount. */\n  $bandedCharge := function($amount, $bands) { (\n    $a := $n($amount);\n    $a <= 0 ? 0 : $reduce($bands, function($acc, $band) { (\n      $ceiling := $exists($band.upTo) and $band.upTo != null ? $band.upTo : $a;\n      $top := $ceiling < $a ? $ceiling : $a;\n      $slice := $top - $acc.floor;\n      {\n        \"floor\": $top > $acc.floor ? $top : $acc.floor,\n        \"charge\": $acc.charge + ($slice > 0 ? $slice * $n($band.rate) : 0)\n      }\n    ) }, {\"floor\": 0, \"charge\": 0}).charge\n  ) };\n\n  /* Clamp into [floor, cap]. Either bound may be omitted (null) to leave that side open — a benefit\n     with a cap and no floor is as common as one with both. */\n  $clampFloorCap := function($value, $floor, $cap) { (\n    $v := $n($value);\n    $withFloor := $exists($floor) and $floor != null and $v < $floor ? $floor : $v;\n    $exists($cap) and $cap != null and $withFloor > $cap ? $cap : $withFloor\n  ) };\n\n  /* Level annuity payment for a principal over `$months` at `$annualRatePct` nominal, compounded\n     monthly. Falls back to straight-line division at a zero rate, where the standard formula\n     divides by zero. */\n  $annuityPayment := function($principal, $annualRatePct, $months) { (\n    $p := $n($principal);\n    $m := $n($months);\n    $i := $n($annualRatePct) / 1200;\n    $m <= 0 ? 0 : ($i = 0 ? $p / $m : $p * $i * $power(1 + $i, $m) / ($power(1 + $i, $m) - 1))\n  ) };\n\n  /* Amortisation schedule: one row per month until the balance clears or `$months` is reached.\n     Returns {\"payment\", \"months\", \"totalInterest\", \"schedule\": [{month, interest, principal,\n     balance}]}. `$extra` is an optional monthly overpayment.\n\n     A real month-by-month fold rather than a closed form, because an overpayment changes every\n     later row — the same reason debt-payoff simulates. Bounded by `$months`, so it always\n     terminates. */\n  $amortize := function($principal, $annualRatePct, $months, $extra) { (\n    $i := $n($annualRatePct) / 1200;\n    $pay := $annuityPayment($principal, $annualRatePct, $months) + $n($extra);\n    $r := $reduce([1..$n($months)], function($acc, $month) {\n      $acc.balance <= 0 ? $acc : (\n        /* The running balance is kept UNROUNDED and only the emitted row is rounded. Rounding the\n           balance each month instead accumulates drift: at 200,000 over 360 months it left 2.83\n           still owing in the final row, which would break the \"final balance is zero\" invariant\n           (§7.3) and look to a reader like the schedule does not pay the loan off. Lenders compute\n           on the exact balance and adjust the last payment, which is what this does. */\n        $interest := $acc.balance * $i;\n        $due := $acc.balance + $interest < $pay ? $acc.balance + $interest : $pay;\n        $principalPart := $due - $interest;\n        $balance := $acc.balance - $principalPart;\n        {\n          \"balance\": $balance,\n          \"totalInterest\": $acc.totalInterest + $interest,\n          \"schedule\": $append($acc.schedule, [{\n            \"month\": $month,\n            \"interest\": $round($interest, 2),\n            \"principal\": $round($principalPart, 2),\n            \"balance\": $round($balance, 2)\n          }])\n        }\n      )\n    }, {\"balance\": $n($principal), \"totalInterest\": 0, \"schedule\": []});\n    {\n      \"payment\": $round($pay, 2),\n      \"months\": $count($r.schedule),\n      \"totalInterest\": $round($r.totalInterest, 2),\n      \"schedule\": [$r.schedule]\n    }\n  ) };\n\n  [\"n\", \"isoY\", \"isoM\", \"isoD\", \"yearsBetween\", \"monthsBetween\", \"proRataDays\",\n   \"bandedCharge\", \"clampFloorCap\", \"annuityPayment\", \"amortize\"]\n)\n"
        }
      ]
    },
    "defaultValues": [
      {
        "path": "$",
        "expr": "{ 'amount': 100, 'direction': 'add', 'category': 'standard', 'reverseCharge': false, 'annualTurnover': 0, 'monthlySales': 100000 }"
      }
    ],
    "derivations": [
      {
        "path": "$.rate",
        "expr": "category = 'reduced1' ? $const.reducedRate1 : (category = 'reduced2' ? $const.reducedRate2 : (category = 'zero' ? $const.zeroRate : (category = 'simplified' ? $const.simplifiedRate : (category = 'smallScale' ? $const.smallScaleReducedRate : $const.standardRate))))"
      },
      {
        "path": "$.belowThreshold",
        "expr": "category = 'smallScale' and $n(monthlySales) < $const.monthlyThreshold"
      },
      {
        "path": "$.effectiveRate",
        "expr": "reverseCharge or belowThreshold ? 0 : rate"
      },
      {
        "path": "$.netAmount",
        "expr": "direction = 'remove' ? $round(amount / (1 + effectiveRate), 2) : $round(amount, 2)"
      },
      {
        "path": "$.vatAmount",
        "expr": "$round(netAmount * effectiveRate, 2)"
      },
      {
        "path": "$.withheldVat",
        "expr": "reverseCharge ? $round(netAmount * rate, 2) : 0"
      },
      {
        "path": "$.grossAmount",
        "expr": "$round(netAmount + vatAmount, 2)"
      },
      {
        "path": "$.mustRegister",
        "expr": "annualTurnover > $const.registrationThreshold"
      }
    ],
    "constraints": [],
    "viewDefinition": {
      "renderer": "builtin",
      "defaultView": "main",
      "views": [
        {
          "id": "main",
          "label": "VAT",
          "layout": "vertical",
          "components": [
            {
              "id": "amount",
              "type": "numericField",
              "label": "Amount (CNY)",
              "bind": "$.amount"
            },
            {
              "id": "direction",
              "type": "selectField",
              "label": "This amount is",
              "bind": "$.direction",
              "options": [
                {
                  "value": "add",
                  "label": "Net — add VAT"
                },
                {
                  "value": "remove",
                  "label": "Gross — remove VAT"
                }
              ]
            },
            {
              "id": "category",
              "type": "selectField",
              "label": "What is being sold",
              "bind": "$.category",
              "options": [
                {
                  "value": "standard",
                  "label": "13% — goods, processing and repair, leasing of movable property"
                },
                {
                  "value": "reduced1",
                  "label": "9% — transport, construction, real estate, telecoms basics, farm produce, utilities, books"
                },
                {
                  "value": "reduced2",
                  "label": "6% — other services and intangible assets"
                },
                {
                  "value": "zero",
                  "label": "0% — exported goods, listed cross-border services"
                },
                {
                  "value": "smallScale",
                  "label": "1% — small-scale taxpayer, 2026–2027 reduced levy rate"
                },
                {
                  "value": "simplified",
                  "label": "3% — simplified method (statutory levy rate)"
                }
              ]
            },
            {
              "id": "reverse",
              "type": "checkboxField",
              "label": "Overseas seller — the Chinese buyer withholds the VAT",
              "bind": "$.reverseCharge"
            },
            {
              "id": "monthlySales",
              "type": "numericField",
              "label": "Monthly sales (CNY) — small-scale taxpayers",
              "bind": "$.monthlySales",
              "helperText": "Under 100,000 yuan a month a small-scale taxpayer pays no VAT; at 100,000 or more, VAT is due on the whole amount."
            },
            {
              "id": "turnover",
              "type": "numericField",
              "label": "Annual taxable sales (CNY)",
              "bind": "$.annualTurnover",
              "helperText": "Over 5 million yuan a year you can no longer be a small-scale taxpayer."
            },
            {
              "id": "tiles",
              "type": "group",
              "layout": "horizontal",
              "components": [
                {
                  "id": "vatTile",
                  "type": "statTile",
                  "label": "VAT charged by the seller",
                  "bind": "$.vatAmount",
                  "format": "currency",
                  "currency": "CNY"
                },
                {
                  "id": "grossTile",
                  "type": "statTile",
                  "label": "Gross",
                  "bind": "$.grossAmount",
                  "format": "currency",
                  "currency": "CNY"
                }
              ]
            },
            {
              "id": "breakdown",
              "type": "keyValueList",
              "label": "Breakdown",
              "items": [
                {
                  "label": "Net",
                  "bind": "$.netAmount",
                  "format": "currency",
                  "currency": "CNY"
                },
                {
                  "label": "VAT charged by the seller",
                  "bind": "$.vatAmount",
                  "format": "currency",
                  "currency": "CNY"
                },
                {
                  "label": "VAT withheld and remitted by the buyer",
                  "bind": "$.withheldVat",
                  "format": "currency",
                  "currency": "CNY"
                },
                {
                  "label": "Gross",
                  "bind": "$.grossAmount",
                  "format": "currency",
                  "currency": "CNY"
                },
                {
                  "label": "Must register as a general taxpayer",
                  "value": "$.mustRegister"
                },
                {
                  "label": "Exempt: small-scale, monthly sales under 100,000",
                  "value": "$.belowThreshold"
                }
              ]
            },
            {
              "id": "note",
              "type": "staticText",
              "text": "The VAT Law of the PRC (增值税法) replaced the 1993 interim regulations on 1 January 2026 and kept the rates: 13% on goods, processing, repair and leasing of movable property; 9% on transport, postal, basic telecoms, construction, real-estate leasing and sales, land-use rights and listed staples (farm produce, utilities, books, feed and fertiliser); 6% on other services and intangibles; 0% on exported goods and on cross-border services and intangibles the State Council lists. A small-scale taxpayer — annual sales not over 5 million yuan — pays at the 3% levy rate without input credits, cut to 1% from 2026 to 2027 except on sales and leases of real estate and transfers of land-use rights. A small-scale taxpayer whose monthly sales do not reach 100,000 yuan (300,000 a quarter) pays no VAT; at 100,000 or more VAT is due on the whole amount (art. 23). For an overseas seller with no agent, the buyer withholds VAT at the rate on the sales amount (art. 15), shown as withheld rather than charged by the seller. Estimate, not tax advice."
            },
            {
              "id": "sources",
              "type": "sourceList",
              "label": "Sources",
              "layers": 2,
              "items": [
                {
                  "label": "VAT Law of the PRC (增值税法, in force 1 Jan 2026, 全文有效): art. 9 (small-scale: annual sales not over 5 million yuan), art. 10 (13% / 9% / 6% / 0%), art. 11 (3% levy rate), art. 15 (withholding), art. 23 (threshold, whole amount)",
                  "url": "https://fgk.chinatax.gov.cn/zcfgk/c100009/c5237365/content.html",
                  "date": "2026-10-31",
                  "covers": [
                    "standardRate",
                    "reducedRate1",
                    "reducedRate2",
                    "zeroRate",
                    "simplifiedRate",
                    "registrationThreshold"
                  ]
                },
                {
                  "label": "MOF and STA Announcement 2026 No. 10 (30 Jan 2026): part 1, threshold of 100,000 yuan of monthly sales; part 3(3)6, small-scale 3% reduced to 1%, 2026–2027, except real estate and land-use rights",
                  "url": "https://fgk.chinatax.gov.cn/zcfgk/c102416/c5247434/content.html",
                  "date": "2026-10-31",
                  "covers": [
                    "smallScaleReducedRate",
                    "monthlyThreshold"
                  ]
                }
              ]
            }
          ]
        }
      ]
    },
    "tests": [
      {
        "description": "V1 1,000 yuan of goods at 13%",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 130,
          "$.grossAmount": 1130,
          "$.netAmount": 1000
        }
      },
      {
        "description": "V2 1,130 yuan gross back to net at 13%",
        "given": {
          "$.amount": 1130,
          "$.direction": "remove",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.netAmount": 1000,
          "$.vatAmount": 130
        }
      },
      {
        "description": "V3 construction at 9%",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "reduced1",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 90,
          "$.grossAmount": 1090
        }
      },
      {
        "description": "V4 consulting at 6%",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "reduced2",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 60,
          "$.grossAmount": 1060
        }
      },
      {
        "description": "V5 small-scale taxpayer at the 2026 1% rate",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "smallScale",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 10,
          "$.grossAmount": 1010
        }
      },
      {
        "description": "V6 exported goods are zero-rated",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "zero",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 0,
          "$.grossAmount": 1000
        }
      },
      {
        "description": "V7 3% simplified levy rate",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "simplified",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 30
        }
      },
      {
        "description": "V8 overseas seller: the buyer withholds 130 at the rate; the seller charges none",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": true,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.vatAmount": 0,
          "$.grossAmount": 1000,
          "$.withheldVat": 130
        }
      },
      {
        "description": "V9 exactly 5 million yuan is still small-scale (“未超过五百万元”)",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 5000000,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.mustRegister": false
        }
      },
      {
        "description": "V10 above 5 million yuan: general taxpayer",
        "given": {
          "$.amount": 100,
          "$.direction": "add",
          "$.category": "standard",
          "$.reverseCharge": false,
          "$.annualTurnover": 6000000,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.mustRegister": true
        }
      },
      {
        "description": "V11 small-scale, monthly sales of 99,999 do not reach the threshold (“未达到起征点”): no VAT",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "smallScale",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 99999
        },
        "expect": {
          "$.belowThreshold": true,
          "$.vatAmount": 0,
          "$.grossAmount": 1000
        }
      },
      {
        "description": "V12 small-scale, monthly sales of exactly 100,000 reach it: 1% on the whole amount",
        "given": {
          "$.amount": 1000,
          "$.direction": "add",
          "$.category": "smallScale",
          "$.reverseCharge": false,
          "$.annualTurnover": 0,
          "$.monthlySales": 100000
        },
        "expect": {
          "$.belowThreshold": false,
          "$.vatAmount": 10,
          "$.grossAmount": 1010
        }
      }
    ]
  }
}
