First 50 seats always free: bill only seats above the free tier #25
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Flag: today a 51-user instance is billed for all 51 seats. The free tier should stack — the first 50 seats of every license are included free, so 51 total seats bills exactly 1 paid seat.
Decision (Nikola, 2026-08-24): absolute presentation. Every user-facing surface keeps talking in TOTAL instance seats (min 51); only the Paddle boundary deals in paid seats.
Design — one conversion boundary:
total − 50); the Paddle price quantity minimum drops from 51 to 1 (max 10000 → 9950).paddleTransactionCompleted: after deriving quantity (line-item sum or absolute subscription lookup),seats += freeSeatswhen > 0.resolveSeatChange: request stays total seats; validation floor becomes> freeSeats;subItemsBodysendsseats − freeSeatsto Paddle.quantity: paidSeats(seats); buy/quote totals price only paid seats; quotation shows the free-50 row as genuinely unbilled.docs/handbook/licensing-faq.mdgains the billing sentence.Note: any license issued before this change was billed for its full seat count; its next renewal/seat-change webhook re-signs it as quantity+50 (an effective +50 seat grant). Sandbox-only today — no live customers.
Shipped and live.
Monthly (per seat)pri_01kyr0wc…,Yearly (per seat)pri_01kyfy4x…) updated quantity 51–10000 → 1–9950 via API. Repeat on the live prices at the #26-launch sandbox→live swap.Sandbox dogfood checklist (needs a browser + Paddle sandbox card):