Chỉ thị Omnibus & hiển thị giá trên Shopify: quy tắc 30 ngày
Giải thích quy định Omnibus directive price display Shopify trong thực tế: quy tắc giá thấp nhất 30 ngày, đánh giá xác thực, minh bạch thứ hạng và cách sửa theme.
Nếu bạn bán hàng cho khách EU từ cửa hàng Shopify, mỗi dòng "giá cũ €49, nay còn €29" trên trang sản phẩm đều là một tuyên bố chịu sự điều chỉnh của pháp luật. Từ năm 2022, luật EU quy định chính xác bạn được phép hiển thị mức giá cũ nào khi công bố giảm giá — và phần lớn theme Shopify, nếu để nguyên cấu hình mặc định, đều đang làm sai. Bài viết này giải thích Omnibus Directive thực sự yêu cầu gì, cơ chế compare-at price của Shopify xung đột với quy định ở đâu, và cách sửa logic hiển thị giá một lần rồi triển khai cho toàn bộ các cửa hàng bạn đang vận hành.
Chỉ thị Omnibus là gì và có hiệu lực từ khi nào?
"Omnibus Directive" là tên gọi quen thuộc của Directive (EU) 2019/2161 — chỉ thị về tăng cường thực thi và hiện đại hóa các quy định bảo vệ người tiêu dùng của EU. Thay vì tạo ra một đạo luật hoàn toàn mới, nó sửa đổi cùng lúc bốn chỉ thị tiêu dùng hiện hành — vì thế mới có tên "omnibus" (gộp chung). Với merchant bán hàng online, ba thay đổi quan trọng nhất là:
- Quy tắc về giảm giá, bổ sung Điều 6a vào Price Indication Directive (Directive 98/6/EC).
- Nghĩa vụ về tính xác thực của đánh giá (review), thông qua sửa đổi Unfair Commercial Practices Directive.
- Nghĩa vụ minh bạch thứ hạng hiển thị, cũng qua Unfair Commercial Practices Directive.
Các nước thành viên phải áp dụng những quy định này từ ngày 28/05/2022, tức là chúng đã có hiệu lực được vài năm. Việc thực thi diễn ra ở cấp quốc gia — cơ quan bảo vệ người tiêu dùng của từng nước EU giám sát thị trường của mình — nhưng Omnibus Directive yêu cầu các nước thành viên phải có khung phạt tối thiểu lên tới 4% doanh thu hằng năm của trader tại các nước liên quan đối với vi phạm trên diện rộng được xử lý theo cơ chế phối hợp của EU. Dù bạn đặt trụ sở trong EU hay bán vào EU từ Việt Nam, các quy định này đều áp dụng cho những offer hướng tới khách EU. Để nắm bức tranh pháp lý tổng thể, xem checklist tuân thủ EU cho merchant Shopify.
Quy tắc giá thấp nhất 30 ngày: hiển thị "giá cũ €X" cho đúng
Điều 6a là phần chạm trực tiếp vào trang sản phẩm của bạn. Mỗi khi công bố giảm giá, bạn phải hiển thị giá trước đó (prior price), được định nghĩa là mức giá thấp nhất bạn đã áp dụng trong khoảng thời gian ít nhất 30 ngày trước đợt giảm giá. Ủy ban châu Âu đã ban hành hướng dẫn chi tiết về cách diễn giải Điều 6a đi qua từng tình huống khó.
Hệ quả thực tế khiến nhiều merchant bất ngờ:
- "Giá cũ" phải là mức thấp nhất trong 30 ngày, không phải giá gốc. Nếu sản phẩm niêm yết €49, đã giảm còn €39 hai tuần trước, và giờ tiếp tục "sale", thì giá cũ bạn được hiển thị là €39 — không phải €49.
- Giảm giá liên tiếp phải tính lùi về trước. Trong một chiến dịch giảm giá tăng dần ("−20%, rồi −30%, rồi −50%"), bạn được phép giữ nguyên giá cũ từ trước đợt giảm đầu tiên — nhưng chỉ trong phạm vi một chiến dịch liên tục.
- Thông báo chung cũng bị tính. Banner kiểu "giảm 20% toàn bộ cửa hàng" là một thông báo giảm giá, nên mọi sản phẩm nằm trong phạm vi banner đều cần giá cũ hợp lệ.
- Giảm giá cá nhân hóa được đối xử khác. Theo hướng dẫn của Ủy ban, các ưu đãi thực sự mang tính cá nhân (như voucher sinh nhật) nhìn chung nằm ngoài Điều 6a — nhưng một mã "cá nhân" gửi đồng loạt cho cả danh sách email thì không.
Các nước thành viên được phép có một số biến thể riêng (ví dụ với hàng dễ hỏng hoặc giảm giá lũy tiến), nên hãy kiểm tra quy định của đúng những quốc gia bạn nhắm tới.
Quy tắc này giờ còn có án lệ đứng sau: trong phán quyết ngày 26/09/2024 (vụ C-330/23, Aldi Süd), Tòa án Công lý EU (CJEU) khẳng định phần trăm giảm giá hay nhãn "giá tốt" phải được tính trên chính mức giá thấp nhất 30 ngày — chứ không chỉ hiển thị cạnh nó. Kiểu ghi "−50%" tính từ giá tham chiếu bị thổi phồng trong khi giá thấp nhất 30 ngày nằm lí nhí bên dưới chính là điều phán quyết này cấm.
Tính xác thực của đánh giá: cấm review giả, cẩn trọng với nhãn "đã xác minh"
Omnibus Directive cũng sửa đổi Unfair Commercial Practices Directive để xử lý nạn "bằng chứng xã hội" giả. Hai nghĩa vụ merchant Shopify cần nhớ:
- Không được đăng hoặc thuê người viết review giả, hoặc trình bày sai lệch các đánh giá để quảng bá sản phẩm. Mua review 5 sao, để nhân viên đóng vai khách hàng viết đánh giá, hay ẩn review tiêu cực trong khi tuyên bố hiển thị "tất cả đánh giá" — đều là hành vi bị cấm.
- Nếu bạn tuyên bố review đến từ người mua thật, bạn phải có biện pháp hợp lý để xác minh điều đó — và giải thích được cách xác minh. Nếu app review của bạn gắn nhãn "verified buyer", nhãn đó phải được chống lưng bởi một cơ chế xác minh thực sự (ví dụ đối chiếu review với dữ liệu đơn hàng), và chính sách review nên nêu rõ cách hoạt động.
Nếu bạn dùng một app review bên thứ ba trên nhiều cửa hàng, hãy rà soát cấu hình: một số app mặc định import review "mồi" hoặc lọc theo số sao, và điều đó có thể đẩy bạn sang phía sai của quy định.
Minh bạch thứ hạng: công khai cách kết quả được sắp xếp
Nếu storefront của bạn cho phép khách tìm kiếm sản phẩm, Omnibus Directive yêu cầu bạn công khai các tham số chính quyết định thứ hạng kết quả và tầm quan trọng tương đối của chúng. Với một cửa hàng Shopify thông thường, điều này nghĩa là một đoạn giải thích ngắn gọn, dễ tiếp cận — thường đặt gần kết quả tìm kiếm hoặc trong trang trợ giúp — nói về các yếu tố như mức độ liên quan, doanh số hay việc sắp xếp thủ công. Quan trọng nhất: nếu có vị trí nào được trả tiền để ưu tiên (nhà cung cấp trả phí để lên đầu, hoặc bạn đẩy sản phẩm được tài trợ), điều đó phải được công bố rõ ràng. Hầu hết merchant chỉ cần một đoạn văn trung thực là đủ; vi phạm nằm ở sự im lặng, không phải ở độ phức tạp.
Sửa logic Omnibus directive price display trong theme Shopify
Đây là nơi luật gặp Liquid. Cơ chế giảm giá gốc của Shopify là compare-at price: bạn đặt compare_at_price cao hơn price, và theme sẽ hiển thị giá gạch ngang "giá cũ" kèm badge sale (xem tài liệu định giá sản phẩm của Shopify). Vấn đề: Shopify không lưu lịch sử giá 30 ngày của bạn, và theme hiển thị mù quáng bất kỳ giá trị compare-at nào được nhập vào. Không gì ngăn bạn — hoặc một bạn VA vội vàng chạy flash sale — hiển thị một "giá cũ" chưa bao giờ là mức thấp nhất 30 ngày.
Một giải pháp vững chắc ở cấp theme trông như sau:
- Lưu giá thấp nhất 30 ngày của từng variant vào một metafield (ví dụ
pricing.lowest_30d), được cập nhật từ lịch sử thay đổi giá. - Thêm một snippet Liquid đọc metafield đó trên template sản phẩm, collection và quick-view, rồi hiển thị dòng chữ luật yêu cầu — "Giá thấp nhất trong 30 ngày qua: €X" — mỗi khi có giảm giá được hiển thị qua
compare_at_pricehoặc discount. - Chốt chặn cho badge sale: nếu metafield bị thiếu, hoặc compare-at price cao hơn mức thấp nhất 30 ngày đã ghi nhận, snippet sẽ hiển thị giá cũ đúng thay vì con số bị thổi phồng.
Đây là vài trăm dòng Liquid cộng một quy trình lưu lịch sử giá — không phải dự án khổng lồ, nhưng phải được gắn vào mọi template nơi giảm giá có thể xuất hiện.
Triển khai một bản sửa Omnibus directive price display cho nhiều cửa hàng Shopify
Nếu bạn chỉ có một cửa hàng, bạn vá một theme là xong. Nhưng nếu bạn vận hành mười cửa hàng hướng tới EU, con đường app store đồng nghĩa với việc cài một app tuân thủ giá lên từng cửa hàng và trả phí thuê bao hằng tháng riêng cho mỗi cửa hàng, mãi mãi — đúng vòng xoáy chi phí theo từng cửa hàng mà chúng tôi đã phân tích trong bài chi phí thực của việc tuân thủ EU trên nhiều cửa hàng Shopify.
Cách tiếp cận của StoreFleet nhìn nhận đúng bản chất vấn đề: đây là một hạng mục phát triển làm một lần. Bạn thuê xây dựng một lần, và nhận về một snippet Liquid triển khai hiển thị giá cũ theo quy tắc 30 ngày — xây một lần, sau đó deploy vào theme của mọi cửa hàng. Vì đó là Liquid thuần nằm trong theme do bạn kiểm soát, bạn sở hữu toàn bộ mã nguồn: không phí định kỳ theo từng cửa hàng, không có chuyện app làm hỏng phần hiển thị giá khi thuê bao hết hạn, và mọi chỉnh sửa tương lai (thêm ngôn ngữ mới, template mới, biến thể quy định theo quốc gia) chỉ là một lần sửa code mà bạn hoặc bất kỳ developer nào cũng làm được. Trên cả một hệ thống nhiều cửa hàng, việc thay nhiều gói thuê bao hằng tháng bằng một snippet thuộc sở hữu của mình thường là khoản dễ cắt nhất — cùng logic với việc giảm chi phí app Shopify ở những phần khác trong hệ thống của bạn.
Những sai lầm phổ biến khiến bạn bị khiếu nại
Một vài mô típ xuất hiện lặp đi lặp lại trong các đợt kiểm tra của cơ quan quản lý quốc gia và các tổ chức người tiêu dùng:
- Thổi phồng compare-at price. Đặt một giá compare-at mà sản phẩm chưa bao giờ thực sự bán ở mức đó là chiêu giảm giá ảo kinh điển — và giờ nó cũng là vi phạm Điều 6a rõ ràng, vì con số đó chưa bao giờ là mức thấp nhất 30 ngày của bạn.
- Vòng lặp flash sale. Chạy "sale 48 giờ", trả giá về cũ một ngày, rồi tung lại đúng đợt sale đó nghĩa là mức thấp nhất 30 ngày của bạn chính là giá sale. Dòng "giá cũ €49" âm thầm trở thành sai sự thật từ vòng lặp thứ hai.
- Sửa một template nhưng bỏ sót phần còn lại. Trang sản phẩm hiển thị giá cũ đúng chuẩn, nhưng thẻ sản phẩm trong collection, kết quả tìm kiếm và widget email vẫn hiển thị con số bị thổi phồng.
- Các cửa hàng trong cùng một hệ thống không đồng nhất. Một nửa số cửa hàng đã được sửa, nửa còn lại thì chưa — một mô típ rất "mời gọi" cho một đơn khiếu nại nêu tên tất cả.
Làm đúng quy tắc 30 ngày suy cho cùng là một bài toán logic hiển thị giá — và logic hiển thị giá chính là thứ nên được sửa một lần, sửa đúng, và áp dụng ở mọi nơi.
Nếu bạn muốn xem một snippet hiển thị giá thuộc sở hữu của riêng mình — cùng khả năng giám sát tập trung trên toàn bộ hệ thống cửa hàng — sẽ vận hành ra sao trên hệ thống thực tế của bạn, hãy đặt lịch demo 1-1 miễn phí ngay trên chính các cửa hàng Shopify của bạn. Đội ngũ StoreFleet có thể cùng bạn rà soát theme, chỉ ra chỗ phần hiển thị giảm giá hiện tại chưa đạt quy tắc 30 ngày, và cho bạn thấy mô hình "xây một lần, deploy mọi nơi" trong thực tế.
Bài viết chỉ mang tính thông tin tham khảo, không phải tư vấn pháp lý. Hãy đối chiếu nguồn chính thức của EU hoặc chuyên gia tư vấn.