Pricing Engine

← Quay lại Cài đặt

Hệ thống định giá động (Pricing Engine)

Sellkit sử dụng rule-based pricing engine — giá được tính động dựa trên điều kiện, không hardcode. Hệ thống gồm 3 lớp: Vars (dữ liệu), Conditions (điều kiện), Effects (hiệu ứng giá).

Kiến trúc

Email nhập vào
  ↓
[1] Enricher — gọi API bên ngoài, lấy dữ liệu membership/subscription
  ↓
[2] Vars — tập hợp tất cả biến: customer data + enricher data
  ↓
[3] Rules — đánh giá conditions → áp dụng effects
  ↓
Giá cuối cùng

Vars — Dữ liệu đầu vào

Vars là tập key-value chứa mọi thông tin cần thiết để tính giá. Có 2 nguồn:

Nguồn 1: Dữ liệu nội bộ (tự động)

VarMô tảVí dụ
customer_emailEmail khách hàngkhach@gmail.com
customer_ordersSố đơn hàng đã mua3
customer_revenueTổng doanh thu từ khách (cents)15000000
customer_segmentTags/nhóm khách hàng["vip", "early"]

Nguồn 2: External Enricher (cấu hình)

Gọi API bên ngoài để lấy thêm dữ liệu. Cấu hình trong tenant.meta.pricing_enrichers:

{
  "pricing_enrichers": [{
    "url": "https://api.example.com/subscriptions/lookup",
    "api_key": "sk_xxx",
    "var_prefix": "member",
    "email_param": "email"
  }]
}

Khi API trả về:

{
  "status": "active",
  "tier": { "slug": "vip", "level": 2, "name": "VIP" },
  "expires_at": "2026-06-26T00:00:00Z"
}

Enricher tự động flatten thành vars:

VarGiá trị
member_status"active"
member_tier_slug"vip"
member_tier_level2
member_tier_name"VIP"
member_expires_at"2026-06-26T00:00:00Z"

Điểm mạnh: Bạn có thể kết nối bất kỳ API nào — CRM, membership platform, loyalty system — chỉ cần API trả JSON và nhận email qua query param.

Conditions — Điều kiện

Mỗi rule có một mảng conditions. Tất cả conditions phải đúng thì rule mới áp dụng.

Operators

OpMô tảVí dụ
eqBằngmember_tier_level eq 2
neqKhácmember_status neq "expired"
gt, gteLớn hơn / lớn hơn hoặc bằngcustomer_orders gte 1
lt, lteNhỏ hơn / nhỏ hơn hoặc bằngorder_total lt 1000000
inThuộc danh sáchmember_tier_slug in "premium,vip"
containsMảng chứa giá trịcustomer_segment contains "early"

Built-in fields

FieldMô tả
nowThời gian hiện tại (dùng cho early bird, flash sale)
line_qtyTổng số lượng trong giỏ
distinct_productsSố sản phẩm khác nhau (dùng cho bundle)
order_totalTổng giá trị đơn hàng (cents)

Bất kỳ field nào không phải built-in sẽ tự động tra cứu trong Vars.

Effects — Hiệu ứng giá

TypeValueMô tả
discount_pct5000Giảm 50% (value/100 = %)
discount_fixed5000000Giảm 50.000₫
surcharge_pct1000Phụ thu 10%
tieredtiers[]Giá theo số lượng (bulk pricing)

Case study: Workshop pricing theo membership

Bài toán: Workshop 299.000₫, giảm giá theo cấp độ thành viên từ hệ thống bên ngoài.

Cấu hình enricher

Kết nối API membership trong Cài đặt → pricing_enrichers:

{
  "url": "https://tony.vibery.app/api/admin/subscriptions/lookup",
  "api_key": "sk_vibery_xxx",
  "var_prefix": "member",
  "email_param": "email"
}

Pricing rules

Rule 1: Premium member giảm 50%

{
  "name": "Premium member -50%",
  "conditions": [
    {"field": "member_status", "op": "eq", "value": "active"},
    {"field": "member_tier_level", "op": "eq", "value": 1}
  ],
  "effect": {"type": "discount_pct", "value": 5000},
  "product_ids": ["workshop-product-id"],
  "priority": 10
}

Rule 2: VIP member miễn phí

{
  "name": "VIP member miễn phí",
  "conditions": [
    {"field": "member_status", "op": "eq", "value": "active"},
    {"field": "member_tier_level", "op": "gte", "value": 2}
  ],
  "effect": {"type": "discount_pct", "value": 10000},
  "product_ids": ["workshop-product-id"],
  "priority": 20
}

Kết quả

EmailTierGiá gốcGiá sau giảm
người mớiFree / không có299.000₫299.000₫
premium memberPremium (level 1)299.000₫149.500₫
VIP memberVIP (level 2)299.000₫Miễn phí

Giá hiển thị real-time trên checkout page khi khách nhập email.

Thiết kế mở rộng

Nhiều enricher cùng lúc

Mỗi enricher có var_prefix khác nhau, không xung đột:

[
  {"url": "https://crm.com/lookup", "var_prefix": "crm", ...},
  {"url": "https://loyalty.com/points", "var_prefix": "loyalty", ...}
]

→ Vars: crm_status, crm_tier, loyalty_points, loyalty_level

Đơn giản vs phức tạp

  • API đơn giản (trả dữ liệu, ta quyết định): API trả tier_level=2 → rule của ta quyết giảm bao nhiêu. Nên dùng cách này.
  • API phức tạp (trả logic tính giá): API trả discount_pct=37 → ta có thể tạo rule match var đó. Nhưng effect hiện tại là giá trị cố định trong rule, chưa hỗ trợ đọc dynamic value từ var.

Bundle pricing

Cho sản phẩm bundle (gói nhiều workshop), có 2 cách:

  • Cách 1: Variant riêng cho mỗi bundle — tạo variant "Gói 3 buổi" với giá riêng, pricing rules giảm theo tier trên variant đó.
  • Cách 2: Tính theo số lượng — dùng tiered effect kết hợp line_qty condition.

Khi logic bundle khác nhau theo tier (VIP = 1 free + 2 paid, Alumni = giảm đều), nên dùng variant riêng cho mỗi bundle + rule per-tier.

Nguyên tắc thiết kế

  1. Dữ liệu tách khỏi logic — Enricher chỉ lấy dữ liệu, rules quyết định giá. Thay đổi logic giá không cần sửa code.
  2. Graceful degradation — Enricher timeout 3s, lỗi bị bỏ qua. API chết → khách vẫn mua được với giá gốc.
  3. Real-time preview — Pricing preview gọi ngay khi nhập email, khách thấy giá trước khi bấm mua.
  4. Đồng nhất — Cùng engine chạy ở cả pricing preview lẫn order creation, giá luôn khớp.

Xem thêm: Tích hợp Checkout | Cài đặt