Workflow: Reminders
Reminders are the automated nudges Vetty sends to clients about upcoming vaccinations, follow-ups and due payments.
Types
reminder_type | Typical trigger | Example title |
|---|---|---|
vaccination | Annual vaccination anniversary | "Luna's annual booster is due in 7 days" |
deworming | Every 3–6 months | "Luna is due for deworming" |
follow_up | Post-surgery / treatment check-up | "Follow-up after dental cleaning" |
payment_due | Invoice past due date | "Invoice INV-2026-0001 is overdue" |
general | Freeform | Catch-all |
Channels
channel | Current wiring |
|---|---|
in_app (default) | Rendered in the SPA via RemindersWidget.js and the Reminders module |
email | Queued job (to be implemented) → mail driver in config/mail.php |
sms | Queued job (to be implemented) → external SMS gateway |
push | Queued job (to be implemented) → FCM/APNs |
Status machine
Lifecycle
Creating a reminder
Today, reminders are managed via Filament (Filament/Resources/Reminders) because the UI's Reminders module and public API don't yet expose a write endpoint. Recommended API surface:
POST /api/v1/tenant/{tenant}/reminders
{
"pet_id": 12,
"client_id": 34,
"title": "Annual rabies booster",
"reminder_type":"vaccination",
"channel": "email",
"due_at": "2026-05-18T10:00:00Z"
}
Validation rules follow the enum options documented in Product Domain.
Dispatch
A future Laravel scheduler entry (app/Console/Kernel.php):
$schedule->call(function () {
Reminder::where('status', 'pending')
->where('due_at', '<=', now())
->each(fn ($r) => dispatch(new SendReminderJob($r)));
})->everyMinute();
The job handler reads channel and delivers via the matching driver, then flips status to sent or failed.
UI touchpoints
RemindersModule.js— full CRUD list with filters by type and status.RemindersWidget.js— dashboard widget showing the next 5 pending reminders.- Filament → Reminders — back-office full list across tenants.
Payload column
reminders.payload is a JSON column intended for channel-specific data (e.g. rendered email body, SMS text, push message). The application layer decides what goes in there; keep PII out unless you know your retention policy.