# Venue VAT

Source: https://docs.settlemint.com/docs/concepts/issuing-and-markets/venue-vat
A venue sets a VAT rate, settlement calculates it on each fee line, and the tax moves to a configured recipient in the same settlement as the trade.

A venue can charge VAT on the fees it takes, and that tax has to be visible on the trade and reach the account that owes it to the authority. The venue holds one VAT policy, settlement calculates the tax on each fee line it charges, and on a venue that collects it on chain the tax moves to a configured recipient account inside the same settlement as the trade and the fee.

## The policy [#the-policy]

`GET /api/v2/addons/trading-venues/{venueAddress}/vat-policy` answers the policy in force:

```json
{
  "data": {
    "venueAddress": "0x7f3c2b5e8a1d4c6f9b0e2a5d8c1f4b7e0a3d6c9f",
    "vatRateBps": 500,
    "vatApplicable": true,
    "vatOnChain": true,
    "vatRecipient": "0x5c8e1a4b7d2f9036ec51a8b4d7f0e2c9a6b3d8f1",
    "zeroRatedParticipants": [
      {
        "walletAddress": "0x91b3f7c2d5e8a1046bc9f2a7d4e1c8b5a0f3d6e9",
        "reason": "Fee falls outside the scope of VAT for this participant's registration",
        "actor": "…",
        "createdAt": "2026-05-02T11:07:31.000Z"
      }
    ]
  },
  "links": {
    "self": "/api/v2/addons/trading-venues/0x7f3c2b5e8a1d4c6f9b0e2a5d8c1f4b7e0a3d6c9f/vat-policy"
  }
}
```

The rate is a whole number of basis points from 0 to 10000. The applicability switch decides whether the venue charges VAT at all, and the on-chain switch decides whether the tax is paid on chain or only recorded. A new venue starts at 500 basis points and applicable, with collection off. A venue that existed before this policy was introduced starts at 0 basis points with VAT off, so its settlements do not change until an admin turns it on.

`PUT` to the same route changes the policy. `vatRateBps`, `vatApplicable` and `walletVerification` are required. `vatOnChain`, `vatRecipient`, `zeroRatedParticipants` and `reason` are optional, and a field the request leaves out keeps its stored value. A `zeroRatedParticipants` list replaces the stored list. It needs the venue admin role and a wallet verification. Every VAT policy change, whichever field it touches, follows the **Trading venues** row under "Approvals" on the "General" page of "Organisation settings". With the row on, the change becomes a venue configuration approval whose `commandType` is `venue-vat-policy`: a second venue admin applies it, the admin who proposed it cannot decide it, and a venue with a single admin cannot change its VAT policy until a second admin holds the role. With the row off, the change applies at once and the response carries the applied policy. The change log keeps the policy before and after.

A reason is required when the on-chain switch, the recipient or the zero-rated list changes, and the request audit trail records it. A change that could never apply is refused with 422 DALP-20523: collection on chain with no recipient, collection on chain while VAT is not applicable, and a change that needs a reason and carries none. When a change switches collection on chain on, or names a new recipient while it is on, the recipient is checked as well: the venue or its escrow account is refused with the same code, and so is a recipient that one of the venue's quote tokens would refuse. That check runs the token's own transfer rules with the escrow as the payer, so the recipient has to be able to receive every quote token the venue settles in. With the row on, the same checks run when the change is proposed and again when it is applied.

In the Console, "VAT policy" on the venue's Listing rules page holds these fields:

- **VAT rate (basis points)**
- **Charge VAT on fees**
- **Collect VAT on chain**
- **VAT recipient**
- **Participants that pay 0% VAT**
- **Reason**

The line under the rate converts the rate you enter, such as "2,100 basis points is a VAT rate of 21%.", and while the field holds no valid rate it gives the scale: "Enter the rate in basis points: 100 basis points is 1%."

You save them with **Save the VAT policy**. A change that waits for a second admin reads "Sent for approval. Another venue admin must approve it." and one that applies at once reads "The VAT policy is saved."

## How the VAT is calculated [#how-the-vat-is-calculated]

Each buyer fee line and each seller fee line carries its own VAT: the line amount multiplied by the rate in basis points, rounded up to the next base unit of the quote token. A fee line whose type does not carry VAT records zero, an inapplicable policy records zero on every line, and a zero rate records zero.

A wallet on the zero-rated list pays its fee and no VAT on its side of a trade, whether it buys or sells, and the counterparty still pays its own share. Every change to the list carries a reason, stored with the wallet and the acting user.

The fee and the VAT stay separate values. A settled fill records the buyer fee, the seller fee, the buyer VAT, the seller VAT and the recipient the tax went to, and every fee line records its amount and its VAT. The recorded fee is the fee the chain charged minus its VAT, so a sum over fees never counts the tax twice. The trade fee event carries `amount` and `vatAmount`, and a statement line carries the fee and its VAT as its own fields.

## Paying it on chain [#paying-it-on-chain]

The venue contract needs no VAT field. A settlement's fee route is a list of recipient and amount entries that must add up to the two sides' fee totals, and the escrow pays one transfer per entry in the same post as the trade. The VAT rides as one more entry, for the two sides' VAT together, paid to the VAT recipient. The platform builds the fee route from the pinned VAT policy, and the venue contract checks only that the entries add up to the fee totals and stay within each order's signed maximum fee.

The settlement instructions show the tax as its own `vat` leg from the buyer to the VAT recipient, and the seller's cash leg is the quote amount minus the seller's fee and the seller's VAT, so each side bears its own share and the chain transfer reconciles with the calculated VAT. The VAT rides the settlement that delivers the trade, so an instrument with a holding period pays it when the trade delivers.

Before a batch settles fills that owe VAT, it checks the recipient again with the quote token's transfer rules, from the escrow as the payer. A recipient the token now refuses holds those fills instead of sending them into a revert, the platform logs an error that names the venue, the recipient and the quote token, and the rest of the batch settles.

A settlement that carries no fee schedule cannot route VAT. A fill that is charged a fee there and owes VAT on it is parked with the reason for an operator to retry, while the other fills of the batch settle. A fill charged no fee, because the instrument charges none or a discount waives it, settles with no fee and no VAT leg.

## A held fill keeps the rule it was staged with [#a-held-fill-keeps-the-rule-it-was-staged-with]

The policy is pinned on the fill when it is matched: the rate, the applicability, whether collection is on chain, the recipient and whether each side is zero-rated. A change therefore applies to fills matched after it, and a fill staged before the switch settles under the rule it was staged with. A recovery replay reads the same pinned rule, so trades of one settlement transaction never carry different VAT.

A held fill keeps the recipient it was staged with, and a retry pays that recipient. Clearing that recipient's compliance block or busting the fill releases it. Naming a new VAT recipient does not.

## The signed fee limit [#the-signed-fee-limit]

The fee cap a client signs has to hold every fee the order can be charged across all of its fills. The venue prices that worst case with one function, shared by order intake and every client's order ticket: the order split into the most fills it can have, one per lot, each fill priced at the highest tier it can reach, with the fixed and minimum fees of the instrument's fee schedule charged on every fill and the percentage fee on the whole order. On a venue that collects VAT on chain, the VAT on those fees is added, rounded up per fill. The cap is the smallest whole number of basis points that covers that total.

An instrument with no fee schedule is priced on its own rate instead: the higher of its maker and taker fee on the whole order, plus the venue's on-chain fixed fees, the order fee once and the settlement fee on every fill. The contract charges those fixed fees only when no fee schedule applies, and the indexer reads them from the venue's `FixedFeesUpdated` event.

The single-instrument read carries `feeSchedule`, the tiers of the instrument's current fee schedule, and `vatOnChain`, and every instrument read carries `orderFee` and `settlementFee`, the venue's fixed fees in quote token units, so a client can compute the same cap. The order ticket signs it and reserves the principal plus the fees at that cap. An order whose signed cap is lower is refused at intake with `max-fee-below-schedule` and the message "The order's maximum fee of X basis points is below the Y this instrument's fee schedule, fixed fees and VAT can charge across the order's most fills".

An order whose worst case exceeds the venue's maximum of 1000 basis points, 10% of its value, cannot be covered by any cap the venue accepts. It is refused at intake with `fee-cap-above-venue-maximum` and the message "The fees this order can be charged across its most fills come to X basis points of its value, beyond the venue's maximum of 1000, so no fee limit the venue accepts covers it". A larger order, or a schedule with lower fixed fees, brings the worst case back under the maximum.

Switching collection on, or raising the rate while collection is on, is refused with 409 DALP-20524 while open orders on the venue were signed under a fee limit that cannot hold the fee plus VAT. The count and the policy write run in one transaction that holds the venue's VAT lock, the write rereads the policy under that lock, and order entry takes the same lock while it writes an accepted order. An order entered at the same moment is therefore either counted or refused, and a change prepared against an older reading of the policy is still checked against the policy it replaces.

On the investor side, the ticket shows **Estimated VAT** beside the fee, and the review step shows the same VAT, at the digits of the instrument's price step and rounded down. When the VAT has more digits it shows "≈" before it, and pointing at it or moving focus to it shows the exact amount. The buy's reservation line reads "Order amount plus maximum fee, VAT included" on a venue that collects VAT on chain, "Order amount plus maximum fee, VAT not reserved" where the VAT is only recorded, and plain "Order amount plus maximum fee" where VAT does not apply.

## Reversing a trade [#reversing-a-trade]

The buyer paid the whole `vat` leg, so a bust that reverses a delivered trade force-transfers that leg, both sides' VAT, from the VAT recipient back to the buyer, under the operations signer's custodian role on the quote token, in the same batch as the fee refund. A quote token on which the operations signer holds no custodian role cannot have that leg reversed. The seller returns the cash it received, which is the quote amount minus its fee and its VAT. A trade whose VAT was only recorded has no VAT leg to reverse. [Trading Venue](https://docs.settlemint.com/docs/concepts/issuing-and-markets/trading-venue) covers the bust workflow itself.
