How session credits actually work

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.

The two sides — plans give, classes take

▲ The PLAN hands out tickets

Credit Settings tab (Membership Billing → plan). Two ways tickets appear:

🎁 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 toggleOFF
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 Credits8
Credits To Grant8
Frequency30
Days To Expire30
📊 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.
"3× per week"RECURRING
✅ WORKS TODAY

"Three sessions every week."

Initial Credits3
Credits To Grant3
Frequency7
Days To Expire7
📊 Same engine as limited-monthly, weekly cadence.
Summary: 3 credits refreshed weekly; use-them-or-lose-them.
TrialONE-TIME
✅ WORKS once PR !23715 ships (gate fix)

"3 sessions in 2 weeks — $25."

Initial Credits3
Credits To Grant0
Frequency0
Days To Expire14
⚠️ 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 Credits10
Credits To Grant0
Frequency0
Days To Expire90
📊 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 Credits1
Credits To Grant0
Frequency0
Days To Expire7
📊 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.

Typed credit wallets
❌ NOT SUPPORTED

"8 group-class credits + 2 reformer credits per month." Boutique/Pilates staple (ClassPass-style tiers).

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: Belongs to the memberships-management redesign PBI (the plan-card/facets work), not the onboarding epic.