Skip to content

Add Canada specific regions VAT rates (ETA May 11) #9

@nicomollet

Description

@nicomollet

Is your feature request related to a problem? Please describe.
Sub-issue of:

🐴 Epic card

Describe the solution you'd like
Pyvat handles postal codes since v1.0.2 (Spain regions).
Pyvat is capable of handling non-EU countries (see Egypt).

Make Pyvat handle VAT rates for regions of Canada using their postal codes.
The first letter of the postal code indicates the province/territory.

Explicit what happens for Canadians without a postal code (see Fallback section below).
Then update Monies and update automated tests.


Tax Rates by Province

📑 Canada - tax rates by province (Dec 2025)

Use the Total Tax column. Rates range from 5% to 15%.

⚠️ Registration constraint: We can only charge the provincial tax (PST/QST/RST) where we are registered. Where we are NOT registered, charge only the federal GST (5%). This means some provinces may currently be charged at 5% (GST only) even if the table shows a higher total rate. Tax values must be easy to update as new provincial registrations are finalized.

Prefix Province/Territory Total Tax (when registered) Notes Example Postal Code
(none) No postal code 13% Fallback: Ontario rate N/A
A Newfoundland and Labrador 15% HST A1A 5T9
B Nova Scotia 14% HST B3H 1Y2
C Prince Edward Island 15% HST C1A 4P3
E New Brunswick 15% HST E2L 4H8
G Quebec 14.975% GST + QST — not currently registered → charge 5% G1A 0A2
H Quebec 14.975% GST + QST — not currently registered → charge 5% H1A 0A1
J Quebec 14.975% GST + QST — not currently registered → charge 5% J1A 1A1
K Ontario 13% HST K1A 0B1
L Ontario 13% HST L5B 4M7
M Ontario 13% HST M5V 3L9
N Ontario 13% HST N2L 3G1
P Ontario 13% HST P7B 5E1
R Manitoba 12% GST + RST — not currently registered → charge 5% R2C 0A1
S Saskatchewan 11% GST + PST (registered) S7K 1A1
T Alberta 5% GST only T5J 0N3
V British Columbia 12% GST + PST (registered) V6B 4N6
X Northwest Territories / Nunavut 5% GST only X0A 0H0
Y Yukon 5% GST only Y1A 0A1

Registration Numbers

These must appear in the free text section of Canadian invoices:

  • Federal GST/HST: 77733 7361 RT0001
  • British Columbia PST: 77733 7361 BT0001
  • Saskatchewan PST: Account #8158362 — Business #777337361

Print all relevant registration numbers for the province of the invoice. Display them even if it means printing all of them, unless we can determine which ones are applicable.


Invoice Free Text Requirements

For all Canadian invoices, the free text section must include:

  1. The applicable PST rate % and GST rate % separately (their sum = total tax rate on the invoice).
  2. All applicable registration numbers (see above).
  3. For customers without a postal code: a sentence encouraging them to add their address in their account dashboard, e.g.:

    "Your tax rate is based on the Ontario default. To ensure accurate tax calculation, please update your address in your account dashboard."


B2B Handling

  • No VAT exemption for B2B: Canadian B2B customers are subject to the same tax as B2C.
  • VAT/GST numbers may be collected but have no effect on pricing or tax application.

Fallback for Missing Postal Code

  • If a customer has no postal code → apply Ontario rate (13%) as default.
  • This fallback must be configurable.
  • For renewals of customers without a postal code: apply the fallback rate and include the free text notice (see above).

⚠️ Quebec and Manitoba rates pending finance team confirmation — charge GST-only (5%) in the meantime.


Monitoring

  • Metabase: track Canadian invoices — none should have 0% VAT after this is live.
  • Track how many existing customers update their address/postal code after launch, to evaluate invoicing accuracy over time.
  • Klaviyo: check Canada segment, and observe Renewal Discount/Regular Price property are updated (meaning no Canada customer should pay Single $59 but a little less)

Create a Canada folder in https://data.wp-media.me/collection/69-vat


Tasks

  • Stripe configuration for RocketCDN — needs Canadian tax details (Quebec & Manitoba currently showing only 5% GST due to missing provincial registrations)
  • Invoices: display PST/GST registration numbers + rate breakdown in free text
  • Invoices: add "please add your address" sentence for customers without postal code
  • Adapt Canada-specific rates in Pyvat library (rate table above, with registration constraint)
  • Handle fallback to Ontario (13%) for customers without postal code — make it configurable
  • Automatic renewals: apply fallback rate for customers without postal code
  • No B2B exemption: ensure VAT number collection has no impact on tax rate
  • Test Imagify staging order/invoice subtotal consistency
  • Test RocketCDN staging order/invoice subtotal consistency
  • Monitoring: Metabase dashboard for Canadian invoices (should not have 0% VAT)
  • Monitoring: track address completion rate post-launch
  • Deploy on staging, QA all apps

Release


Describe alternatives you've considered
N/A

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions