A customer views their quote. The services are listed, the map shows the property, the total is clear. They want to pay. Before this session, there was no way to do that. The quote page was informational — look but don't touch. Payment happened over the phone, or not at all.

Stripe Connect payment flow landed on the quote page. A new QuotePaymentDialog component mounts Stripe's Payment Element scoped to the tenant's Connect account. The backend creates a PaymentIntent on the tenant's account, the frontend collects the card, the backend verifies the intent status server-side before marking anything as paid. No trusting the frontend's claim that payment succeeded.

On successful payment: order status moves to sold, the paid amount records, an OrderStatusChanged event fires through Pusher, and an admin email dispatches. The operator knows within seconds that a quote converted to a sale — a notification on their phone while they're servicing another lawn.

The quote page UI got polished alongside the payment work. Card styling removed from the header in favor of a divider. Logo increased to 80 pixels. Greeting font decreased to 1.15rem. The in_process status shows "Waiting Confirmation" in amber instead of a technical status string. "Select & Sign Up" became "Confirm & Pay Now →" — an action that describes what the customer is about to do, not what the system is about to process.

The old iframe-based measurement dialog got removed from the quote page — dead code from an earlier version where re-measurement was embedded in the quote flow.