Luồng 2 · Nhận đơn hàng từ Etsy về Odoo

← Tổng quan
LUỒNG 2 · ĐỌC ~6 PHÚT

Nhận đơn hàng từ Etsy về Odoo

Từ lúc khách Etsy bấm mua đến lúc đơn vào hệ thống quản lý Odoo. Khách đặt trên Etsy, hệ thống tự động lấy đơn mỗi 5 phút qua API (hoặc mỗi 10 phút đọc email khi đang chạy chế độ dự phòng). Sau khi nhận đơn + ghi nhật ký, hệ thống tự đối chiếu khách theo email — đúng 1 khách: tự tạo; 0 hoặc nhiều hơn 1: BA duyệt. Cuối cùng tạo đơn hàng với trạng thái "Mới nhận" và định tuyến theo sản phẩm (MTO in nội bộ hoặc Dropship Gearment).

Hoạt động 95% API pilot live 2026-05-12 Nguồn: FLOW_DON_HANG_ETSY_VN · HUONG_DAN_DON_HANG_ETSY_VN

AAi làm gì — sơ đồ vai trò

Luồng tiếp nhận đơn liên kết 5 vai trò: khách Etsy, Etsy API, hệ thống Odoo, BA, Marketing. Bảng dưới đọc từ trái qua phải: mỗi cột là một vai trò, mỗi hàng là một mốc chính.

Khách Etsy
Etsy API
Hệ thống Odoo
BA
Marketing
1. Đặt hàng
Bấm "Buy Now", Etsy gán receipt_id
Ghi nhận đơn
2. Cron 5 phút
Sẵn sàng lấy đơn
GET /shops/{shop_id}/orders mỗi 5 phút
3. Ingest + log
Bóc tách đơn (mã đơn, khách, sản phẩm, địa chỉ); ghi nhật ký Etsy
4. Match khách
Tìm khách hàng theo email: trùng 1 → tự tạo. 0 hoặc 2+ → BA duyệt
Nếu cần: duyệt khách hàng mới
5. Sinh SO
Tạo đơn hàng với trạng thái "Mới nhận", lưu mốc thời gian Etsy sửa lần cuối
6. Định tuyến
Kiểm tra Gearment SKU: có → Luồng 3B, không → Luồng 3A
Xem thông tin theo routing

BCác bước chi tiết (8 bước)

  1. 1
    Khách Etsy
    Khách bấm "Buy Now" trên Etsy
    Khách chọn sản phẩm, nhập thông tin giao hàng (tên, địa chỉ, email), xác nhận thanh toán. Etsy gán mã receipt_id cho đơn và ghi nhận tình trạng thanh toán (paid / pending / refunded).
  2. 2
    Hệ thống Odoo · mỗi 5 phút
    Cron tự động pull (GET /shops/{shop_id}/orders)
    Hệ thống chạy lịch Cron theo định kỳ 5 phút. Lần đầu: lấy hết các đơn chưa có trong Odoo. Lần sau: chỉ lấy đơn có thay đổi từ timestamp cuối cùng (incremental, tiết kiệm bandwidth).
    Cấu hình: Lịch tự động "Cập nhật đơn hàng Etsy" (mã kỹ thuật: etsy_integration.cron_etsy_order_sync) chạy cứ 5 phút = 288 lần/ngày. Công suất: 50-100 đơn/ngày với thời gian lấy đơn ≤ 4.3 giây.
  3. 3
    Etsy API
    Etsy trả danh sách đơn
    API /shops/{shop_id}/orders trả JSON với mảng transactions — mỗi transaction = một dòng sản phẩm. Dữ liệu bao gồm: receipt_id, buyer_user_id, buyer_email, shipping_address, price, payment_status, shipping_status, etsy_last_modified.
  4. 4
    Hệ thống Odoo
    Bóc tách đơn + ghi nhật ký Etsy + bật nhật ký email dự phòng nếu cần
    Hệ thống đọc dữ liệu từ Etsy, kiểm tra xem đơn này đã tồn tại chưa (theo mã đơn Etsy). Nếu đơn mới → tạo dòng nhật ký Etsy ghi chi tiết (đường gọi, mã trạng thái, thời điểm). Nếu đơn cũ mà trạng thái đã thay đổi → cập nhật nhật ký. Dự phòng: nếu API lỗi 3 lần liền → chuyển sang đọc email (chế độ dự phòng).
    Chi tiết: mỗi dòng nhật ký Etsy lưu thời điểm, mã shop, mã HTTP, đường gọi, đối tượng, kết quả. Ví dụ: "2026-05-28 14:03 | shop 60752333 | 200 | /shops/60752333/orders | received 14 orders | success". Đường email chỉ kích hoạt khi API hỏng 3 lần → gửi cảnh báo cho BA.
  5. 5
    Hệ thống Odoo
    Tìm hoặc tạo khách hàng dựa trên email
    Hệ thống tìm khách hàng theo email Etsy. Nếu đúng 1 kết quả → tự liên kết (không cần BA duyệt). Nếu 0 kết quả → hệ thống tự tạo khách hàng mới với tên từ Etsy. Nếu nhiều hơn 1 kết quả → BA Lead phải duyệt chọn cái nào (qua hàng chờ "Nhật ký email Etsy — chưa xử lý" — xem màn hình 4).
    Ngoại lệ: nếu email chứa ký tự đặc biệt hoặc trống → BA chấp nhận thủ công qua giao diện "Nhật ký email Etsy — chưa xử lý" (cùng màn hình 4). Cơ chế chọn khách hàng trùng dựa trên hộp thoại tìm kiếm chuẩn của Odoo trên mô hình khách hàng — không có wizard riêng cho việc này.
  6. 6
    Hệ thống Odoo
    Tạo đơn hàng với trạng thái thanh toán + địa chỉ giao + mốc Etsy sửa lần cuối
    Hệ thống tạo đơn hàng với các trường: khách (từ bước 5), dòng sản phẩm (mỗi giao dịch → 1 dòng), địa chỉ giao (từ dữ liệu Etsy), trạng thái thanh toán (đã trả / chờ), trạng thái = "Mới nhận" (mặc định). Lưu thêm mốc Etsy sửa đơn lần cuối để biết khi nào khách chỉnh sửa trên Etsy.
    Chi tiết: dòng sản phẩm lưu {sản phẩm, số lượng, đơn giá = giá Etsy / qty, nội dung cá nhân hoá / khắc chữ}. Mốc thời gian Etsy sửa lần cuối — nếu Etsy có cập nhật mà Odoo chưa lấy → lượt chạy lịch sau sẽ lấy lại và cập nhật đơn.
  7. 7
    Hệ thống Odoo
    Định tuyến: sản phẩm có SKU Gearment → Luồng 3B dropship; không có → Luồng 3A MTO
    Hệ thống kiểm tra từng dòng sản phẩm trong đơn: nếu trường "SKU Gearment" có giá trị → gắn cờ "Dropship", đơn hàng sẽ theo Luồng 3B (gửi sang Gearment). Nếu trống → gắn cờ "MTO", đơn sẽ theo Luồng 3A (in nội bộ). Một đơn có thể có cả dòng MTO lẫn Dropship → hệ thống tách thành 2 hướng giao.
  8. 8
    Hệ thống Odoo · fallback
    Khi API hỏng 3 lần liền: chuyển sang email parser (dự phòng)
    Nếu Cron API gặp lỗi 3 lần liên tiếp (ví dụ 401 token hết, 429 rate limit, 5xx Etsy down) → hệ thống tự chuyển sang chế độ "Email Fallback": Cron đọc email 10 phút một lần thay vì API. BA được alert để authorize Etsy lại hoặc kiểm tra kết nối. Sau khi fix → bấm "Test Connection" để quay lại API.
    Lý do hai đường: Email chậm hơn (có thể trễ vài phút so với Etsy) và định dạng email có thể lạ → cần parser robust. Nhưng nó được để dưới dạng fallback để shop không mất đơn khi API tạm thời down.

Màn hình Odoo trong luồng này

4 màn hình mô phỏng. Cuộn xuống để xem chi tiết: Dashboard Vận hành với KPI và bảng đơn mới, form đơn hàng tab Etsy, Nhật ký Etsy, và Nhật ký email Etsy (dự phòng).
Màn hình 1 · Operations Dashboard — KPI và danh sách đơn mới 24 giờ
Vận hànhOperations › Dashboard ba.lead@hatafa
Vận hànhOperations Dashboard 2026-06-03
Đơn hôm nay
23
↑ 12% so với hôm qua
API success (5 phút trước)
14 đơn
200 — kết nối tốt
Email fallback
OFF
API hoạt động bình thường
Thời gianOrder #Etsy receipt_idKhách hàngTổng tiềnPipeline stateĐến lúc
14:03SO-2026-04453094521…Jane Smith$45.50Mới nhận3 giờ
13:42SO-2026-04443094502…John Doe$28.00Mới nhận3 giờ 20 phút
12:15SO-2026-04433094488…Alice Johnson$62.99Đã xác nhận4 giờ 48 phút
11:30SO-2026-04423094471…Bob Wilson$33.75Đang sản xuất5 giờ 33 phút
10:05SO-2026-04413094452…Emma Brown$51.20Sẵn sàng giao6 giờ 58 phút
09:47SO-2026-04403094431…Michael Chen$19.99Đã giao7 giờ 16 phút
Operations Dashboard hiển thị toàn bộ dòng sản phẩm mới (không phải toàn bộ đơn). KPI trên cùng cho thấy tình hình API + fallback. Cron pull 14 đơn (23 dòng sản phẩm) trong 4.3 giây lúc 14:03.
Mockup gốc: view list tuỳ biến (mhc.operations_dashboard_list_view @ multichannel_hub_core/views/operations_dashboard_views.xml) — dựng trên sale.order.line với 34 cột lấy từ Excel "Esty main 2 - 15h VN.xlsx" (P1-01b). KPI ở trên cùng là phần thêm bên ngoài standard list view.
Màn hình 2 · Sale Order form — Tab Etsy hiển thị receipt_id, payment_status, shipping_address
Bán hàngĐơn bán › SO-2026-0445 ba.lead@hatafa
Đơn bánSO-2026-0445
Mới nhậnXác nhậnSản xuấtĐã giao
SO-2026-0445 · Jane Smith
Order InfoEtsyOrder LinesOther Info
Etsy receipt_id
3094521840162
Buyer alias
jane.smith.etsy
Etsy last modified
2026-06-03 14:02:51 UTC
Payment status
paid
Shipping status
not_shipped
Shop
JaHandmadeArt (shop_id 60752333)
Shipping address (từ Etsy)
Tên
Jane Smith
Địa chỉ
123 Maple Street, Springfield, IL 62701, USA
Email
jane.smith@example.com
Phone
+1 (217) 555-0101
Tab Etsy hiển thị toàn bộ metadata từ Etsy API: receipt_id (mã gọi tiền), payment_status ("paid" = đã thanh toán), shipping_status, etsy_last_modified (timestamp — để track update). Nếu khách sửa địa chỉ trên Etsy, BA Lead bấm "Yêu cầu đổi địa chỉ" — xem Luồng 2 chi tiết.
Mockup gốc: form đơn hàng chuẩn của Odoo (sale.view_order_form @ addons/sale/views/sale_order_views.xml); chỗ khác biệt: tab "Etsy" mở rộng + các trường receipt_id / payment_status / shipping_address / etsy_last_modified trong etsy_integration/views/sale_order_views.xml.
Màn hình 3 · Etsy API Log — lịch sử gọi API mỗi 5 phút
EtsyAPI › Logs ba.lead@hatafa
EtsyAPI Logs
Thời gianShopHTTPEndpointKết quảGhi chú
2026-06-03 14:03JaHandmadeArt200/shops/60752333/orderssuccess14 đơn, 4.3s
2026-06-03 13:58JaHandmadeArt200/shops/60752333/orderssuccess0 đơn (no changes), 0.8s
2026-06-03 13:53JaHandmadeArt200/shops/60752333/orderssuccess2 đơn, 1.2s
2026-06-03 13:48JaHandmadeArt429/shops/60752333/ordersrate_limitEtsy rate limit exceeded (retry 60s)
2026-06-03 13:43JaHandmadeArt200/shops/60752333/orderssuccess5 đơn, 2.1s
2026-06-03 13:38JaHandmadeArt200/shops/60752333/orderssuccess1 đơn, 0.9s
2026-06-03 13:33JaHandmadeArt500/shops/60752333/ordersserver_errorEtsy server error — API tạm down
2026-06-03 13:28JaHandmadeArt200/shops/60752333/orderssuccess3 đơn, 1.5s
Etsy API Log ghi mỗi cuộc gọi cron: thời điểm, HTTP status, số đơn được kéo, thời gian response. 200 = thành công; 429 = rate limit (hệ thống tự retry); 500 = Etsy down (trigger Email fallback nếu xảy ra 3 lần liền). Cron pull 14 đơn (23 dòng) trong 4.3 giây lúc 14:03.
Mockup gốc: view list + form tuỳ biến (etsy_integration.view_etsy_api_log_tree / view_etsy_api_log_search @ etsy_integration/views/etsy_api_log_views.xml) — không có view chuẩn Odoo cho nhật ký API; đây là mô hình tuỳ biến cho Etsy.
Màn hình 4 · Etsy Email Log (fallback) — khi API hỏng 3 lần liền
EtsyEmail › Logs ba.lead@hatafa
EtsyEmail Logs
Email parser ở chế độ DỰ PHÒNG — chỉ chạy khi API hỏng 3 lần liền. Hôm nay không có email nào được parse vì API hoạt động bình thường.
5 dòng · 0 lỗi
Email dateSubjectParsedSale.order tạoNote
2026-05-15 11:23New order from JaHandmadeArtyesSO-2026-0382parsed via email, 2 items
2026-05-14 09:47New order from JaHandmadeArtfailedký tự lạ trong tên khách (emoji) — đợi parser update
2026-05-13 14:15New order from JaHandmadeArtyesSO-2026-0378parsed via email, 1 item
2026-05-12 16:33New order from JaHandmadeArtduplicateđơn đã tạo trước đó qua API, email this là resend từ Etsy
2026-05-11 10:05New order from JaHandmadeArtyesSO-2026-0375parsed via email, 3 items, cá nhân hoá đầy đủ
Email Log chỉ hoạt động khi API hỏng liên tục. Khi API quay lại bình thường, email log vẫn chạy trong nền để fallback nếu cần. Các trạng thái: yes = parse thành công, failed = không bóc được (BA cần xem thủ công), duplicate = đơn đã có (từ API), pending = chờ xử lý. Khi API tạm xuống, BA được alert để bấm "Test Connection" authorize lại.
Mockup gốc: view tuỳ biến trong etsy_integration/views/etsy_email_log_views.xml — không có view chuẩn Odoo; mô hình email-fallback chuyên biệt cho Etsy (kích hoạt khi API hỏng 3 lần liền).

CTiêu chí thành công

DLiên kết với các luồng khác

ELưu ý và câu hỏi mở

Hai con đường vào hệ thống: JaHandmadeArt đã chuyển sang API (chính thức 2026-05-12); 18 shop còn lại vẫn dùng email parser. Lộ trình P1-13 sẽ cutover shop thứ hai vào API vào tuần W7. Email parser vẫn chạy như fallback — khi API hỏng 3 lần liền, hệ thống tự chuyển sang email 10 phút một lần cho đến khi API fix.

Etsy shop_id là số thực, không phải Odoo PK: JaHandmadeArt có etsy_api_shop_id = 60752333 (Etsy gán). Trước đó dùng Odoo ID (Sandbox test) nhưng đã deprecated. Tất cả URL /shops/{shop_id}/* phải dùng etsy_api_shop_id, không dùng Odoo record ID.

Etsy app scope approved cho 4 scopes: transactions_r/w (đọc-ghi đơn), listings_r/w (đọc-ghi sản phẩm), shops_r (đọc info shop), email_r (đọc email báo đơn). Scope conversations_r (buyer messaging) chưa approved — cần re-submit với Etsy khi feature buyer-msg phát triển.