Public Report Page
The 30-second tenant flow is the single most important user experience in PMFriend. If tenants can't submit in under a minute, they call instead, and the whole triage flow collapses.
The URL
Every property has a stable token (UUID, never rotates) at:
https://app.pmfriend.com/report/{token}
You generate the URL once when the property is created, print it onto a QR sticker, stick it inside the fridge door or meter box. It's the only interface the tenant ever uses.
What the tenant sees
PMFriend — 45 Bourke Street, Melbourne
What's going on?
┌─────────────────────────────────────┐
│ Tell us what's happening. A few │
│ sentences is plenty. │
│ │
│ │
└─────────────────────────────────────┘
Your name [_______________________]
Email or mobile [_____________________] (we'll only use this to
get back to you)
[ Submit ]
Is it an emergency (gas, fire, flood, personal safety)?
Call 000 or your after-hours number immediately instead.
That's it. One textarea + name + contact. No address dropdown (the URL already encodes the property). No category picker (Claude handles that).
What happens on submit
- Creates a
MaintenanceRequestwithchannel=WEB_FORM, statusNEW. - If the contact email matches an existing tenant record, links to it. Otherwise creates a new tenant.
- Fires a Hibernate post-insert event → PMFriend notification feed shows it immediately.
- The PM can now Suggest triage from the inbox — Claude runs on the textarea content.
Branding
Today the report page shows the agency name (if an agency.logoUrl is
set, it also renders the logo). No CSS customisation yet — the page is
intentionally minimal so tenants submit instead of getting distracted.
Why not an app?
Three attempts at tenant apps elsewhere in the industry. None got >15% tenant adoption. Reasons:
- Install friction. "Another app? For the one thing I do four times a year?"
- Onboarding friction. Email confirmation, password, terms, consent — 100% dropoff on a burst-pipe report at 11pm.
- Update friction. App store review delays, forced updates, version fragmentation.
A React Native tenant app is on the roadmap as an optional second channel, not a replacement. See Product Roadmap.
Rate limiting
Per-IP + per-token rate limits apply to the submit endpoint (5 submissions per token per hour). Trivially bypassable by a determined attacker, but good enough to block automated form-spam.
API
POST /api/v1/report/{token}
Content-Type: application/json
{
"text": "The dishwasher is making a loud rattling noise...",
"name": "Alex Nguyen",
"contact": "alex@example.com"
}
Returns { "requestId": "MR-...", "status": "RECEIVED" }.
See also
- AI Triage — what happens after submission
- Getting Started → Step 4 — how to print the QR sticker