Custom Addresses
Detailed address and location entry for jobs that Google autocomplete can't find. Used a sacred-data model that protects user input from being overridden. First AI-created prototype at Roofr, then partnered with a BE dev to bring it into the real codebase.
Case highlights
40%
Pain validated
of surveyed users; #1 address entry issue at 55.8% (of that 40%)
Revenue protected
Bigger release approved
complete map + pin instead of a text-only solution that would have risked the report funnel
First at Roofr
AI-created prototype
Figma → HTML/CSS/JS → real codebase
Roofr’s New Job flow always starts with an address. Previously relied on Google autocomplete to provide us with both the text address and the lat/lng location data, but when it can’t find the address then the flow breaks. Coverage is worst on new construction, rural sites, and incorrect addresses. The fix sat unsolved for years because reports require lat/lng, and a text-only fallback would let users create jobs that can’t order Roofr Reports.
Custom Addresses ships both halves: type the full address and also drop a pin to lock the coordinates. The sacred-data model keeps user input safe from automation. It’s also the first AI-created prototype at Roofr. Static Figma screens weren’t impressing stakeholders, so I built a basic interaction in HTML/CSS/JS with Claude Code, which was used to get approval. Afterwards I partnered with a backend developer to stand the same env up inside the real codebase. Design team onboarded to the same workflow afterward.
- Address-entry friction at scale. 40% of surveyed users hit issues; 55.8% cite “address doesn’t show up” as the #1 complaint.
- Direct revenue risk. Reports require coordinates. A text-only fallback would create jobs that can’t order reports.
- Data integrity. Contractors were using fake addresses to get around the current limitation, corrupting downstream metrics and products.
- Sales objection unblocked. “We can’t adopt Roofr until we can enter our new-construction addresses.”
- Roofing CRM needs to support all addresses. It was extremely frustrating to our customers that we only supported addresses that were in Google’s Places API.
Launch
Unblock and protect
- 01 Unblock new-construction and rural jobs.
- 02 Capture exact coordinates for the measurement team.
- 03 Stop proxy-address corruption in the database.
- 04 Roll out via internal beta → slow rollout.
Strategy
Protect revenue, set up platform
- 01 Protect the report-revenue mechanic across rollout.
- 02 Unblock for multi-address support.
- 03 Make AI-native design the team standard.
- 04 Don't break other products that rely on the address.
- Lat / lng non-negotiable. Reports need coordinates.
- Autocomplete stays the happy path. Fallback can’t add friction for the addresses Google still finds cleanly.
- Entity contract holds. Payload backwards-compatible.
The project ran as a progression of artifacts. Each one unblocked the next.
- Static Figma mockup. Layout was right; the interaction questions stayed open.
- PRD with Claude. Edge-case enumeration first to iron out the interaction pattern between text fields and pin dropping.
- HTML/CSS/JS prototype with Claude Code. Leaflet, Nominatim, glass form panel, floating and anchored pin states. Built so stakeholders could feel the interaction. First AI-created prototype at Roofr.
- Real-codebase env, BE-dev partnered. BE dev set up the foundation; I did all the FE styling and UX. Engineering team is building off of this.
- V1-skip sign-off. Walked the C-suite, VP Engineering, and CRM PM Lead through the real-env build. Group chose the complete release over a text-only interim that would have broken the report funnel.
- Design-team onboarding. Rolled the same Claude Code workflow out to the rest of the design team. The team’s been running it since and it’s become the de facto standard.
TO CAPTURE · VIDEO ≤90s
Prototype walkthrough. Autocomplete happy path → sticky 'Enter address manually' → modal animates 600px → 1100px → glass form panel → floating pin → drag to anchor → reverse-geocode backfill → output JSON. Capture from the HTML/CSS/JS sales-tool prototype.
Sacred-data. Once a user types in a field or drops a pin, that input is locked. System-generated values render in purple with an “Auto” badge; user-confirmed values render in normal text. The pin mirrors the fields: floating (purple dot, follows form input via debounced geocode) is the system’s best guess; anchored (blue teardrop, user-placed) is immovable until released. The contract lets the system be aggressively helpful without clobbering a correction, and reads without a legend.
Essentially anything the user enters is sacred and the system should support that.
TO CAPTURE · IMAGE 3-up composite
Auto-fill state system. Empty → suggested (purple text + 'Auto' badge) → locked (normal text, no badge).
TO CAPTURE · IMAGE 2-up composite
Pin states. Floating (purple dot + pulse ring) and anchored (blue teardrop + × release).
TO CAPTURE · IMAGE 3-up composite
Status banners across the top of the map: locating, found, not found.
TO CAPTURE · IMAGE 2-up composite
Output JSON: 'verification: google-verified' (autocomplete) and 'verification: user-custom' (manual + anchored pin). Lat/lng forwarded to Measurements.
TO CAPTURE · VIDEO ≤90s
Real-codebase walkthrough. Same interaction inside Roofr's real codebase. BE dev built the backend; I did the FE styling. The artifact production engineering is building from.
Skip text-only V1
Reports require coordinates. A text-only release would create jobs that can’t produce reports, trading CRM friction for report-funnel breakage.
Figma → HTML/CSS/JS
Static Figma was stalling the conversation, and an interactive Figma prototype was impractical. Building it in code with Claude Code was faster and produced the real interaction. This version was instrumental in stakeholder approval and excitement.
Partner on the real codebase
The HTML prototype was a sales tool. To convert excitement into engineering velocity, I partnered with a BE dev to rebuild the same interaction inside Roofr’s real codebase. The real-env build is the handoff artifact.
Sacred-data model
User input is never overwritten by automation. Locked fields and anchored pins are immovable; suggested fields or floating pins are the system’s best guess. Visual language is intuitive and portable to any auto-fill surface in the product.
-
40%
Surveyed users hit the pain
#1 issue is 'address doesn't show up' (55.8%). New construction (27.9%) and unit / suite numbers (20.9%) round out the top three.
-
Revenue protected
Bigger release approved
C-suite, VP Engineering, and CRM PM Lead approved the complete map + pin release. The text-only interim would have broken the report funnel.
-
First at Roofr
AI-created prototype-in-codebase
Static Figma didn't land; HTML/CSS/JS with Claude Code did. Real-codebase env, partnered with a BE dev, shipped to engineering as the starting point.
-
Sacred-data model
Portable design pattern
User input never overwritten by automation. Reusable across any auto-fill surface in the product.
-
Design team onboarded
AI workflow rolled out
Rest of the team now running the same Claude Code practice. Became the in-house reference for AI-native product design at Roofr.
KPIs instrumented from rollout day one. Defined before launch so the success criteria don’t get reverse-engineered to whatever the data happens to show. Numbers fill in here as they land post-rollout.
- Feature adoption. Share of total jobs created via the custom-address flow rather than the Google autocomplete path.
- User unblock rate. Users who type 4+ characters, get no Google match, switch to manual, and complete job creation.
- Sales unblocked. New deals closed specifically because Roofr now supports new-construction addresses.
- Operational savings. Reduction in ‘Address Not Found’ support tickets.
- Unblocked revenue. Volume and dollar value of proposals, reports, and invoices on jobs created via the custom-address feature flag. Anchors the report-revenue protection that drove the bigger-release approval.
- Figma isn’t always enough. Static didn’t resolve the questions; a full Figma prototype was impractical. The call was recognizing that and moving to code.
- Prototype-in-code collapses the decision cycle. Debounce, pulse timing, modal-size animation, reverse-geocode latency. The real stack surfaces those early.
- Partner on the real codebase. The HTML prototype was a sales tool. The real-codebase env is the handoff artifact.
- Sacred-data is a contract, not a form pattern. Applies anywhere the system auto-fills or auto-corrects. The purple / normal language plus the “Auto” badge is portable across the product.
- AI workflow ≠ AI output. The model didn’t choose sacred-data, V1-skip, the BE partnership, or the team rollout. It accelerated edge-case enumeration, PRD drafting, and translating interaction into code.
In build. Q2 ‘26 rollout. KPIs below fill in as numbers land.
Deep dive
Curious about the specifics?
Adoption cohorts, revenue pivot data, prototype walkthrough videos, and the internal PRD are available on request during a portfolio review.