CnterDocumentationSign in

Start here

  • What Cnter is
  • Core concepts
  • Quickstart

Platform

  • Authentication
  • Conventions
  • Errors
  • Organization
  • The dashboard

Modules

  • Content Management
  • Online Ordering
  • Restaurant Ordering
  • Promotions
  • Reservations
  • Bookings
  • Contact Form

Payments

  • AgnusPAY
  • Tax

Services

  • Address autocomplete
  • Video
  • Email

Reference

  • API reference

Payments

Tax

Multiple rates, inclusive pricing, and the one figure you are allowed to display.

A full brief for whoever builds against this.

Tax is a specification, not a detail. A buyer who cannot find on your site what the receipt in their hand states will ask about it, and "our website does not show that" is not an answer a business wants to give. Show it on the cart, at checkout and on your confirmation page.

The configuration#

Print tax.label exactly as it comes

"BTW", "MwSt", "TVA", "VAT" — the merchant is registered under one of these and their receipts say it. Do not translate it, do not normalise it to "VAT", and do not build your own mapping from country to label. A German receipt whose website says "VAT" reads as foreign software, and the customer who noticed is the one who asks the restaurant about it.

Everything you need comes back in the tax block from the restaurant settings endpoint, or from your customer's tax settings under Settings then Organization then Tax.

json
{
  "enabled": true,
  "label": "BTW",
  "prices_include_tax": true,
  "rates": [
    { "id": "8f1c...", "name": "Laag (eten)", "rate": 9,  "is_default": true },
    { "id": "b2d7...", "name": "Hoog",        "rate": 21, "is_default": false }
  ]
}
FieldWhat it decides
enabledfalse means this business does not charge tax. Show nothing at all. Not a zero, nothing.
labelWhat to call it: BTW, MwSt, TVA, VAT. Use it verbatim. A German receipt saying "VAT" reads as foreign software.
prices_include_taxWhether the listed price is already the final price.
ratesEvery rate this business is registered for, each with an id, a name and a percentage. One is the default.

Inclusive or added#

`prices_include_tax`MeansShow
trueThe listed price is what the buyer pays.The tax contained in the total. The total does not change.
falseTax is added at checkout.That the buyer pays more than the menu showed, and say it before the payment screen rather than after.

Surprises belong before payment, not after

With prices exclusive of tax, the total on the payment page is higher than every number the buyer has seen so far. Show the addition in the cart. Discovering it on the Stripe page is where carts get abandoned.

Why there is more than one rate#

A menu spanning food and alcohol has more than one rate. In the Netherlands food is 9 percent and alcohol 21, so a single average would be wrong for any order mixing them.

A catalog item carries its own rate in the field your customer mapped. Anything without one falls back to the rate flagged is_default. You do not have to resolve this yourself: it matters because it explains why the breakdown has several lines.

The figure that counts#

The cart does not have to estimate. Quote the basket and the same breakdown comes back before anyone commits, computed by the same function the checkout uses — see Online Ordering. The checkout returns it again on the order itself. Both are the server's arithmetic; the only figure that is a guess is one you worked out yourself.

json
"vat": {
  "total": 4.10,
  "inclusive": true,
  "lines": [
    { "rate_id": "8f1c...", "rate_name": "Laag (eten)", "rate": 9,
      "base": 24.20, "amount": 2.00 },
    { "rate_id": "b2d7...", "rate_name": "Hoog", "rate": 21,
      "base": 12.10, "amount": 2.10 }
  ]
}

Use it on your confirmation page rather than your own arithmetic. The server applies discounts to the taxable base, taxes fees at their own rate, and rounds once per rate group. Recompute that yourself and the two figures will eventually disagree by a cent in front of a buyer.

One shape, two names

The block above is the checkout's, where it is called vat. The quote returns the same three fields under tax. Same numbers, same meaning, different key — read whichever the endpoint you called actually answers with rather than reaching for one name in both places.

Print rate_name. "Incl. Laag 9%" tells someone more than "Incl. 9%", and it is what your customer called it in their own books.

Where it goes on the page#

One layout rule, everywhere the totals appear: the total is the last line.

text
Subtotal            36.30
Delivery             3.50
Happy hour          -5.50
------------------------
Total               34.30
  incl. Laag 9%      2.00
  incl. Hoog 21%     2.10

Subtotal, then fees, then discounts, then the total, with the tax breakdown below it and quieter. With inclusive pricing the tax is already inside the total, so listing it above reads as another charge being added and people add it up twice.

PreviousAgnusPAYNextAddress autocomplete

On this page

  • The configuration
  • Inclusive or added
  • Why there is more than one rate
  • The figure that counts
  • Where it goes on the page