What We Shipped in May 2026
Compliance dashboard, move-out workflow, invoice categories, reporting reconciliation — a heavy month on the polish side of the product.
April was infrastructure. May was reconciliation — the unsexy work that turns a working product into one operators trust with their books. Here's the rundown.
Compliance dashboard
The biggest add this month. Every active lease now gets evaluated against state and city disclosure rules — bed bug notice in New York, window guard rider in NYC, sprinkler disclosure, indoor allergen hazard, all the way down to the recommended (but not mandatory) Good Cause Eviction notice for buildings that aren't exempt.
Open /compliance in your dashboard to see, across all active leases, who is missing what. The page groups disclosures by state, by individual disclosure, and surfaces the leases that are most at-risk (the ones with the highest count of unsigned mandatory items).
If you try to send a lease for e-signature while mandatory disclosures are still pending, we now block the request server-side with a 409 and surface a clear error in the UI: "Cannot send for signature — N mandatory disclosure(s) still unsigned. Bundle them in, or sign them out-of-band first." You can override with ?force=1 if you're handling the disclosures on paper.
Why it matters: in New York, missing a window guard rider on a unit with kids under 11 is a HPD violation. Missing the bed bug disclosure can void your right to recover possession in certain proceedings. The mechanical work of pulling the right form for each lease was eating hours per onboarding. Now it's automatic and visible.
Move-out workflow
The other half of the lease lifecycle that was missing. Until this month, you could create leases, renew them, terminate them — but the workflow stopped there. There was no place in Proprietio to capture the inspection report, itemize damages, generate a final statement, or refund the security deposit.
That's now wired end-to-end. On any active lease, the "Schedule move-out" button opens a wizard:
- Inspection — record the date, attach photos, add notes per room
- Damages — itemize each deduction with description, dollar amount, photo, and optional vendor invoice reference
- Statement — preview the PDF, edit the message to the tenant, send (we email it; the PDF lands in their tenant portal too)
- Refund — issue via Stripe (reverse the original deposit payment intent), or mark a manual ACH / check / cash refund
The math is straightforward: deposit collected - sum of damages = refund. The PDF statement is itemized and references the relevant state statute for deposit return timelines — 14 days in New York under General Business Law § 7-108, longer in other states.
If you're 10 days past the move-out date and haven't issued a refund, we'll email you a reminder. We don't enforce the deadline — that's between you and your state law — but we surface it.
Invoice categories
Small but impactful. Until May, all invoices on Proprietio were either RENT or FEE under the hood, even though the human-readable invoice number prefixed them as DEP (deposit), PRO (prorated), CAM (common area maintenance), or LATE. That made P&L reports lump deposits in with rent revenue — wrong for accounting purposes (a deposit isn't income until forfeited or applied).
We've added SECURITY_DEPOSIT, PRORATED_RENT, CAM, LATE_FEE, and UTILITY as first-class invoice kinds. The human-readable number prefixes now match the kind. Existing data has been backfilled where the number prefix was unambiguous.
Reporting reconciliation
The Reports → Overview tile used to say "Cash collected (TTM)" but underneath was summing invoices marked PAID rather than actual Payment rows. For migrated portfolios with legacy PAID invoices that never had a Payment record attached, the tile inflated. Same issue affected the NOI per property table, which mixed annualized gross potential rent with TTM actual collected revenue and labeled both as "Annual Revenue."
We've cleaned up:
- The NOI table now has separate columns for Annualized GPR (potential, rent roll × 12) and TTM Actual (sum of payments over the trailing 12 months)
- WALT (Weighted Average Lease Term) now returns
nullwith a reason code instead of0when no commercial leases exist, so the UI can show "N/A" instead of misleading zeros - The Tax Forms 1099 page now counts owner entities correctly — it was reporting zero potential 1099-MISC recipients even though we had four configured owner LLCs
Smaller polish
- Prospect tenants are now auto-flipped to
ACTIVEwhen theirtenancyStartdate arrives (server cron + lazy-flip on read). No more "why is my tenant still PROSPECT three days after they moved in" tickets. - Renewed leases had a small data inconsistency: the
statusfield saidRENEWEDbut therenewalStatusfield saidNOT_STARTED. Now they sync automatically when you renew. - The marketing site got a copy pass — about 12 typos, contradictions, and stale prices fixed. Most were invisible to anyone not reading the bundle source, but the homepage hero stat said "$49 entry plan" while the pricing page (correctly) said $29. That's fixed.
What's next
Phantom revenue reconciliation. Some of you have noticed that the "Cash collected" tile, even after the recent cleanup, still doesn't exactly match the sum of your Payment rows. That's because ~10% of your historical invoices were imported as PAID without an attached Payment row. We're building a one-time reconciliation script with a dry-run protocol — you'll see a CSV of proposed matches before anything writes to your database. Expect that in late May or early June.
If you have feedback, the in-app chat is the fastest way to reach us. We read everything.
Take the next step
14-day free trial. No credit card. CSV migration in 30 minutes.
See accounting features