Tính phí ship tự động tại checkout là kỹ thuật quyết định cả conversion lẫn UX shop online. Khách nhập địa chỉ — 800 ms sau hiện phí chính xác là chốt đơn, lag trên 3 giây hoặc sai 20-30% là bỏ giỏ ngay.
Bài này build pipeline end-to-end gồm 6 bước: match zone, tính weight, cache Redis, call API multi-đơn vị cung cấp parallel, áp business rule, fallback chain 4 layer.
Kiến trúc pipeline 6 bước cho phí ship realtime
Mỗi lần khách điền hoặc đổi địa chỉ checkout, WooCommerce trigger AJAX ?wc-ajax=update_order_review để re-calculate phí. Pipeline 6 bước tuần tự, mỗi bước có timeout riêng để không lag toàn cục.
Total target dưới 800 ms ở percentile 90. Vượt 800 ms = khách nhìn loading spinner quá lâu, tỷ lệ bỏ giỏ cải thiện theo benchmark UX checkout 2025.
6 bước pipeline với timeout từng bước
- Match shipping zone (dưới 5 ms): match province ID với zone đã configured trong WooCommerce settings.
- Tính weight và dimension (dưới 5 ms): sum weight line items, calc dimensional weight cho hàng cồng kềnh.
- Cache check (5-20 ms): query Redis hoặc transient với key
shipping_{đơn vị cung cấp}_{origin}_{dest}_{weight_step}. - Call shipping API (200-500 ms): nếu cache miss, call GHN/GHTK/VTPost với origin, destination, weight. Parallel call multi-đơn vị cung cấp để giảm latency.
- Apply business rule (dưới 10 ms): free ship threshold, coupon, phụ phí miền núi, VAT 8%.
- Display và cache update (dưới 5 ms): trả phí cuối render checkout, update cache cho request tiếp theo. Fallback flat rate khi API down.
Architecture diagram của pipeline hoàn chỉnh
# Pipeline architecture
[User checkout]
│
▼
[Step 1: Match zone] ──> Province match → zone 1/2/3/4
│ <5ms
▼
[Step 2: Weight calc] ──> Sum line items weight + dim
│ <5ms
▼
[Step 3: Cache check] ──> Redis: shipping_ghn_HN_HCM_500
│ HIT (70%) ──> Skip Step 4
│ MISS (30%) ──> Step 4
▼
[Step 4: API call] ──> GHN API (parallel với GHTK + VTPost)
│ 200-500ms Use fastest response
▼
[Step 5: Business] ──> Apply free ship, coupon, phụ phí, VAT
│ <10ms
▼
[Step 6: Display] ──> Render checkout với phí cuối
Update cache cho request tiếp theo
Total target: <800ms percentile 90
Công thức tính phí của đơn vị cung cấp VN
Hiểu công thức đơn vị cung cấp giúp validate API response và estimate offline khi API down. Ba yếu tố tổng hợp tạo nên phí cuối cùng — biết rõ tránh charge sai cho khách.
3 yếu tố cốt lõi quyết định phí ship
- Distance: phân tier theo cặp province nguồn-đích. Vd GHN chia 4 khu vực: nội tỉnh, khu vực 1, khu vực 2, khu vực 3-4.
- Phí khởi điểm 22-45 nghìn cho 500 g đầu.
- Weight thực: tăng theo step 500 g. Vd GHN +5 nghìn mỗi 500 g sau 500 g đầu tiên.
- Cap 30 kg/đơn — trên cap phải book riêng dịch vụ hàng nặng.
- Weight quy đổi (volumetric): Dài × Rộng × Cao (cm) chia 6000 = kg quy đổi. Đơn vị cung cấp charge max(weight thực, quy đổi).
- Quan trọng cho hàng nhẹ cồng kềnh.
Example volumetric weight gây mất 30 triệu/năm
# Example: áo phồng 200g đóng hộp 30×30×20cm
Weight thực = 0.2 kg (200g)
Weight quy đổi = (30 × 30 × 20) / 6000 = 18000/6000 = 3 kg
Đơn vị cung cấp charge = max(0.2, 3) = 3 kg
# Phí GHN nội tỉnh:
500g đầu = 22.000đ
+5.000đ mỗi 500g sau:
3kg = 22 + 5 × 5 = 47.000đ
# Nếu shop bỏ qua volumetric:
Estimate = 22.000đ (theo 200g)
Actual charge from GHN = 47.000đ
Loss per order = 25.000đ
# Shop bán 100 đơn/tháng = mất 2,5 triệu/tháng
# 1 năm = 30 triệu loss nếu skip volumetric calc
Cache chiến lược đảm bảo dưới 800 ms
Call API mỗi request tốn nhiều mặt: latency 200-500 ms, rate limit (GHN free 60 req/phút), API flaky đôi khi timeout. Cache đúng giúp serve 70%+ request từ memory với latency dưới 20 ms.
Cache key design quan trọng nhất — sai design dẫn tới hit rate dưới 30%, không khác gì không cache. Round weight về step 100 g là kỹ thuật then chốt.
Cache key design tối đa hit rate
# Cache key pattern (max hit rate)
shipping_{đơn vị cung cấp}_{origin_district_id}_{dest_district_id}_{weight_step}
# Quan trọng: weight_step round về 100g để max hit rate
# 100 user mua 1.2-1.3kg (random) về cùng quận
# Round 100g → cache 1 entry serve 100 user thay vì 100 entry
Ví dụ:
shipping_ghn_1542_1561_1300 # weight 1234g round → 1300
# TTL config:
- Phí ship: 30 phút (giá đơn vị cung cấp stable trong ngày)
- District list: 24 giờ (hierarchy ít thay đổi)
- Đơn vị cung cấp service list: 7 ngày
# Storage:
- Default: WP transient (DB-based)
- Better: Redis object cache (xem /woo-cache-redis/)
- Best: Redis cluster cho shop >500 đơn/ngày
# Hit rate target: 70%+ sau 1 tuần warm cache
# <50% hit rate = cache key quá specific (không round) hoặc TTL ngắn
3 sai lầm cache design phổ biến
Cache design sai làm hit rate dưới 30%, không khác gì không có cache. Tránh 3 pattern sai sau.
- Cache key chứa weight gốc không round: 1234g và 1235g = 2 entry khác nhau, hit rate cực thấp.
- TTL quá ngắn dưới 5 phút: cache invalidate trước khi request thứ 2 đến, lúc nào cũng miss.
- Cache key chứa user ID: mỗi user 1 entry riêng, không share giữa khách hàng — vô nghĩa.
Business rule layer — free ship, coupon, phụ phí
Sau khi API trả phí gốc, layer business rule áp logic shop riêng. 4 rule phổ biến nhất chiếm 90% case business của shop VN.
4 rule business thường gặp ở shop VN
- Free shipping threshold: Zone 1 (nội thành) 500.000đ, Zone 2 (đô thị lớn) 700.000đ, Zone 3 (đồng bằng) 1.000.000đ. Push AOV cải thiện theo A/B test.
- Coupon ship giảm phần trăm: giảm phí ship qua filter
woocommerce_package_rates, multiply rate cost với 0,5. - Phụ phí miền núi/đảo: cộng thêm 20-50 nghìn cho district có “huyện đảo”, “biên giới”, “vùng cao” — list cứng district ID hoặc detect text trong địa chỉ.
- VAT 8% cho phí ship: áp theo Luật thuế dịch vụ vận tải hiện hành. Config WooCommerce → Tax → “Shipping” tax 8% để tự tính.
Thứ tự áp business rule quan trọng
Áp rule sai thứ tự dẫn tới phí cuối lệch so với mong đợi của shop. 3 nguyên tắc cố định.
- Phụ phí miền núi áp trước threshold free ship: nếu áp ngược, đơn 600.000đ ship Hà Giang được free ship vô lý, shop ăn lỗ.
- Coupon áp sau phụ phí, trước VAT: giảm trên phí gốc + phụ phí, sau đó mới tính VAT trên số đã giảm.
- VAT là bước cuối cùng: luôn áp trên final amount sau khi mọi giảm trừ đã xong, đúng theo quy định kế toán.
Fallback chain khi API down
API không 100% thời gian hoạt động — GHN downtime ~30 phút/tháng, GHTK ~1 giờ, VTPost ~2 giờ. Không có fallback = downtime = mất toàn bộ doanh thu giờ đó.
4 layer fallback chain đảm bảo khách luôn checkout được, kể cả khi mọi đơn vị cung cấp cùng down. Tham khảo bài tích hợp GHTK để hiểu sâu hơn về đơn vị cung cấp backup.
4 layer fallback theo thứ tự ưu tiên
# Fallback chain (high to low priority)
Layer 1: CACHE (TTL 30 phút)
- API timeout 1.5s → instant fallback cache cũ
- 95% case downtime: Layer 1 đủ
- User vẫn checkout với giá hôm qua
Layer 2: STALE CACHE (TTL extend 24h)
- Detect API down >5 phút → mở rộng TTL stale 24h
- Show admin warning "API down, dùng cache 24h"
- Auto-retry mỗi 5 phút để switch về Layer 1
Layer 3: FLAT RATE FALLBACK
- Cache và API đều fail (downtime >24h)
- Bảng phí cứng setup sẵn:
Nội tỉnh: 25.000đ
Liên tỉnh: 40.000đ
Miền núi: 60.000đ
Đảo: 100.000đ
- Khách vẫn checkout, shop ăn lỗ chút phí ship 1-2 ngày
Layer 4: DISABLE METHOD
- Cả 3 layer trên fail
- Disable shipping method
- Show "Liên hệ shop báo phí ship" + Zalo/Hotline
- Tránh charge 0đ (lost revenue) hoặc rate sai
# Implementation: filter woocommerce_package_rates
# Plugin "WP Shipping Fallback" handle chain logic
Tối ưu performance pipeline cho shop trên 500 đơn/ngày
5 kỹ thuật advanced đẩy hit rate cache lên 80%+ và giảm latency xuống 400 ms. Critical cho shop traffic cao khi mỗi 100 ms latency impact conversion 0,5-1%.
5 kỹ thuật optimize pipeline advanced
- Pre-fetch khi user vào trang cart: predict zone phổ biến của shop, pre-fetch ngầm trong background. Khi user chuyển sang checkout, phí đã sẵn trong cache.
- Debounce input 500 ms: trigger API call sau khi user dừng gõ 500 ms — giảm 5-10 call/khách xuống còn 1-2 call.
- Parallel API call multi-đơn vị cung cấp: 3 đơn vị cung cấp call song song qua
wp_remote_postasync hoặc Guzzle promises. Tổng latency giảm từ 1500 ms (sequential) xuống 500 ms (parallel). - Server-side cache Redis: object cache thay transient DB-based. Hit rate tăng đáng kể, lookup latency từ 20 ms xuống 2 ms.
- Edge cache Cloudflare Workers: cache phí API call qua edge 5 phút. Request từ client đi qua Cloudflare edge gần nhất, return cache không cần đến origin.
Monitor và alert pipeline performance
Build pipeline xong cần monitor liên tục để bắt regression sớm. 3 metric phải track hàng ngày.
- p90 latency tổng pipeline: alert khi vượt 1000 ms trong 5 phút liên tiếp — dấu hiệu API đơn vị cung cấp hoặc cache có vấn đề.
- Cache hit rate: alert khi dưới 50% trong 1 giờ — cache key bị break hoặc TTL config sai.
- API error rate per đơn vị cung cấp: alert khi vượt 5% trong 10 phút — đơn vị cung cấp có thể đang downtime cần switch fallback.
Implementation example — code call parallel 3 đơn vị cung cấp
Phần này là code mẫu hoàn chỉnh cho dev có kinh nghiệm. Combine WordPress HTTP API với async pattern qua requests-multiple hoặc Guzzle promises để call 3 đơn vị cung cấp đồng thời.
Code mẫu parallel call 3 đơn vị cung cấp và return phí thấp nhất
// Parallel call 3 đơn vị cung cấp và lấy phí thấp nhất
function get_cheapest_shipping_parallel($origin, $dest, $weight) {
$cache_key = "shipping_lowest_{$origin}_{$dest}_" . round($weight, -2);
$cached = get_transient($cache_key);
if ($cached !== false) return $cached;
$vendors = [
'ghn' => 'https://api.ghn.vn/v2/shipping-order/fee',
'ghtk' => 'https://services.giaohangtietkiem.vn/services/shipment/fee',
'vtpost' => 'https://partner.viettelpost.vn/v2/order/getPrice',
];
// Call song song qua WP HTTP API multiple
$requests = [];
foreach ($vendors as $đơn vị cung cấp => $url) {
$requests[$đơn vị cung cấp] = [
'url' => $url,
'type' => 'POST',
'data' => json_encode([
'from_district' => $origin,
'to_district' => $dest,
'weight' => $weight,
]),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 2, // hard timeout 2s
];
}
$responses = Requests::request_multiple($requests);
$lowest = PHP_INT_MAX;
$winner = null;
foreach ($responses as $đơn vị cung cấp => $resp) {
if ($resp instanceof Requests_Exception) continue;
$body = json_decode($resp->body, true);
$fee = $body['data']['total'] ?? PHP_INT_MAX;
if ($fee < $lowest) {
$lowest = $fee;
$winner = $đơn vị cung cấp;
}
}
$result = ['fee' => $lowest, 'đơn vị cung cấp' => $winner];
set_transient($cache_key, $result, 30 * MINUTE_IN_SECONDS);
return $result;
}
Benchmark latency thực tế của 3 đơn vị cung cấp VN
Latency là yếu tố quyết định UX checkout.
Đo benchmark thực tế giúp shop biết đơn vị cung cấp nào fast nhất để ưu tiên call trước, đơn vị cung cấp nào slow phải đẩy về fallback.
Bảng so sánh latency p50 và p95 của 3 đơn vị cung cấp
| Đơn vị cung cấp | p50 latency | p95 latency | Timeout rate |
|---|---|---|---|
| GHN | 180 ms | 420 ms | 0,5% |
| GHTK | 220 ms | 520 ms | 1,2% |
| Viettel Post | 380 ms | 1100 ms | 3,8% |
3 insight để optimize pipeline
- GHN nhanh nhất và ổn định nhất: ưu tiên call GHN trước, kết quả cache đầu tiên dùng làm baseline.
- Viettel Post chậm gấp 2-3 lần: đặt vào fallback chain layer cuối, không gọi parallel với 2 đơn vị cung cấp kia để tránh kéo latency tổng lên.
- Timeout rate Viettel 3,8% là cao: phải có flat rate fallback chuẩn bị sẵn cho vùng xa nơi Viettel là đơn vị cung cấp duy nhất.
Câu hỏi thường gặp về pipeline tính phí ship
Cache phí ship 30 phút có sai khi đơn vị cung cấp đổi giá không?
Đa số đơn vị cung cấp đổi giá đầu tháng và announce 7 ngày trước. Cache 30 phút không sai trong period bình thường.
Đầu tháng cần invalidate manual qua admin button “Clear shipping cache”, hoặc setup cron daily check vào 00:01 ngày 1 hàng tháng để tự clear cache.
API GHN 429 rate limit traffic cao xử lý sao?
Free tier giới hạn 60 request/phút. Shop trên 100 đơn/ngày dễ exceed limit vào giờ peak (12h trưa, 20h tối).
3 giải pháp combine: tăng cache hit rate lên 80%, đăng ký gói paid (200-500 request/phút), batch API call cho admin (50 đơn/lần thay vì từng đơn). Combine cover shop tới 1000 đơn/ngày.
Tính volumetric weight có cần thiết không?
Có, cho shop bán quần áo, gối, đồ chơi nhồi bông, giấy — hàng nhẹ cồng kềnh. Skip volumetric dẫn tới đơn vị cung cấp charge cao hơn dự tính, shop ăn lỗ ngầm.
Plugin GHN/GHTK/VTPost official có sẵn config volumetric divisor (default 6000). Set dimension đúng cho từng product trong meta để tránh API trả phí sai.
Free shipping threshold tối ưu bao nhiêu?
Threshold = AOV nhân 1,3-1,5. Vd AOV 500.000đ thì threshold 700-750 nghìn là mức lý tưởng.
Đặt thấp hơn AOV: free ship mọi đơn, mất margin. Cao hơn 1,5 lần AOV: ít khách reach threshold, không push được.
A/B test 3 mức (1,2x, 1,4x, 1,6x AOV) trong 30 ngày để tìm con số tối ưu shop cụ thể.
Khi nào dùng flat rate thay API call?
Shop nhỏ dưới 30 đơn/ngày và budget hosting hạn chế: flat rate đủ. Đầu tư API + cache không bù được công maintain.
Shop scale trên 100 đơn/ngày: invest API + cache đáng (mỗi sai 5.000đ × 100 đơn × 30 ngày = 15 triệu/tháng). Shop trên 1000 đơn/ngày: bắt buộc API + Redis + Cloudflare để giữ latency dưới 800 ms.
Bước tiếp theo sau khi build pipeline
Pipeline tính phí là core engine — sau khi build xong, mở rộng sang tracking và checkout UX để hoàn thiện flow sau bán hàng. Tham khảo các bài liên quan trong cụm WooCommerce vận chuyển:
- Cấu hình shipping zone WooCommerce — foundation phải có trước khi build pipeline tính phí.
- Tích hợp Viettel Post vào WooCommerce — đơn vị cung cấp thứ 3 cho coverage 100% xã VN.
- Tracking đơn hàng WooCommerce — sau khi tính phí xong, cần tracking realtime giảm support ticket.
- Checkout 1 trang WooCommerce — UI tối ưu giảm bỏ giỏ, kết hợp với pipeline phí ship nhanh.
- Dịch vụ thiết kế website WooCommerce — gói thi công có sẵn pipeline shipping turnkey.
Cần đội Web22 build pipeline tính phí ship full stack với match zone, multi-đơn vị cung cấp parallel, cache Redis và fallback chain 4 layer? Thi công WooCommerce theo yêu cầu cho shop Việt — báo giá theo phạm vi, có sẵn pipeline shipping turnkey trong gói advanced.


