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)
| Var | Mô tả | Ví dụ |
|---|---|---|
customer_email | Email khách hàng | khach@gmail.com |
customer_orders | Số đơn hàng đã mua | 3 |
customer_revenue | Tổng doanh thu từ khách (cents) | 15000000 |
customer_segment | Tags/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:
| Var | Giá trị |
|---|---|
member_status | "active" |
member_tier_slug | "vip" |
member_tier_level | 2 |
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
| Op | Mô tả | Ví dụ |
|---|---|---|
eq | Bằng | member_tier_level eq 2 |
neq | Khác | member_status neq "expired" |
gt, gte | Lớn hơn / lớn hơn hoặc bằng | customer_orders gte 1 |
lt, lte | Nhỏ hơn / nhỏ hơn hoặc bằng | order_total lt 1000000 |
in | Thuộc danh sách | member_tier_slug in "premium,vip" |
contains | Mảng chứa giá trị | customer_segment contains "early" |
Built-in fields
| Field | Mô tả |
|---|---|
now | Thời gian hiện tại (dùng cho early bird, flash sale) |
line_qty | Tổng số lượng trong giỏ |
distinct_products | Số sản phẩm khác nhau (dùng cho bundle) |
order_total | Tổ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á
| Type | Value | Mô tả |
|---|---|---|
discount_pct | 5000 | Giảm 50% (value/100 = %) |
discount_fixed | 5000000 | Giảm 50.000₫ |
surcharge_pct | 1000 | Phụ thu 10% |
tiered | tiers[] | 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ả
| Tier | Giá gốc | Giá sau giảm | |
|---|---|---|---|
| người mới | Free / không có | 299.000₫ | 299.000₫ |
| premium member | Premium (level 1) | 299.000₫ | 149.500₫ |
| VIP member | VIP (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
tieredeffect kết hợpline_qtycondition.
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ế
- 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.
- Graceful degradation — Enricher timeout 3s, lỗi bị bỏ qua. API chết → khách vẫn mua được với giá gốc.
- Real-time preview — Pricing preview gọi ngay khi nhập email, khách thấy giá trước khi bấm mua.
- Đồ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