Stripe for Studios: Setting Up Recurring Memberships and Class Pack Billing
A step-by-step Stripe configuration guide for studio membership billing — products, prices, subscription schedules, and failed payment handling.

Stripe's native subscription tools handle 95% of studio billing needs. Studios that configure them correctly eliminate the billing support tickets that occupy front desk hours — failed payment chasing, manual renewals, and mid-cycle change confusion. This guide covers the Stripe setup that maps directly to class-based studio billing: product architecture, subscription schedules, failed payment recovery configuration, and the API patterns that keep billing logic clean.
Why Stripe Is the Right Foundation for Studio Billing
Most studio-specific billing platforms are built on Stripe. When you use a platform that wraps Stripe, you benefit from Stripe's infrastructure (PCI compliance, fraud detection, smart retry logic) plus the studio-specific layer (class access rules, pack credit management, attendance gates).
Understanding Stripe's native structure helps you evaluate any platform built on it — and diagnose billing issues when they arise.
The core Stripe objects that matter for studio billing:
| Object | What it does | Studio use case | |--------|-------------|-----------------| | Customer | Stores payment method, billing email | One per studio member | | Product | Describes what you sell | One per membership type or pack type | | Price | Billing amount + interval | Monthly price, annual price per Product | | Subscription | Recurring billing schedule | One per active member | | Invoice | Generated automatically each billing cycle | Sent to member for each payment | | PaymentIntent | Handles a single transaction | Each pack purchase, drop-in, retail item |
Getting the Product/Price hierarchy right from the start prevents the catalog sprawl that makes Stripe dashboards unmanageable.
How Do You Structure Products and Prices?
The correct hierarchy: Product → Prices (multiple).
Create Products that represent the membership concept, not the specific price point. A "Studio Membership — Capped 12 Sessions" is a Product. A "$175/month" is a Price under that Product. An "$1,890/year" (10% annual discount) is another Price under the same Product.
This structure lets you:
- Run monthly and annual billing from one product record
- Compare revenue across subscription types in Stripe's reporting
- Add price variants (e.g., grandfathered pricing) without cluttering your product catalog
How Do You Set Up Subscription Schedules for On-Ramp?
For studios running an on-ramp or fundamentals program, Subscription Schedules let you define a multi-phase billing sequence without manual intervention.
Phase 1: on-ramp period (14–21 days, $0 or on-ramp fee billed separately) Phase 2: standard membership billing at full price on the schedule start date
const schedule = await stripe.subscriptionSchedules.create({
customer: customerId,
start_date: onrampStartDate,
phases: [
{
items: [{ price: onrampPriceId }],
end_date: membershipStartDate,
},
{
items: [{ price: membershipMonthlyPriceId }],
},
],
});
This automates the transition from on-ramp to membership with no manual step. The member's credit card is charged the on-ramp fee upfront, then the membership billing begins automatically on the phase transition date.
How Do You Configure Failed Payment Handling?
Stripe's Smart Retries are on by default but require supplementary SMS outreach to reach maximum recovery rates.
In Stripe Dashboard:
- Settings > Billing > Revenue recovery > Manage failed payments
- Enable Smart Retries (already on by default on most accounts)
- Set dunning emails: "Email when payment fails" and "Email when subscription is cancelled"
- Set subscription cancellation behavior: "Cancel after X days" — set this to at least 30 days to give your external outreach sequence time to work
The critical configuration: do not set Stripe to cancel subscriptions on first failure or even on Day 7. Stripe's default cancellation timing is often too aggressive. Extend the cancellation window to 30 days and manage access gating through your application layer (suspend booking access on Day 11, cancel subscription on Day 30).
For the full 11-Day Recovery Sequence and SMS message templates, see our studio payment processing guide.
How Do You Handle Membership Pauses and Freezes?
Stripe doesn't have a native "pause" concept — you pause subscriptions by either putting them on hold (subscription.status = paused) or cancelling and recreating them.
The pause implementation that works:
Option A: Stripe subscription pause. Stripe added native subscription pausing in 2022 — pause_collection on the subscription object stops billing for a defined period without cancelling. The subscription status changes to paused and billing resumes automatically on the resume date.
await stripe.subscriptions.update(subscriptionId, {
pause_collection: {
behavior: 'void',
resumes_at: resumeTimestamp,
},
});
Option B: Coupon-based pause. Apply a 100% discount coupon for the pause period. The invoice is generated but shows $0. Less clean than Option A but supported in older Stripe API versions.
Communicate pause policies clearly: maximum 2 pauses per year, maximum 60 days per pause, minimum 7-day notice. These limits prevent pause abuse while accommodating legitimate needs (injury, travel, family event).
How Do You Manage Class Pack Billing?
Class packs are one-time purchases — use PaymentIntents, not Subscriptions.
The pack billing flow:
- Client selects pack on booking page
- PaymentIntent created for pack price
- Payment confirmed → credits added to client's account
- Each class booking decrements credits
- Credit balance visible in client's member portal
The Stripe setup: one Product per pack type (5-class pack, 10-class pack, 20-class pack), one Price per product (one-time, not recurring). Use payment_intent_data.metadata to attach pack type and credit quantity to each purchase — this is the data your application needs to allocate the correct credit amount.
const paymentIntent = await stripe.paymentIntents.create({
amount: 22000, // $220.00 in cents
currency: 'usd',
customer: customerId,
metadata: {
pack_type: '10_class_pack',
credit_quantity: 10,
studio_id: studioId,
member_id: memberId,
},
});
For the broader class pack and membership strategy, read our class pack vs membership decision framework.
What Stripe Reporting Should You Monitor Monthly?
Four Stripe reports matter for studio billing health:
MRR (Monthly Recurring Revenue) and churn. Stripe's Revenue overview shows MRR, new MRR, expansion, contraction, and churn in a single view. Monitor MRR churn rate — above 5% monthly is a retention flag.
Failed charge rate. Stripe's Payments > All charges filtered by status:failed. Track as a percentage of total billing attempts. Above 5% warrants a dunning sequence review.
Dispute rate. Stripe's Disputes section. Above 0.5% of charges triggers monitoring; above 1% risks account termination.
ACH vs card revenue split. Identify opportunities to migrate high-value members to ACH billing at lower transaction cost (0.8% vs 2.9%).
For the full payment infrastructure playbook including Square and Vagaro comparisons, see our studio payment processing guide.
Run your studio on Zatrovo
Stripe-powered billing, membership management, and class scheduling — all in one platform for studios.
We write playbooks for studio operators — based on data from thousands of studios running on Zatrovo across pilates, yoga, lash, nail, massage, salon, dance, and fitness.
Related reading

Studio Payment Processing: Stripe, Subscriptions, and Failed Payment Recovery
The complete payment infrastructure guide for studios — gateway selection, subscription billing, failed payment recovery, and refund policy templates.

Stripe for Fitness Studios: Gateway Setup, Webhooks, and the Configurations That Matter
A technical and operational guide to Stripe for class-based businesses — payment links, webhooks, retry logic, and the configurations most studios skip.

Chargeback Prevention for Studios: Policies and Documentation That Win Disputes
The documentation, communication records, and refund policy language that win chargeback disputes — and the practices that prevent them from being filed.