New Features
1. Stacked Discount Codes
Checkout sessions, payments, subscriptions, and plan changes now accept up to 20 discount codes in a single request via thediscount_codes array. Codes are applied in array order — the first eligible code reduces the base price, the second reduces the already-discounted price, and so on — so you can layer campaigns without creating bespoke combined codes.

Plan change behavior
Response shape
The full set of applied discounts is returned under the
discounts array on payments and subscriptions — each entry includes discount_id, position, and cycles_remaining (for subscriptions). The legacy singular discount_id field is deprecated but still present for backward compatibility.
The singular
discount_code field is deprecated but still fully supported — existing integrations continue to work without changes. It cannot be combined with discount_codes in the same request. We recommend migrating to discount_codes when convenient, even for single codes, to take advantage of stacking and the richer response shape.2. Seven New Customer Notification Emails
Seven new transactional emails are now sent to your customers automatically, covering refund confirmations, subscription lifecycle milestones, and payment failures. Each email is independently toggleable from Settings → Communication under the Customer Emails section.
Opt-out (disabled by default)
Customer emails are separate from the notification emails sent to your team. Disabling a customer email does not affect your team’s notifications for the same event.
Improvements
3. Checkout Payment Page Overhaul
The payment page on checkout has been substantially reworked end-to-end — tighter layout, faster perceived load, clearer validation states, and refined card-input UX. In aggregate, these changes lifted observed checkout success rates by ~2–3% across global traffic.
Before

After
- Smoother field interactions — autofocus, smarter tab order, and improved keyboard navigation on the card form
- Cleaner error and loading states — inline validation surfaces precisely where the customer needs to act, replacing the previous full-form error banner pattern
- Faster paint — skeletons and progressive hydration eliminate the brief blank-state flicker on slow networks
- Mobile polish — tap targets, scroll behavior, and keyboard handling tuned specifically for mobile checkout, where the majority of traffic now lives
4. Product Form Rework
The product create, edit, and duplicate flows have been rebuilt from the ground up around a single, consistent form experience.
- Live preview — see how your product appears on the checkout and customer portal as you edit, side-by-side with the form
- Autosave — drafts are persisted automatically, so navigating away or losing your tab no longer means losing your work
- Markdown editor — product descriptions now support a full markdown editor with live rendering, link previews, and inline formatting controls
- Duplicate flow parity — duplicating a product opens the same unified form pre-filled, instead of a stripped-down dialog, so you can adjust every field before saving the copy
5. Business Settings Page Redesign
The Settings → Business page has been redesigned to make configuration easier to scan and faster to update. Settings are now grouped into clearer sections with explanatory copy that describes the impact of every toggle before you flip it. There are no behavioural changes to existing settings — only the layout, grouping, and surrounding explanations have improved.
Improvements
credits_amountoverride now propagated correctly to GET checkout session and payment link routes — when a checkout session or payment link was created with a per-checkoutcredit_entitlementsoverride, fetching that session or link via GET was returning the product-level defaultcredits_amountinstead of the overridden value. This is now fixed.- Refund action disabled for fully refunded payments — the Refund button on a payment is now disabled once a payment is fully refunded, with a tooltip explaining why. Previously the button remained active and returned an error only after submission.
- Minor bug fixes and stability improvements across the platform