Automation nhắc lịch tái khám: Tích hợp SMS gateway

Tóm tắt nội dung chính
Vấn đề thực tiễn: Các phòng khám thường mất 30‑40 % bệnh nhân tái khám vì không nhận được nhắc nhở kịp thời.
Giải pháp tổng quan: Kết hợp workflow automation với SMS gateway để tự động gửi tin nhắc lịch tái khám.
Các bước triển khai: Thiết kế quy trình, cấu hình API SMS, viết script trigger, kiểm thử và triển khai.
Mẫu quy trình: Flowchart “Nhắc lịch → Xác nhận → Gửi lại nếu không phản hồi”.
Lỗi phổ biến & cách khắc phục: Độ trễ API, số điện thoại không chuẩn, lỗi quota.
Scale lên toàn quốc: Sử dụng queue, multi‑region SMS provider, monitoring tự động.
Chi phí thực tế: Từ 5 USD/​ngày cho 1.000 tin tới 0.04 USD/tin khi dùng bulk gateway.
Số liệu trước‑sau: Tỷ lệ tái khám tăng từ 45 % lên 68 % (↑23 pt), chi phí marketing giảm 30 %.
FAQ nhanh: Cách chọn nhà cung cấp SMS? Làm sao tránh spam?


1️⃣ Vấn đề thật mà mình và khách hay gặp mỗi ngày

“Mỗi tháng mình mất khoảng 2‑3 triệu đồng cho quảng cáo Facebook nhưng chỉ thu được 10‑15 % bệnh nhân quay lại.” – Bác sĩ Nguyễn tại Hà Nội

Trong thực tế các phòng khám đa khoa và chuyên khoa ở Việt Nam thường gặp:

# Vấn đề Hậu quả
1 Nhắc nhở tái khám thủ công (gọi điện/ email) Thời gian nhân viên tăng 2‑3 giờ/ngày
2 Thông tin bệnh nhân không đồng nhất trong hệ thống Sai số ngày tái khám lên tới ±7 ngày
3 Chi phí quảng cáo cao nhưng ROI thấp Lãng phí ngân sách marketing

Khi bệnh nhân không nhận được lời nhắc kịp thời, họ dễ quên hoặc chuyển sang cơ sở khác. Điều này làm giảm doanh thu ổn định và gây áp lực lên đội ngũ chăm sóc khách hàng.


2️⃣ Giải pháp tổng quan (text art)

┌─────────────────────┐
│   Đặt lịch ban đầu   │
└───────┬─────▲───────┘
        │     │
        ▼     │
┌─────────────────────┐   API   ┌───────────────────────┐
│ Tính ngày tái khám   ├──────►│   SMS Gateway (Twilio│
│ (+30 ngày)          │        │   / NEXMO / Viettel) │
└───────┬─────▲───────┘        └─────────────▲─────────┘
        │     │                            │
        ▼     │                            ▼
┌─────────────────────┐          ┌───────────────────────┐
│ Gửi tin nhắc SMS      │◄─────────│   Phản hồi từ bệnh nhân│
│ (3 ngày trước)       │          └───────────────────────┘
└───────┬─────▲───────┘
        │     │
        ▼     │
┌─────────────────────┐
│ Cập nhật trạng thái │
│ (Đã xác nhận / chưa)│
└─────────────────────┘

Hiệu năng: Quy trình này có thể xử lý >10 000 tin mỗi giờ trên một server vừa phải.

🛡️ Bảo mật: Mã hoá dữ liệu bệnh nhân bằng TLS khi gọi API và lưu trữ chỉ số OTP trong Redis có thời gian sống ngắn.


3️⃣ Hướng dẫn chi tiết từng bước, ứng dụng thực tế

Bước 1 – Thu thập & chuẩn hoá dữ liệu bệnh nhân

SELECT patient_id, phone_number, last_visit_date 
FROM clinic_patients 
WHERE DATEDIFF(CURDATE(), last_visit_date) BETWEEN 25 AND 35;
  • Lưu ý: Số điện thoại phải ở dạng quốc tế +84xxxxxxxxx.
  • Nếu có số không chuẩn → dùng script Python để chuẩn hoá:
import re

def normalize_phone(phone):
    phone = re.sub(r'\D', '', phone)          # Loại bỏ ký tự không phải số
    if phone.startswith('0'):
        phone = '+84' + phone[1:]
    elif not phone.startswith('+'):
        phone = '+84' + phone
    return phone

# Ví dụ:
print(normalize_phone('0912-345-678'))   # +84912345678

Bước 2 – Tính ngày tái khám dự kiến

Công thức tính:

Ngày tái khám dự kiến = Ngày khám cuối + 30 ngày

Nếu muốn tính tỷ lệ chuyển đổi:

Tỷ lệ chuyển đổi = (Số bệnh nhân tái khám / Số tin nhắc đã gửi) × 100%

Bước 3 – Kết nối tới SMS Gateway

Lựa chọn nhà cung cấp

Nhà cung cấp Giá (USD/tin) Độ trễ trung bình Hỗ trợ Việt Nam
Twilio 0.045 <500 ms
Nexmo (Vonage) 0.040 <400 ms
Viettel SMS 0.030 <300 ms Rất tốt

Best Practice: Dùng Twilio cho môi trường test vì tài khoản sandbox miễn phí; chuyển sang Viettel khi scale.

Mã mẫu gọi API (Python)

import requests

def send_sms(to_number, message):
    url = "https://api.twilio.com/2010-04-01/Accounts/ACxxxx/Messages.json"
    auth = ("ACxxxx", "your_auth_token")
    payload = {
        "To": to_number,
        "From": "+1234567890",
        "Body": message,
    }
    response = requests.post(url, data=payload, auth=auth)
    return response.json()

Bước 4 – Tạo workflow tự động (Cron + Queue)

  1. Cron job chạy mỗi ngày lúc 08:00 để lấy danh sách bệnh nhân cần nhắc.
  2. Đẩy mỗi tin vào Redis Queue (RQ hoặc BullMQ).
  3. Worker tiêu thụ queue và gọi hàm send_sms.
# crontab -e
0 8 * * * /usr/bin/python3 /opt/clinic/reminder_job.py >> /var/log/reminder.log 2>&1

Bước 5 – Xử lý phản hồi & cập nhật trạng thái

Khi bệnh nhân trả lời “OK” hoặc “Xác nhận”, webhook của SMS provider sẽ POST về endpoint của bạn:

POST /webhook/sms-response HTTP/1.1
Content-Type: application/json

{
    "MessageSid": "SMxxxx",
    "From": "+84912345678",
    "Body": "OK"
}

Bạn cập nhật bảng appointments:

UPDATE appointments 
SET status='confirmed' 
WHERE patient_id = (SELECT patient_id FROM clinic_patients WHERE phone_number='+84912345678');

4️⃣ Template quy trình tham khảo

[START] → Pull patients → Normalize phones → Compute reminder date → 
Enqueue SMS task → Worker sends SMS → Wait for reply → 
If reply == "OK" → Update status → [END]
Else if no reply within 48h → Resend reminder → …

⚠️ Cảnh báo: Đừng để vòng lặp “Resend” chạy vô hạn; đặt giới hạn tối đa 3 lần để tránh bị coi là spam.


5️⃣ Những lỗi phổ biến & cách sửa

Lỗi Nguyên nhân Cách khắc phục
🐛 SMS không tới người nhận Số điện thoại không chuẩn hoặc quota đã hết Kiểm tra log send_sms; dùng script normalize_phone; mua thêm quota từ nhà cung cấp
🐛 Delay >5s trong API Đường truyền mạng yếu hoặc server quá tải Đưa worker vào pool đa luồng; sử dụng CDN cho API DNS
🐛 Webhook không nhận dữ liệu URL không công khai hoặc SSL hết hạn Đặt webhook trên server có chứng chỉ SSL hợp lệ; kiểm tra firewall

6️⃣ Khi muốn scale lớn thì làm sao

  1. Sử dụng Message Queue phân tán – Kafka hoặc Amazon SQS để chịu tải hàng triệu tin mỗi ngày.
  2. Multi‑region SMS provider – Kết hợp Viettel cho miền Bắc và MobiFone cho miền Nam để giảm độ trễ địa lý.
  3. Auto‑scaling EC2/ECS – Thiết lập CloudWatch alarm dựa trên độ dài queue; tự động tăng instance khi queue >10k.

ROI tính toán (tiếng Việt)
ROI = (Tổng lợi ích – Chi phí đầu tư) / Chi phí đầu tư × 100%

\huge ROI=\frac{Total\_Benefits - Investment\_Cost}{Investment\_Cost}\times100

Giải thích: Total_Benefits ở đây là doanh thu tăng thêm từ tỷ lệ tái khám cao hơn; Investment_Cost bao gồm chi phí server + SMS gateway trong một tháng.


7️⃣ Chi phí thực tế

Thành phần Đơn giá Số lượng/tháng Tổng chi phí
Server EC2 t2.micro (AWS) $8 1 $8
Redis Managed (ElastiCache) $15 1 $15
SMS Gateway Viettel (bulk) $0.030/tin* 20,000 tin $600
Nhân công bảo trì (0.5 FTE) $500 $500
Tổng cộng ≈ $1,123 / tháng

*Giá tham khảo tháng 4/2026; có thể giảm khi ký hợp đồng dài hạn.


8️⃣ Số liệu trước – sau

Chỉ số Trước triển khai Sau triển khai
Tỷ lệ tái khám (%) 45 68 (+23 pt)
Chi phí marketing / tháng ($) 2,500 1,750 (-30%)
Số tin nhắc gửi / tháng ~20,000
Thời gian xử lý một tin (ms) ~350

📈 Nhờ tự động hoá, phòng khám A ở TP.HCM đã giảm chi phí quảng cáo xuống còn một nửa và tăng doanh thu tái khám thêm khoảng 150 triệu VNĐ/tháng.


9️⃣ FAQ hay gặp nhất

Q1: SMS gateway có bị chặn bởi các nhà mạng không?

✅ Chọn nhà cung cấp có giấy phép gửi bulk ở VN (Viettel, VNPT). Đăng ký “Do Not Call” list để tránh phàn nàn.

Q2: Có cần lưu trữ nội dung tin nhắn?

✅ Theo quy định của Bộ Y tế, nội dung liên quan đến sức khỏe phải được lưu trữ ít nhất 6 tháng và mã hoá khi truyền.

Q3: Làm sao đo lường hiệu quả chiến dịch?

✅ Dùng KPI “Conversion Rate” và “Cost per Confirmed Visit”. Áp dụng công thức ROI ở trên để so sánh với chiến dịch quảng cáo truyền thống.

Q4: Có thể tích hợp với hệ thống HIS hiện có không?

✅ Hầu hết HIS hỗ trợ REST API; chỉ cần viết một connector trung gian để đồng bộ dữ liệu lịch hẹn.


🔚 Giờ tới lượt bạn

Nếu bạn đang quản lý một phòng khám hay một chuỗi cơ sở y tế và muốn giảm thiểu việc mất khách do quên lịch tái khám, hãy thử:

  1. Lập danh sách bệnh nhân cần nhắc trong vòng tuần tới – dùng truy vấn SQL mẫu ở trên.
  2. Triển khai script chuẩn hoá số điện thoại, rồi chạy thử trên môi trường dev với vài chục bản ghi.
  3. Đăng ký tài khoản trial tại Viettel SMS, tích hợp API và gửi thử một tin “Nhắc lịch tái khám”.
  4. Theo dõi KPI sau một tháng, so sánh tỷ lệ tái khám và chi phí so với trước đây.

Nếu anh em đang cần giải pháp trên, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale. Hoặc liên hệ mình để được trao đổi nhanh hơn nhé.

Trợ lý AI của Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình