- Shipped
- November 15, 2026 at 9:56 PM UTC
- Author
- Kamo
- Commit
- d4c63c0
- PromoCodeService: one verdict (shared SubscriptionPromotions.check) for the public check, Have A Code? and the purchase; plain sentences; plan-fit headline + savings; never on Free or negotiated plans. - **************** takes promoCode: refused BEFORE the card is touched, slot claimed atomically in the purchase transaction, Stripe coupon scoped to the plan's product (amount_off = monthly value x term months [x seats]), redemption (channel BILLING_ORDER) + REDEEMED audit. A typed code replaces the automatic offer. - Automatic offer (catalog + Stripe) now skips codes that must be typed and single-use personal codes. - POST **************** (audited APPLIED); POST **************** (X-Internal-Auth, for APIService); **************** on MANAGE_PROMO_CODES.
