Skip to main content

Story 5: Automated Payment Reminders

Overview​

FieldValue
Story IDNGE-14-5
Story Points8
SprintSprint 13
LanguageGo

Reminder Schedule​

TriggerMessage Type
7 days before dueFriendly reminder
3 days before dueUrgent reminder
Due dateFinal reminder
1 day overdueOverdue notice
7 days overdueEscalation

Technical Implementation​

// reminder_worker.go
func (w *ReminderWorker) Start() {
c := cron.New()
c.AddFunc("0 9 * * *", w.sendDueReminders) // 9 AM daily
c.AddFunc("0 18 * * *", w.sendOverdueReminders) // 6 PM daily
c.Start()
}

func (w *ReminderWorker) sendDueReminders() {
// Get invoices due in 7 days
invoices := w.getUpcomingDue(7)

for _, inv := range invoices {
message := fmt.Sprintf(
"Fee of Rs.%.2f for %s is due on %s. Pay: %s",
inv.Balance, inv.StudentName, inv.DueDate, inv.PayLink,
)
w.sms.Send(inv.ParentPhone, message)
w.logReminder(inv.ID, "SMS", "DUE_REMINDER")
}
}

Channels​

  • SMS - Primary (all parents)
  • Email - Secondary (if available)
  • WhatsApp - Optional (via API)
  • Push - App notification