Command Palette

Search for a command to run...

Xây dựng hệ thống đặt lịch với Next.js

Bài học từ các nền tảng đặt salon và tour — form, thanh toán, admin flow và giữ UX đơn giản.

Nguyễn Đình Giang

· · 2 phút đọc

Lập trình viên frontend ở Hà Nội. Mình viết về Next.js, WordPress và hiệu năng của những thứ mình thực sự ship.

Flow đặt lịch nhìn bề ngoài đơn giản: chọn ngày, chọn giờ, thanh toán, xong. Thực tế nó đụng tới auth, inventory, payment, notification và dashboard admin.

Mình đã triển khai pattern này ở một nền tảng đặt lịch salon (đặt lịch + e-commerce) và một nền tảng đặt tour (tìm tour, lọc và yêu cầu tuỳ chỉnh).

Luồng người dùng cốt lõi

  1. Duyệt dịch vụ hoặc tour
  2. Lọc theo ngày, giờ, stylist hoặc điểm đến
  3. Thêm vào giỏ hoặc đặt trực tiếp
  4. Thanh toán qua cổng thanh toán tích hợp
  5. Nhận xác nhận (email / thông báo admin)

Mục tiêu là không gây nhầm lẫn giữa các bước. Mỗi màn hình phải trả lời: mình đang ở đâu, đã chọn gì, bước tiếp theo là gì?

Kiến trúc frontend

// Booking state đơn giản hoá
const [step, setStep] = useState<"browse" | "details" | "payment">("browse")
const [selection, setSelection] = useState<BookingSelection | null>(null)

Mình thường dùng Zustand cho multi-step booking — nhẹ hơn Redux với flow nhiều form, vẫn dễ debug.

Phía admin cũng quan trọng

Khách hàng cần quản lý lịch hẹn, cập nhật slot trống và xử lý huỷ. WordPress admin + custom post types thường lo phần này, còn Next.js phục vụ UI phía người dùng.

Bài học rút ra

  • Validate sớm: disable ngày/giờ không hợp lệ trước khi user tới bước thanh toán
  • Hiện loading khi redirect payment — user dễ hoảng khi thấy màn hình trắng
  • Log lỗi booking phía server; "payment failed" không context thì vô dụng
  • Mobile-first: phần lớn traffic đặt lịch từ điện thoại

Những bài học đó hiện trong case study salon booking platformtour booking platform. Phía CMS của cùng kiểu build nằm ở WordPress headless với Next.js.

Hệ thống booking tốt cảm giác "nhàm" theo nghĩa tốt — dự đoán được, nhanh và đáng tin.

Đọc thêm: Zustand, Forms and Mutations của Next.js, và docs cổng thanh toán bạn thực sự nối (đừng bịa luồng PCI trong bài).

River BotHỏi tôi