Skip to content

QR stickers

The shortest path from “this thing is broken” to a filed incident is a QR code on the thing itself. CondoPulse generates a printable sticker sheet with one code per asset; a resident scans the sticker on the broken treadmill and lands on the report form with that treadmill already selected.

Each asset gets a short public URL:

GET /r/[assetId]

It’s a public redirect to /incidents/new?assetId=... - the report form with that asset pre-selected. Two details worth knowing:

  • Scanning is public; submitting is not. Anyone can follow the link, but the report form still requires login. A visitor who scans without an account hits the sign-in step; residents who are already signed in go straight to a half-completed form.
  • The QR encodes your deployment’s base URL (taken from BETTER_AUTH_URL, or the request host) - so set that env variable to your real public URL before printing, or the stickers will point at the wrong host. Reprinting fifty laminated labels because the codes embed http://localhost:3000 is a rite of passage you can skip.

The redirect carries only the asset ID. Severity, title, description, photos, and the anonymous option are all chosen by the reporter on the form, exactly as in the normal flow (see Reporting an issue).

/admin/qr (staff) renders a printable sheet with one card per asset. Each card contains:

  • the QR code (crisp SVG - scales to any label size without pixelation),
  • the asset name (“Elevator A2”), so a human can confirm they’re scanning the right sticker,
  • the call to action - “Scan to report an issue”,
  • and the property name.

The sheet is laid out as a CSS grid sized for label sheets: print it onto adhesive label stock from a normal printer, peel, and stick. Printing is just the browser’s print dialog - the same print-first approach as the /report page.

  • Print at 100% scale - disable “fit to page”, which can shrink codes and misalign label boundaries.
  • Do a plain-paper test first, scan a couple of codes from the page with a phone, and check each lands on the right asset’s form.
  • Laminate (or use weatherproof stock) for harsh spots - the parking garage door and pool-area stickers live outdoors-adjacent lives.
  • A new asset means one new card - re-open /admin/qr and print the one sticker you need.

The rule: at the point of failure, at eye height.

AssetSpot
ElevatorsInside the car, next to the panel - where the stuck person is
GymOn each major machine, plus one at the door
PoolAt the entrance gate (where “it’s closed/green water” gets noticed)
Parking garage doorOn the wall beside the door, driver’s-window height
LaundryOne per machine
Fire alarm panel, HVACAt the panel - useful to staff and contractors too

The friction it removes is real: without the sticker, reporting means remember the URL → sign in → find the asset in a picker → describe it. With it: scan → describe → submit. In practice that’s the difference between “I kept meaning to report that treadmill” and a timestamped incident with a photo - filed by the person standing in front of the problem at the moment it’s a problem.

It also improves data quality where it matters most for the building’s record: reports arrive attached to the right asset, which is exactly what drives the uptime bars, the digest’s downtime hours, and the asset health ranking in Insights. An asset-less report has to be triaged by hand; a scanned one is born triaged.

Pair the stickers with the lobby kiosk and the loop closes in public: scan the sticker on the dead treadmill, and the incident is scrolling across the lobby screen - with the gym’s slat turning amber - before you’ve finished your workout.