Norra POS (Point of Sales)

F&B SaaS · iPad / điện thoại / máy tính

Vai trò
Sole Product Designer
Làm việc với
PO, BA, Dev. CEO là người chốt cuối.
Người dùng
Phục vụ, thu ngân và quản lý. Bếp dùng KDS riêng (màn hình đặt dưới bếp).
Bài toán
Nhà hàng dùng POS chỉ để thanh toán, còn gọi món, chuyển bàn, theo dõi bàn vẫn chạy bằng giấy bút. Mình cải thiện POS để nó trở thành nơi duy nhất để hỗ trợ các vị trí khác nhau cùng vận hành.

Root cause chung

Ban đầu, việc của nhân viên trong nhà hàng đều được giải quyết bằng giấy, bút và qua lời nói. Chưa có hệ thống lúc đầu, và mỗi vai trò trong nhà hàng (nhân viên phục vụ, thu ngân, quản lý và nhân viên bếp) thường phải trao đổi và khi có vấn đề phát sinh về món ăn và thanh toán họ phải lại trao đổi và sửa tay.

Mình không thiết kế theo từng màn hình, mình phải thiết kế dựa theo công việc của những vai trò công việc khác nhau.

1

Gộp, tách, chuyển bàn: hóa đơn không biết đi theo ai

Vấn đề

Khi có nhu cầu gộp bàn từ khách hàng thì công việc của nhân viên phục vụ phải thực hiện các bước ghi chú lại vào giấy, xong thông báo qua cho thu ngân và quản lý. Tới lúc tính tiền, thì thu ngân phải xem xét hoá đơn đã được cập nhật thông tin đúng số bàn hay chưa sau đó nếu có sai xót thì chỉnh sửa hoá đơn bằng tay.

Mình nhận ra

Lỗi chưa xuất hiện khi lúc tiến hành thanh toán, mà lỗi có thể sẽ xảy ra lúc có hành động đổi bàn/gộp bàn mà hệ thống chưa biết.

Cân nhắc

Khi gộp bàn, hoá đơn đi theo bàn. Không cần phải thao tác bằng tay. Chỉ cần cập nhật thẳng vào POS, tất cả các vị trí khác trong hệ thống cũng sẽ nắm được thông tin.

Khi tách bàn (hoặc tách hoá đơn), hệ thống sẽ hỗ trợ 3 cách: chia món (hoá đơn) theo 50/50 (chia đều), chia theo phần trăm và cuối cùng là chia thủ công.

Ban đầu các developer đề xuất chia đều và chia theo phần trăm sẽ đơn giản và hỗ trợ nhân viên chia bàn (hoá đơn) nhanh hơn.

Nhưng khách hàng không phải lúc nào cũng muốn chia cho đều, vì sẽ có các trường hợp

  1. Khách muốn tách hoá đơn để xuất hoá đơn riêng
  2. Khách chỉ muốn tách các món riêng để trả chi phí riêng cho phần món mang về
  3. Khách muốn tách riêng các món có chi phí cao hơn nên sẽ tự thanh toán phần riêng đó

Và khi đó các cách chia đều hoặc chia theo phần trăm, không thể thực hiện được các trường hợp ngoài mà khách muốn.

Làm với team

Gộp, tách, chuyển bàn (hoá đơn) là yêu cầu dành cho POS, nên không ai tranh luận chuyện có làm hay không.

Mình đem đúng mấy câu chuyện khách hàng ở trên đi kể cho team, sau đó được duyệt cho thêm cách chia thủ công.

Dev không ngại làm thêm, vì bản chất chỉ là chọn món rồi chuyển sang hóa đơn khác.

Với việc các câu chuyện tách bàn đã được thông qua thì các thành viên team dev cũng hiểu được tầm quan trọng của tính năng này và cũng không phản đối việc làm thêm này.

Quyết định

Mình quyết định rằng việc chọn gộp, tách, chuyển bàn sẽ được cập nhật vào hoá đơn, vì sẽ có trường hợp 1 bàn sẽ có thể có 2 hoặc nhiều hoá đơn được tách ra, và việc tách hoá đơn kèm thông tin bàn trên đó sẽ hỗ trợ việc rà soát các báo cáo cuối ngày, sẽ hiện hơn cho vấn đề quản lý.

Kết quả sau đó

Mình đã thử nghiệm trực tiếp từ phiên bản wireframe với nhân viên nhà hàng, khi các bạn nhân viên thường sử dụng việc tách hoá đơn trước đây là phải dùng tay để chỉnh sửa các món và hoá đơn thì họ ấn tượng nhất là cách chia món/hoá đơn bằng phần trăm hoặc chia đôi, nhưng khi họ thấy việc chia món/hoá đơn theo ý muốn, nhân viên cảm thấy tiện hẳn — vì điều đó giúp họ giải quyết nhanh được trong công việc của họ.

Vì trước đó khi gặp trường hợp muốn tách riêng những món mà khách hàng cần thì nhân viên phải làm 1 thao tác là tạo 1 bàn mới phụ thuộc vào hiện tại thì mới ghi lại được món mà khách cần tách ra — đây là lý do mình cần phải làm gọn lại.

Split Bill: thêm hóa đơn mới
Sau khi chuyển món sang hóa đơn 1234-2
Menu của bàn trên điện thoại: Combine Bill, Split Bill
2

Trạng thái bàn và sơ đồ bàn: phải chạy tới tận nơi mới biết

Vấn đề

Vào giờ cao điểm, có trường hợp khách đến dùng bữa mà không đặt bàn trước. Lúc đó, hệ thống chưa có sơ đồ bàn để quản lý biết ngay bàn nào đang trống, nên quản lý phải đi vòng quanh nhà hàng để kiểm tra trực tiếp.

Ngoài ra, hệ thống cũng chưa thể ước lượng được bàn đang phục vụ còn bao lâu nữa mới trống — ví dụ bàn A bắt đầu phục vụ từ 5 giờ chiều, nếu biết số lượng khách và món đã gọi thì đáng lẽ có thể tính được thời điểm bàn sẽ trống, nhưng lúc đó hệ thống chưa làm đến mức đó.

Mình nhận ra

Đây là một nhu cầu của hầu hết nhân viên sử dụng hệ thống POS, bởi họ muốn biết toàn bộ tình trạng của tầng để có thể đưa ra những quyết định kịp thời.

Cân nhắc

Hệ thống được thiết kế với 9 trạng thái bàn: bàn trống, bàn đã đặt, khách đã tới, khách tới trễ, đang phục vụ, đã phục vụ, chờ thanh toán, đã thanh toán, và bàn hủy hoặc khách không đến.

Màn hình chính là danh sách bàn, có thêm nút chuyển sang sơ đồ bàn.

Lý do chọn danh sách làm màn hình chính là vì đa số nhân viên dùng danh sách để phục vụ khi khách tới — danh sách hiển thị đúng bàn nào đang phục vụ dựa theo thông tin khách đã đặt.

Sơ đồ bàn thì dùng trong trường hợp cần biết bàn nào đang trống, bàn nào đã được đặt trước, để quản lý nắm được tình trạng chung của cả nhà hàng.

Làm với team

Ban đầu team Dev không đồng ý với việc quá nhiều trạng thái trên hệ thống, nhưng mỗi trạng thái sẽ hỗ trợ nhân viên biết được tình trạng thực tế tại bàn đang như thế nào - để hỗ trợ nhân viên phục vụ tốt nhất công việc của họ.

Quyết định

Mình giữ đủ 9 trạng thái, không bỏ trạng thái nào.

Màn hình chính vẫn là danh sách bàn, còn sơ đồ bàn là chế độ xem để chuyển qua khi cần. Việc làm real‑time thì dời sang giai đoạn sau, theo lo ngại kỹ thuật từ phía dev.

Kết quả sau đó

Trạng thái hiện tại được cập nhật bằng nút bấm reload. Mình từng đề xuất thêm thông báo trong app để báo có gì mới, nhắc nhân viên bấm reload — nhưng vẫn giữ quan điểm là hệ thống nên tự cập nhật, chỉ cần bấm lại khi có lỗi mạng hoặc lỗi hệ thống. Việc làm real‑time vẫn nằm trong hướng phát triển tiếp theo, chứ không bị bỏ hẳn.

Danh sách, lọc theo trạng thái
Sơ đồ bàn theo khu, có chú giải trạng thái
Chế độ xem Gantt theo giờ
3

Phân quyền: ai xem gì, ai được làm gì

Vấn đề

Trong nhà hàng có nhiều vai trò cùng xem vào một đơn hàng. Nếu ai cũng có quyền sửa thì dễ dẫn đến sai sót và khó kiểm soát, còn nếu quản lý chỉ được xem thôi thì không xử lý được những tình huống thực tế phát sinh.

Mình nhận ra

Mình nhận ra cần tách quyền xem ra khỏi quyền hành động, và đặt một nguyên tắc chung: ai là người thực hiện thao tác thì người đó không được là người duyệt thao tác đó. Ngoài ra với mỗi vai trò sẽ có thêm quyền xem và thao tác riêng biệt.

Cân nhắc

Mỗi vai trò chỉ được thực hiện đúng phần việc của mình — phục vụ tạo và sửa đơn của mình, gộp, tách, chuyển bàn; quản lý xem được toàn bộ và duyệt các thao tác nhạy cảm; thu ngân giữ toàn quyền xử lý tiền; còn bếp thì đứng ngoài hệ thống POS, sử dụng riêng màn hình KDS. Chi tiết đầy đủ được thể hiện trong bảng phân quyền bên dưới.

Làm với team

Ban đầu, đội ngũ sản phẩm muốn quản lý được biết hết mọi thứ và có quyền chỉnh sửa trực tiếp.

Mình thuyết phục theo hướng ngược lại: việc của ai thì người đó làm, quản lý chỉ nên xác nhận và giám sát cách nhân viên làm việc, chứ không được tự ý chỉnh sửa.

Lý do là lúc đó hệ thống chưa có audit log (nhật ký thao tác), nên nếu quản lý có quyền sửa hoặc xóa món, có thể dẫn đến trường hợp quản lý tự ý xóa món cho một bàn quen biết, rồi khi có vấn đề lại đổ ngược trách nhiệm cho nhân viên. Hoặc quản lý có thể tự ý áp mã giảm giá cho bàn mình muốn mà không cần ai xác nhận. Cách an toàn nhất là không để họ có quyền dẫn tới những sai phạm đó.

Quyết định

Mình quyết định phân quyền theo hành động chứ không theo màn hình, và không để một người vừa thực hiện vừa tự duyệt cho chính mình — vì quản lý cần thấy được toàn bộ nhưng không được thay đổi đơn khi nhân viên đang phục vụ, còn tiền thì chỉ được xử lý qua thu ngân. Mỗi quản lý có một mã xác nhận riêng, khi nhân viên cần duyệt (void, hủy món...) thì mang máy POS đến, quản lý tự nhập mã của mình ngay trên đó, nên biết chính xác quản lý nào đã duyệt việc gì.

Nhập mã xác nhận khi thêm voucher
Hoàn tiền từng khoản thanh toán

Ma trận phân quyền

Ma trận phân quyền
Hành độngPhục vụThu ngânQuản lý
Xem sơ đồ bàn và trạng thái bàn—XemXem
Xem chi tiết món (đã phục vụ chưa, đang làm chưa)XemXemXem
Tạo đơn, gọi món cho khách (kể cả bằng note hay voice)LàmKhôngKhông
Sửa món tùy ý khi nhân viên đang phục vụLàm (đơn của mình)KhôngKhông
Đổi món khi khách đổi ýXin duyệtKhôngDuyệt
Gộp, tách, chuyển bànLàmKhôngLàm
Hủy món hoặc hủy đơn (món chưa bắt đầu làm)Xin duyệt: bấm hủy, cần mã xác nhận của quản lýKhôngDuyệt: cấp mã xác nhận
Hủy món đang làmKhông, hệ thống chặn—Không
Void món (hủy món đã làm xong hoặc đã phục vụ)Xin duyệtKhôngDuyệt và ghi lý do
Áp mã giảm giáKhôngDuyệt: xác nhận mãXin duyệt: áp mã, cần thu ngân xác nhận
Thanh toánKhông, phải qua thu ngânLàmKhông tự thanh toán. Có thể xác nhận, nhưng vẫn phải qua thu ngân.
Hoàn tiềnKhôngLàm (chỉ thu ngân)Không

Làm = tự làm được · Xem = chỉ được xem · Xin duyệt = tạo yêu cầu, người khác duyệt · Duyệt = xác nhận yêu cầu · Không = không có quyền

4

Đổi món giữa chừng: hỏi bếp bằng chân

Vấn đề

Khi khách đổi ý, phục vụ phải chạy xuống bếp để hỏi xem món đã được làm chưa, còn giấy order thì cứ phải chuyền qua chuyền lại giữa bếp và thu ngân.

Mình nhận ra

Ý tưởng này đến từ chính trải nghiệm của mình khi đi ăn ở ngoài.

Khi muốn đổi món, mình sẽ hỏi nhân viên xem món đã làm chưa — nếu chưa làm thì đổi được, còn nếu đã làm thì thường mình sẽ đợi. Nhưng nếu đợi quá lâu, ví dụ hơn 30 phút kể từ lúc gọi món, thì mình có quyền yêu cầu hủy, và lúc đó là chuyện giữa quản lý, nhân viên và bếp tự giải quyết với nhau.

Mình nhận ra bếp thật ra đã luôn biết câu trả lời cho câu hỏi "món tới đâu rồi", chỉ là trước giờ POS không hỏi đến nó.

Cân nhắc

Thay vì làm riêng một luồng "đổi món", mình để trạng thái món trên KDS quyết định việc hủy hay đổi:

  • Món chưa bắt đầu làm: hủy hay đổi đều được, cần mã xác nhận của quản lý.
  • Món đang làm: hệ thống sẽ báo không thể hủy.
  • Món đã chuẩn bị phục vụ hoặc đã phục vụ: chuyển thành void, quản lý xác nhận và ghi lý do.

Trạng thái từ KDS được hiển thị ngay trên dòng món của bàn đó. Ngoài trạng thái, hệ thống còn tính luôn thời gian tính từ lúc gọi món — nếu khách phải chờ quá lâu (như tình huống hơn 30 phút ở trên), có thể kiểm lại ngay trên POS xem đã thật sự quá thời gian hay chưa, để quản lý, nhân viên và bếp xử lý đúng người đúng việc.

Làm với team

Không có ai trong team phản biện hướng làm này.

Quyết định

Mình quyết định để trạng thái món trên KDS quyết định việc hủy hay đổi được hay không, vì phục vụ cần trả lời khách ngay mà không phải chạy xuống bếp hỏi, còn với món đã làm thì cần quản lý xác nhận và ghi lý do để kiểm lại sau.

Kết quả sau đó

Void flow (luồng xử lý món đã phục vụ) đã được thiết kế xong màn hình, không còn dừng ở mức ý tưởng.

Chi tiết đơn với các tab trạng thái món
Chi tiết đơn trên điện thoại
Nhập mã để xóa món đã gửi bếp
Chi tiết đơn, mỗi dòng món có một nút xóa
Hộp thoại void món: chưa chọn lý do
Đã chọn lý do cho món cần void
Món đã void: bị gạch ngang và hiện lý do

Deep dive: ghi món bằng note hoặc voice

Câu chuyện mở đầu

Mình đi ăn như một khách hàng bình thường. Nhân viên nghe khách gọi món, ghi chú vào điện thoại hoặc giấy, rồi mới nhập lại vào POS. Sản phẩm mình làm ra lại không phục vụ đúng khoảnh khắc quan trọng nhất đó.

Vấn đề

POS hiện có hàng trăm món để bấm chọn, nhưng khách gọi món nhanh hơn thời gian nhân viên tìm được món trên hệ thống, nên nhân viên phải ghi chú trước rồi nhập lại sau — làm hai lần cho cùng một việc.

Mình hiểu sai lúc đầu

Ban đầu mình tưởng bài toán là làm cho danh sách món dễ tìm hơn. Nhưng thực ra bài toán là không nên bắt nhân viên phải tìm món ngay trong lúc khách đang nói. Thời gian xử lý sẽ lâu hơn vì thời gian tìm món hoặc tốc độ tay của từng người.

Các hướng cân nhắc

  1. Tối ưu lại menu và tìm kiếm: vẫn buộc nhân viên tìm món trong lúc khách đang nói, không giải quyết được gốc rễ vấn đề.
  2. Ghi note tự do (có thể chỉ ghi vài chữ đầu của món), hệ thống sẽ phân tích thành món để nhân viên xác nhận lại với khách hàng sẽ nhanh chóng hơn.
  3. Voice note, dùng cùng cơ chế phân tích: chọn luôn, làm song song với note.

Làm với team

Dev có lo ngại về việc có làm được hay không.

Mình không đưa phương án lùi mà thuyết phục bằng ba thứ:

  1. Nỗi khó thực tế mà nhân viên đang gặp
  2. Kết quả khảo sát các công cụ AI hiện có trên thị trường
  3. Và nói rõ thời gian cần hoàn thành cùng chi phí phải bỏ ra để dev tự đánh giá

Sau đó dev đã nhận và hoàn thành tính năng.

Quyết định

Mình quyết định để nhân viên ghi tắt hoặc nói, sau đó để AI đề xuất món để họ xác nhận lại, thay vì bắt họ phải tìm trong menu.

Lý do là khách gọi món nhanh hơn thời gian tìm món, và nhân viên vốn dĩ đã phải ghi tay rồi nhập lại rồi.

Đánh đổi ở đây là thêm một bước xác nhận, và phụ thuộc vào độ chính xác của AI.

Kết quả

Mình đã thử nghiệm bằng Maze với 10 nhân viên nhà hàng.

Nhân viên cho biết tính năng "smart note" cảm thấy thoải mái hơn khi chọn món (đây là phản hồi định tính, không có số đo trước/sau vì bản Maze miễn phí không còn lưu lại dữ liệu gốc).

Tính năng này hiện đang trong giai đoạn phát triển, chưa được đưa vào sử dụng chính thức.

Trước: tìm và bấm trong menu

Menu List: tìm và bấm từng món

Sau: ghi note, hệ thống gợi ý món, nhân viên xác nhận

Smart Note: ghi note tự do
Chọn món khớp với "cá hồi"
Chọn món khớp với "bò nướng"
Xác nhận đơn rồi gửi bếp

Bài học

Mình từng tin rằng voice sẽ là điểm khác biệt lớn nhất. Nhưng kết quả thử nghiệm cho thấy nhân viên chủ yếu vẫn dùng note, vì họ đã quen với việc ghi chú trên điện thoại, còn voice thì họ ngại nói trước mặt khách.

Quyết định sau khi thử nghiệm là giữ nguyên voice như một tùy chọn, không ép buộc và cũng không loại bỏ, để nhân viên có thời gian làm quen dần với công nghệ mới. Trong thực tế, note vẫn là cách sử dụng chính.