From Piano Teacher to SaaS: Building Grace Piano
The Starting Point
Grace Piano started with a simple observation: piano teachers spend an enormous amount of time on administrative tasks instead of teaching. Scheduling lessons, tracking student progress, managing payments, sending reminders — all of this eats into the hours that should be spent making music. I wanted to build a tool that handles all of that so teachers can focus on what they do best.
Having taught piano myself, I understood the pain points firsthand. That domain knowledge turned out to be the most valuable asset in the entire project, far more important than any technical skill.
Choosing the Stack
For a SaaS platform that needs to be reliable, fast, and maintainable by a small team, I went with Next.js as the foundation. The app router gave me server components for the dashboard pages and client components where I needed interactivity.
Authentication and Multi-tenancy
Each piano teacher gets their own workspace with their students, lessons, and billing. I implemented this using a combination of NextAuth for authentication and a tenant-scoped data model.
// Middleware ensures every request is scoped to the correct tenant
export async function middleware(request: NextRequest) {
const session = await getToken({ req: request });
if (!session?.tenantId) {
return NextResponse.redirect(new URL('/login', request.url));
}
// Inject tenant context for downstream handlers
request.headers.set('x-tenant-id', session.tenantId);
return NextResponse.next();
}
Stripe Integration
Billing was the most complex part of the system. Teachers need to charge students on different schedules — some pay monthly, some per lesson, some buy packages. I built a flexible billing engine on top of Stripe that supports all of these models.
Growing Pains
The hardest part of building a SaaS is not the code. It is figuring out what to build next. Early users gave wildly different feedback, and learning to distinguish between "nice to have" and "must have" features took time and discipline.
Ship the smallest thing that solves the biggest pain. Everything else can wait.
What I Would Do Differently
If I started over today, I would spend more time on customer interviews before writing a single line of code. I would also launch with a simpler billing model and add complexity only when users asked for it. The technical foundation was solid from day one, but the product direction took a few pivots to get right.
Current Status
Grace Piano is live and serving teachers. The platform handles scheduling, progress tracking, and payments, freeing up hours every week for each teacher using it. The next phase focuses on student-facing features: practice tracking, repertoire management, and lesson recordings.