← Back to all posts

Class cards: pre-paid packages that punch themselves

August 26, 2026 · 6 min read · by James, half-owner of a dance studio

Not every studio sells classes by the season. Some sell them by the package: six classes for $150, ten for $220, unlimited for a monthly rate. Drop-in yoga, adult fitness, adult ballet, teen open styles, competition team's off-season conditioning. Punch cards, class passes, whatever your studio calls them.

We just shipped Class Cards in Presently and this post is the honest walkthrough of what it does, what it doesn't do, and the couple of design decisions we made that studios often ask about.

What it does

Admins define card products. Under Setup → Class Card Products you name a card (6-Class Card, Unlimited Summer, Punch Pass 10), set how many punches it holds (or leave blank for unlimited), set the price, and optionally an expiry window (30, 60, 90 days from purchase). Two toggles per product: is it active, and can families buy it directly in the portal or is it admin-issue-only.

Families can buy directly. When a card is marked purchasable-by-family, it shows up in the family portal on a Class Cards page. The family sees the price, punch count, expiry (if any), and buys it with the card on file. The purchase runs through your Stripe Connect account like every other portal transaction. If a family doesn't have a payment method on file yet, they're prompted to add one.

Attendance punches the card automatically. This is the part I care most about. When you mark a student present, Presently checks the family for an active card and, if one exists, punches it. No extra clicks. No separate "did you use a card?" workflow. The attendance modal shows a small violet badge next to each student with an active card ("3 punches left" or "Unlimited card") so you know before you tap whether they're on a package or a regular tuition family.

Cards are family-scoped. Any student in the family can burn a punch. That's the model most drop-in studios I've talked to actually run: mom bought the ten-pack, either kid uses it. It also collapses the "who owns which card" bookkeeping into something a front desk staffer can manage without asking questions.

How we handle the tricky stuff

Multiple active cards on the same family? Earliest-expiry-first. If a family has one card expiring in five days with three punches left and another expiring in thirty days with six, we punch the five-day card first. Studios don't want families losing money on expired punches while an older card still has slack.

Refunds? Voiding a card sets it to inactive AND voids the source ledger entry via a paired credit. The redemption log stays in place — voiding a card doesn't un-punch a class the student already attended. If a family cancels after using 3 of 10 punches, void the card, and the family sees a full refund on the ledger for the card's purchase price (the 3 classes they already took are separate history). If your studio prefers pro-rated refunds instead, refund the difference manually and void the card without triggering the auto-credit.

What if a student attends without a card? Attendance saves normally. Nothing happens on the card side. This is the mixed-billing case — a lot of studios have some families on class packages and others on regular tuition. The system doesn't force everyone into the same model.

Unlimited cards. Set total punches to blank. The card stays "active" forever (or until the expiry date if one is set). Every present-attendance still writes a redemption row, so you can see how many classes an unlimited-holder actually took — useful when you're deciding whether the unlimited price is right for next season.

What we deliberately didn't do

Per-student cards. We chose family-scoped. Studios that need per-student can effectively achieve it by issuing a one-punch card, but the primary flow assumes a family shares. That's the working assumption we're rolling out with; happy to revisit if enough studios push back.

Transfers. Cards can't be transferred between families. If you accidentally issue one to the wrong family, void it and re-issue.

Partial punches. A drop-in class costs one punch, no matter how long it runs. A 30-minute stretch class and a 90-minute contemporary intensive both burn one punch. If you want different tiers, sell different products.

Pause / freeze cards. Not there yet. Right now the two states are active and voided. If your family is out for injury, the pragmatic option is to void + re-issue when they come back. We'll consider a "pause" state if the pattern becomes common.

Turning it on

Off by default for every existing tenant. If you don't sell class packages, nothing changes for you. To turn it on:

  1. Settings → Billing → toggle "Class Cards" on.
  2. Setup → Class Card Products → add at least one product.
  3. Optionally mark products as purchasable-in-family-portal so families can self-serve.
  4. Optionally issue a card to a family manually from their detail page → Class Cards.

From that point on: mark a student present, watch the card decrement. If your studio has a Class Card program, this stops being a spreadsheet you keep in your head and starts being a live part of your ledger.

What's next

A few next-step ideas we've talked about but haven't shipped:

Pause state — a family goes on injury for a month, the card pauses, expiry pushes out proportionally. Fair to studios, fair to families.

Card-level attendance report — see who used which card when, with a per-card burn-down chart. The redemption log is already tracked; it's just a UI on top.

Auto-renewal for unlimited cards — a monthly-unlimited card that recharges every 30 days off the family's stored card. Turns the whole thing into a subscription. Requires more careful Stripe wiring than the current fire-once purchase, so we didn't scope it into this release.

For now: the primary flow — buy a card, punch it via attendance, void with credit if needed — is on today. Turn it on and let me know what breaks.

Studio software, built by a studio owner.

I'm James, half-owner of a dance studio. My wife and I built Presently because the incumbents weren't designed for how studios actually work. 30-day free trial, no credit card.