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 |
|---|---|---|
| Viettel | Supported | Tax lookup, Invoice validation |
| VNPT | 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 info = await this.tvanService.getTaxInfo({ taxCode });
await this.cache.set(`tax:${taxCode}`, info, CACHE_TTL);
return info;
}Batch Operations
typescript
// More efficient than individual lookups
const taxCodes = orders.map(o => o.customerTaxCode).filter(Boolean);
const uniqueTaxCodes = [...new Set(taxCodes)];
const taxInfoMap = await this.tvanService.batchGetTaxInfo({
taxCodes: uniqueTaxCodes,
});