pricing

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.

The Zatrovo TeamThe Zatrovo Team· January 4, 2026· 9 min read
Studio hero image
Photo on Unsplash

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
Stripe product architecture comparison for studio membership billing.

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:

  1. Settings > Billing > Revenue recovery > Manage failed payments
  2. Enable Smart Retries (already on by default on most accounts)
  3. Set dunning emails: "Email when payment fails" and "Email when subscription is cancelled"
  4. 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:

  1. Client selects pack on booking page
  2. PaymentIntent created for pack price
  3. Payment confirmed → credits added to client's account
  4. Each class booking decrements credits
  5. 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.

Zatrovo

Run your studio on Zatrovo

Stripe-powered billing, membership management, and class scheduling — all in one platform for studios.

Start 14-Day Free Trial
The Zatrovo Team
Written by
The Zatrovo Team
Studio operations research

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