Hầu hết những người mở cửa hàng dropshipping đều đang săn tìm những lối tắt. Họ lướt qua các diễn đàn để tìm kiếm những sản phẩm chiến thắng, thuê các trợ lý ảo giá rẻ, và hy vọng thuật toán sẽ mang lại sự giàu có chỉ sau một đêm. Điều đó chưa bao giờ thu hút tôi. Tôi coi dropshipping như một bài toán kỹ thuật. Tôi không theo đuổi tiền nhanh. Tôi muốn giải quyết vấn đề đồng bộ hóa kho hàng, xây dựng các thuật toán định giá có khả năng phản ứng với những thay đổi thực tế của thị trường, và vật lộn với các API của nhà cung cấp mà không làm mất đi sự tỉnh táo của mình. Cửa hàng trở thành một tác dụng phụ của hệ thống mà tôi đã xây dựng bằng Node.js và PostgreSQL.

Hãy coi cửa hàng như một dịch vụ backend

Khoảnh khắc bạn ngừng coi dropshipping là một công việc kinh doanh marketing và bắt đầu coi nó như một thách thức về hệ thống phân tán, các vấn đề sẽ trở nên thú vị. Làm thế nào để giữ cho cửa hàng luôn chính xác khi có ba nhà cung cấp khác nhau kiểm soát kho hàng của bạn? Làm thế nào để định giá cạnh tranh khi chính những nhà cung cấp đó thay đổi chi phí mà không báo trước cho bạn? Làm thế nào để quản lý một danh mục sản phẩm tăng từ năm mươi SKU lên năm nghìn mà không bị chìm nghỉm trong các bảng tính?

Tôi đã xây dựng một pipeline để trả lời những câu hỏi đó. Node.js đảm nhận kiến trúc hướng sự kiện (event-driven architecture) vì tôi cần I/O không chặn (non-blocking I/O) để xử lý đồng thời nhiều kết nối với nhà cung cấp. PostgreSQL đóng vai trò là nguồn dữ liệu gốc (source of truth) nghiêm ngặt. Tôi cực kỳ quan tâm đến thiết kế schema vì một bảng kho hàng cẩu thả sẽ trở thành một cơn ác mộng ngay lần đầu tiên bạn bán quá số lượng một mặt hàng không tồn tại.

Xây dựng Pipeline

Công việc cốt lõi rất đơn giản: lấy dữ liệu sản phẩm từ các API của nhà cung cấp. Trên thực tế, điều đó có nghĩa là nạp các SKU, mô tả, hình ảnh, mức tồn kho và giá cả từ các endpoint vốn chưa bao giờ được thiết kế để giao tiếp với nhau. Tôi đã viết các dịch vụ polling bằng Node.js để truy cập vào các nguồn cấp dữ liệu của nhà cung cấp theo các khoảng thời gian so le. Mọi payload gửi đến đều phải trải qua các lớp xác thực (validation) và ánh xạ (mapping) trước khi chạm tới cơ sở dữ liệu cửa hàng nội bộ của chúng tôi.

Tôi cấu trúc PostgreSQL với các bảng riêng biệt cho sản phẩm, các biến thể (variants), lịch sử giá và nhật ký đồng bộ (sync logs). Khi một nhà cung cấp âm thầm thay đổi tên trường hoặc gửi một giá trị null ở nơi lẽ ra phải là một con số, pipeline sẽ phát hiện ra và ghi lại một bản ghi lỗi thay vì làm hỏng dữ liệu cửa hàng. Tôi có thể nhìn vào một dòng nhật ký và biết chính xác endpoint nào bị lỗi, thời điểm xảy ra và các trường nào bị sai định dạng. Khả năng quan sát (observability) đó đã cứu tôi nhiều lần khi một nhà cung cấp quyết định "nâng cấp" API của họ vào cuối tuần.

Những gì đã hoạt động hiệu quả

Tự động hóa đã tiết kiệm được một lượng thời gian khổng lồ. Thời gian đầu, tôi đã thử cách tiếp cận thủ công: tải xuống các bảng tính của nhà cung cấp, làm sạch chúng bằng tay, định dạng hình ảnh và tải các tệp CSV lên cửa hàng. Điều đó trở nên bất khả thi khi danh mục sản phẩm vượt quá vài chục mặt hàng. Pipeline tự động đã xử lý các danh sách mới, cập nhật giá và điều chỉnh kho hàng mà tôi không cần phải chạm vào bảng tính một lần nào nữa.

Việc mở rộng quy mô mô tả sản phẩm được thực hiện thông qua các mẫu (templates). Viết văn bản độc nhất cho năm trăm mặt hàng gần như giống hệt nhau là điều không thể duy trì lâu dài. Thay vào đó, tôi đã xây dựng một lớp templating để lấy các thuộc tính của nhà cung cấp như chất liệu, kích thước hoặc màu sắc và chèn chúng vào các khối mô tả có cấu trúc. Kết quả đầu ra đủ sạch để chuyển đổi và đủ nhất quán để việc thêm một nghìn SKU mới không cần đến việc viết nội dung thủ công.

Việc giám sát giá cũng vượt quá mong đợi của tôi. Tôi đã xây dựng một lớp giám sát nhẹ nhàng để theo dõi giá của đối thủ cạnh tranh trên một nhóm các sản phẩm chủ chốt. Khi phát hiện sự thay đổi, hệ thống sẽ tự động điều chỉnh biên lợi nhuận của chúng tôi trong các giới hạn (guardrails) mà tôi đã cấu hình. Nếu một nhà cung cấp giảm giá bán buôn, giá niêm yết có thể phản ánh sự thay đổi đó trong vòng vài phút thay vì vài ngày. Sự phản ứng nhanh nhạy đó đã tạo ra sự khác biệt đáng kể đối với các mặt hàng có biên lợi nhuận mỏng.

Những gì đã hỏng và tại sao

Các API của nhà cung cấp thiếu tính nhất quán. Đó không phải là một lời phàn nàn; đó là một sự thật hiển nhiên. Một đối tác cung cấp JSON sạch sẽ với phân trang (pagination) có thể dự đoán được. Một đối tác khác lại trả về XML với các thẻ camelCase vào thứ Hai và snake_case vào thứ Tư. Giới hạn tốc độ (rate limits) thay đổi từ hào phóng đến khắc nghiệt. Thời gian ngừng hoạt động (downtime) được thông báo qua các trang lỗi HTML thay vì các mã trạng thái (status codes) chuẩn xác. Cuối cùng, bạn sẽ phải viết các bộ phân tích (parsers) mang tính phòng thủ và logic thử lại (retry logic) cho các endpoint hoạt động như thể chúng được thiết kế từ năm 2003.

Việc đồng bộ hóa kho hàng gặp phải các tình trạng tranh chấp (race conditions) khiến tôi mất ăn mất ngủ. Hãy tưởng tượng thế này: hai khách hàng cùng đặt mua đơn vị sản phẩm cuối cùng chỉ trong vòng vài giây, hoặc một webhook từ nhà cung cấp báo rằng hàng đã hết ngay đúng khoảnh khắc người mua nhấn thanh toán. Logic "đọc rồi mới cập nhật" (read-then-update) ban đầu của tôi đã thất bại thảm hại. Tôi đã phải viết lại lớp đồng bộ hóa (sync layer) bằng cách sử dụng các giao dịch PostgreSQL nguyên tử (atomic transactions) và khóa bi quan (pessimistic locking) cho các mã SKU có tốc độ luân chuyển cao. Đó là một bài học thực tế đầy đau đớn về tính đồng thời (concurrency) mà không có hướng dẫn nào có thể chuẩn bị cho bạn tốt bằng việc đối mặt với rủi ro mất tiền thật.

Thất bại lớn nhất của tôi là đã bỏ qua việc tự động hóa hỗ trợ khách hàng. Tôi quá ám ảnh với các đường ống dữ liệu (data pipelines) và coi những hệ lụy về mặt con người chỉ là chuyện phụ. Đơn hàng đến trễ. Nhà cung cấp giao sai màu. Khách hàng gửi email nhưng chúng nằm im trong hộp thư đến của tôi hàng giờ liền trong khi tôi mải mê gỡ lỗi (debug) các lỗi timeout của API. Tôi không có hệ thống điều hướng ticket, không có phản hồi tự động, cũng không có quy trình chuyển giao cho chatbot. Cơ sở hạ tầng kỹ thuật thì vững chắc. Nhưng cơ sở hạ tầng về con người thì thiếu sót, và lỗ hổng đó đã gây tổn hại cho doanh nghiệp nhiều hơn bất kỳ một webhook chập chờn nào.

Thử nghiệm hình ảnh như một kỹ sư

Tôi đã thực hiện một thử nghiệm phụ trên hình ảnh sản phẩm. Tôi đã hiển thị các hình ảnh chủ đạo (hero images) khác nhau cho các người dùng khác nhau bằng cách sử dụng định tuyến tham số URL đơn giản gắn liền với việc phân nhóm dựa trên phiên làm việc (session-based bucketing). Một biến thể hiển thị sản phẩm trên nền trắng trơn. Một biến thể khác hiển thị sản phẩm trong bối cảnh đời thường trên một chiếc bàn thực tế. Tôi đã theo dõi tỷ lệ chuyển đổi cho từng nhóm bằng cách sử dụng nhật ký sự kiện (event logging) cơ bản gắn trực tiếp với luồng đặt hàng.

Những thay đổi nhỏ đã cải thiện mức độ tương tác. Các bức ảnh phong cách sống (lifestyle shots) không phải lúc nào cũng thắng, nhưng khi chúng thắng, mức độ tăng trưởng đủ lớn để thay đổi cách tôi ưu tiên các công việc.