Tax
What Wajub computes, what it records, and what it never does to the amount.
Tax answers one question on demand, "how much tax is owed on this amount in this country", and keeps a ledger of the answer for every payment you actually collect. That ledger is what you file from.
What it does not do is touch your payments. Turning Tax on changes no amount, adds no line to a charge, and is invisible to your payer unless you put it there yourself.
Tax is never added to what you charge
The amount your customer pays is the amount you created the payment for, plus the platform fee when you pass that on to them. The tax is not in it. If your price is meant to carry tax, the total has to be your total: ask for the tax first, then create the payment for the sum. Wajub will record the tax either way, and it will record it against whatever amount you charged.
Three things happen around a payment, and only one of them moves money.
1Asked, not applied
The calculator answers a question. Ignoring the answer changes nothing about your payment.
2Nothing is added
The charge stays the amount you created it for. A price that carries tax is yours to compute.
3Recorded once paid
One row per collected payment, in a ledger of its own. That ledger is what you file from.
Two things, on two timelines
Everything in this section is one or the other, and confusing them is the source of most of the questions.
| Calculation | Record | |
|---|---|---|
| What it is | An answer to a question | A row in your tax ledger |
| When | Whenever you ask, before you charge | Automatically, once the money is credited |
| Triggered by | POST /tax/calculate | The payment completing |
| Depends on your settings | No, except for the customer rules | Yes, nothing is written while Tax is off |
| Changes the payment | Never | Never |
The calculation is a calculator. The record is bookkeeping. You can use one without the other: ask for calculations and never enable Tax, or enable Tax and never call the endpoint.
Which country's tax
Tax follows the consumption principle: the rate is the payer's, not yours. Three steps decide, in order.
| Step | Source |
|---|---|
| 1 | The country resolved from the payer's IP when the payment page opened |
| 2 | Your default_country setting |
| 3 | CM, the platform's home jurisdiction |
The currency never decides. XAF is spent in six countries, and a payer in Paris can pay you in XAF
from a French IP: the rate applied is the French one. On POST /tax/calculate there is no
inference at all, the country field is required and it is the only thing read.
Step one only happens on the hosted page
The payer country is resolved when the hosted checkout opens. A payment charged entirely from
your server, with the payer never sent to a Wajub page, carries no country at all, so every one
of its records falls to your default_country. If you collect from several countries through
your own interface, set default_country to the one that dominates and reconcile the rest from
your own data.
What a record holds
One row per collected payment, in the currency the payment was made in.
| Field | What it holds |
|---|---|
country_code | The country whose rate was applied |
tax_name | The local name of the tax, TVA, VAT, IVA, GST |
rate | The percentage applied |
taxable_amount | The base the rate was applied to |
tax_amount | The tax itself |
tax_inclusive | Whether the base was extracted from the amount or added to it |
charged_at | When the payment was credited, which is what the reports group on |
A refund writes a second row with both amounts negative, so the ledger nets out on its own. See Reports.
What it covers
Two hundred countries carry a standard rate, maintained by Wajub and updated without anything on your side.
| Country | Tax | Rate |
|---|---|---|
| TVA | 19.25 % | |
| TVA | 18 % | |
| TVA | 18 % | |
| VAT | 16 % | |
| VAT | 15 % | |
| VAT | 15 % | |
| VAT | 10 % | |
| TVA | 20 % |
Sixteen countries are carried at 0 %, either because they levy no such tax or because their system is not a single national rate. The United States is one of them: sales tax there is set per state and per city, and Wajub does not resolve it.
One standard rate per country
There are no reduced rates, no per-product rates in effect, and no state or city level rates today. Whatever the country, the calculation applies its single standard rate. Configuration covers the two exceptions that do change the outcome, an exempt customer and a reverse charge.
Live only, and on which plan
Tax is on Growth, Scale and Enterprise, and available as a paid add-on below that.
Nothing runs in sandbox. No record is written for a test payment, and the endpoints refuse a test
key, so there is no way to rehearse a tax year. Inside the Dashboard the Tax section needs the
view_tax permission, and changing settings needs manage_tax.
Funding transactions, where you top up your own Wajub balance, never produce a record either. There is no VAT on moving your own money.
The endpoints
All of them take your private key and all of them are live only.
| Method | Endpoint | Used for |
|---|---|---|
GET PUT | /tax/settings | The on switch, your country, inclusive pricing, your registration |
POST | /tax/calculate | What is owed on an amount, before you charge it |
GET | /tax/rates | The standard rate per country |
GET | /tax/reports | The ledger, aggregated by country and by currency |
GET | /tax/codes | The product tax code catalogue |
GET | /tax/jurisdictions | Sub-national rates, where they exist |
GET POST PUT DELETE | /tax/registrations | Where you are registered, for your own records |
GET | /tax/thresholds | Registration thresholds and how close you are |
GET POST DELETE | /customers/{id}/tax_ids | A customer's tax IDs, and their verification |