Lawn care isn't a one-time purchase. It's a five-application seasonal program — a commitment measured in months, not transactions. So when a customer looks at a quote showing $50 per application times five applications, the natural question is: what if I pay for the whole year upfront?

Products now carry an annual_discount_percent field. For multi-application products, the product editor shows the discount option. On the quote page, when a product has a prepay discount, both prices appear: the regular annual total and the prepay offer with the discounted price and savings amount spelled out. "Pay Annually" opens Stripe checkout with the discounted amount. "Pay Per-App" confirms without payment — the standard flow for customers who pay as they go.

The discount calculation lives server-side. The frontend shows the number. The backend computes and charges it. Never trust a client-calculated payment amount. After payment, the order gets flagged prepaid=true with the prepay_discount recorded for reporting.

The accepted badge color landed on dark forest green — #166534 — after testing against the quote page's other green elements. A small decision that affects every accepted quote every customer sees.