nopSolutions/nopCommerce · warning · NopException
Unsupported file {AvalaraTaxDefaults.TaxRatesFilePath} struc
Error message
Unsupported file {AvalaraTaxDefaults.TaxRatesFilePath} structure What it means
The fallback CSV's first line (header) splits into fewer than 14 comma-separated columns, so the parser does not recognize the schema. The expected layout has ZIP_CODE, STATE_ABBREV, COUNTY_NAME, plus rate columns; fewer than 14 columns means the file is the wrong format.
Source
Thrown at src/Plugins/Nop.Plugin.Tax.Avalara/Services/AvalaraTaxManager.cs:677
/// </returns>
protected async Task<List<TaxRate>> GetTaxRatesFromFileAsync()
{
//try to create file if doesn't exist
var filePath = _fileProvider.MapPath(AvalaraTaxDefaults.TaxRatesFilePath);
if (!_fileProvider.FileExists(filePath))
await DownloadTaxRatesAsync();
if (!_fileProvider.FileExists(filePath))
throw new NopException($"File {AvalaraTaxDefaults.TaxRatesFilePath} not found");
//get file lines
var text = await _fileProvider.ReadAllTextAsync(filePath, Encoding.UTF8);
if (string.IsNullOrEmpty(text))
throw new NopException($"File {AvalaraTaxDefaults.TaxRatesFilePath} is empty");
var lines = text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
if (!lines.Any() || lines[0].Split(',').Length < 14)
throw new NopException($"Unsupported file {AvalaraTaxDefaults.TaxRatesFilePath} structure");
//prepare tax rates
var taxRates = lines.Skip(1).Select(line =>
{
try
{
var values = line.Split(',', StringSplitOptions.TrimEntries);
return new TaxRate
{
Zip = values[0], //ZIP_CODE
State = values[1], //STATE_ABBREV
County = values[2], //COUNTY_NAME
City = values[3], //CITY_NAME
StateTax = decimal.Parse(values[4], NumberStyles.Any, CultureInfo.InvariantCulture), //STATE_SALES_TAX
CountyTax = decimal.Parse(values[6], NumberStyles.Any, CultureInfo.InvariantCulture), //COUNTY_SALES_TAX
CityTax = decimal.Parse(values[8], NumberStyles.Any, CultureInfo.InvariantCulture), //CITY_SALES_TAX
TotalTax = decimal.Parse(values[10], NumberStyles.Any, CultureInfo.InvariantCulture), //TOTAL_SALES_TAX
ShippingTaxable = string.Equals(values[11], "y", StringComparison.InvariantCultureIgnoreCase), //TAX_SHIPPING_ALONEView on GitHub (pinned to 64bdf2ff08)
Solutions
- Open the file and inspect the header row to confirm what was actually downloaded.
- Delete the malformed file and re-download to obtain the current schema.
- Verify the plugin version matches the current Avalara rate-file format; upgrade if schema changed.
- If the schema legitimately changed, update the parser column indices.
Example fix
// before
if (!lines.Any() || lines[0].Split(',').Length < 14)
throw new NopException($"Unsupported file {AvalaraTaxDefaults.TaxRatesFilePath} structure");
// after - report what was found vs expected
var headerColumns = lines.ElementAtOrDefault(0)?.Split(',').Length ?? 0;
if (!lines.Any() || headerColumns < 14)
throw new NopException($"Unsupported structure in {AvalaraTaxDefaults.TaxRatesFilePath}: expected >= 14 columns, found {headerColumns}. Re-download the file or update the plugin."); Defensive patterns
Strategy: validation
Validate before calling
// Sanity-check the header before parsing
var firstLine = (await _fileProvider.ReadAllTextAsync(filePath, Encoding.UTF8))
?.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
if (firstLine is null || firstLine.Split(',').Length < 14)
throw new NopException($"Unsupported rates-file structure in {AvalaraTaxDefaults.TaxRatesFilePath}"); Prevention
- Inspect the rates-file header after each download to catch schema drift.
- Keep the plugin version aligned with the current Avalara rate-file format.
- Delete and re-download when the header column count looks wrong.
- Never hand-edit the rates file into an incompatible shape.
When it happens
Trigger: The downloaded file is a different format or version than expected, or a non-CSV payload (e.g., an HTML error page) was saved with the .csv extension, so the header line yields too few columns.
Common situations: Avalara changed the rate-file schema; an error page got saved as the rates file; a locale using a different list separator; a partial download that truncated columns; an older plugin version against a newer file.
Related errors
- File {AvalaraTaxDefaults.TaxRatesFilePath} not found
- File {AvalaraTaxDefaults.TaxRatesFilePath} is empty
- Wrong file format
- Wrong file format
- No tax category found with the specified id
AI-assisted analysis of nopSolutions/nopCommerce@64bdf2ff08 (2026-08-13).
Data as JSON: /api/errors/3292cd9a42992083.
Report an issue: GitHub.