Serve the running offer, and say whether a seat is actually PAID for

FeatureBillingService
Shipped
August 31, 2026 at 3:31 AM UTC
Author
Kamo
Commit
5923a39

Adds GET /markets/{id}/promotion. There was no way for an in-app buying surface to know an offer was running at all — the marketing site read promotions through the public catalog proxy, and kamo-internal had no equivalent, so the Plans & billing console quoted list prices while kamocrm.com advertised a third off the same plan. It returns the offer RESOLVED, not the raw row. Every consumer of the raw shape has had to re-derive the same three things — whether it is live today, which plans it covers by code rather than by UUID, and which cycles — and every one that did so got at least one wrong: the marketing site widened a two-plan code into an every-plan code by comparing UUIDs against plan codes, and its hero filtered on the discount TYPE and silently advertised nothing for months. Liveness comes from SubscriptionPromotions.check, the same predicate calculatePrice applies when it actually discounts an order, so a surface cannot advertise a code checkout will decoder. Plans come back in display order, because the surfaces write them into a sentence and "Business and Starter" reads as though the tiers ran downhill. /self/coverage now also returns `source`. `paidBy` names WHO covers a seat, which is a different question from whether anything is being paid for it: a member on the organization's free-default subscription reads paidBy=ORGANIZATION and is on no paid plan at all. Anything offering an upgrade has to be able to tell those apart, and paidBy cannot.

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