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
| Limit | Value |
|---|---|
| Data rows in one file | 5,000, not counting the header row |
| File size | 2 MiB (2,097,152 bytes) |
| Format on the wire | CSV. The browser converts an .xlsx you choose into CSV before it is sent |
| Kinds of record per file | One. Properties, vendors, units or entities |
| Life of a preview | 7 days, after which it expires and cannot be committed |
| Uploads or commits | Five a minute |
| Commit checkpoint | Every 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
| Column | Required | Type | Also accepted as | What it is |
|---|---|---|---|---|
| Code | Yes | string | property code, building code, property_code, short code | Your own short code for the building, which is how this import recognizes it again next time |
| Name | Yes | string | property, property name, building, building name | The name people call the building |
| Entity | No | string | entity, entity name, ownership entity, owner, legal entity | The legal entity that owns this building, which must already exist in your workspace before you import |
| Address line 1 | No | string | address, address 1, address1, street, street address | The street number and street name |
| Address line 2 | No | string | address 2, address2, suite, unit number | A suite or floor, when the address has one |
| City | No | string | town | The city or town |
| State or province | No | string | state, province, region | The state or province, as a two-letter code where there is one |
| Postal code | No | string | postal, zip, zip code, postcode | The postal or ZIP code |
| Country | No | country | country code | The two-letter country code, such as CA or US |
| Door count | No | integer | units, doors, unit count, number of units | How many doors the building has, which is what splits a shared cost by unit count |
| Square feet | No | integer | squarefeet, square feet, square_feet, sqft, sq ft, sq_ft, area | The rentable area of the whole building, which is what splits a shared cost by area |
Vendors
| Column | Required | Type | Also accepted as | What it is |
|---|---|---|---|---|
| Name | Yes | string | vendor, vendor name, supplier, supplier name, payee | The supplier name exactly as it appears on their invoices |
| Category | No | string | type, vendor category, trade | What this supplier does, in your own words |
| Tax ID | No | string | tax id, taxid, ein, bn, business number, vat | The supplier tax number, if you hold one |
| Default GL account | No | string | defaultglaccount, default gl account, default_gl_account, gl account, gl_account, gl, expense account | The account their invoices are usually coded to |
| Payment terms | No | string | terms, payment terms, payment_terms | The terms you agreed with them, such as Net 30 |
| Status | No | enum: active, review, inactive | vendor status | Whether you still use this supplier: active, review or inactive |
| Address line 1 | No | string | address, address 1, address1, street, street address | The street number and street name |
| Address line 2 | No | string | address 2, address2, suite, unit number | A suite or floor, when the address has one |
| City | No | string | town | The city or town |
| State or province | No | string | state, province, region | The state or province, as a two-letter code where there is one |
| Postal code | No | string | postal, zip, zip code, postcode | The postal or ZIP code |
| Country | No | country | country code | The 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.
| Column | Required | Type | Also accepted as | What it is |
|---|---|---|---|---|
| Label | Yes | string | label, unit, unit label, unit_label | The door as your rent roll writes it, such as 4B or 307 |
| Square feet | No | integer | squarefeet, square feet, square_feet, sqft, sq ft, sq_ft | The rentable area of this door |
| Bedrooms | No | integer | bedrooms, beds, bedroom | How many bedrooms this door has |
| Default GL account | No | string | defaultglaccount, default gl account, default_gl_account, gl account, gl_account, gl | The account work on this door is usually coded to |
| Cost center | No | string | costcenter, cost center, cost_center (the -re spelling is accepted too) | Your cost center for this door |
Entities
| Column | Required | Type | Also accepted as | What it is |
|---|---|---|---|---|
| Name | Yes | string | entity, entity name, legal name, ownership entity | The legal name of the entity that owns the buildings |
| Type | Yes | string | entity type | What kind of entity it is, such as Ownership entity or Joint venture |
| EIN | No | string | ein, tax id, bn, business number | The entity tax number, if you hold one |
| GL segment | No | string | gl segment, gl_segment, segment | The ledger segment that stands for this entity in your accounting system |
| Address line 1 | No | string | address, address 1, address1, street, street address | The street number and street name |
| Address line 2 | No | string | address 2, address2, suite, unit number | A suite or floor, when the address has one |
| City | No | string | town | The city or town |
| State or province | No | string | state, province, region | The state or province, as a two-letter code where there is one |
| Postal code | No | string | postal, zip, zip code, postcode | The postal or ZIP code |
| Country | No | country | country code | The 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:
| Field | Header spellings that trigger the refusal |
|---|---|
| Auto-approve threshold | auto approve under, autoapproveunder, auto approval limit, auto approve limit |
| Primary approver | primary approver, primaryapproverid, primary approver id, approver |
| Backup approver | backup approver, backupapproverid, backup approver id |
| Default GL account | defaultglaccount, default gl account, default_gl_account, gl account, gl_account, gl |
| Cost center | costcenter, 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
Descris 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
| Type | Accepted |
|---|---|
| string | Anything, trimmed |
| integer | Digits only. 12.5, 1,200, -3 and n/a are errors rather than guesses |
| country | Two letters, such as CA or US |
| enum | One 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.
| Kind | Matched by, in this order |
|---|---|
| Properties | 1. an alias, exactly; 2. the code, ignoring case; 3. the normalized address |
| Vendors | 1. an alias; 2. the name, ignoring case; 3. the tax ID, when both the row and the record carry one |
| Units | The label, inside the building you chose, compared exactly — 4B and 4b are two doors |
| Entities | The 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 "against48is not a change, and neither ishrb-01againstHRB-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

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 preview | In the report after a commit | Means |
|---|---|---|
| Create | Created | Nothing in the workspace matched this row |
| Update | Updated | One record matched, and at least one field differs |
| No change | Unchanged | One record matched and nothing differs, or the same record is named earlier in the file |
| Not imported | Not imported | The row was not written, and the message says why |
The messages a refused row carries, and what each one means:
| Message | What to do |
|---|---|
| Nothing is feeding "Code", which every row needs | Choose a column for it on the Columns step. Any column of your own will do |
| This row has no name | A required cell is blank on that line. Fix it in your file |
"n/a" is not a whole number for Door count | The 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 workspace | Create the entity first, or correct the Entity column |
| The same building is already on line 12 of this file, so this row adds nothing | Nothing. 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
updatedwhere it predictedcreate. 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
- Importing your data — the walkthrough, step by step.
- Roles and permissions — who may import what.
- Properties and Vendors — where the records you import end up.