In September 2008, a piano teacher posting on the Piano World forum under the handle Dark Dragon wrote this:
"I currently have one former student who owed me $630+ since April. I'm owed between $1000–$2000 not including anything for October. My mortgage was due today and I had to pull strings to get it paid."
— Piano World, "Must put an end to late paying clients", Sep 2008
I read that post a year before I wrote the first line of Segnoly. I'd been working through the back-archive of Piano World, Violinist.com, Capterra reviews, and the parent-side complaints on Mumsnet — about 600 threads in total, going back to 2006 — looking for the moments when an independent music teacher's billing system actually broke.
This was the thread. Not because the dollar amount is unusual — it isn't, the second-most-quoted line in the same thread is "They still owe me $300.00. I cut my losses." — but because of the mortgage.
Almost every commodity guide on the internet treats late lesson payments as an etiquette problem. Send a friendly reminder. Be firm but kind. Charge a small late fee. That advice is not wrong, but it doesn't survive contact with the moment a parent's overdue invoice and a teacher's mortgage arrive on the same Tuesday. At that moment, the teacher's billing software is either solving the problem or it's part of the problem, and almost every billing tool I've used or audited is part of the problem.
Here's why, and what I built instead.
The thing the listicles miss
The dominant pattern in software-for-music-teachers is a single "send a reminder" template that fires on a schedule. It's the same email at day 1 overdue, day 7 overdue, day 30 overdue. The variables are merge-fields — {{first_name}}, {{amount}}, {{due_date}} — and the body is the same polite paragraph asking the parent to please pay when convenient.
This is the kind of thing that looks like a feature in a product demo and falls apart in the field. In the same Piano World thread, dumdumdiddle (Sep 2006) wrote:
"When I upped it to $20 I saw an immediate change."
She'd been charging a $10 late fee for two years and getting paid on roughly the same calendar as before. The month she changed it to $20, the same families paid on time. The $10 jump didn't suddenly create more cashflow at the parents' end — it changed the frame of what late meant. Morodiene (Apr 2007) phrased the same insight differently:
"My late charge is only $15, but that coupled with no further lessons until paid up really is a good motivator."
The escalation isn't the dollars. It's the named, specific consequence — "no further lessons until paid up" — that moves money. When ChavoPues (Feb 2016) finally cracked, she didn't raise the fee. She told one specific family their child wasn't returning the next year:
"He didn't pay on time in January, either. Or December. Or November. Nope, not even October… I've even established a $5 per week late tuition fee which he dutifully pays. I'm not taking his daughter back into my studio next year."
— Piano World, "Dealing with a parent who never ever ever pays on time", Feb 2016
The pattern is the same in every thread you can find: the email that gets paid is the email that escalates the named consequence, not the email that escalates the tone or the late fee. A polite second reminder, a firmer third reminder, and a fourth reminder titled "FINAL NOTICE" in caps don't do this. The first reminder mentions a fee. The second mentions the fee plus a hold on next week's lesson slot. The third mentions a specific external escalation — a collections agency, a non-renewal, a refusal to schedule the next semester.
Most music-teacher software ships the polite-firmer-FINAL pattern. That pattern doesn't move money. The named-consequence pattern does.
What Segnoly actually does at D7, D14, and D30
Segnoly's overdue cron runs at 08:00 in the studio's timezone every day. It scans for invoices in issued or partial status whose due date is in the past, marks them overdue, and decides which template to fire based on days-past-due.
Here's the pseudocode (it's roughly what lib/scheduler.ts:runOverdueJob actually does):
days_overdue = today − invoice.dueAt
if days_overdue >= 30 → send "invoice_overdue_30"
else if days_overdue >= 14 → send "invoice_overdue_14"
else if days_overdue >= 7 → send "invoice_overdue_7"
else → no email (the issued-invoice email was enough)
The bands aren't decoration. They map to the consequences I lifted out of the forum corpus:
- D7 — the late fee. This is the first email a parent gets after the original invoice. It's short, names the fee in absolute dollars (not a percentage), and shows the new balance. Critically, it doesn't apologize. dumdumdiddle's $10-to-$20 lesson is in here: a $5 late fee written as "%2 of balance" reads as friction; "$20" reads as a number you owe. If your studio uses a $0 late fee — common, and fine — D7's job is to send the reminder before the delinquency feels normalized.
- D14 — the lesson hold. This is Morodiene's lever: the email names the next scheduled lesson and says it can be held without payment received. This is the email that breaks the most balances, in my reading of the forum corpus. The reason is bandwidth: a parent who's been ignoring an email for two weeks because their inbox is full will not ignore an email that mentions Tuesday at 4pm.
- D30 — the explicit external escalation. This is Morodiene again, three replies later in the same 2007 thread: "I did have 2 that I sent to collections. One paid me prior to sending it to the collection agency." The D30 email names the external thing — a third-party service, a non-renewal, a refusal to enroll for the next term. In Segnoly's defaults the language is "this account will be reviewed for our standard end-of-term collections process"; teachers customise it.
The D30 template is also where Segnoly deliberately stops. There's no D60. There's no D90. The forum corpus is unambiguous on this: Mrs.A (Apr 2009) — "They still owe me $300.00. I cut my losses." By day 60 the relationship is over and the time you spend writing a fourth email is time you don't spend filling the slot with someone who pays. I'd rather the cron stay silent and the studio dashboard surface the unpaid invoice as a red number than auto-send a sixth nag that trains the parent to ignore my domain.
The numbers you actually want to put in the email
Late-payment reminders perform on specifics. The best single quote in the entire corpus on this isn't a music teacher — it's a vocal coach reviewing the Fons billing app on Capterra in September 2018:
"I honestly make $300–$400 from cancellations a month that I would not have been paid prior."
$300–400 per month is roughly $4,000 a year. For a vocal coach charging $80 a lesson, that's 50 lessons that would otherwise have evaporated into a "policy says we don't charge for cancellations less than 24 hours, but…" gray zone. Not because the teacher's policy was different — most teachers have a 24-hour cancellation policy on paper — but because the enforcement was different. The software auto-charged. The teacher didn't have to write the awkward email.
This is the same insight as the late-fee finding from a different angle. The thing that converts a late-cancellation into actual revenue isn't the policy text. It's the automation that fires without the teacher having to be the bad guy. Segnoly's late-cancel charge runs the same way — lib/scheduling.ts auto-creates a charge at the cancel-window boundary, and the cancellation policy in studio_settings.cancellation_policy_json decides whether it's a "late-cancel" or "no-show" charge with different defaults. The teacher's job is to set the policy once. The software's job is never asking the teacher to be the bad guy a second time.
When you put real numbers in the reminder email, the same dynamic kicks in. The default Segnoly D7 email reads, in part:
Your account currently has an outstanding balance of $240.00, with a $20.00 late fee applied on April 24th, bringing your total due to $260.00. We'd love to clear this before next Tuesday's lesson.
Compare to the version every off-the-shelf billing tool ships:
Hi {{first_name}}, this is a friendly reminder that your invoice {{invoice_number}} is overdue. Please pay at your earliest convenience.
The first email is doing two things the second isn't: it's surfacing the late fee as a discrete line item ("$20 late fee, applied April 24th") and it's anchoring on a specific upcoming lesson ("next Tuesday's"). Both are concrete. Both make the email impossible to skim past. The forum-archive evidence is consistent on which one gets paid.
What this means if you're shopping for billing software
There's a reason I'm writing this as a single specific case study and not as "10 tips for handling late payments." Two reasons, actually.
The first is that I don't trust general advice to outlive contact with a real studio. Every studio's families are different, every parent's tolerance for friction is different, and the teachers I trust most — including the dozen on Segnoly's design-partner waitlist — say the same thing: the policy works because of how it's enforced, not because of how it's written.
The second is that a checklist post about "how to handle late payments" is exactly the kind of content Google's March 2024 core update was built to deprioritize. Search Central's people-first content guidance asks one question that matters here: "Does your content clearly demonstrate first-hand expertise and a depth of knowledge?" A summary of advice from ten other blogs doesn't. A close reading of a 2008 forum thread, with named handles and date-stamped quotes and a billing tool that was designed against that specific evidence, does.
If you're evaluating billing tools and you want to do this in fifteen minutes:
- Ask the vendor for a copy of every reminder template they ship by default, not just one. Read them. If they're identical except for the urgency adjective, the tool is going to underperform on collections.
- Ask whether the cron escalates by named consequence (late fee → lesson hold → external escalation) or by tone. If the answer is "we send a reminder at 7, 14, and 30 days," ask what's different between them.
- Ask what happens at day 60. If the answer involves another auto-email, that's a tool that's optimized for activity, not collections.
- Read the late-cancel and no-show flow the same way. If the policy lives only in copy and not in code that auto-charges, your enforcement is going to be your time and your awkward conversations, not the software.
I built Segnoly to fail those four questions in the right way. The reminder cadence is in lib/scheduler.ts:runOverdueJob, the templates are editable per studio in studio_settings.email_templates, and the late-cancel charge fires inside lib/scheduling.ts without the teacher ever clicking a "send" button. The defaults are the ones I would set if I were running a 30-student studio and had read every word Dark Dragon, dumdumdiddle, Morodiene, and Brittney T. wrote. Which I have.
If your billing tool isn't designed off real teacher experience, my single most useful piece of advice is: read the Piano World thread yourself. Sit with the mortgage line. Then go look at how your current tool handles day 7. The gap is the leak.
Building Segnoly — billing and automation for independent music teachers. The 2008 thread is real, the design choices in this post are how the software actually works, and the waitlist is open for the first cohort.