Pistonlog's reminders are event-scheduled, not date-scanned. When a meaningful event happens (a jobcard is completed; an appointment is created), Pistonlog inserts a reminder_logs row for each applicable template with its scheduledDate set to (due_date − countdownDays). The daily cron then sends every row whose scheduledDate has passed and that hasn't been sent yet.
When reminders are scheduled
| Event | What gets scheduled |
|---|---|
| Jobcard completed | One row per matching MOT / Service / Timing-Belt template, using the per-job reminder intervals you set on each job |
| Appointment created | One row per matching Appointment template, using the appointment date |
Setting an MOT date on a vehicle by itself does not schedule reminders — scheduling only happens when a jobcard with an MOT job is completed.
What "matching" means
A template matches when its reminderType and the event align — e.g. an MOT template only schedules against an MOT-flagged job at jobcard completion.
If reminders aren't firing
Was the triggering event captured?
For service/belt reminders, the scheduling happens at jobcard completion with reminder intervals chosen per-job. If you completed the jobcard without setting an interval, no reminder was scheduled. Re-complete the jobcard with the right interval set.
Does the template exist for this type?
Inactive templates don't schedule. Verify the template exists and is enabled in Workshop Settings → Reminders.
Did the (private) customer opt out?
Individual customers can be marked contactByEmail: false or contactBySms: false and they're then excluded from the relevant channel. (Business contacts don't have these flags — they always receive on whichever channel they have an address for. Business routing is controlled by the per-contact reminder opt-ins instead, see Fleet reminders.)
Check the logs
Every scheduled and attempted send is recorded in Reminder logs with its status.
Why pre-scheduling and not a date scan
A date scan ("every day, find every vehicle whose MOT is in 30 days") would be simple but brittle — it'd miss the intent of when you, the operator, completed the job. Event-scheduling captures the workshop's view of "this is now eligible for a reminder" at the moment of completion, which gives you a stable record in reminder_logs that you can inspect, edit, or cancel before it actually sends.