← Back to all posts

Schedule Builder: plan a season before you commit

May 26, 2026 · 6 min read · by James, half-owner of a dance studio

Every spring at our studio, we sit down with three things: last year's schedule printed out, a pad of paper, and our standing list of "we'd like to add this if we can fit it." For about a week we shuffle blocks around on paper because the studio software we used to live in wanted us to commit a real class the second we typed anything into it.

That always felt backwards. The earliest, messiest part of planning a season is exactly when you don't want the software pushing back. You don't know yet whether the Tuesday 5 PM ballet is going to be 60 minutes or 75. You don't know if Miss Sarah can teach Wednesdays this year. You're trying things on. The capacity, the tuition, the age range, the class type, the season's start and end dates: those are downstream decisions. You'll get there. But you'll get there faster if the upstream part isn't fighting you.

The Schedule Builder is the answer to that. It's a private canvas for laying out a season's schedule without creating a single real class until you're ready. Families don't see it. Reports don't see it. Instructors don't see it. It's a working surface, not a published artifact.

The three nouns

There are exactly three things to know about. We resisted the urge to add more.

A Draft is a planning workspace. One sheet of paper. You might call it "Fall 2026 planning" or "Summer intensive ideas." You can have several drafts going at once and none of them affect anything real.

A Placeholder is one block on the canvas. A name, a day, a start time, an end time, an instructor. That's the minimum to put it on the grid. You can also set a location, a class type, a season, and notes, but you don't have to. If all you know on Monday morning is "I want a ballet class somewhere on Tuesday afternoon," that's a complete placeholder.

Promote is when you turn it real. When the layout settles, you promote placeholders into actual classes. One at a time from each block's edit modal, or all at once from the top of the canvas. Promoted blocks turn grey with a check mark and the rest of the page becomes read-only history.

What it looks like to use

You open a draft and you see a weekly grid: days across the top, hours down the side. Click any empty cell and a modal opens pre-filled with that day and start time. You give the block a name and pick an instructor, and it's on the canvas. Repeat. If a slot is already full, the + icon next to each day label opens the modal pre-filled to that day so you can add another block somewhere without first clicking the exact right cell.

Hovering a block gives you a tooltip with everything you've set on it. Clicking it opens the editor. Every gesture saves immediately. There is no save button, because there's nothing to commit; we're not building a published schedule yet, we're moving blocks around.

A few things we layered in once we'd been using the canvas for a week ourselves:

Blocks are colored by instructor. Each instructor gets their own color, with a legend above the grid. The reason: when you're staring at a wall of blocks, the question that always comes up first is "wait, does Miss Sarah have three back-to-back Tuesdays?" Color answers that without reading the labels.

You can zoom into a day. Click the "Tue" or "Wed" label and that day stretches to the full canvas width. Now every block in that column shows its full content inline: name, time, instructor, location, class type, season, notes. Useful for the day with the most density, which at our studio is always Wednesday.

Season is per-block, with a draft default. Set the draft's season once for the common case. Most of the time the whole draft is one season and you never think about it again. But studios that run a competition season alongside a regular season often share rooms and instructors and times. The canvas should let you plan both side by side. So each block can override the draft's season, with a small badge on the block when it does.

What's deliberately missing

We thought about a lot of things and chose not to ship them in V1. Worth saying why.

Drag-and-drop to move blocks around. The temptation was strong. But every drag-and-drop scheduling tool we've used in the past had the same problem: you accidentally nudge a block off a 15-minute boundary and now you have a 5:07 PM class. Click-to-edit keeps the times clean and removes the entire class of "oops I moved the wrong thing" errors. We might add it later if enough people ask. Nobody's asked yet.

Per-cadence anything. Placeholders are weekly. If you want a biweekly class, set its cadence after you promote it (we shipped real biweekly support a week before this). The Schedule Builder is for the layout question; cadence is a property of the real class, and we'd rather keep the canvas focused.

Capacity, tuition, ages, registration mode, every other class field. They all have sensible defaults at promote time (capacity 10, active, weekly, no auto-create of registrations). You can tweak each one after promotion, the same way you would for any class. The canvas is for one question only: where do the blocks go?

The actual workflow

Here's what a real season planning session looks like in the Schedule Builder.

Day 1. You open a fresh draft called "Fall 2026 planning" and set the draft's season to Fall 2026. You start with last year's schedule, copying it into the canvas roughly by clicking cells and naming blocks. This part is mechanical and takes maybe 30 minutes. You don't worry about getting it exactly right.

Day 2. You look at what you copied, see that two intermediate ballet classes are both at 5 PM Wednesday, and start the actual planning. You move one to Tuesday by editing the block. You add the new tap class you've been wanting on Thursdays. You realize Miss Sarah's color is showing up Monday, Tuesday, Wednesday, Thursday and that's too many days for her, so you move the Thursday class to Friday with a different instructor.

Day 3. Your spouse or business partner pulls up the draft on their laptop and pushes back on three things. You debate. Two of them you change in the canvas, one of them you leave as is. The conversation is faster because you're both looking at the same picture.

Day 4. You realize the competition team's schedule needs to be on the same canvas because four of the same instructors teach both. You override the season on those blocks to "Fall 2026 Comp." Now both groups are on one page and you can see the conflicts.

Day 7. Layout is final. You hit "Promote all" at the top. Forty placeholders become forty real classes with sensible defaults, ready for the round of detail work (capacity, tuition, descriptions, photos) that you actually wanted to do once anyway. The draft turns into a grey snapshot of what got promoted.

Why "promote later" matters more than it sounds

The biggest unspoken cost of "create real classes from the start" is that any class you create has consequences. It shows up in reports. It might trigger billing logic depending on your season setup. If you delete it, you've broken any audit trail that touched it. If you mark it inactive, it still clutters lists. Studios end up with a graveyard of "Test Ballet" and "Tuesday 5 PM v2" classes that exist because someone was thinking out loud and the software forced them to commit.

Promotion is the right boundary because it matches how studios actually think. The block exists before the class exists, in your head and on your paper. The software should match that, not invert it.

What changes when the canvas exists

A few things we noticed once we'd been running on the Schedule Builder for a couple of seasons internally.

Planning conversations are shorter. Everyone is looking at the same picture, and rearranging it is a couple of clicks. Nobody is reading times off a printed sheet or trying to remember which Google Doc version is current.

You try more things. Because there's no commitment cost, you experiment. You add the speculative Saturday morning toddler class to see if it fits. If it doesn't, you delete the block. No invoice was generated, no family was notified, no report row was created.

You catch instructor over-scheduling earlier. The color-per-instructor view makes back-to-back fatigue obvious. You'd notice it eventually when an instructor mentioned it in person, but you'd notice it now while it's still cheap to fix.

You stop scheduling in your inbox. The "hey can you also fit a hip hop class on Wednesday" emails from instructors stop being a mental tax. You open the draft, find Wednesday, see whether there's room.

What's next

A few directions we're watching, in rough order of how likely they are to ship.

Duplicate from last year. "Start a new draft from last year's promoted schedule" so the Day 1 mechanical copy step goes away. This is the most-asked one and is probably next.

Conflict warnings on the canvas. The class-creation flow already warns about overlapping rooms and overlapping instructors. The Schedule Builder doesn't yet, because the placeholders are intentionally lightweight. But it's a natural next layer.

Share a draft with a co-owner who isn't a tenant admin. Right now any tenant admin can open any draft. That's the right default for solo and small-team studios. For larger ones, we may add a "share with this user" mode so the head ballet teacher can plan their own corner of the canvas.


James runs a dance studio with his wife and built Presently because nothing else fit the way studios actually work. The Schedule Builder is live for all studios under Setup → Schedule Builder. See more features or start a free trial.

Studio software, built by a studio owner.

I'm James, half-owner of a dance studio. My wife and I built Presently because the incumbents weren't designed for how studios actually work. 30-day free trial, no credit card.