Skip to main content

Workflow: Reminders

Reminders are the automated nudges Vetty sends to clients about upcoming vaccinations, follow-ups and due payments.

Types

reminder_typeTypical triggerExample title
vaccinationAnnual vaccination anniversary"Luna's annual booster is due in 7 days"
dewormingEvery 3–6 months"Luna is due for deworming"
follow_upPost-surgery / treatment check-up"Follow-up after dental cleaning"
payment_dueInvoice past due date"Invoice INV-2026-0001 is overdue"
generalFreeformCatch-all

Channels

channelCurrent wiring
in_app (default)Rendered in the SPA via RemindersWidget.js and the Reminders module
emailQueued job (to be implemented) → mail driver in config/mail.php
smsQueued job (to be implemented) → external SMS gateway
pushQueued 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.