The extra-class offer now shows each client their own price
When a client used up their monthly classes, the offer to buy an extra one quoted the under-30 price to everyone and named the wrong date for when their classes come back. Both now show what is true for that client.
When a client on a limited monthly membership has used all the classes included in their cycle, we tell them so and offer them an extra class. Two things in that message were wrong. **The price was the under-30 price, for everyone.** Clients aged 30 and over were shown one amount and charged another at checkout — because the offer quoted your catalogue price, which for group classes is the VAT-exempt under-30 figure. The offer now shows each client the amount they will actually be charged, worked out by checkout itself, including their loyalty or other automatic rate, VAT and any first-purchase registration fee. Their age band is still resolved from their own date of birth and the VAT evidence you hold. Only their own price is shown; they never see both. **The date their classes come back was the billing date.** For most members those are the same day, so it usually looked right — but after a freeze, a pause, or if their start date was moved, the two drift apart and we named the wrong one. On a clip card we were showing the card's expiry date under the words "renews", which is never true. The message now uses the date the allowance genuinely resets, taken from the same place the remaining-classes count comes from, and says nothing at all rather than guessing when a pass has no cycle. This matters because waiting is often the better answer than buying. A client who can see that their classes return in two days can decide for themselves — and one who buys an extra class now sees the right price before they pay, not after.
Reliable discounted membership sales and failed-setup cleanup
Staff can again sell a membership with an agreed recurring price, registration fee waiver, referral offer, or other coupon-backed concession. Membership creation now uses Stripe's current subscription-discount request shape while preserving the existing concession precedence and retry fingerprint.