Tax misconfiguration in WHMCS is one of those issues that's invisible until you have a problem — usually an angry email from your accountant or a tax filing that doesn't match reality. The configuration takes 30 minutes; the reasoning behind it is what most guides skip.
This is the practical tax / VAT / GST setup for WHMCS.
The three tax models you need to model
- Inclusive vs Exclusive. Is the listed price including tax or before tax? Inclusive is common in EU consumer contexts; Exclusive is common B2B.
- Per-region rates. Different countries (and within US, different states) have different rates. WHMCS supports rates per country/state.
- VAT exempt for B2B cross-border. EU VAT reverse-charge mechanism — your EU business customer doesn't pay VAT to you if they provide a valid VAT number.
Step 1 — Configure base tax settings
WHMCS Admin → Setup → Payments → Tax Configuration:
- Tax Enabled: yes.
- Tax Type: Inclusive or Exclusive (see above).
- Compound Tax: usually No. Yes only for jurisdictions where second tax applies on first (rare).
- Apply Tax to Late Fees: depends on jurisdiction; usually Yes.
Step 2 — Add tax rules per region
For each country/region where you owe tax:
- Setup → Payments → Tax Configuration → Tax Rules → Add.
- Set:
- Tax Rule Name: e.g., "DE VAT 19%".
- Country: Germany.
- State: leave blank if country-wide.
- Tax Rate: 19.
- Save.
Common EU rates:
- Germany: 19% (standard) / 7% (reduced)
- France: 20%
- Italy: 22%
- Netherlands: 21%
- UK: 20%
- Spain: 21%
Setup each country individually.
Step 3 — EU VAT MOSS compliance
If you sell digital services to EU consumers, you must collect VAT at the customer's country rate (not yours). WHMCS supports this via EU VAT MOSS:
- Setup → Payments → Tax Configuration → EU VAT Settings.
- Enable VAT Validation (uses VIES to validate VAT numbers).
- Configure VAT Number Field Required for EU business customers.
- When a B2B customer provides a valid EU VAT number ≠ your country, WHMCS applies 0% (reverse charge).
For each EU country your customers come from, add a tax rule (see step 2). WHMCS picks the right one based on the customer's country.
Step 4 — Indian GST configuration
GST has its own model:
- CGST + SGST for intra-state customers (your state = customer's state).
- IGST for inter-state (different state).
- 0% for international customers (export of services).
- Customer's GSTIN must be captured for B2B invoicing.
WHMCS doesn't ship GST out of the box. Options:
- Two tax levels: Tax 1 = CGST, Tax 2 = SGST. Configure rates per state. Use Compound Tax = No.
- Custom hook: detect customer state, apply CGST+SGST or IGST programmatically before invoice generation.
- Indian-specific module: ModulesGarden and a few others ship dedicated GST modules.
For most Indian hosting brands, option 2 (custom hook) gives the most control. The logic:
add_hook('InvoiceCreationPreEmail', 1, function ($vars) {
$invoiceId = $vars['invoiceid'];
$userId = $vars['userid'];
$client = Capsule::table('tblclients')->where('id', $userId)->first();
if ($client->country !== 'IN') return; // export — 0% GST
$companyState = 'JK'; // your state code
$customerState = inferStateFromAddress($client); // your logic
if ($companyState === $customerState) {
// CGST 9% + SGST 9%
$vars['cgst_rate'] = 9;
$vars['sgst_rate'] = 9;
} else {
// IGST 18%
$vars['igst_rate'] = 18;
}
});
Make sure the invoice PDF template renders all three components separately (required by GST regulations).
Step 5 — Tax-aware invoice display
Invoice templates must show:
- Pre-tax subtotal.
- Tax breakdown (each rule applied, named, with amount).
- Total including tax.
- Your tax ID / VAT number / GSTIN.
- Customer's VAT number / GSTIN if applicable.
Edit /templates/{your-theme}/invoicepdf.tpl — see my invoice customization guide.
Step 6 — Validate VAT / GST numbers
Always validate the format before storing. Examples:
- EU VAT: country code (2 letters) + 8-12 digits/chars. WHMCS validates via VIES API automatically if enabled.
- GSTIN: 15 chars, format
NNAAAAANNNNNAZN(state code + PAN-based pattern). Validate with regex.
Invalid numbers should be rejected at customer signup, not at invoice generation.
How to verify tax setup
- Create test clients in 3-4 different countries.
- Place orders. Confirm correct tax applied for each.
- For EU customers: test with valid VAT number → 0% (reverse charge). Without → standard rate.
- For Indian customers: test intra-state, inter-state, international. Verify CGST+SGST vs IGST vs 0%.
- Invoice PDF shows tax breakdown correctly.
- Reports → Tax Report shows correct totals.
Common pitfalls
"Tax rate applied to wrong customer." WHMCS matches customer's address country/state to tax rules. If customer's address is wrong or empty, no rule matches and no tax is applied. Make country mandatory at signup.
"VAT MOSS validation fails for valid numbers." VIES API is slow / sometimes down. WHMCS times out. Add a manual override option for admin.
"Tax shown on invoice but not on cart preview." WHMCS calculates tax server-side at order placement. The cart shows pre-tax until you proceed. UX issue, not a bug.
"Refunds don't refund tax correctly." Some gateways refund the full amount including tax; some require explicit tax-refund handling. Check your gateway's docs.
My take — get your accountant involved
Tax misconfiguration leads to under-collecting (financial penalty) or over-collecting (customer goodwill destroyed). Both bad. Before launch:
- Show your tax accountant the WHMCS tax setup.
- Walk through 3-4 example invoices.
- Have them confirm the breakdown matches what their filings expect.
- Document the configuration so future-you remembers.
Going further
I configure tax / VAT / GST for WHMCS deployments — multi-country, EU MOSS, India GST, validation. Tell me where you sell and I'll send a quote in 24 hours.