Đặt được lịch chưa phải xong. Tỉ lệ no-show phỏng vấn thực tế có thể 20–40%. Bài này xây lớp "vận hành lịch": nhắc đúng lúc, phát hiện vắng mặt, tự động mời lại — giảm no-show và cứu pipeline.
Vì sao cần lớp này
Mỗi no-show làm lãng phí 45–60 phút của interviewer và kéo dài thời gian tuyển. Phần lớn no-show đến từ quên hoặc kẹt lịch mà ngại báo. Agent giải quyết được cả hai bằng nhắc nhở và cho đổi lịch dễ dàng.
Chuỗi nhắc lịch theo thời gian (reminder cadence)
T-24h : Email nhắc + link đổi lịch ("nếu bận, đổi tại đây")
T-2h : Tin nhắn ngắn (SMS/Zalo/Telegram) + link phòng họp
T-10m : Nhắc phòng họp lần cuối (nếu online)
T+5m sau giờ hẹn mà chưa join → kích hoạt luồng no-show
Mỗi mốc dùng kênh khác nhau vì hiệu quả khác nhau: email cho thông tin, tin nhắn cho tính cấp thiết.
Bước 1: Lên lịch job nhắc
Agent cần một scheduler (cron/queue) để "thức dậy" đúng lúc:
# Khi tạo interview, đăng ký các job nhắc
schedule_reminder(interview_id, at=start - timedelta(hours=24), channel="email")
schedule_reminder(interview_id, at=start - timedelta(hours=2), channel="telegram")
# Job chạy: kiểm tra interview còn 'scheduled'? → gửi; nếu đã hủy → bỏ qua
Luôn kiểm tra trạng thái tại thời điểm gửi — đừng nhắc một cuộc đã bị hủy (mất uy tín).
Bước 2: Phát hiện no-show
Với phỏng vấn online (Meet/Zoom), dùng tín hiệu tham gia; với offline, cần interviewer đánh dấu:
def check_no_show(interview):
if now() < interview.start + minutes(5):
return
if not interview.candidate_joined and not interview.marked_present:
trigger_no_show_flow(interview)
Bước 3: Luồng no-show có nhân văn
Không kết luận vội "ứng viên bỏ cuộc". Cho cơ hội cứu vãn:
1. T+5m : gửi "Chúng tôi đang chờ bạn ở phòng họp, bạn có kịp không?" + link
2. T+15m: nếu vẫn vắng → đánh dấu no_show, gửi email "tiếc là lỡ hẹn, đặt lại?"
3. Cho phép TỰ đặt lại 1 lần qua link (không cần recruiter can thiệp)
4. Nếu no-show lần 2 → chuyển recruiter xử lý tay (đừng tự loại)
Bước 4: Reschedule tự phục vụ
Link đổi lịch nên tái dùng logic Bài 4: query free/busy mới → đề xuất slot mới → cập nhật event cũ thay vì tạo mới (giữ lịch sử).
def reschedule(interview_id, new_slot):
verify_slot_free(new_slot) # chống trùng lần nữa
update_event(interview_id, new_slot)
cancel_pending_reminders(interview_id)
schedule_reminders(interview_id, new_slot) # đặt lại chuỗi nhắc
log("rescheduled", interview_id, new_slot)
Điểm dễ quên: hủy chuỗi nhắc cũ và đặt lại chuỗi mới, nếu không ứng viên nhận nhắc cho giờ đã đổi → rối loạn.
Khung tư duy "nhắc đủ, không phiền"
ĐÚNG lúc (T-24h, T-2h) — không spam mỗi giờ
ĐÚNG kênh — email dài, tin nhắn ngắn khẩn
ĐÚNG nội dung — luôn kèm hành động (join/đổi/hủy)
ĐÚNG trạng thái — chỉ nhắc cuộc còn hiệu lực
Checklist vận hành lịch
- [ ] Có scheduler đăng ký job nhắc khi tạo interview
- [ ] Kiểm tra trạng thái trước mỗi lần gửi
- [ ] Cadence nhắc đa kênh (T-24h, T-2h)
- [ ] Phát hiện no-show có ngưỡng thời gian
- [ ] Cho tự reschedule 1 lần, lần 2 chuyển người
- [ ] Reschedule hủy nhắc cũ + đặt nhắc mới
Sai lầm thường gặp
- Nhắc một cuộc đã hủy. Do không check trạng thái tại thời điểm gửi. Gây bối rối và mất chuyên nghiệp.
- Kết luận no-show quá nhanh. Đánh dấu ngay tại giờ hẹn là bất công (ứng viên có thể trễ 3 phút). Đặt ngưỡng 5–15 phút và gửi lời hỏi trước.
- Không hủy nhắc cũ khi reschedule. Ứng viên nhận nhắc mâu thuẫn cho 2 giờ khác nhau.
- Spam quá nhiều reminder. Nhắc mỗi giờ khiến ứng viên khó chịu, phản tác dụng.
- Tự động loại sau no-show. Có thể ứng viên gặp sự cố thật; để người quyết định sau lần 2.