Tested at 2,000 units
Before a large operator trusts PMFriend with a portfolio, a fair question is "have you ever run it at our size?" On 17 September 2026 we did: a test operator with four towers and 2,000 apartments, loaded on the live production system exactly the way a customer is onboarded — six CSV files per tower — and then given six months of maintenance history.
What was loaded
| Towers | 4 (500 apartments each), each with its own building record |
| Units | 2,000 apartments + 4 building records |
| Tenants and leases | 1,812 (about 92 % occupancy) |
| Owners | 332 — one holding company per tower plus individual investors |
| Equipment | 445 items: chillers, lifts, pumps, fire panels, AC units |
| Contractors | 12 |
| Maintenance history | 600 requests, 562 work orders, in every stage, in English, Arabic and Hindi |
The results
Onboarding
| Step | Rows per tower | Time per tower |
|---|---|---|
| Properties with owners | 501 | 14–21 s |
| Tenants | about 450 | 5–6 s |
| Leases | about 450 | 26–32 s |
| Equipment | about 110 | 3 s |
| Certificate register | 4 | under 1 s |
- All four towers — 2,000 units — were live in 3 minutes 36 seconds of upload time, with no failed rows.
- Uploading every file a second time created nothing new (24 seconds to confirm about 6,000 rows were already there). Fixing three rows and re-uploading a whole file is safe.
Everyday use at that size
| Screen | Rows | Response |
|---|---|---|
| Properties | 2,004 | 0.2 s |
| Tenants | 1,812 | 0.2 s |
| Maintenance requests | 600 | 0.2 s |
| Work orders | 562 | 0.2 s |
| Compliance register | 1,540 obligations | 0.2 s |
| Contractor scorecard | 12 contractors, 485 completed jobs | 0.2 s |
| Attention Inbox (the home screen) | whole portfolio | 0.3–0.4 s |
The server ran on its normal single instance throughout; the database peaked at 10 % CPU.
What the test found — and we fixed
Running at real size is how you find what a demo hides. Two things changed the same day:
- Existing leases arrived as alarms. Importing 1,812 running leases
produced 718 "lease registration overdue" items — for leases registered
long ago. The leases file now takes a
registered_ondate, and an older lease without one raises nothing. See Importing your portfolio. - A tenant's card didn't say where they live. It now shows the unit and the lease — or says clearly that there is no lease on file.
See it yourself
The test operator stays in place. Ask us for a walkthrough — the Attention Inbox, the contractor scorecard and "where do our jobs get stuck?" in ChatGPT are all more convincing at 2,000 units than at eight.