GST QST calculator
A pre-tax price of 100 at 5% GST and 9.975% QST carries 5 of GST and 9.98 of QST, for a total of 114.98. Put both tax lines and the payable amount on a Quebec receipt, quote or sales journal. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Price
- 100
- Gst rate
- 5
- Qst rate
- 9.975
- Total
- 114.98
- Gst amount
- 5
- Qst amount
- 9.98
- Total tax
- 14.98
Canadian invoices in Quebec split consumption tax into two lines: the federal Goods and Services Tax (GST) and the provincial Quebec Sales Tax (QST, also called TVQ). This GST QST calculator takes a pre-tax price plus the two applicable rates as percent points and returns each tax amount together with the tax-inclusive total. GST and QST are applied independently on the same consideration, matching the post-2013 Quebec rule rather than the older tax-on-tax method.
What GST and QST amounts mean on a Quebec invoice
The Goods and Services Tax is the federal consumption tax collected on most taxable supplies in Canada; the Quebec Sales Tax is the provincial counterpart collected on taxable supplies made in Quebec. A GST QST calculator answers the Quebec checkout question: given a pre-tax price (the consideration) and the two rates that apply to that supply, how much GST is due, how much QST is due, and what the customer pays after both taxes.
Since 1 January 2013 both GST and QST are computed independently on the same pre-tax consideration — QST is not levied on the GST-inclusive amount. Rates are percent points, not decimal fractions: five means five percent GST, nine point nine seven five means the current QST rate of nine point nine seven five percent.
A one-hundred-dollar pre-tax price at those rates produces five dollars of GST, nine dollars and ninety-eight cents of QST after half-up cent rounding of nine point nine seven five, and a total of one hundred fourteen dollars and ninety-eight cents. Zero is a valid price (a complimentary taxable line still reports zero tax and a zero total). You supply the consideration and the two rates that already apply; the calculator multiplies, rounds each tax half-up to two decimal places, and adds.
Where a GST QST calculator earns its keep
Quebec merchants and bookkeepers use a GST QST calculator to split a pre-tax invoice line into the two tax amounts that belong on a receipt, a quote, or a sales journal, without opening a full tax engine. A freelancer quoting one hundred dollars plus GST and QST needs the same split so the client sees GST, QST, and the payable total as separate lines. Accounting tests pin a known-good pair of rates next to a cart subtotal so a checkout library cannot silently switch back to tax-on-tax arithmetic.
Classroom consumer-math exercises in Canadian provinces that use GST plus a provincial sales tax need a deterministic oracle that rejects a negative price instead of printing a rebate. Failed validation does not consume balance.
What you can do with it
Pin checkout arithmetic in accounting tests
Feed a cart subtotal and the two percent rates into a deterministic oracle so a library cannot silently revert to tax-on-tax math.
Canadian consumer-math worksheets
Students compute GST and QST on practice prices and compare hand-written tax lines and totals against a known-good split.
FAQ
How are GST and QST calculated from a pre-tax price?
Total = price + GST + QST. Both taxes apply independently on the same pre-tax consideration (the post-2013 Quebec rule).
Should I enter 5 and 9.975, or 0.05 and 0.09975?
Combined_rate in the response is their sum (14.975 at those current Quebec rates).
What happens if the pre-tax price is negative?
A negative consideration is not a GST/QST selling price this calculator will tax. Zero is allowed and yields zero tax and a zero total.
Is QST calculated on top of GST (tax-on-tax)?
No. Since 1 January 2013 Quebec computes QST on the selling price excluding GST. This calculator applies both rates independently on the pre-tax price you send.
Why is the QST 9.98 and not 9.975?
Each tax is rounded to the cent on its own, with halves rounded up. 9.975% of 100 is 9.975, which becomes 9.98 on the receipt. The GST is rounded the same way before both are added to the price.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/gst-qst \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"price":100,"gst_rate":5,"qst_rate":9.975}'const res = await fetch("https://api.kit.forhosting.com/fin/gst-qst", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"price": 100,
"gst_rate": 5,
"qst_rate": 9.975
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/gst-qst",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"price": 100,
"gst_rate": 5,
"qst_rate": 9.975
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/gst-qst", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"price":100,"gst_rate":5,"qst_rate":9.975}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"price":100,"gst_rate":5,"qst_rate":9.975}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/gst-qst", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"price": 100,
"gst_rate": 5,
"qst_rate": 9.975
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.gst_qst",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
A negative pre-tax price fails with invalid_input and is not billed.
What GST and QST amounts mean on a Quebec invoice
The identities are gst_amount equals price times gst_rate divided by one hundred, qst_amount equals price times qst_rate divided by one hundred, and total equals price plus gst_amount plus qst_amount. A negative pre-tax price is rejected with invalid_input because a consideration below zero is not a selling price this calculator will tax. This tool does not look up rates by postal code, does not apply GST/HST place-of-supply rules, does not decide whether a supply is zero-rated or exempt, and does not convert currencies.
Input contract, response shape, and error behaviour
Zero GST, zero QST, and zero price are allowed. POST a JSON body with three required finite numbers that share one currency. price is the pre-tax consideration and must be greater than or equal to zero; aliases pre_tax, amount, subtotal, and net map to the same field so a worksheet can keep its column names. gst_rate is the federal GST rate in percent points from zero through one hundred; aliases gst and gst_percent are accepted. qst_rate is the Quebec Sales Tax rate in percent points from zero through one hundred; aliases qst, qst_percent, and tvq are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values — NaN, Infinity, or text that does not parse as a number — fail with invalid_input naming the field. Those failures are not billed. A negative price also fails with invalid_input, because a selling price below zero is not a GST/QST question this calculator answers. Negative gst_rate or qst_rate, and rates above one hundred percent, fail the same way. On success the body echoes price, gst_rate, and qst_rate, then reports gst_amount and qst_amount as the two taxes rounded half-up to two decimal places, total_tax as their sum, total as the tax-inclusive amount, combined_rate as gst_rate plus qst_rate, and a formula string restating the independent identities. Example: price one hundred, gst_rate five, qst_rate nine point nine seven five yields GST five, QST nine point nine eight, total tax fourteen point nine eight, and total one hundred fourteen point nine eight. Pair the JSON with your own rule for which rates apply — the current five and nine point nine seven five, a historical pair, or a modelling assumption — because this endpoint multiplies the rates you send; it does not look up Revenu Québec tables. Pricing is a flat $0.002 per successful request.
Where a GST QST calculator earns its keep
Keep price non-negative, keep both rates inside zero to one hundred, pin the rounded gst_amount, qst_amount, and total in tests, and you get a reproducible Quebec tax split for quotes, LMS plugins, and edge workers without standing up a CRA or Revenu Québec integration of your own.
Integration use cases
Quote a Quebec invoice with GST and QST lines
Turn a pre-tax line, the GST rate, and the QST rate into gst_amount, qst_amount, and a payable total for a quote or receipt.
Technical questions
What does the GST QST calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.