Fifty commits in a single day. Pricing, payments, invoicing, documentation, and an entire AI assistant — each one built on the assumption that a lawn care operator shouldn't need a computer science degree to run their business.
The prepay system gave customers a choice: pay per application across the season, or pay upfront for a discount. The discount calculates server-side — never trust a frontend amount for a payment. The quote page shows both options with savings spelled out. Stripe handles both flows through the same endpoint with a prepay boolean flag.
The payment flow itself had a bug where "Confirm Service" set the status to sold before payment, and the payment guard checked status to prevent double charges. Accepted-but-unpaid orders were locked out of their own payment button. The guard now checks the paid amount instead of the status.
An Invoices tab brought Stripe payment data into the application — card brand, last four digits, payment intent ID, all captured at confirmation time. The page reuses the pipeline composable with a paidOnly filter, proving the composable was designed with the right abstraction.
Products learned about exclusion rules. Select Essential and Premium disables itself with a lock icon and a tooltip. A JSONB column, no junction table, auto-deselect on conflict. The simplest encoding of a business rule that existed in the operator's head but not in the software.
Quick Measure and Quick Calculator connected through localStorage — measure a lawn, click a button, the calculator prefills with the exact square footage and address. The Convert to Order flow carries the address forward. One workflow where there used to be two isolated tools.
A knowledge base went live at /help — twenty-two articles across eight categories, entirely client-side, Protocol-inspired three-view layout with full-text search. No database, no CMS, no loading spinners. Just the answers, searchable.
And Bermuda — the AI CRM copilot. Thirteen tools, a tool-use loop that queries iteratively until it has enough context to answer, persistent conversations with memory that learns user preferences over time. Ask it a question about your pipeline and it goes to the database, not to its training data. Floating or docked, gated to Pro plan, tenant-isolated at both layers.
Fifty commits, and the thread that connects them: every one reduces the distance between wanting something and having it. A price you can pay in one click. A measurement that flows into a calculator. An AI that answers from your data. Documentation you can search. Each feature removes a step, a tab switch, a phone call, a moment of confusion. The product gets simpler while the system underneath gets richer.