Реализация автоматических напоминаний о бронировании (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 дней. Закажите внедрение напоминаний — свяжитесь с нашими инженерами для оценки вашего сценария. Получите консультацию и предложение под ключ.







