The running offer, on Plans & billing and on the launchpad

Featurekamo-internal
Shipped
August 31, 2026 at 3:32 AM UTC
Author
Kamo
Commit
b8f3e28

The console quoted list prices while kamocrm.com advertised a third off the same plan, because nothing in kamo-internal could see that an offer existed. It now reads the resolved offer from BillingService and shows what it does to the price: a banner above the plan picker with a countdown and what it saves on the order in hand, and each covered plan card struck through from its committed rate to the offered one. The estimate below already prices what the card shows, so the two cannot disagree. The launchpad gains a one-line pill beside the trial pill — to its LEFT, and shown whether or not the trial pill is up, since an organization past its trial with no subscription is exactly who the offer is for. It is gated on being able to act on it: a member who may buy their own seat, or an owner who may buy the organization's, and who is not already paying. That last test reads coverage.source, not coverage.paidBy — paidBy says WHO covers the seat, and somebody sitting on the organization's free-default subscription reads ORGANIZATION while being on no paid plan at all. Offering an upgrade to someone already paying is the fastest way to make a banner invisible. planOffer.ts holds the arithmetic so the pill and the console cannot drift, and because these are numbers people spend money on: the percentage comes off the rate for the term COMMITTED to, never the month-to-month list price, matching **************** 18 tests cover that ordering, the seat and term scaling, that an uncovered plan is left alone, and that the end date is the last day the code works rather than the first day it is not. check-server-timestamps caught the expiry parse: `new Date(\`${d}T23:59:59Z\`)` is explicit UTC and correct, but the guard cannot tell it from the naive-string bug it exists to catch, and a guard people learn to argue with is worse than the bug. It goes through parseServerDate now, which keeps a date-only value at UTC midnight — so the deadline is that plus a day, which is also clearer about why.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing