Skip to content

Studio deliveryMulti-tenant booking SaaS · 2025 · Senior full-stack engineergetavana.com

Avana

Automated reminders and Stripe subscriptions for a multi-tenant salon booking platform.

Avana is a studio-delivered multi-tenant booking SaaS for salons: Stripe subscription billing mapped to entitlements, and automated SendGrid reminder sequences that replaced manual outreach. Delivered inside a previous studio, not a client contract with The SyncFlow.

Studio
Attribution
Full build
Scope
Live
Status

Delivered inside a previous studio. Contract terms belonged to that studio, so none are published here.

01

The problem

Salons live and die by the appointment book. Every no-show is an hour of a stylist’s day sold once and paid for never, and the platform had no automated way to prevent them. Reminders were manual, inconsistent, and the first thing a busy owner stopped doing.

At the same time the platform was moving to subscriptions. Billing had to be correct for many independent tenants, with different plans and different failure modes, without anyone watching it each morning.

02

Constraints

The conditions the solution had to survive, not a wish list.

Multi-tenancy
Every salon is an isolated tenant with its own staff, services, calendar and customers. Nothing could cross a tenant boundary.
Live product
Billing and messaging were added to a running application with real customers, not designed on a clean sheet.
Non-technical operators
Salon owners are not software users by trade. Anything requiring configuration would not get configured.
Unattended reliability
Subscription and reminder logic had to be correct without a human reconciling it daily.
03

The approach

In plain English, before the architecture.

The fix was to make the two things being done by hand, chasing payment and chasing customers, happen on their own.

Billing moved to Stripe subscriptions with plan tiers mapped to platform entitlements, so the application reads subscription state rather than keeping a second copy that can drift.

For no-shows, every confirmed booking schedules a SendGrid reminder sequence derived from the appointment itself, so it stays correct when a booking moves and owners never have to switch it on.

04

Architecture

The decisions that mattered, and why they were made that way.

  1. 01

    Subscription state as entitlements

    Plan tiers map to one entitlement record per tenant, derived from Stripe rather than duplicated. Upgrades and cancellations change access because the subscription changed, not because a flag was remembered.

  2. 02

    Idempotent webhook handling

    Webhooks verified by signature, deduplicated by event ID and processed idempotently. Retries and out-of-order delivery are normal conditions, so replaying an event produces the same result.

  3. 03

    Failed payment lifecycle

    Past-due and unpaid states handled explicitly with a defined grace period, so a card expiring over a weekend does not cost a salon its calendar on Monday.

  4. 04

    Event-driven reminder flows

    Booking events trigger a scheduled SendGrid sequence keyed to appointment time. Rescheduling cancels or re-issues it, preventing the failure that kills automated reminders in practice: messages for appointments that no longer exist.

  5. 05

    Tenant isolation and RBAC

    Tenant scoping enforced at the data-access layer with role-based access control above it, so isolation does not depend on every future endpoint remembering to filter.

05

Outcome

Reminder sequences now generate automatically from the appointment itself, replacing the manual outreach that no-shows had been quietly costing the business.

Subscription billing reads from Stripe as the source of truth, so entitlements move with the subscription instead of a second copy of plan state drifting out of sync.

Stack

  • React
  • Next.js
  • Node.js
  • MongoDB
  • Stripe
  • SendGrid

More work

Tell us what you can’t staff.

Twenty minutes. No deck, no discovery sequence. If we are the wrong fit we will say so on the call and point you somewhere better.