Visual explainer for the Credit Settings tab · numbers from production 2026-08-02 · companion to the timing research
🎟 Credits are class-entry tickets. A membership plan can hand tickets out, and a class can demand one at the door. Everything on the Credit Settings tab is just: how many tickets, when do they appear, when do they die.
🎁 Initial Credits — a bundle the moment they buy 🔁 Credits To Grant — a refill every Frequency days
Limited toggle OFF = unlimited plan. No tickets involved, members book freely (where classes allow).
🎟 ×N
▼ The CLASS demands a ticket
Each class has its own switch: session rules.
ON → booking costs 1 available ticket. No ticket, no booking. OFF → anyone can book, tickets irrelevant.
This is why "does the buyer need credits?" depends on WHICH classes they'll book — not just on the plan.
The four fields, translated
Initial Credits *
10
# of credits to issue immediately
"You get 10 tickets the second you pay." This is the one that makes same-day booking work.
Credits To Grant *
8
# of credits issued each period
"Your membership refills you with 8 tickets every period." 0 = no refills, ever.
Frequency Of New Credits *
30
frequency in days of when credits will be issued
"The refill happens every 30 days." (7 = weekly, 30 = monthly.) A nightly job does the refilling.
Days To Expire *
30
# of days before credits expire
"Each ticket dies 30 days after it was issued if unused." Stops hoarding across periods.
Life of a ticket
💳
Member buysplan's Initial Credits issued instantly, same request as the payment
🔁
Refillsnightly job adds Credits-To-Grant every Frequency days
📅
Member booksclass w/ session rules ON → 1 available ticket → Used
⌛
Or it diesunused past Days-To-Expire → Expired
Every ticket is a real row (billing.SessionCreditCustomer) with a status: Available → Used / Expired. Staff can also hand out one-off tickets manually (Manage Credits).
The recipe cards — what a gym can build on this screen ✅
Each card = a proposed ❓ "show me how" modal for the Credit Settings tab: the story, the exact numbers, and the summary sentence the gym should expect. The badge on each card says whether FPT can do it today.
Unlimited membershipNO CREDITS
✅ WORKS TODAY
"$149/mo — come as often as you like."
Limited toggle
OFF
everything else
—
📊 The most common plan type in production.
Summary: no credits involved — members book any class that allows it.
Limited monthlyRECURRING
✅ WORKS TODAY — the workhorse
"8 classes a month — $99/mo."
Initial Credits
8
Credits To Grant
8
Frequency
30
Days To Expire
30
📊 This shape (plus the weekly variant) = 100% of all 1,571 credit configs in production.
Summary: 8 credits now, 8 more every 30 days, unused ones expire with the period.
⚠️ Grant = 0: this shape only works after the Aug-2026 gate fix (PR !23715).
Summary: 3 credits at purchase, no refills, gone in 14 days.
Class pack / punch cardONE-TIME
✅ WORKS once PR !23715 ships (gate fix)
"10-pack — use within 90 days." The classic widget intro offer.
Initial Credits
10
Credits To Grant
0
Frequency
0
Days To Expire
90
📊 Exists 0 times in production — the form requires a Grant value and the old backend silently issued nothing for grant-less plans. Both fixed / fixable now.
Summary: 10 credits up front, nothing recurs, 90-day shelf life.
Drop-in single classONE-TIME
✅ WORKS once PR !23715 ships (it's a 1-pack)
"$22 — just this one class." Very common at CrossFit/boutique gyms.
Initial Credits
1
Credits To Grant
0
Frequency
0
Days To Expire
7
📊 Same shape as the punch card, count of 1. A natural widget offer next to the trial.
Summary: 1 credit at purchase, use it within the week.
Covered — but through a different lever than this screen ⚠
Gyms ask for these all the time. FPT does them — just not via the four credit fields, which is a top source of confusion. A help modal should say where to go.
Rollover credits
⚠ PARTIAL — expiry trick
"Unused classes carry over to next month."
How: set Days To Expire longer than the Frequency (e.g. expire 60, refill every 30) — each ticket lives past the next refill, so leftovers survive one extra cycle.
Limit: no cap — a no-show member can hoard. "Roll over up to 4" is not expressible.
Class-restricted plan ("yoga only")
⚠ YES — configured on the CLASS, not here
"This membership books yoga classes only."
How: classes carry membership associations (session rules on the class + which plans it accepts). The plan's credits then only open the doors of classes associated to it.
Confusion: lives in the Classes area, two screens away from Credit Settings. The #1 "where do I set this?" support question shape.
Guest passes / comps
⚠ YES — staff action, not a plan
"Bring a friend free" · "here's a make-up class on us."
How: staff issue one-off credits from a member's profile (Manage Credits). Tracked with a SourceId of Admin so reporting can tell them apart.
Off-peak membership
⚠ YES — via class associations
"Cheaper plan, valid weekdays 10am–4pm."
How: associate the plan only to the off-peak class slots. There's no time-window rule on credits themselves — the schedule IS the restriction.
Freeze / pause
⚠ AUTOMATIC — nothing to configure
"Pause my membership while I travel."
How: freezing the subscription stops the nightly refills; they resume (with the schedule shifted) when it reactivates. Built into the credit processor.
Real gym-world products FPT cannot express today ❌
The honest gap list. All demand-driven candidates — build when a real tenant asks, not before.
Why not: every ticket is identical — one untyped wallet per member. Workaround: sell two plans, which doubles the billing lines.
Variable-cost bookings
❌ NOT SUPPORTED
"A 60-min PT session costs 2 credits; a class costs 1."
Why not: booking is hard-wired to 1 ticket = 1 entry. No per-class credit price.
Shared / family wallet
❌ NOT SUPPORTED
"One 20-pack the whole household draws from."
Why not: credits belong to exactly one customer record. No pooling across members.
Capped rollover
❌ NOT SUPPORTED
"Roll over unused classes — up to a max of 4."
Why not: the expiry trick above has no accumulation cap. Would need a max-balance rule at issue time.
What production says (2026-08-02, read-only)
3,248,976credits ever issued
182gyms with credit plans
34,531credits issued in the last 30 days
1,571plan credit configs — every one recurring
0one-time (punch-card) plans — ever
✅ Translation: the credit system is a workhorse — but only its recurring mode has ever been used. The one-time mode (trial packs, punch cards) was doubly broken: the form fights it and the backend skipped it. The Aug-2026 gate fix repairs the backend half without touching the recurring mode at all — zero change for existing gyms.
⚠ The remaining trap (drove the builder warning): a class with session rules ON demands a ticket, and a plan with no credit config hands out none. A gym can sell that combination today and the buyer can't book. The Booking Widget builder now warns on exactly this pairing; the Credit Settings screen itself still lets it happen silently.
Proposed product change — help modals on the Credit Settings tab
💡 The idea (Antonio, 2026-08-02): add a "Set up from a recipe…" affordance on the Credit Settings tab — the five cards above as pick-one presets that fill the four fields, each with its plain-English summary. Plus two guard rails:
Un-require Credits To Grant (allow 0) so one-time packs are a first-class choice, now that the backend honors them.
Make the Summary line the truth-teller — "0 credits will be issued at the beginning" should read as a warning when Initial = 0 and Grant = 0 (a Limited plan that grants nothing is almost certainly a mistake).
Point sideways for the ⚠ cases — one modal footnote: "restricting WHICH classes this plan can book happens on the class (membership associations), not here."
Belongs to the memberships-management redesign PBI (the plan-card/facets work), not the onboarding epic.