Tổng quan
Dữ liệu Shopify đổ về theo thời gian thực
Doanh thu & khối lượng theo ngày
7 ngày gần nhất · USD và kg tócXem số liệu từng ngày dạng bảng
Tiến độ đơn nhà máy
theo dòng sản phẩm · tính đến hiện tạiNhật ký webhook
có chống trùng theo webhook-id| Mã đơn | Ngày nhận | Sản phẩm / SKU | Khách | Nguồn đơn | SL | KL | Giá gốc | Discount | Doanh thu thuần | Payment | Trạng thái hàng | Shipping from | Tracking | Đơn vị ship | Note | Tình trạng đơn |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Mã đơn | Ngày gửi | Tem (SKU) | Sản phẩm | Xoăn sóng | Tiêu chuẩn | Độ dài | Màu | Số bó | KL | Note VP | Quà tặng | NM dự kiến | Thực gửi | Note NM | Tình trạng |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Giải mã SKU thành phiếu sản xuất
Chính là node Code: Tách line_items — chạy nguyên bản trên webNhập SKU
Tách đoạn
SKU mẫu
Đường đi của một đơn hàng
thay thế toàn bộ 2 workflow n8n
01 · Shopify
Webhook bắn về một endpoint
Đăng ký orders/create, orders/paid, orders/updated, orders/fulfilled cùng trỏ về /api/shopify/webhook. Không cần 2 workflow riêng nữa.
02 · Cổng nhận
Xác thực HMAC rồi lưu thô
So x-shopify-hmac-sha256 với secret. Ghi nguyên payload vào webhook_events, khoá duy nhất trên x-shopify-webhook-id. Trả 200 trong dưới 1 giây để Shopify không retry.
03 · Xử lý
Upsert thay vì append
Tách line_items, giải mã SKU, ghi vào orders / order_items / factory_lines. Khoá duy nhất (order_id, line_item_id) — đơn về 5 lần vẫn chỉ có 1 dòng.
04 · Nhà máy
Xác nhận ngay trên web
Tài khoản nhà máy chỉ thấy factory_lines qua RLS — không thấy giá, không thấy khách. Bấm xác nhận là văn phòng thấy đổi trạng thái tức thì qua Supabase Realtime.
Lược đồ Postgres
Supabase · 5 bảng chính
webhook_events -- lá chắn chống trùng & nhật ký để replay
id, shopify_webhook_id text UNIQUE, topic, shop_domain,
payload jsonb, received_at, processed_at, error text
orders -- 1 dòng / 1 đơn Shopify
id, shopify_order_id int8 UNIQUE, name text, -- '#1247'
created_at, financial_status, fulfillment_status, tags text[],
customer_name, email, phone, address, currency,
subtotal, total_discounts, total_price, raw jsonb
order_items -- bảng Order Paid của bạn
id, order_id → orders, line_item_id int8,
sku, product_name, variant_title, quantity,
price, discount, revenue, weight_kg
UNIQUE (order_id, line_item_id) ← chống append trùng
factory_lines -- bảng Order Ưu tiên B2C
id, order_item_id → order_items,
ma_don, tem, san_pham, xoan_song, tieu_chuan, do_dai, mau,
so_bo, khoi_luong, note_vp, qua_tang, ngay_gui_don,
nm_du_kien date, nm_ngay_thuc_gui date, note_nm text,
status enum('cho','xac_nhan','sx','xong','da_gui'),
confirmed_by uuid, confirmed_at timestamptz
fulfillment -- phần văn phòng tự điền
order_item_id, trang_thai_hang, shipping_from, affiliate,
tracking, don_vi_ship, htdk, note
+ audit_log: ai sửa ô nào, từ giá trị gì sang giá trị gì
Vì sao web ổn định hơn n8n hiện tại
| Đơn bị trùng dòng | n8n: node Check đã có chưa đọc Sheet rồi mới append — 2 webhook về sát nhau là ra 2 dòng. Web: UNIQUE (order_id, line_item_id) — database từ chối, không cần kiểm tra thủ công. |
| Google Sheets hết quota | n8n: mỗi đơn tốn 3–4 lượt gọi API Sheets, đụng giới hạn ghi là workflow đỏ. Web: Postgres không có quota kiểu đó. Vẫn xuất Excel khi cần đối chiếu. |
| Đơn lỗi thì mất luôn | n8n: execution fail là xong, phải mò trong lịch sử rồi chạy tay. Web: payload nằm nguyên trong webhook_events, bấm một nút là xử lý lại. |
| Nhà máy phản hồi | n8n: nhà máy gõ tay vào Sheet chung, dễ sửa nhầm ô của người khác. Web: RLS cho nhà máy quyền sửa đúng 3 cột trên dòng của họ, mọi thay đổi đều có audit log. |
| Sửa logic SKU | n8n: sửa trong ô Code của node, không có version, không test được. Web: một file sku.ts có unit test — thêm mã màu mới là chạy test biết ngay đúng sai. |
| Công sức dựng | Next.js + Supabase + Vercel. Ước lượng 2–3 tuần cho bản chạy thật: tuần 1 webhook + schema + import lịch sử từ Sheet, tuần 2 hai màn hình bảng + màn nhà máy, tuần 3 phân quyền, xuất Excel, chạy song song với n8n để đối chiếu. |
Phễu chuyển đổi theo ngày
rê chuột để xem số · bấm vào một ngày để xem riêng ngày đóXem số liệu từng ngày dạng bảng
Từng sản phẩm
mỗi dòng 1 mã hàng (bỏ gram) · bấm ▸ xem từng gói gram · bấm tiêu đề cột để sắp xếp| SKU | Lượt xem | Thêm giỏ | Tỉ lệ giỏ | Đơn | SL bán | Khối lượng bán | Doanh thu thuần | Tỉ lệ mua | Đánh giá |
|---|
| Ngày | Khách | Sản phẩm | SL | Giá trị | Tình trạng | Đã liên hệ | Kết quả | Ghi chú | Khôi phục |
|---|
Phân bổ đơn theo kho
| Xét | Mỗi dòng trong đơn mới | Kết quả |
|---|---|---|
| 1 | Kho VN còn đủ số kg của mã hàng đó | Ship ở VP · tự trừ kho VN |
| 2 | VN không đủ, kho US còn đủ số kg | Ship kho US · tự trừ kho US |
| 3 | Không kho nào đủ, mã chưa có trong kho, hoặc đặt Ngừng bán | Làm đơn NM · tạo phiếu nhà máy |
| 4 | Dòng không có SKU | Không trừ kho, không đẩy nhà máy |
Mã hàng là SKU bỏ đuôi khối lượng: đơn TA-MSA2-TH-1B-18-100G và TA-MSA2-TH-1B-18-50G
cùng lấy tồn của mã TA-MSA2-TH-1B-18.
Đơn huỷ hoặc hoàn tiền toàn bộ thì số kg đã trừ tự cộng lại vào kho. Trên Order Paid, đổi cột Shipping From sang Ship ở VP / Ship kho US / Làm đơn NM là kho và phiếu nhà máy tự đổi theo; chọn ↻ Tự tính lại theo kho để tính lại một dòng.
Chỉ áp dụng cho đơn tạo sau lúc bật; khi đang tắt, đơn mới vẫn đẩy nhà máy theo tag Pre-order như cũ. Kho VP / Kho US hiện các mã còn tồn lớn hơn 0.
Danh sách mã tự cập nhật mỗi ngày khi Shopify có sản phẩm mới — số tồn, trạng thái, ghi chú bạn đã điền giữ nguyên.
Đơn huỷ hoặc hoàn tiền toàn bộ thì số kg đã trừ tự cộng lại vào kho. Trên Order Paid, đổi cột Shipping From sang Ship ở VP / Ship kho US / Làm đơn NM là kho và phiếu nhà máy tự đổi theo; chọn ↻ Tự tính lại theo kho để tính lại một dòng.
Chỉ áp dụng cho đơn tạo sau lúc bật; khi đang tắt, đơn mới vẫn đẩy nhà máy theo tag Pre-order như cũ. Kho VP / Kho US hiện các mã còn tồn lớn hơn 0.
Danh sách mã tự cập nhật mỗi ngày khi Shopify có sản phẩm mới — số tồn, trạng thái, ghi chú bạn đã điền giữ nguyên.
| Họ tên | Vai trò | Trạng thái | Đăng nhập cuối | Ghi chú | Thao tác |
|---|
Quyền của từng vai trò
| Màn hình | Admin | Văn phòng | Nhà máy |
|---|---|---|---|
| Tổng quan | ✅ | ✅ | ✅ (ẩn doanh thu) |
| Order Paid | ✅ | ✅ | — |
| Order Nhà Máy | ✅ | ✅ | ✅ |
| Hàng chờ xác nhận | ✅ | — | ✅ |
| Nhân viên | ✅ | — | — |
| Giải mã SKU · Kiến trúc & DB | ✅ | — | — |
Quyền được chặn ở tầng database bằng RLS policy, không phải ẩn giao diện.
Tài khoản nhà máy dù gọi thẳng API cũng không đọc được bảng giá và thông tin khách hàng.