The biggest single product week of the month. Three flagships shipped in parallel: Live Coach moved out of spike into production, Revenue gained projections plus a deeper Channels view, and a brand-new Listing Visibility module went live behind a Firecrawl-backed rank crawler.
Live Coach — production-grade transcription.
Browser-direct-to-Deepgram via a temp token replaced the proxied path. An AudioWorklet buffer plus Deepgram keyterms tightened the small-transcript wins. A Web Speech instant-ghost overlay (Chrome / Edge) shows the rep what they just said before the model returns. Per-type suppression and rep-tunable thresholds eliminate noisy nudges, a pagehide teardown prevents zombie sessions, an hourly janitor closes anything stuck with ended_at=NULL, and the coach UI now hides itself to keep focus on the transcript surface. A silent-or-unavailable-mic warning surfaces fast when the rep's audio path breaks, and comm_log is unified via Twilio CallSid linkage.
Comms — every call captured, transcribed, and playable.
Inbound Twilio webhook plus a shared comm-log upsert helper. Every Twilio call records by default, with verify_jwt pinned. Recordings mirror into a durable Supabase Storage bucket, async transcription runs against plain Twilio calls (transcribe-recording), and reps can play recordings inline from the lead Communications tab.
Revenue PR 11 — Projections.
A new Projections tab with three sub-tabs (Form, History, CSV Upload). Annual + monthly projection tables, both lifecycle-aware. Drawer-edit pencil and a ProjectionEditPanel wired into the NewUnitDrawer. Bulk-upsert RPC with an EXISTS guard, an upsert RPC for individual rows, and a revenue.projection_import audit table. CSV parser with TDD test suite, drag/paste/file CSV import via ProjectionsCsvUpload (mirroring GoalsCsvUpload), and a downloadable CSV template.
Revenue PR 11 — New Unit Performance.
A complete new-unit tab with portfolio KPI strip (5 cards with skeleton loading), filter toolbar (multi-select chips for territory, bedrooms, phase + a guardrail toggle), sortable table with phase chips and guardrail badges, drawer with header + 4 KPIs + actions + projection breakdown + notes, and a Carson-tone recommended-actions list. Two RPCs (get_new_unit_kpis, get_new_unit_listings) move phase + band + pace% to the database.
Revenue PR 8 — Channels v2.
Channel Mix chart got a 3-stack treatment with LY Final. Booking Window column on ChannelSummaryTable. BedroomRevenueShareTab gained a ?months= URL filter and a Booking Fee Share tooltip. ChannelsTab gained a ?br= URL bedroom filter. PinnedKPIRow shows a Commission % badge with a bookingFeeMargin refactor. ChannelDrawer reorder plus a delete affordance on BookingCurveByChannel. PR 8 RPC migration added taxonomy + bedroom filter + booking-window mean/median.
Revenue — Calendar Occupancy.
A new tab in Revenue Reports renders 12 mini-calendars (responsive 1/2/3/4-col), each showing 365-day occupancy with STLY pace + LY-Final. Year stepper, bedroom chips, and a Tailwind-only modal (Esc + backdrop close) for the expanded month view. New get_calendar_occupancy RPC. Color-mode toggle (absolute heatmap vs smart-anchor delta) plus a hover tooltip.
Listing Visibility v1 — rank crawler.
Net-new module. A Firecrawl REST client with stealth + retry, listing-id extraction, listing metadata parser, URL builders, block detection, rank math, multi-adults search per market, and an orchestrator (live-fire passing). Card-based index + detail page with grade / visibility / history, bulk import from Guesty inventory, auto-sync Guesty inventory into Optimized Listings, aggregated weekly portfolio scan via pg_cron, and a weekly digest delivered as email + in-app inbox. Three iterative polish passes: v1.1 (search context + filters), v1.2 (tiles, trends, quick wins), v1.3 (admin polish).
CRM lifecycle — Phase 1 + 2.
Phase 1 removed Pricing/Live and added sub-statuses, checklists, and tags. Phase 2 made the lifecycle interactive: sub-statuses, tags, delays, and a property section on the lead drawer.
Guesty self-serve.
A self-serve Guesty connect wizard with two-path entry, plus a live read-through proxy + listings preview to validate the connection before write-back.