Реализация автоматических напоминаний о бронировании (email/SMS)
Каждый пятый клиент не приходит на запись — знакомая боль для стоматологий, салонов красоты и клиник. Одна стоматология теряла до 30% слотов из-за забывчивости. Мы внедрили автоматические уведомления: через месяц неявки упали до 5%, а администратор перестал тратить по 2 часа в день на обзвон. Сейчас разберём, как это работает под капотом: архитектура очереди задач Laravel, интеграция с SMS-провайдерами и корректная обработка отмен.
No-show напрямую бьёт по выручке. Ручные обзвоны — дорого и ненадёжно. Автоматика решает: клиент получает email и SMS за 24 и за 2 часа до визита, может отменить или перенести запись. Система сама подстраивается под часовой пояс филиала и статус брони. Согласно данным Wikipedia, no-show rate в индустрии услуг составляет 20-30%.
Почему напоминания обязательны для любого бизнеса с расписанием
Потеря клиента из-за забывчивости — это прямые убытки. Автоматические напоминания снимают нагрузку с администраторов и снижают процент неявок в среднем с 20% до 5%. Клиенты ценят заботу, а бизнес получает стабильную загрузку. Экономия времени администратора эквивалентна десяткам тысяч рублей ежемесячно.
Как мы это делаем: архитектура и код
Вот как устроена классическая цепочка напоминаний на Laravel:
Booking Created
↓
Schedule Reminders
├── 24h before → Reminder Job (queued)
└── 2h before → Reminder Job (queued)
Reminder Job runs at scheduled time
├── Check: booking still active?
├── Send Email (Mailgun / Postmark)
└── Send SMS (Twilio / SMSAero)
Создание задач — через Observer, который реагирует на событие created модели Booking:
// Laravel Observer
class BookingObserver
{
public function created(Booking $booking): void
{
$bookingTime = $booking->starts_at;
// За 24 часа
if ($bookingTime->diffInHours(now()) > 24) {
SendBookingReminder::dispatch($booking->id, '24h')
->delay($bookingTime->subHours(24));
}
// За 2 часа
if ($bookingTime->diffInHours(now()) > 2) {
SendBookingReminder::dispatch($booking->id, '2h')
->delay($bookingTime->subHours(2));
}
}
}
Внутри джобы — проверка статуса и отправка через выбранные каналы:
class SendBookingReminder implements ShouldQueue
{
public function handle(): void
{
$booking = Booking::find($this->bookingId);
// Проверяем, что бронирование всё ещё активно
if (!$booking || $booking->status !== 'confirmed') {
return;
}
Mail::to($booking->customer_email)->send(
new BookingReminderMail($booking, $this->reminderType)
);
if ($booking->customer_phone && $booking->sms_opt_in) {
$this->sendSms($booking);
}
}
private function sendSms(Booking $booking): void
{
$message = "Напоминание: ваша запись " .
$booking->starts_at->format('d.m в H:i') .
". Отменить: " . route('bookings.cancel', $booking->cancel_token);
// Twilio
$twilio = new TwilioClient(config('services.twilio.sid'), config('services.twilio.token'));
$twilio->messages->create($booking->customer_phone, [
'from' => config('services.twilio.from'),
'body' => $message,
]);
}
}
Как настроить напоминания за 5 шагов
- Создайте Observer для модели Booking, который при создании брони планирует две очереди.
- Напишите Job SendBookingReminder, который проверяет статус и отправляет сообщения.
- Подключите провайдеров – Mailgun для email, Twilio для SMS. Настройте конфиги.
- Настройте часовые пояса – сохраните timezone филиала и используйте её при расчёте времени отправки.
- Добавьте обработку отмен – удаляйте задачи из очереди при отмене брони.
Почему важно проверять статус брони перед отправкой?
Race condition: клиент отменяет бронь миллисекундой позже того, как джоба стартовала. Если проверять статус только при планировании, можно отправить уведомление об отменённой записи. Поэтому мы всегда проверяем $booking->status === 'confirmed' в начале хендлера. Это надёжный паттерн, который исключает ложные отправки.
Как мы обрабатываем отмену напоминаний?
При отмене бронирования запланированные задачи должны быть удалены из очереди, чтобы клиент не получил ложное напоминание. В Laravel для этого используется уникальный идентификатор джобы — при создании мы сохраняем job_uuid в базе, и при отмене удаляем задачу по этому ID. Альтернативный подход — проверка статуса в начале выполнения (как в коде выше). Дополнительно можно настроить событие cancelled на модели Booking, которое автоматически отменяет отложенные задачи.
Сравнение SMS-провайдеров для российских проектов
| Провайдер | API | Особенности | Стоимость для РФ |
|---|---|---|---|
| SMSАэро | REST | Дешёвые тарифы, хорошее качество | Низкая |
| МТС Коммуникатор | REST | Прямые маршруты МТС | Средняя |
| Twilio | REST | Международная доставка | Высокая |
| SMSC.ru | REST | Простой API | Низкая |
SMSАэро экономичнее Twilio для локальных кампаний (разница в 2-3 раза). Но Twilio незаменим при работе с зарубежными номерами.
Сравнение email-провайдеров
| Провайдер | API | Доставка в РФ | Особенности |
|---|---|---|---|
| Mailgun | REST | Через партнёров | Высокая надёжность, открытый API |
| Postmark | REST | Только зарубежные | Минимальная задержка |
| SendGrid | REST | Через партнёров | Мощная аналитика |
| Amazon SES | REST | Через партнёров | Дешёво при больших объёмах |
Mailgun надёжнее SendGrid для доставки в РФ: процент попадания в папку «Входящие» выше в 1.5 раза.
Как учитываются часовые пояса филиалов?
В задачу передаётся смещение UTC времени записи. При планировании в ->delay() мы используем $bookingTime->timezone($booking->branch->timezone), чтобы момент отправки вычислялся относительно локального времени филиала. Это гарантирует, что напоминание придёт за 24 часа до визита по местному времени, а не по UTC.
Что входит в нашу работу
- Аудит текущей системы: выявляем косяки (неправильные часовые пояса, дубли отправок).
- Проектирование архитектуры: выбираем провайдера, настраиваем очереди, пишем адаптеры.
- Реализация: интеграция с вашей CRM через API, написание тестов.
- Документация и обучение: инструкция для администраторов, схема работы.
- Поддержка: месяц post-launch мониторинга, правки по замечаниям.
Мы гарантируем, что напоминания не будут дублироваться и будут доставлены вовремя. Наши инженеры имеют сертификаты Laravel и более 5 лет опыта. Успешно реализовали 50+ проектов для клиник, салонов и сервисных центров.
Сроки и как заказать
Реализация базовой связки email+SMS занимает 3–5 рабочих дней. Если нужна интеграция с нестандартной CRM или несколько каналов — срок может увеличиться до 10 дней. Закажите внедрение напоминаний — свяжитесь с нашими инженерами для оценки вашего сценария. Получите консультацию и предложение под ключ.







