Import reference

This page is the lookup half of setup by import: the columns, the spellings each one answers to, the rules that decide which record a row is about, the limits, and what the two phases actually do. If you are running an import for the first time, read importing your data instead — it walks the six steps in order. Come here when you need to know what a column is called, why a row said what it said, or what the commit did with the rest of the file.

Two facts frame everything below.

inletAP reads a file you exported. There is no connection to the system that produced it. Nothing is fetched, nothing is sent back, and nothing keeps running afterwards.

The preview writes nothing. Uploading a file produces a record of the request and a row-by-row report, and touches no property, unit, vendor or entity. The commit is the only phase that writes, and it is described at the bottom of this page — including the part people assume wrongly.

The limits

LimitValue
Data rows in one file5,000, not counting the header row
File size2 MiB (2,097,152 bytes)
Format on the wireCSV. The browser converts an .xlsx you choose into CSV before it is sent
Kinds of record per fileOne. Properties, vendors, units or entities
Life of a preview7 days, after which it expires and cannot be committed
Uploads or commitsFive a minute
Commit checkpointEvery 100 rows

A 1,500-door portfolio exported with every optional column is well under 100 KB, so the byte cap is almost never the binding one. The row cap is the one you meet, and the answer is to split the file and import it in parts.

Who may run one

Admins, Controller Approvers and AP Specialists. Setting up master data is the AP specialist's job, so it is not reserved for admins. A Viewer cannot import anything.

A member limited to specific buildings may import units for a building they hold, and may not import properties or entities at all — creating a building outside your own scope would be a way out of the scope. See roles and permissions.

The column dictionary

The canonical header is the one the generated template prints. Every column also answers to the spellings under Also accepted as, and matching ignores case, spaces, hyphens and underscores — so Square Feet, square_feet and SQFT are one column. A header inletAP has no field for is ignored rather than rejected.

Properties

ColumnRequiredTypeAlso accepted asWhat it is
CodeYesstringproperty code, building code, property_code, short codeYour own short code for the building, which is how this import recognizes it again next time
NameYesstringproperty, property name, building, building nameThe name people call the building
EntityNostringentity, entity name, ownership entity, owner, legal entityThe legal entity that owns this building, which must already exist in your workspace before you import
Address line 1Nostringaddress, address 1, address1, street, street addressThe street number and street name
Address line 2Nostringaddress 2, address2, suite, unit numberA suite or floor, when the address has one
CityNostringtownThe city or town
State or provinceNostringstate, province, regionThe state or province, as a two-letter code where there is one
Postal codeNostringpostal, zip, zip code, postcodeThe postal or ZIP code
CountryNocountrycountry codeThe two-letter country code, such as CA or US
Door countNointegerunits, doors, unit count, number of unitsHow many doors the building has, which is what splits a shared cost by unit count
Square feetNointegersquarefeet, square feet, square_feet, sqft, sq ft, sq_ft, areaThe rentable area of the whole building, which is what splits a shared cost by area

Vendors

ColumnRequiredTypeAlso accepted asWhat it is
NameYesstringvendor, vendor name, supplier, supplier name, payeeThe supplier name exactly as it appears on their invoices
CategoryNostringtype, vendor category, tradeWhat this supplier does, in your own words
Tax IDNostringtax id, taxid, ein, bn, business number, vatThe supplier tax number, if you hold one
Default GL accountNostringdefaultglaccount, default gl account, default_gl_account, gl account, gl_account, gl, expense accountThe account their invoices are usually coded to
Payment termsNostringterms, payment terms, payment_termsThe terms you agreed with them, such as Net 30
StatusNoenum: active, review, inactivevendor statusWhether you still use this supplier: active, review or inactive
Address line 1Nostringaddress, address 1, address1, street, street addressThe street number and street name
Address line 2Nostringaddress 2, address2, suite, unit numberA suite or floor, when the address has one
CityNostringtownThe city or town
State or provinceNostringstate, province, regionThe state or province, as a two-letter code where there is one
Postal codeNostringpostal, zip, zip code, postcodeThe postal or ZIP code
CountryNocountrycountry codeThe two-letter country code, such as CA or US

Units

A unit file belongs to one building, which you choose before you upload. The file is that building's doors.

ColumnRequiredTypeAlso accepted asWhat it is
LabelYesstringlabel, unit, unit label, unit_labelThe door as your rent roll writes it, such as 4B or 307
Square feetNointegersquarefeet, square feet, square_feet, sqft, sq ft, sq_ftThe rentable area of this door
BedroomsNointegerbedrooms, beds, bedroomHow many bedrooms this door has
Default GL accountNostringdefaultglaccount, default gl account, default_gl_account, gl account, gl_account, glThe account work on this door is usually coded to
Cost centerNostringcostcenter, cost center, cost_center (the -re spelling is accepted too)Your cost center for this door

Entities

ColumnRequiredTypeAlso accepted asWhat it is
NameYesstringentity, entity name, legal name, ownership entityThe legal name of the entity that owns the buildings
TypeYesstringentity typeWhat kind of entity it is, such as Ownership entity or Joint venture
EINNostringein, tax id, bn, business numberThe entity tax number, if you hold one
GL segmentNostringgl segment, gl_segment, segmentThe ledger segment that stands for this entity in your accounting system
Address line 1Nostringaddress, address 1, address1, street, street addressThe street number and street name
Address line 2Nostringaddress 2, address2, suite, unit numberA suite or floor, when the address has one
CityNostringtownThe city or town
State or provinceNostringstate, province, regionThe state or province, as a two-letter code where there is one
Postal codeNostringpostal, zip, zip code, postcodeThe postal or ZIP code
CountryNocountrycountry codeThe two-letter country code, such as CA or US

Columns that are refused

Five property fields are refused in an import, whatever your role, and named back to you when a file carries them:

FieldHeader spellings that trigger the refusal
Auto-approve thresholdauto approve under, autoapproveunder, auto approval limit, auto approve limit
Primary approverprimary approver, primaryapproverid, primary approver id, approver
Backup approverbackup approver, backupapproverid, backup approver id
Default GL accountdefaultglaccount, default gl account, default_gl_account, gl account, gl_account, gl
Cost centercostcenter, cost center, cost_center, and the same words spelled with -re

They decide who signs for a building and how its spending is coded, and they are changed on the building's own page by somebody with permission to change them. The rest of the file imports normally; the run reports the refused columns by name. Note that the same GL and cost-center spellings are ordinary columns on a vendor or unit file — the refusal is a property-file rule.

How your headers are matched

  • The header row is found, not assumed. inletAP looks down the first fifteen rows for the first one that looks like headings — at least three non-empty, distinct, non-numeric cells. A report export with a title row, a company name and the parameters above the headings is the normal case this exists for. You can point it at a different row.
  • A blank header cell is a spacer, not a column. Letting one claim a position would shift every mapping after it by one.
  • The first column to claim a field wins. A file with two columns called Name keeps the left one.
  • What was matched is always shown, with up to three real values out of your own file under each of your headers. That is what tells you the column called Descr is the building name.
  • A required field nothing feeds does not reject the file. Every row reads as an error naming the field, and you fix it by choosing a column on the screen in front of you. Press the button on the Columns step and the preview is rebuilt from the same uploaded bytes — you do not upload again.

The four layouts recognized on sight

inletap, doorloop, rentec and tenantcloud. A recognized layout is data — a header signature plus a column map — and never a separate code path: the same engine reads every file. Detection is a suggestion that saves a few clicks, and it changes nothing on its own; a file is never silently read as a layout you did not choose.

Three of those four published templates carry no short code for a building, and Code is required, so the normal first experience of importing one is choosing which of your own columns to use as the code.

Every other layout goes through the same generic template plus the mapping step. That is not a gap waiting to be filled: most systems in this market export through a report builder, so two customers of one product produce two different files, and a named layout for either of them would be wrong for the other.

How a cell is read

TypeAccepted
stringAnything, trimmed
integerDigits only. 12.5, 1,200, -3 and n/a are errors rather than guesses
countryTwo letters, such as CA or US
enumOne of the listed values, in any case

A blank cell means "leave this alone", not "clear it". An export from another system is full of empty cells, and reading them as a clear would wipe values somebody typed by hand. Clearing a field is done on the record's own page.

A blank cell in a required column is an error for that row, naming the column.

Postal codes are never coerced to numbers, but a spreadsheet may have done it already. If a postal code arrives as four digits or fewer with no letters, the run warns you that a leading zero may have been lost before the file ever reached us. Check those after the import.

How a row finds its record

One matcher per kind of record, and the preview and the commit call the same one. That is what makes the preview worth reading: it is not a parallel guess at what the commit will do.

KindMatched by, in this order
Properties1. an alias, exactly; 2. the code, ignoring case; 3. the normalized address
Vendors1. an alias; 2. the name, ignoring case; 3. the tax ID, when both the row and the record carry one
UnitsThe label, inside the building you chose, compared exactly — 4B and 4b are two doors
EntitiesThe name, ignoring case
  • No match is a create. One match is an update. More than one match is an error, naming both records, because picking one of them would file a customer's invoices against a building nobody chose.
  • An update lists only the fields that actually differ. A row whose every mapped cell already matches reports as unchanged rather than as an empty update. Values are compared after normalizing, so " 48 " against 48 is not a change, and neither is hrb-01 against HRB-01.
  • Rows that repeat a record already named earlier in the same file are collapsed, and the run says how many. One row per unit is the normal shape of a rent roll, so without this a 300-door portfolio would import as 300 buildings.
  • A property row's entity is resolved by name. A name that matches nothing is an error telling you to create the entity first; a name that matches two is an error naming both. When the file names no entity and your workspace has exactly one, that one is used — and the preview shows it on the row, with a warning on the run, so you can reject it before anything is written.
  • A unit import never reactivates a retired door. Re-importing a rent roll does not un-retire a unit somebody retired on purpose.

What the preview reports

The Preview step of a small properties file: each line reads Create, Update or Not imported, with counts above the table and, for one building, a field-by-field panel showing the value now and the value after import.
Every row of the file before any of it is written, and for a record you already have, which fields change and what they change from.

For the run as a whole: how many rows would be created, updated, left unchanged and refused; your header row exactly as the file carried it; which of our fields each of your headers feeds; our required fields nothing feeds yet; your columns we are not reading; the columns we refused; and any warnings.

For each row: the physical line number in your file, so you can scroll to it; what it would do; the name it goes by; which existing record it matched and how; the parsed values; the field-by-field changes for an update; and a message whenever the row is refused or does nothing.

The line number is the physical one, which is what you want: a record whose quoted field spans four lines is still reported at the line you would scroll to.

What a row can say

In the previewIn the report after a commitMeans
CreateCreatedNothing in the workspace matched this row
UpdateUpdatedOne record matched, and at least one field differs
No changeUnchangedOne record matched and nothing differs, or the same record is named earlier in the file
Not importedNot importedThe row was not written, and the message says why

The messages a refused row carries, and what each one means:

MessageWhat to do
Nothing is feeding "Code", which every row needsChoose a column for it on the Columns step. Any column of your own will do
This row has no nameA required cell is blank on that line. Fix it in your file
"n/a" is not a whole number for Door countThe cell is not the type the column takes. The message quotes the cell and names the column
This row matches 2 existing records ("…" and "…")You hold two records that both answer to this row. Resolve the duplicate, then import again
There is no ownership entity called "…" in this workspaceCreate the entity first, or correct the Entity column
The same building is already on line 12 of this file, so this row adds nothingNothing. The first of each is used

When the whole file is refused

Only what cannot produce a single useful row. Everything else is reported per row or per column.

  • The file is empty, or has no rows.
  • No row inside the first fifteen can be read as headers, or the row you named does not exist.
  • It has a header and no data rows.
  • It has more than 5,000 data rows, or is over 2 MiB.
  • The CSV itself is malformed — a quoted field that never closes, or text after a closing quote. The refusal names the line. The reader is strict here on purpose: a row silently recovered into the wrong shape does not produce a visible error, it produces a record nobody asked for.

How the commit behaves

This is the part that is easy to assume wrongly, so it is stated plainly.

The commit is best effort per row, and it can apply a prefix of the file. Rows are written one at a time, each with its own outcome, and the run's counters are flushed every 100 rows so a commit that dies halfway still describes what it did. A row that fails does not abort the rest.

What makes that safe rather than alarming is that the import is idempotent: because every kind of record has a real match key, running the same file again updates what is already there instead of duplicating it. "Upload it again" is a true instruction.

Other behavior worth knowing:

  • The commit re-runs the matcher; it does not replay the preview. If somebody created that building by hand in between, the run says updated where it predicted create. The predicted counts are kept beside the actual ones.
  • A commit is refused when the bytes are not the bytes that were previewed, when the run is no longer a preview, and when the preview has expired. A preview somebody approved is the only thing that can be committed.
  • Every row failing is reported as a failed run, with "Every row failed. Nothing was written."
  • Your uploaded bytes are dropped once the run is committed or discarded. Holding a customer's vendor list after the import has finished buys nothing.
  • The commit is written to the audit trail with the counts, the filename and the kind of record. See audit trail.

Where to go next