The mobile widget used to be a dead end. Type an address on your phone, see the satellite image, and then — "Enter your email and we'll send you a link to measure on desktop." A polite way of saying: this doesn't work here. Come back on a real computer.

Now it shows you a quote.

When the mobile step loads, it fires a property insights request using the lat/lng from Google Places. Back comes the lot size, the structure footprint, the estimated maximum lawn area. Product prices calculate from the estimate — per-application discounts, annual totals, the same math the desktop pricing view does. The customer on their phone sees: your property is approximately 8,400 square feet of lawn, here's what each treatment costs, here's the annual total.

The CTA changed from "Send me a link" to "Ask for Measured Quote." Behind it: create a customer record, create an order, store the estimated square footage in the order notes, send the measurement link email. The lead exists in the system now. The operator sees it in their pipeline. The customer gets an email with a link to the full measurement tool — but they've already seen approximate pricing, which means they arrive at the measurement step already knowing the ballpark. The measurement confirms or adjusts. It doesn't surprise.

A subtle data decision: the estimated square footage goes into the order's note field, not square_feet. Storing it in square_feet would trigger hasExistingMeasurement, which would skip the measurement step entirely on the customer's next visit. The estimate isn't a measurement. It's a preview. Keeping them in separate fields preserves the distinction.

And lat/lng handling uses ?? null instead of || null — because latitude zero is the equator, and JavaScript's || operator would coerce it to null. A one-character difference between correctly geocoding a property in Ecuador and silently losing its coordinates.

The mobile step label changed from "Email" to "Quote." Not because the label matters technically, but because the step's purpose changed. It's not a handoff anymore. It's a preview. The widget went from saying "come back later" to saying "here's what this costs."