The problem.
Elena runs a Spanish-language academy in Hong Kong with more than 2,000 active students, in-person and online classes, and a catalog of monthly micropayments ranging from 60 to 100 USD per plan. Operations are simple but the demographics don't help: Hong Kong, multi-timezone, students with overloaded lives, and an academy that doesn't want to become a debt collector.
The problem wasn't delinquency. It was forgetfulness. Bank-transfer micropayments that slip people's minds between Thursday's meeting and the weekend. Each month, between 200 and 300 students reached due date without paying — not out of bad faith, but because the reminder hit a saturated inbox or got buried in notifications.
What we built.
Weekly cron + Teachworks query
Every 7 days, an n8n workflow queries the Teachworks API: which students have invoices issued and not paid older than X days. Filters out the ones already paid (always check before sending). Builds the reminder list.
WhatsApp message via Chatwoot
For each pending student, the workflow sends a personalized WhatsApp message in English (the academy's working language with students) through Chatwoot, which manages the WhatsApp Business API. The message includes the amount, due date, and a direct payment link.
Stop-on-pay
Critical: the system stops the moment payment is detected. Each cycle, before sending, it requeries Teachworks. If the invoice has been paid in the last 7 days, no message is sent. Zero "you owe us, oh wait you already paid" messages — the worst kind for customer experience.
Escalation and dashboard
If a student has 3 reminders without paying (>21 days), the system tags them and notifies Elena. She decides whether to write personally or pause the service. Active monitoring on a Metabase dashboard: pending invoices by age, recovery rate, average days from issue to collection.
I went from spending an hour a week on collection to ten minutes reviewing the dashboard. And the best: students who pay on time never get a payment-related message. Just the ones who actually need a nudge.
Stack used.
n8nTeachworks APIChatwootWhatsApp Business APIPostgreSQLMetabase