Bulk-import properties across landlords
Updated 2026-05-15
When to use bulk import
Bulk import shines when you're onboarding a new landlord with many properties, or migrating an existing book onto PropFlow. For one or two properties, the one-at-a-time wizard at Add a property on behalf of a landlord is faster.
Important: only .xlsx is accepted
Same rule as the landlord article — PropFlow rejects CSV with: "CSV uploads are not supported. Re-export as .xlsx from Excel or Google Sheets."
Add the landlords first
Before importing, every landlord_email on the spreadsheet must already exist on your /team page as a landlord. PropFlow won't auto-create them — this is a guard-rail against accidentally creating user accounts.
If you have, say, 5 new landlords whose portfolios you're importing, invite all 5 first via Invite landlords, then run the import.
Step 1: Download the template
- Go to Platform → System Configuration.
- Find the Imports section.
- Click Download template.
Step 2: Fill it in (13 columns)
Required (5)
- landlord_email — must match a landlord in your org. Case-insensitive.
- address_line_1
- city
- postcode — auto-uppercased, format-validated.
- property_usage —
privateorsocial.
Optional (8)
- address_line_2
- property_type — apartment / terraced_house / end_of_terrace / semi_detached / detached / studio / mixed_commercial / other.
- bedrooms, bathrooms (integers)
- is_hmo — TRUE or FALSE (string). Triggers HMO obligations.
- is_furnished — TRUE or FALSE. Triggers PAT testing.
- year_built — values < 2000 trigger Asbestos Property Type.
- epc_rating — A through G.
- description — free text, max 2,000 chars.
Step 3: Upload
- Back at Platform → System Configuration → Imports, click Upload spreadsheet.
- Pick your .xlsx. Max 1,000 rows per file.
- The upload runs server-side; typically under 30 seconds.
How rows are routed
For each row:
- PropFlow looks up the landlord by
landlord_email(case-insensitive) within your organisation. - If found: the property is created with that landlord as the owner, and stamped with the landlord's organisation_id.
- The Intake Agent seeds the property's compliance obligations.
- An audit-log row records you as the actor + the batch_id + source_filename + row_number + the resolved landlord_email.
- If not found: the row errors with: "landlord_email '{email}' not found in your organisation. Create the landlord on the Team page first, then re-upload."
Reading the import report
After upload you'll see "Upload complete · X created · Y skipped · Z error(s)". Expand the report:
- Created — green tick. New property added under the matching landlord.
- Skipped — amber. Duplicate detected by (address_line_1 + postcode) within the org.
- Error — red. The error message tells you the cause (missing landlord, bad postcode, invalid enum, out-of-range year, etc.).
Bad rows don't block good ones — each row processed independently.
Undo a batch
If a whole import came in wrong:
- Platform → System Configuration → Imports History.
- Find the batch by filename/timestamp.
- Click Undo.
- PropFlow hard-deletes every property in that batch (correct FK order — compliance, tenancies, applications, viewings, documents, photos, evidence packs, alerts, then properties). Audit log entries are kept for forensic trail.
Undo is irreversible — if you've started using one of the imported properties (added a tenancy, uploaded a certificate), think carefully before nuking the whole batch.
Common errors
- "landlord_email not found in your organisation" — add the landlord via /team first.
- "Maximum 1000 rows per upload" — split into multiple .xlsx files.
- "Invalid property_usage; must be one of: private, social" — check case-sensitivity on the value.
- "Invalid postcode format" — must be a valid UK postcode.
Tier gate
No tier gate on bulk import — every plan can use it, including Starter. Tenancy quota still applies per your plan.
Next steps
- Compliance for managing agents — once the obligations are seeded.
FAQ
- Does PropFlow auto-create landlords I haven't added yet?
- No — and this is deliberate. Each row's landlord_email must match an existing landlord in your org or the row errors. This forces you to think about the landlord's user account, billing implications, and the Team-page relationship before adding properties to them. Add landlords via /team first.
- What's the case-sensitivity rule on landlord_email?
- Lookups are case-insensitive. Mixed-case (Saeed@Example.com) matches the saved lowercase landlord row. PropFlow normalises to lowercase internally.
- Can different rows in the same .xlsx point to different landlords?
- Yes — that's the point. Each row is independent. One file can populate properties for 10 different landlords on your books, with each property correctly stamped against its landlord.
- If I bulk-import, who's recorded as the property creator?
- You (the org-admin or PM doing the import) are recorded as the actor in the audit log — even though the property's owner is the landlord. The audit row includes batch_id, source_filename, row_number, and the landlord_email so you can reconstruct exactly what was imported.
Ready to do this now?
Opens the relevant page in your PropFlow account.