Add settings-gated appointment notifications and fix Bird key validation.
Deploy Ladill Care / deploy (push) Successful in 58s

Patients can be SMS/email notified on booking and video schedule when enabled in Settings. Bird validation now accepts only lsk_live_ keys, strips paste artifacts, and surfaces the platform error.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-13 13:31:28 +00:00
co-authored by Cursor
parent 7c33432dc9
commit d13d460e32
10 changed files with 625 additions and 15 deletions
@@ -87,6 +87,7 @@
<input type="password" name="bird_api_key" autocomplete="off" required
placeholder="lsk_live_…"
class="mt-1 w-full rounded-lg border-slate-300 font-mono text-sm">
<p class="mt-1 text-xs text-slate-500">Use the HTTP API key from <a href="https://bird.ladill.com" target="_blank" rel="noopener" class="underline">bird.ladill.com</a> (starts with <code>lsk_live_</code>). Do not use the mailbox password.</p>
</div>
<div>
<label class="block text-sm font-medium text-slate-700">From email</label>
@@ -53,6 +53,64 @@
<a href="{{ route('care.integrations') }}" class="text-sm font-medium text-teal-700 underline">Open messaging integrations </a>
</x-settings.card>
<x-settings.card title="Patient notifications" description="Automatically notify patients when appointments are booked or video visits are scheduled. Requires connected SMS / Bird credentials.">
<div class="space-y-4 text-sm">
<div>
<p class="font-medium text-slate-800">When an appointment is booked</p>
<div class="mt-2 space-y-2">
<label class="flex items-start gap-2">
<input type="checkbox" name="notify_appointment_booked_sms" value="1"
@checked(old('notify_appointment_booked_sms', data_get($organization->settings, 'notify_appointment_booked_sms')))
class="mt-0.5">
<span>
Send SMS confirmation
@unless ($messagingSmsReady)
<span class="block text-xs text-amber-700">Connect SMS in Integrations before this can send.</span>
@endunless
</span>
</label>
<label class="flex items-start gap-2">
<input type="checkbox" name="notify_appointment_booked_email" value="1"
@checked(old('notify_appointment_booked_email', data_get($organization->settings, 'notify_appointment_booked_email')))
class="mt-0.5">
<span>
Send email confirmation
@unless ($messagingEmailReady)
<span class="block text-xs text-amber-700">Connect Bird email in Integrations before this can send.</span>
@endunless
</span>
</label>
</div>
</div>
<div>
<p class="font-medium text-slate-800">When a video visit is scheduled</p>
<div class="mt-2 space-y-2">
<label class="flex items-start gap-2">
<input type="checkbox" name="notify_video_scheduled_sms" value="1"
@checked(old('notify_video_scheduled_sms', data_get($organization->settings, 'notify_video_scheduled_sms')))
class="mt-0.5">
<span>
Send SMS with join link
@unless ($messagingSmsReady)
<span class="block text-xs text-amber-700">Connect SMS in Integrations before this can send.</span>
@endunless
</span>
</label>
<label class="flex items-start gap-2">
<input type="checkbox" name="notify_video_scheduled_email" value="1"
@checked(old('notify_video_scheduled_email', data_get($organization->settings, 'notify_video_scheduled_email')))
class="mt-0.5">
<span>
Send email with join link
<span class="block text-xs text-slate-500">Uses Bird when connected; otherwise Meet emails the invite.</span>
</span>
</label>
</div>
</div>
</div>
</x-settings.card>
<x-settings.card title="Integrations" description="Manage service queues and counters in Care. You must also enable Care integration in Ladill Queue settings.">
<label class="flex items-center gap-2 text-sm">
<input type="checkbox" name="queue_integration_enabled" value="1" @checked(data_get($organization->settings, 'queue_integration_enabled'))>