2-hour-after-class review prompt
Booking confirmed → client marked attended → 2 hours after class end → email with a one-tap star picker. Magic-link auth, no login.
Every confirmed booking gets a one-tap review prompt two hours after class. Ratings land private. You toggle each one public when you're happy with it. The aggregate average renders on your storefront from the reviews you publish.
Opposite of marketplace reviews that go live on submission. Your relationship with the client, your judgement about what reflects the studio.

Booking confirmed → client marked attended → 2 hours after class end → email with a one-tap star picker. Magic-link auth, no login.
Every review lands as private. You read the comment, sit with the rating, decide whether to publish. Hidden-at audit tracks every visibility change.
Toggle is_public to true on the reviews that tell the real story. Aggregate average updates on the storefront. Un-publish at any time.
Marketplace platforms (Mindbody, ClassPass, Yelp) publish every review on submission — consumers need an independent signal before booking somewhere new. The argument against it for a boutique studio on its own booking page:
A single off-day from an instructor can post a 2-star rating that drags the studio average down for months. The marketplace controls the surface.
Existing clients aren't using the review feed to decide whether to come back — they use their direct relationship. Public reviews on your booking page primarily serve new clients in discovery mode.
Most new clients for boutique studios come from word-of-mouth, not review-driven discovery. The marketplace case for unfiltered public reviews doesn't apply.
Operator moderation gives the studio the signal (unhappy client, quality issue) without the public-record damage. Address it privately, fix what happened, keep the relationship.
The reviews you publish reflect the studio you're actually running — not the average of every off-day captured publicly.
See why operator-moderated reviews beat marketplace ratings for the full argument.
Each review ties to a single booking. Unique on booking_id, so a client can't submit twice for the same class. Rating 1-5; comment optional.
instructor_review_stats view averages reviews of classes that instructor taught. Available in the schema; surfaces on instructor profile pages later.
service_review_stats view averages reviews of classes of that service type — Reformer Flow vs Slow Flow Yoga vs Reformer Foundations. Surfaces on class detail pages later.
No. Reviews are private by default. Every review lands in your dashboard as private. You toggle each one public when you're happy with it. The aggregate average on your storefront updates as you publish; only published reviews count toward the visible average. Opposite of marketplace platforms where reviews go live on submission and the studio has limited recourse.
Two hours after class end, Junocal emails the booked client a one-tap link to /r/{token} — unique to that booking, expires after seven days. The page renders a 1-5 star picker and optional comment field. One tap for the rating, optional comment, submit. No login, no app. Magic-link-style auth.
Because the studio relationship is the asset, not a marketplace's attention. When Mindbody publishes every review on submission, a single off-day from an instructor can post a 2-star rating that stays visible forever and pushes the studio average down. Operator moderation gives the studio the signal without the public-record damage — handle it with the client privately, publish the reviews that reflect the studio you're actually running.
Nothing technically — the studio chooses. Boutique-studio clients aren't operating on the Yelp trust model. Most studio clients trust the studio through word-of-mouth, and the booking page is a confirmation, not a discovery surface. A handful of strong 5-star reviews tells the same story Yelp would: people like this place. Marketplaces like Mindbody control the review feed precisely because consumers need that signal in discovery; Junocal isn't a marketplace, so operator moderation fits.
Yes. Each review has an is_public toggle and a hidden_at audit field. Publishing flips is_public to true. Un-publishing flips it back and writes the timestamp plus operator user_id to hidden_at. Original review text isn't deleted — you can re-publish later.
Both, via aggregation views. instructor_review_stats averages reviews of classes that instructor taught. service_review_stats averages reviews of classes of that service type (Reformer Flow, etc.). Queryable but not yet rendered in the operator UI — they exist for surfacing on instructor profiles and class detail pages.
Aggregate star rating at the top, then published reviews in chronological order. Each shows the rating, comment (if provided), and date. Client name renders as first name plus last initial (Sarah K.) for privacy. Per-class and per-instructor surfacing follows.
No. The prompt only fires for confirmed bookings where the client was marked attended on the day-of roster. Cancelled, no-showed, or studio-cancelled classes get no prompt. The scheduled-job queue only fires the email after the class end timestamp passes.