T-VAN Compliance
T-VAN (Tax Value Added Network) compliance requirements for Vietnam tax integration.
Overview
T-VAN providers act as intermediaries between businesses and CQT (Vietnam Tax Authority) for:
- Tax information queries
- Invoice submission
- Tax compliance verification
Supported Providers
| Provider | Status | Features |
|---|---|---|
| VNPAY | Supported | Tax lookup, Invoice validation |
When to Use T-VAN
| Use Case | T-VAN Feature |
|---|---|
| Verify customer tax code | Tax info lookup |
| Validate supplier invoices | Invoice validation |
| Check business legitimacy | Tax info lookup |
| Pre-invoice verification | Tax info lookup |
Compliance Requirements
Decree 123/2020
| Requirement | T-VAN Support |
|---|---|
| Verify buyer tax code before B2B invoice | Tax info lookup |
| Validate received invoices | Invoice validation |
| Check supplier status | Tax info lookup |
Decree 70/2025 (Effective Jan 2026)
| Requirement | T-VAN Support |
|---|---|
| Real-time tax verification | Tax info lookup |
| Invoice authenticity check | Invoice validation |
Tax Code Formats
| Format | Description | Example |
|---|---|---|
| 10 digits | Standard company | 0123456789 |
| 13 digits | Branch/subsidiary | 0123456789-001 |
Best Practices
Caching
typescript
// Cache tax info (24 hours)
const CACHE_TTL = 24 * 60 * 60 * 1000;
async getTaxInfoCached(taxCode: string) {
const cached = await this.cache.get(`tax:${taxCode}`);
if (cached) return cached;
const { data } = await this.tvanService.queryTaxInformation({
provider: 'vnpay',
params: { type: TVanTaxInfoQueryTypes.TAX_CODE, taxCodes: [taxCode] },
});
await this.cache.set(`tax:${taxCode}`, data[0], CACHE_TTL);
return data[0];
}Batch Operations
typescript
// queryTaxInformation accepts up to 10 tax codes per request;
// enable fetchAll to auto-batch larger arrays
const taxCodes = orders.map(o => o.customerTaxCode).filter(Boolean);
const uniqueTaxCodes = [...new Set(taxCodes)];
const { data } = await this.tvanService.queryTaxInformation({
provider: 'vnpay',
params: { type: TVanTaxInfoQueryTypes.TAX_CODE, taxCodes: uniqueTaxCodes },
options: { fetchAll: true, continueOnError: true },
});