Skip to main content
PropFlow AI
Managing agent (housing & support)

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

  1. Go to PlatformSystem Configuration.
  2. Find the Imports section.
  3. 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_usageprivate or social.

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

  1. Back at Platform → System Configuration → Imports, click Upload spreadsheet.
  2. Pick your .xlsx. Max 1,000 rows per file.
  3. The upload runs server-side; typically under 30 seconds.

How rows are routed

For each row:

  1. PropFlow looks up the landlord by landlord_email (case-insensitive) within your organisation.
  2. If found: the property is created with that landlord as the owner, and stamped with the landlord's organisation_id.
  3. The Intake Agent seeds the property's compliance obligations.
  4. An audit-log row records you as the actor + the batch_id + source_filename + row_number + the resolved landlord_email.
  5. 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:

  1. Platform → System Configuration → Imports History.
  2. Find the batch by filename/timestamp.
  3. Click Undo.
  4. 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

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.

Open bulk importer

Back to Managing agent (housing & support)