Skip to content

File requirements and parsing rules

View as MarkdownOpen in Claude(opens in a new tab)Open in ChatGPT(opens in a new tab)

Vintage accepts your loan data the way your core system exports it, with no required template. The few rules a file must meet to be read are stated below, and then exactly how each cell is read: when a value becomes a number, when it becomes a date, and when it is treated as no value at all.

The short version: upload CSV or Excel .xlsx, keep every file in one file group to the same columns, and know that Vintage never turns a blank or an unreadable cell into a zero.

CSV and Excel .xlsx are the only accepted file types. Anything else is refused when you choose it, with a message naming the two supported types.

  • Older Excel .xls files are refused, including an older workbook renamed to .xlsx or .csv. The message tells you to save the workbook as .xlsx or export it as CSV.
  • Other file types, such as .txt, .pdf, or .zip, are refused with the list of supported types.
  • An empty file is refused where you choose it, and so is a file with column headings but no data rows under them.
  • A file that cannot be read at all, for a reason Vintage does not recognize, is named: you are told that file, and any picked after it, were not added and what to check.

CSV is the recommended format, especially for a large portfolio. A CSV file has no size limit of its own. A single file is bounded only by what Vintage can address internally, about 2 GB, and a file that would cross that is refused while it is being added, with a message saying so, rather than after it has been sent.

Every upload sorts files into up to three file groups: Snapshot files, Origination files, and Transaction files. You declare each file’s group by choosing it; Vintage never guesses. Within one upload, every file in a group must have the same column names, in any order. A file whose columns do not match its group’s is staged with the mismatch named, and Continue stays blocked until you remove or fix it.

Across different uploads, a group’s columns may change. A renamed column reads as one column removed and another added. See Choosing files.

Each column needs a distinct, non-blank heading, because Vintage records every decision about a column by its name. A file with a duplicated or blank heading cannot pass Choose Files or be confirmed at the Remove PII step. If processing finds such a file, it is refused with a sentence that names the problem and the fix, and the only action offered is Remove, because retrying would fail the same way.

Rows whose cell count does not match the heading row

Section titled “Rows whose cell count does not match the heading row”

In a CSV, a value containing a comma that is not quoted (Smith, John) splits into two cells and pushes every later value one column to the right. The row’s values can no longer be trusted to belong to their columns, including the identifier columns protected in your browser. So a row with more or fewer cells than the heading row is skipped entirely: never trimmed, padded, or partly kept.

Vintage counts skipped rows and states the count on the Column Mapping screen and again on the Review screen, with the fix: correct the export and upload again. Every row figure Vintage shows counts only imported rows. Spreadsheet files address cells by position, so their values cannot shift columns.

Every cell is read by the type of the field it is mapped to: numeric, date, categorical, or text. One grammar reads every numeric column the same way.

  • Blank is no value, never zero. An empty cell, a cell of spaces, and the placeholders NA, N/A, N-A, NULL, NONE, EMPTY, and a lone -, in any capitalization, mean “no value”. So does a currency symbol with no digits, such as $ -.
  • Spaces at the start or end are ignored.
  • Thousands commas are removed only when they group digits correctly in threes (1,234,567). A malformed grouping (1,5, 12,34, 1,2345, or a zero-led 0,125) is never reinterpreted as a different number. The decimal point is always a period, so European-style 1.234,56 is not read as a number.
  • Currency markers are removed: a leading $, euro, pound, or yen symbol, and a leading or trailing three-letter code (USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY).
  • Negatives read the same whichever way they are written: a minus sign and a currency symbol combine in either order, and accounting parentheses mean negative whether the symbol sits inside or outside them.
  • A trailing percent sign is removed and the number is kept as written: 5% reads as 5. What that numeral means is decided by the field’s percent format for the whole column, never cell by cell. See Percent columns.
  • Not read as numbers: abbreviated magnitudes (125k, 1.2M), scientific notation (1e3), units other than a recognized currency (10 bps), and extra punctuation (1.2.3).
  • Precision. Numbers are stored to six decimal places; a value needing more is rounded.
  • Very large numbers. A numeric field value with 15 or more digits before the decimal point is treated as no value, counted, and shown to you. It is never overflowed or rounded into a different number. A long identifier mapped as text or as a Custom attribute (a column kept under its own name) keeps every digit exactly as uploaded.

A value that is not a number under these rules is kept, but it counts as no value for a numeric field. One such cell never disqualifies the column: a column’s type is inferred from the cells that carry data, so a numeric column with the occasional Pending stays numeric, and a sparse amount column that is blank on most rows still reads as numeric.

Cells Vintage could not read cleanly, and numbers too large to store, are counted per file and shown as a notice on the Column Mapping screen. Those rows are still imported; you decide whether to fix the export or continue.

In your fileRead asWhy
12341234A plain number.
1,234.561234.56Correctly grouped thousands commas are removed.
1,5no valueCommas that do not group digits in threes are never read as 15.
0,125no valueA zero before the comma is not thousands grouping; never read as 125.
1.234,56no valueEuropean-style decimals are not read.
$1,234.561234.56A leading currency symbol is removed.
1234.56 USD1234.56A trailing currency code is removed.
-$1,234.56-1234.56Sign before the symbol.
$-1,234.56-1234.56Sign after the symbol reads the same.
(500)-500Parentheses mean negative.
($1,200)-1200Symbol inside the parentheses.
$ (1,234.00)-1234Symbol outside the parentheses, with a space.
5%5The percent sign is removed; the number is kept as written.
(5%)-5A negative percent.
+77A leading plus sign is allowed.
.50.5A leading decimal point is allowed.
(blank)no valueBlank is empty, never 0.
NAno valueA missing-data placeholder.
-no valueA lone dash is missing, never 0 or negative.
$ -no valueAn accounting-style dash is missing, never 0.
Pendingno valueText is not a number.
125kno valueAbbreviated magnitudes are not read.
$1.2Mno valueAbbreviated magnitudes are not read.
10 bpsno valueUnrecognized units are not read.
1e3no valueScientific notation is not read.
5.no valueA trailing decimal point with no digits.

“No value” means the cell is kept in your data but treated as empty for a numeric field. It never overwrites a value Vintage already knows for that loan.

A numeric field also carries a format: number, currency, or one of two percent formats. Number and currency change only how values are displayed. A percent format is the reading instruction for the whole column:

FormatYour file writes 8.25% as5% in this column means
Percent points8.255%
Decimal fraction0.0825500% (the column’s format governs, not the cell’s decoration)

Every percent value is stored as percent points and displayed as X%, whichever format the file used. Vintage suggests a format, marked matches your data; when every value in a column carries a percent sign, the suggestion is Percent points. Interest Rate defaults to Percent points. Changing a percent format later re-reads the column from the original uploaded values and is confirmed before it takes effect. See Declaring formats.

A date column’s format is declared once for the column and then reads every cell the same way. Vintage suggests it from the column’s own values, shows it on the Column Mapping screen, and lets you correct it.

  • Always recognized, whatever the declared order: year-first dates (2024-01-15, 2024/1/15, 20240115), month codes (2024-01, 202401), and dates with a written month name (Jan-2024, January 2024, 15-Jan-2024, Jan 15, 2024), abbreviated or in full, in any capitalization. A month-level value is read as that month, with the day pinned to the first.
  • Two numbers and a year (04/07/2025, 01-15-2024) could be month first or day first, so they are read in the column’s declared order. Your data settles it when it can: a value whose first number is over 12 proves day first, and one whose second number is over 12 proves month first. When nothing in the column settles it, Vintage defaults to US month/day order and shows that as a correctable suggestion. An ambiguous date order never blocks finalizing.
  • Only real calendar dates are read. February 30 and April 31 are not; February 29 is read only in a leap year.
  • A bare year such as 2024 is not read as a date.
  • A cell that does not fit the column’s declared format is kept but treated as no value for that field, and counted as wrong format so Vintage can name the field to fix. It is never flipped into the other order.
In your fileDeclared orderRead asWhy
2024-01-15Year first2024-01-15Year-first dates are always recognized.
20240115Year first2024-01-15An eight-digit date code.
2024-01Year first2024-01A month code; the day is pinned to the first.
04/07/2025Month/Day2025-04-07April 7.
04/07/2025Day/Month2025-07-04The same text is July 4 under day-first order.
31/12/2024Month/Dayno valueDoes not fit the declared order; never flipped.
Jan-2024Month name2024-01A written month name is never ambiguous.
15-Jan-2024Month/Day2024-01-15Month-name dates read under any declared order.
02/29/2024Month/Day2024-02-292024 is a leap year.
02/29/2023Month/Dayno value2023 is not a leap year.
2024Month/Dayno valueA bare year is never a date.

Snapshot months are matched by the calendar date they parse to, not by their text, so an export whose format drifts (2024-01 one month, Jan-2024 the next) never creates a duplicate month. See Uploading month after month.

Identifier columns follow two extra rules before they are scrambled in your browser. Both are stated in full in Removing personal information.

  • Loan IDs are normalized so cosmetic differences do not split one loan’s history: whitespace is removed, letters match regardless of case, and leading zeros are dropped, so 0012345, 12345, and 12 345 are the same loan. Separators such as - and /, and every other digit, stay significant. Tax IDs also drop every non-alphanumeric character.
  • A placeholder is not an ID. The blank-like placeholders above, and an all-zeros value such as 0, 000000, or 000-00-0000, give the row no protected ID (the scrambled stand-in for a Loan ID) at all. A row with no usable Loan ID is kept as source data but cannot be linked to a loan; Review reports it as without a Loan ID.

Vintage also publishes these numeric and date rules, with worked examples, at app.vintagemodeling.com/parsing-rules, a page you can open without signing in and share with whoever prepares your exports.