The problem
Bridger Property Group manages 340 units across Bozeman and Livingston — a mix of long-term rentals, seasonal cabins, and vacation properties. Their back office ran on a patchwork of Excel sheets, a legacy desktop accounting app, and a shared Gmail inbox for maintenance requests. Rent collection was manual: print statements, stuff envelopes, process paper checks. Late payments averaged 23% of the portfolio each month.
Maintenance requests came in by phone, text, email, and sometimes handwritten notes slipped under the office door. There was no triage — a dripping faucet sat in the same queue as a burst pipe. Two full-time admins spent most of their week chasing tenants, re-entering data between systems, and manually reconciling owner distributions. Seasonal vacation units were priced on gut feel with no visibility into local demand patterns.
What we did
Weeks one and two we built the tenant portal on Next.js with Clerk authentication. Tenants get a single login to view their lease, pay rent via Stripe Connect, and submit maintenance requests with photos. Autopay enrollment is opt-in with a two-click setup — no paper forms.
Weeks three and four: lease automation. We modeled the full lifecycle — application, approval, move-in, renewal, termination — as Inngest workflows. Lease renewals generate 90 days before expiry, route for manager approval, and send tenant notifications automatically. Drizzle ORM on Postgres keeps the data layer type-safe end to end.
Week five we wired up maintenance request intake. Tenants describe the issue in plain language and attach photos. Claude API triages each request — classifying urgency (emergency, urgent, routine), suggesting a vendor category, and drafting an initial response. Emergency requests page the on-call manager immediately; routine items queue for next-day dispatch.
Weeks six and seven: the owner portal. Property owners see real-time occupancy, rent collection status, maintenance spend, and monthly distribution statements. Stripe Connect handles split payments — rent flows in, management fees deduct automatically, and owner distributions land in their bank accounts without manual reconciliation.
Week eight: seasonal rate optimization. We built a pricing engine that pulls local event calendars, historical occupancy data, and competitor pricing to recommend nightly rates for vacation units. Managers approve or override suggestions weekly.
Weeks nine and ten: hardening, migration of existing lease data, tenant onboarding emails, and staff training. We wrote runbooks for every automated workflow so the team knows exactly where to intervene when edge cases arise.
Results
After 90 days in production, late payments dropped 42% — driven almost entirely by autopay adoption, which hit 68% of tenants within the first month. The two admin positions were consolidated to a single part-time role, eliminating 1.5 FTE and saving $58K annually. Vacation unit revenue increased 12% in the first season as dynamic pricing captured demand spikes around Bozeman events and ski weekends. Maintenance response time for emergency requests dropped from an average of 4.2 hours to 18 minutes. Bridger’s owners now receive distributions three days after month-end close instead of the previous ten.
