Bài viết này hướng dẫn cách kết nối EzyDelivery với SPX Express (SPX Việt Nam) để tạo đơn giao hàng trực tiếp từ trang quản trị, nhận mã vận đơn SPX, và tự động cập nhật trạng thái đơn khi SPX giao hàng.
Sau khi tích hợp xong, luồng làm việc sẽ như sau:
  1. Nhân viên tạo đơn giao hàng trong EzyDelivery với phương thức giao hàng Chuyển phát nhanh và chọn dịch vụ SPX.
  2. EzyDelivery hỏi SPX khung giờ lấy hàng sớm nhất còn trống, gửi đơn sang SPX, nhận về mã vận đơn SPX và in tem.
  3. Trong quá trình giao, SPX gọi lại (webhook) về hệ thống, EzyDelivery cập nhật trạng thái đơn theo thời gian thực.

Chuẩn bị

Trước khi cấu hình, cần có:
Thứ cần cóGhi chú
Thông tin tích hợp API do SPX cấpSau khi ký thoả thuận hợp tác, SPX gửi email "[TH SPX Partner] API integration information" gồm app-id (một dãy số) và app-secret.
Tài khoản người gửi trên SPX (user_id, user_secret)Dùng cho mọi thao tác tạo đơn. Có thể do SPX cấp sẵn, hoặc để EzyDelivery tự tạo bằng số điện thoại (xem phần Tài khoản người gửi).
Đã hoàn thành phần Cài đặt ban đầu cho EzyDeliveryĐặc biệt là quốc gia nhận (Việt Nam) có đủ tỉnh/thành phố, quận/huyện, phường/xã, và kho nhận hàng có địa chỉ, số điện thoại đầy đủ.
Tiền tệ VND đã được kích hoạtSPX chỉ nhận tiền VND. Nếu đơn dùng tiền tệ khác (ví dụ CNY), cần có tỉ giá quy đổi sang VND, nếu không đơn sẽ gửi thất bại.
Trang web (web plugin) truy cập được từ InternetĐể SPX gọi lại cập nhật trạng thái đơn.
SPX có 2 môi trường, mỗi môi trường có bộ app-id, app-secret riêng:
Môi trườngĐịa chỉ API
Thử nghiệm (sandbox)https://test-stable.spx.vn
Thật (production)https://spx.vn

Cấu hình dịch vụ SPX

Vào Thương mại điện tử → Các dịch vụ vận chuyển (/ecommerce/delivery-services), tìm dòng SPX và bấm sửa (hoặc mở thẳng /ecommerce/delivery-services/SPX/edit).
Điền các ô như sau:
ÔGiá trịGhi chú
TênSPXTên hiển thị trong ô chọn dịch vụ khi tạo đơn. Không được trùng tên với dịch vụ khác.
Phiên bảnĐể trốngSPX không dùng ô này.
Đường dẫn dịch vụhttps://spx.vnDùng để tạo đường dẫn tra cứu hành trình đơn cho khách hàng.
Đường dẫn API dịch vụhttps://spx.vnĐịa chỉ API của SPX. Khi chạy thử thì dùng https://test-stable.spx.vn. Không thêm dấu / ở cuối.
Đường dẫn gọi lạihttps://<tên-miền-web-của-bạn>/callback/SPXĐể ghi nhớ địa chỉ đã gửi cho SPX (xem phần Cấu hình webhook).
Khoá máy kháchapp-id do SPX cấpChỉ gồm chữ số. Bắt buộc điền.
Khoá bí mậtapp-secret do SPX cấpDùng để ký mọi yêu cầu gửi sang SPX và để xác thực webhook SPX gọi về. Bắt buộc điền.
Tên đăng nhậpuser_id của tài khoản người gửiMột dãy số. Xem phần Tài khoản người gửi.
Mật khẩuuser_secret của tài khoản người gửi
Dịch vụ giao hàng mặc định1 hoặc để trốngLoại dịch vụ SPX: 1 là giao tiêu chuẩn (standard). Để trống thì hệ thống dùng 1.
Trạng tháiACTIVATEDChỉ dịch vụ đang ACTIVATED mới xuất hiện khi tạo đơn.
Các ô còn lại (logo, ảnh bìa, tiền tệ phí vận chuyển, phí vận chuyển tối thiểu, giá trị hàng hoá mặc định, ...) không bắt buộc cho SPX.
Bấm Lưu. Khi lưu, hệ thống sẽ kiểm tra thử user_id và user_secret với SPX (ký bằng app-id, app-secret vừa nhập):
  • Nếu đúng: lưu thành công.
  • Nếu sai: hiện lỗi ở ô Tên đăng nhập và Mật khẩu. Kiểm tra lại user_id, user_secret, app-id, app-secret, và Đường dẫn API dịch vụ có đúng môi trường hay không (thông tin của môi trường thử nghiệm không dùng được với môi trường thật và ngược lại).
Khi sửa các ô khác, cứ để nguyên ô Mật khẩu và Khoá bí mật đang hiển thị dạng ẩn, hệ thống sẽ giữ giá trị cũ.
Screenshot 2026-10-09 at 10.51.22.png

Tài khoản người gửi (user_id, user_secret)

Có 2 cách để có tài khoản người gửi:
Cách 1: SPX đã cấp sẵn user_id và user_secret. Điền user_id vào ô Tên đăng nhập, user_secret vào ô Mật khẩu, rồi lưu như bình thường.
Cách 2: Để EzyDelivery tự tạo tài khoản bằng số điện thoại.
  1. Điền Khoá máy khách (app-id) và Khoá bí mật (app-secret).
  2. Ở ô Tên đăng nhập, nhập số điện thoại của cửa hàng. Để trống ô Mật khẩu.
  3. Bấm Lưu.
Khi lưu, EzyDelivery gọi SPX tạo tài khoản mới bằng số điện thoại này, rồi tự điền user_id vào ô Tên đăng nhập và user_secret vào ô Mật khẩu. Mở lại trang sửa sẽ thấy ô Tên đăng nhập đã đổi thành một dãy số.
Lưu ý:
  • Nếu số điện thoại đã có tài khoản trên SPX, hệ thống không tạo được tài khoản mới và cũng không tự điền gì. Khi đó cần liên hệ SPX để lấy user_id, user_secret của tài khoản đó rồi làm theo cách 1.
  • Nếu SPX từ chối tạo tài khoản (ví dụ số điện thoại không hợp lệ, hoặc sai app-id, app-secret), hệ thống báo lỗi ở ô Khoá bí mật.

Đặt làm dịch vụ mặc định (tuỳ chọn)

Ở trang danh sách Các dịch vụ vận chuyển, có thể đặt SPX làm dịch vụ mặc định. Dịch vụ mặc định sẽ được chọn sẵn khi tạo đơn giao hàng.

Ánh xạ tiền tố đơn vị hành chính

SPX nhận địa chỉ dưới dạng văn bản, và chỉ nhận những tên tỉnh, quận, phường có trong file địa chỉ chuẩn của SPX. Khi gửi đơn, EzyDelivery ghép tên đơn vị hành chính theo mẫu ánh xạ tiền tố của từng dịch vụ vận chuyển.
Mẫu cho SPX được tạo tự động khi plugin EzyDelivery (admin) khởi động, và hiển thị ở ô Ánh xạ giữa kiểu và tiền tố địa giới hành chính trên trang sửa dịch vụ. Khác với GHTK và Viettel Post, mẫu của SPX dùng tiền tố viết đầy đủ. Nội dung mặc định:
[
  { "type": "CITY", "prefix": "Thành Phố" },
  { "type": "DISTRICT_IN_CITY", "prefix": "Quận" },
  { "type": "DISTRICT_IN_PROVINCE", "prefix": "Huyện" },
  { "type": "TOWN_IN_PROVINCE", "prefix": "Thị Xã" },
  { "type": "WARD", "prefix": "Xã" },
  { "type": "WARD_IN_CITY", "prefix": "Phường" },
  { "type": "TOWN", "prefix": "Thị Trấn" }
]
Mỗi dòng gồm:
  • type: loại đơn vị hành chính, khớp với loại bạn chọn khi tạo tỉnh/thành phố, quận/huyện, phường/xã trên trang quốc gia.
  • prefix: tiền tố được thêm trước tên đơn vị khi gửi sang SPX. Ví dụ phường Bến Nghé có loại WARD_IN_CITY sẽ thành Phường Bến Nghé.
Mẫu không có dòng cho loại PROVINCE, nên tên tỉnh được gửi nguyên văn, không có tiền tố (ví dụ Bắc Ninh). Thành phố trực thuộc trung ương có loại CITY thì có tiền tố (ví dụ Thành Phố Hà Nội).
Thông thường không cần sửa mẫu này. Chỉ sửa khi SPX báo không hỗ trợ địa chỉ, hoặc khi bạn dùng thêm loại đơn vị hành chính khác. Nếu xoá mẫu, lần khởi động sau hệ thống sẽ tạo lại với nội dung mặc định.
Điều quan trọng hơn là dữ liệu đơn vị hành chính phải đúng: tỉnh, quận, phường của kho gửi hàng và người nhận cần được chọn đầy đủ, đúng loại, và sau khi ghép tiền tố thì tên phải khớp với tên trong file địa chỉ chuẩn của SPX. Khi gặp lỗi địa chỉ, hãy xin SPX file địa chỉ chuẩn mới nhất để đối chiếu.

Cấu hình webhook với SPX

Khác với GHTK và Viettel Post, đường dẫn webhook của SPX không tự khai báo trên trang quản lý: bạn gửi đường dẫn cho SPX, SPX gắn đường dẫn đó vào ứng dụng (app-id) của bạn và bật gửi webhook.
Đường dẫn cần gửi cho SPX:
https://<tên-miền-web-của-bạn>/callback/SPX
Ví dụ:
https://shop.example.com/callback/SPX
Nếu dùng cả môi trường thử nghiệm và môi trường thật, cần gửi đường dẫn cho SPX ở từng môi trường.
Một số điểm cần biết về webhook:
  • Đường dẫn trên thuộc trang web (web plugin), không phải trang quản trị. Tên miền phải truy cập được từ Internet và nên dùng https.
  • SPX ký mỗi lần gọi webhook bằng app-secret, gửi kèm trong các header app-id, check-sign, timestamp, random-num. EzyDelivery tự tính lại chữ ký bằng ô Khoá bí mật để xác thực:
    • Thiếu header check-sign sẽ bị từ chối với lỗi check-sign: required.
    • Thiếu một trong các header còn lại, hoặc chữ ký không khớp, sẽ bị từ chối với lỗi check-sign: invalid.
    • Nếu chưa điền Khoá bí mật mà SPX vẫn gọi webhook, hệ thống sẽ báo lỗi no spx secret key.
  • Dữ liệu SPX gửi về phải có tracking_no, nếu thiếu sẽ bị từ chối (tracking_no: required).
  • EzyDelivery chỉ chấp nhận cập nhật cho đơn mà nó đã tạo và có mã vận đơn khớp với tracking_no SPX gửi về. Các đơn tạo trực tiếp trên trang SPX sẽ bị bỏ qua (trả về deliveryOrder: notFound).
  • SPX yêu cầu phản hồi trong vòng 3 giây. Nếu webhook liên tục bị từ chối hoặc quá thời gian, SPX có thể ngừng gửi webhook, khi đó trạng thái đơn sẽ không còn tự cập nhật. Vì vậy cần đảm bảo cấu hình đúng trước khi gửi đơn thật.

Tạo đơn giao hàng qua SPX

Khi khách hàng có yêu cầu giao hàng với phương thức Chuyển phát nhanh:
  1. Vào Các yêu cầu giao hàng (/ezydelivery/shipping-requests) và mở yêu cầu cần giao.
  2. Bấm Tạo vận đơn, kiểm tra Tổng số cân (kg).
  3. Ở ô Dịch vụ vận chuyển, chọn SPX (chỉ hiện khi phương thức giao hàng là chuyển phát nhanh).
  4. Bấm Tạo hoặc Tạo và hoàn thành.
Khi gửi đơn, EzyDelivery tự xử lý các việc sau:
ViệcCách làm
Hình thức nhận hàngLuôn là SPX đến lấy hàng (pickup), không hỗ trợ mang hàng ra bưu cục.
Khung giờ lấy hàngHỏi SPX danh sách khung giờ lấy hàng, chọn khung giờ sớm nhất còn trống. Nếu không còn khung giờ nào, đơn không được gửi.
Địa chỉ lấy hàngNếu đơn có địa chỉ người gửi thì dùng địa chỉ đó. Nếu không, dùng địa chỉ của kho gửi hàng (tỉnh, quận, phường, địa chỉ chi tiết).
Người gửiDùng tên người gửi (hoặc tên cửa hàng) và số điện thoại người gửi (hoặc số điện thoại của kho gửi hàng).
Địa chỉ người nhậnDùng tỉnh, quận, phường đã chọn của người nhận. Nếu người nhận chưa chọn tỉnh, hệ thống tách từ địa chỉ đầy đủ của người nhận. Ghi chú của người nhận được gửi làm hướng dẫn giao hàng.
Mã đơn gửi sang SPXGhép từ mã đơn trong EzyDelivery và thời điểm gửi, nên mỗi lần gửi lại là một mã mới, không bị SPX báo trùng.
Kiện hàngCả đơn được gửi thành một kiện: khối lượng là tổng khối lượng các sản phẩm (đổi sang kg), dài, rộng, cao là kích thước lớn nhất trong các sản phẩm (đổi sang cm), tên hàng là tên các sản phẩm nối với nhau bằng + , số lượng là tổng số lượng sản phẩm.
Giá trị khai báoBằng giá trị hàng hoá của đơn (đã quy đổi sang VND). Nếu giá trị từ 3.000.000 VND trở lên, đơn được đánh dấu là hàng giá trị cao theo quy định của SPX.
Quy đổi tiềnGiá trị hàng và tiền thu hộ được quy đổi sang VND theo tỉ giá hiện có.
Thu hộ (COD) và người trả phíXác định theo bảng bên dưới.
Cách xác định tiền thu hộ và người trả phí vận chuyển:
Đơn đã thanh toán?Người trả phí vận chuyểnSPX thu của người nhận
Đã thanh toánNgười gửiKhông thu gì
Đã thanh toánNgười nhậnChỉ thu phí vận chuyển
Chưa thanh toánNgười gửiChỉ thu tiền hàng (COD)
Chưa thanh toánNgười nhậnThu cả tiền hàng và phí vận chuyển

Giới hạn kiện hàng của SPX

SPX từ chối đơn vượt các giới hạn sau (áp dụng cho Việt Nam):
Giới hạnGiá trị
Khối lượngLớn hơn 0 và không quá 15 kg
Mỗi chiều dài, rộng, caoKhông quá 60 cm
Tiền thu hộKhông quá 20.000.000 VND
Giá trị khai báoDưới 20.000.000 VND
Vì vậy cần khai báo khối lượng cho mọi sản phẩm, và nên khai báo kích thước để SPX tính phí đúng.

Kết quả gửi đơn

  • Thành công: đơn chuyển sang trạng thái Đã gửi yêu cầu, mã vận đơn SPX (tracking_no) được lưu làm mã vận đơn của đơn, và tem được in ngay. Các thông tin SPX trả về (đường dẫn tra cứu, mã phân loại, phí vận chuyển dự kiến, phí cơ bản, phí thu hộ, phí hàng giá trị cao, VAT, ...) được lưu kèm đơn.
  • Thất bại: đơn chuyển sang trạng thái Gửi yêu cầu thất bại, nội dung lỗi SPX trả về (mã lỗi, thông báo, thông tin gỡ lỗi) được lưu vào đơn để xem lại. Sau khi sửa nguyên nhân có thể gửi lại.

Cập nhật trạng thái đơn

Mỗi lần SPX gọi webhook, EzyDelivery cập nhật trạng thái đơn theo status_code, thời điểm cập nhật theo timestamp, lưu số điện thoại tài xế SPX (nếu có), và lưu mã trạng thái, tên trạng thái, ghi chú gốc của SPX kèm đơn để tiện đối chiếu.
Bảng ánh xạ trạng thái SPX sang trạng thái trong EzyDelivery:
Mã SPXÝ nghĩa bên SPXTrạng thái trong EzyDelivery
1001Chờ lấy hàngĐã nhận yêu cầu
2001Đã lấy hàng, đang vận chuyểnĐang giao hàng
2006Đang giao tới người nhậnSẵn sàng giao hàng
3001Kiện hàng bị giữ lạiTạm thời bị treo
4001Giao thành côngĐã giao hàng
5001Lấy hàng thất bạiKhông lấy được hàng
5002Kiện hàng bị hư hỏngĐã có sự cố
5003Kiện hàng bị thất lạcĐã có sự cố
6001Đang trả hàng về người gửiĐang trả hàng
6002Trả hàng thất bạiĐã có sự cố
6003Đã trả hàng về người gửiBị trả lại
7001Đơn bị huỷBị huỷ
Mã trạng thái không có trong bảng sẽ được ghi nhận là không xác định.
Khách hàng có thể tra cứu hành trình đơn qua đường dẫn dạng:
https://spx.vn/track?<mã-vận-đơn>
Phần đầu của đường dẫn lấy từ ô Đường dẫn dịch vụ đã cấu hình.

Xử lý sự cố thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Lưu cấu hình báo sai tên đăng nhập / mật khẩuSai user_id, user_secret, sai app-id, app-secret, hoặc dùng thông tin môi trường thử nghiệm với API thật (và ngược lại)Kiểm tra lại thông tin SPX cấp, kiểm tra Đường dẫn API dịch vụ đúng môi trường và không có / ở cuối.
Lưu cấu hình báo lỗi ở ô Khoá bí mậtSPX từ chối tạo tài khoản người gửi bằng số điện thoại trong ô Tên đăng nhậpKiểm tra số điện thoại, app-id, app-secret. Hoặc xin SPX user_id, user_secret và điền trực tiếp.
Không thấy SPX khi tạo đơnDịch vụ chưa ACTIVATED, hoặc phương thức giao hàng không phải chuyển phát nhanhKích hoạt dịch vụ, kiểm tra lại phương thức giao hàng của yêu cầu.
Gửi đơn thất bại với lỗi deliveryServiceNotSetupThiếu Đường dẫn API dịch vụ, Khoá máy khách, Khoá bí mật, Tên đăng nhập hoặc Mật khẩu, hoặc Khoá máy khách / Tên đăng nhập không phải dãy sốĐiền đủ các ô và lưu lại cấu hình.
Gửi đơn thất bại với lỗi getPickupTimeslotFailedSPX từ chối yêu cầu lấy khung giờ lấy hàng, thường do sai thông tin xác thựcKiểm tra lại app-id, app-secret, user_id, user_secret và Dịch vụ giao hàng mặc định.
Gửi đơn thất bại với lỗi noAvailablePickupTimeslotSPX không còn khung giờ lấy hàng nàoThử gửi lại sau, hoặc liên hệ SPX.
Gửi đơn thất bại với lỗi noCurrencyVNDChưa có tiền tệ VNDKích hoạt tiền tệ VND.
Gửi đơn thất bại do không quy đổi được tiềnThiếu tỉ giá từ tiền tệ của đơn sang VNDThêm tỉ giá trong Thương mại điện tử.
Gửi đơn thất bại, SPX báo địa chỉ không được hỗ trợ (mã 10011 đến 10019)Tên tỉnh, quận, phường của kho hoặc người nhận không khớp file địa chỉ chuẩn của SPX, hoặc khu vực đó SPX chưa phục vụKiểm tra tỉnh, quận, phường của kho và người nhận, kiểm tra mẫu ánh xạ tiền tố, đối chiếu với file địa chỉ chuẩn của SPX.
Gửi đơn thất bại, SPX báo lỗi khung giờ lấy hàng (mã 10080)Khung giờ vừa chọn đã hết chỗGửi lại đơn, hệ thống sẽ lấy khung giờ mới.
Gửi đơn thất bại, SPX báo lỗi khối lượng hoặc kích thước (mã 10001, 10083 đến 10086, hoặc parcel weight can not be null)Sản phẩm chưa khai báo khối lượng, hoặc kiện hàng vượt giới hạnKhai báo khối lượng, kích thước cho sản phẩm, tách đơn nếu quá nặng hoặc quá lớn.
Gửi đơn thất bại, SPX báo lỗi tiền thu hộ (mã 10003)Tiền thu hộ vượt 20.000.000 VNDTách đơn, hoặc thu trước một phần tiền hàng.
Gửi đơn thất bại, SPX báo lỗi app-id (mã 1001, 1005)Sai app-id, app-secret, hoặc ứng dụng chưa được SPX kích hoạtKiểm tra lại thông tin SPX cấp, liên hệ SPX nếu vẫn lỗi.
Trạng thái đơn không tự cập nhậtSPX chưa gắn đường dẫn webhook, sai Khoá bí mật nên chữ ký không khớp, tên miền web không truy cập được từ Internet, hoặc SPX đã ngừng gửi webhook do lỗi liên tụcKiểm tra lại phần Cấu hình webhook, liên hệ SPX để bật lại webhook nếu cần.