This article explains how to build the spreadsheet you upload in the first step of the bulk import wizard, the one that creates or updates monthly fees and leases for many units at once. It is for...
Last updated
This article explains how to build the spreadsheet you upload in the first step of the bulk import wizard, the one that creates or updates monthly fees and leases for many units at once. It is for property managers, building staff and board members who are preparing this file, and it is the article you will come back to most often, so it covers every column in full.
Before you build a spreadsheet from scratch, look for the button on the Upload step of the wizard that downloads a ready-made template. This template already knows your property: it comes with one row per real unit in your building, with the unit number already filled in and every other cell left blank for you to complete.
If your property has no units set up yet, the downloaded template will only have the column headings and no rows to fill in. Add your units to the property first, then download the template again.
The table below lists every column the spreadsheet can carry. The column name in the first row of your file must match one of the names shown here, or one of its listed alternatives, for it to be picked up automatically.
Four columns are always required, no matter what kind of fee you are recording: unit_label,
lease_type, start_date and billing_day. The payer_name column is optional. Two more columns are required only
depending on what lease_type says for that row: a row for a rented unit needs
rent_amount_cents, and a row for an owned unit needs condo_fee_cents. Everything else is
optional.
| Column | Required? | What it holds | Example |
|---|---|---|---|
unit_label |
Required on every row | The unit number exactly as it appears in your property | 304 |
payer_name |
Optional. Leave it blank to use the unit's current payer | The name of the person who pays, matched against the people on that unit | Sarah Chen |
lease_type |
Required on every row | Either RESIDENTIAL_RENTAL for a rented unit, or CONDO_OWNERSHIP for an owned unit. No other word is accepted |
RESIDENTIAL_RENTAL |
start_date |
Required on every row | The date the fee or lease begins, written as YYYY-MM-DD |
2026-10-01 |
billing_day |
Required on every row | The day of the month the charge is due, a whole number from 1 to 28 | 1 |
rent_amount_cents |
Required only when lease_type is RESIDENTIAL_RENTAL. Must be left out on an owned unit's row |
The monthly rent, in whole cents | 45000 |
condo_fee_cents |
Required only when lease_type is CONDO_OWNERSHIP (a fee of zero is allowed and counts as filled in). Must be left out on a rented unit's row |
The monthly owner fee, in whole cents | 62500 |
occupant_email |
Optional, but strongly recommended | The payer's email address. This is the strongest way to match the right person, and it is the address an invitation would be sent to | sarah.chen@example.com |
occupant_first_name |
Optional | The payer's first name, used only if a new person needs to be invited | Sarah |
occupant_last_name |
Optional | The payer's last name, used only if a new person needs to be invited | Chen |
end_date |
Optional, and only for rented units. A value here on an owned unit's row will be rejected | The date the lease ends, written as YYYY-MM-DD |
2027-09-30 |
reserve_contribution_cents |
Optional, and only meaningful on owned units. Left blank, it is treated as zero | A monthly reserve fund contribution, in whole cents | 5000 |
rent_frequency |
Optional. Left blank, it is treated as monthly | How often the rent is charged: ONE_TIME, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, BIWEEKLY or WEEKLY |
MONTHLY |
escalation_type |
Optional. Left blank, it is treated as no escalation | How the amount increases over time: NONE, FIXED_AMOUNT, FIXED_PERCENT or CPI |
NONE |
escalation_percent |
Optional. Left blank, it is treated as zero | The percentage the amount increases by, if the escalation type uses a percent | 3 |
escalation_amount_cents |
Optional. Left blank, it is treated as zero | The flat amount the charge increases by, in whole cents, if the escalation type uses a fixed amount | 2500 |
escalation_start_date |
Optional | The date the escalation begins, written as YYYY-MM-DD |
2027-10-01 |
security_deposit_cents |
Optional. Left blank, it is treated as zero | The security deposit amount, in whole cents | 45000 |
parking_amount_cents |
Optional | A parking amount, in whole cents | 7500 |
add_on_amount_cents |
Optional | An add on amount, in whole cents | 3000 |
notes |
Optional, up to 2000 characters | Free text carried onto the lease record | Renewed for a second year |
Every money column in this file, rent_amount_cents, condo_fee_cents,
reserve_contribution_cents, security_deposit_cents, escalation_amount_cents,
parking_amount_cents and add_on_amount_cents, is written in cents, not dollars. This is the
part people get wrong most often, so read this section carefully.
To turn a dollar amount into cents, remove the dollar sign and the decimal point, and treat the result as a whole number.
45000.125050.0.If you write 450 instead of 45000, the file will still be accepted, because 450 is a valid
whole number. But it will be read as $4.50, not $450.00, because 450 cents is four dollars and
fifty cents. The mistake will not be caught for you: it will quietly create a fee that is one
hundred times too small. Always multiply your dollar amount by 100 before typing it into the
file, and never include a decimal point, a dollar sign, or a comma in a money column.
The unit_label column is compared against the real unit numbers already set up in your
property. When a value matches a unit exactly, that row is accepted straight away. When a value
is close to a real unit number but not identical, for example a typo or an old numbering format,
the import will suggest the unit it thinks you meant, but it will not use that suggestion until a
person confirms it on the next step of the wizard. A close match is never applied automatically.
The payer_name column is optional. When you fill it in, it is matched against the people already
recorded on that unit. The closer the name is to an exact match, the more confident the system is; a
name that only partly matches will be flagged for someone to check by hand.
If you leave payer_name blank, the row uses the unit's current payer, the one person who holds the
unit's billing account today. If the unit has no payer, or has more than one, that row asks you to
choose a payer on the Payer step.
The occupant_email column is optional, but it is the strongest way to point the import at the
right person. If two people on the same unit have similar names, a matching email removes the
guesswork. It is also the address used if the row ends up inviting a new person to the property,
so an email you provide here saves a step later.
start_date (and end_date, where it applies) must be written as YYYY-MM-DD, for example
2026-10-01 for the first of October 2026. Any other format will be rejected.
billing_day is the day of the month the charge is due, written as a whole number from 1 to 28.
For example, a billing day of 1 means the charge lands on the first of every month. A billing
day of 28 is the highest number accepted, because not every month has more than 28 days.
If your spreadsheet has a column heading the import does not recognise, it will not stop your upload. On the Upload step, you can look at the table showing "CSV column" next to "Maps to" and point any unrecognised column at the right field by hand. Most files need no changes here at all; the matching happens automatically for common column names and their usual variations.
Anything you do not map, and that the system cannot use, is listed as "Not used" next to its column name. It is simply ignored, and nothing is lost from the columns you did map.
The file must be a CSV file. The upload screen will accept a file up to 50 MB, but in practice the import can only process a file up to 10 MB and up to 20,000 rows. If your file is bigger than that, it will be rejected once you continue past the Upload step, with a message asking you to split it into smaller files. If you are importing a very large property, split the spreadsheet into two or more files and upload them one at a time.
A small, correctly filled-in spreadsheet with one rented unit and one owned unit.
| unit_label | payer_name | lease_type | start_date | billing_day | rent_amount_cents | condo_fee_cents |
|---|---|---|---|---|---|---|
| 304 | Sarah Chen | RESIDENTIAL_RENTAL | 2026-10-01 | 1 | 45000 | |
| 512 | David Okonkwo | CONDO_OWNERSHIP | 2026-10-01 | 1 | 62500 |
$450.00 was written as 45000, and $625.00 was written as 62500. Notice that each row leaves
the money column that does not apply to it blank.
The table on the Upload step where an unrecognised column can be pointed at the right field.
| CSV column | Maps to |
|---|---|
| unit # | unit_label |
| tenant | payer_name |
| internal_ref | Not used |