Skip to main content
Thanh toán theo số lượng chỗ tính phí khách hàng dựa trên số người dùng trong tài khoản của họ. Dodo Payments triển khai hình thức này bằng hệ thống add-on: một sản phẩm subscription cơ bản cộng với một add-on tính phí theo từng chỗ, trong đó quantity biểu thị số lượng chỗ.

Implementation Tutorial

Hướng dẫn từng bước kèm ví dụ mã.

Add-ons Documentation

Tìm hiểu về hệ thống bổ trợ hỗ trợ thanh toán theo chỗ ngồi.

Subscription Management

Quản lý đăng ký theo chỗ ngồi và thay đổi gói.

Webhooks

Theo dõi thay đổi chỗ ngồi bằng webhook đăng ký.

Thanh Toán Theo Số Ghế Là Gì?

Thanh toán theo số lượng seat tính phí khách hàng dựa trên số người dùng truy cập sản phẩm của bạn. Thay vì một khoản phí cố định, giá sẽ tăng theo quy mô nhóm.

Các Trường Hợp Sử Dụng Thông Dụng

Lợi Ích Của Định Giá Theo Số Ghế

Dành cho doanh nghiệp của bạn:
  • Doanh thu tăng khi khách hàng phát triển
  • Khách hàng có thể dự toán ngân sách một cách ổn định
  • Lộ trình nâng cấp rõ ràng từ cá nhân lên nhóm rồi đến doanh nghiệp
  • Giá trị vòng đời cao hơn khi các nhóm mở rộng
Dành cho khách hàng của bạn:
  • Chỉ trả tiền cho số người dùng họ có
  • Dễ hiểu và dự toán chi phí
  • Thêm hoặc xóa người dùng khi cần
  • Mức giá công bằng, phù hợp với quy mô nhóm

Cách hoạt động

Dodo Payments triển khai thanh toán theo số lượng chỗ bằng hệ thống Add-ons. Một subscription tính phí theo số lượng chỗ gồm hai phần: Tổng tiền hàng tháng của khách hàng là:
Ví dụ: 8 seat bổ sung trong Team Plan

Chiến Lược Định Giá

Chọn chiến lược định giá theo số ghế phù hợp với doanh nghiệp của bạn:

Chiến Lược 1: Cơ Bản + Tiện Ích Theo Ghế

Bao gồm một số ghế nhất định trong kế hoạch cơ bản, tính phí cho các ghế bổ sung.
Phù hợp nhất cho: Các sản phẩm mà những nhóm nhỏ có thể hoạt động với gói cơ bản.

Chiến lược 2: Định giá hoàn toàn theo từng chỗ

Tính một mức phí cố định cho mỗi chỗ mà không có phí cơ bản.
Triển khai: Đặt giá gói cơ bản là $0 và chỉ sử dụng seat add-on. Phù hợp nhất cho: Mức giá đơn giản, minh bạch.

Chiến lược 3: Định giá theo cấp dựa trên số chỗ

Các gói cơ bản khác nhau với mức phí theo từng chỗ khác nhau.
Triển khai: Tạo các sản phẩm riêng cho từng cấp với mức giá add-on khác nhau. Phù hợp nhất cho: Khuyến khích nâng cấp lên các cấp cao hơn; bán hàng cho doanh nghiệp.

Chiến lược 4: Gói chỗ

Bán chỗ theo gói thay vì bán từng chỗ riêng lẻ.
Triển khai: Tạo nhiều add-on cho các kích thước gói khác nhau. Phù hợp nhất cho: Đơn giản hóa quyết định mua hàng; khuyến khích cam kết lớn hơn.

Thiết lập thanh toán theo số lượng chỗ

Bước 1: Lập kế hoạch định giá

Trước khi triển khai, hãy xác định cấu trúc định giá của bạn:
1

Define Base Plan

Quyết định những gì được bao gồm trong subscription cơ bản:
  • Giá cơ bản (có thể là $0 đối với mô hình thuần túy tính theo seat)
  • Số seat được bao gồm
  • Các tính năng khả dụng ở cấp này
2

Set Seat Pricing

Xác định chi phí của seat add-on:
  • Giá cho mỗi chỗ bổ sung
  • Mọi chiết khấu theo số lượng (thông qua nhiều add-on)
  • Số lượng chỗ tối đa (nếu có)
3

Consider Billing Frequency

Điều chỉnh giá theo số lượng chỗ phù hợp với chu kỳ thanh toán của bạn:
  • Subscription hàng tháng → khoản phí theo chỗ hàng tháng
  • Subscription hàng năm → khoản phí theo chỗ hàng năm (thường được giảm giá)

Bước 2: Tạo Seat Add-on

Trong dashboard Dodo Payments:
  1. Đi đến Products → Add-Ons
  2. Nhấp vào Create Add-On
  3. Cấu hình add-on:
Sử dụng tên add-on mang tính mô tả và có ý nghĩa trên hóa đơn. “Additional Team Seat” rõ ràng hơn “Seat Add-on” đối với khách hàng khi xem lại hóa đơn của họ.

Bước 3: Tạo Subscription cơ bản

Tạo sản phẩm subscription của bạn:
  1. Đi đến Products → Create Product
  2. Chọn Subscription
  3. Cấu hình giá và thông tin chi tiết
  4. Trong phần Add-Ons, đính kèm seat add-on của bạn

Bước 4: Đính kèm Add-on vào sản phẩm

Liên kết seat add-on với subscription của bạn:
  1. Chỉnh sửa sản phẩm subscription
  2. Cuộn đến phần Add-Ons
  3. Nhấp vào Add Add-Ons
  4. Chọn seat add-on của bạn
  5. Lưu thay đổi
Sản phẩm subscription của bạn hiện hỗ trợ định giá theo số lượng chỗ. Khách hàng có thể mua bất kỳ số lượng chỗ bổ sung nào trong quá trình checkout.

Quản lý chỗ

Thêm chỗ vào Subscription mới

Khi tạo một phiên checkout, hãy chỉ định số lượng chỗ:

Thay đổi số lượng chỗ trong Subscription hiện có

Sử dụng Change Plan API để điều chỉnh số chỗ. Mảng addons đặt tổng số chỗ mới (không phải phần chênh lệch).

Xóa chỗ

Để giảm số lượng chỗ, hãy chỉ định quantity thấp hơn:

Xóa tất cả chỗ bổ sung

Truyền một mảng addons trống để xóa tất cả add-on:

Proration khi thay đổi số chỗ

Khi thay đổi số chỗ được áp dụng giữa chu kỳ, Dodo Payments tính khoản phí ngay lập tức qua ba bước:
Số tiền credit phụ thuộc vào proration mode bạn chọn. Khoản phí luôn là một chu kỳ đầy đủ.
Khoản phí luôn áp dụng cho toàn bộ một cycle. Chỉ khoản credit thay đổi tùy theo mode. Đây là lý do số tiền bị tính hiếm khi bằng “số seat mới × giá × số ngày còn lại”.Với prorated_immediately, khoản credit giảm dần khi cycle tiến triển, nên cùng một thay đổi về seat sẽ tốn nhiều hơn nếu được thực hiện muộn hơn. Với difference_immediately và full_immediately, khoản credit không phụ thuộc vào thời điểm, nên hai mode này có cùng chi phí vào bất kỳ ngày nào trong cycle.

Cách mỗi mode tính credit

Với difference_immediately, khách hàng chỉ trả phần chênh lệch giữa giá gói cũ và giá gói mới. Đây là nguồn gốc của tên gọi này, đồng thời là lý do số tiền không đổi bất kể thay đổi được thực hiện vào thời điểm nào trong cycle. Nếu khoản credit lớn hơn khoản phí của chu kỳ mới, phần chênh lệch được giữ dưới dạng credit ở cấp subscription và tự động áp dụng cho các lần gia hạn trong tương lai.
prorated_immediately, difference_immediately và full_immediately đều đặt lại cycle thanh toán theo ngày thay đổi. Lần gia hạn tiếp theo được neo lại vào ngày áp dụng thay đổi seat. Chỉ do_not_bill giữ nguyên ngày gia hạn ban đầu (số seat mới được tính đủ vào lần gia hạn tiếp theo, không tính phí tại thời điểm thay đổi).
do_not_bill áp dụng thay đổi số chỗ ngay lập tức, không chờ đến lần gia hạn. Số chỗ mới có hiệu lực ngay khi call thành công, nhưng sẽ không bị tính phí cho đến lần gia hạn tiếp theo.Khi thêm seat, khách hàng được sử dụng miễn phí các seat đó trong phần thời gian còn lại của cycle hiện tại. Thêm 5 seat với giá $10 vào ngày 1 của cycle 30 ngày sẽ cho họ 5 seat miễn phí trong 29 ngày, và khoản phí cao hơn sẽ được tính lần đầu vào ngày gia hạn ban đầu.Khi xóa seat, điều ngược lại sẽ xảy ra: các seat bị thu hồi ngay lập tức và không được credit cho phần cycle đã thanh toán.Sử dụng do_not_bill khi đó là điều bạn mong muốn, chẳng hạn như nâng cấp ưu đãi hoặc dùng thử thêm chỗ theo thỏa thuận bán hàng.

Ví dụ thực tế: Thêm 5 chỗ

Một tình huống được chạy qua cả bốn mode để các con số có thể so sánh trực tiếp.
Trong cả ba mode áp dụng ngay, khách hàng nhận được trọn một tháng mới với giá $130 để đổi lại khoản họ thanh toán hôm nay.

Vì sao thời điểm quan trọng với prorated_immediately

Cùng một thay đổi sẽ tốn nhiều hơn nếu được thực hiện càng muộn trong chu kỳ, vì phần thời gian còn lại để credit lại càng ít.
Khách hàng nhận được một tháng mới đầy đủ trong mọi dòng. Chỉ có sự phân bổ giữa phần “đã thanh toán” và phần “thanh toán hôm nay” thay đổi. Để thay đổi seat có cùng chi phí bất kể được thực hiện vào thời điểm nào, hãy sử dụng difference_immediately.

Ví dụ thực tế: “Khoản phí bất ngờ”

Đây là trường hợp thường khiến merchant bất ngờ nhất. Thêm một seat add-on nhỏ vào cuối chu kỳ có thể tạo ra khoản phí lớn hơn nhiều so với giá của add-on.
Thêm một seat $10/tháng có chi phí $55.00 với prorated_immediately. Khách hàng được tính phí cho trọn một tháng mới ở mức $60 và được credit $5 còn lại của tháng cũ, đồng thời ngày gia hạn của họ được đặt lại. Để các lần thêm seat nhỏ giữa cycle chỉ có chi phí bằng giá seat và không phát sinh thêm khoản nào, hãy sử dụng difference_immediately.

Ví dụ thực tế: Xóa chỗ (Downgrade)

Khi gói mới có giá thấp hơn khoản credit, phần dư được giữ dưới dạng subscription credit và tự động áp dụng cho các lần gia hạn trong tương lai của subscription này. Khoản này không được thêm vào Customer Wallet và không phải là credit entitlement.
Khoản credit bao phủ toàn bộ subscription, gồm gói cơ bản và tất cả add-on, không chỉ các seat bị xóa.

Đọc Preview Response

previewChangePlan trả về chính xác các line item sẽ được tính phí. Mỗi line item có một proration_factor:
Diễn giải như sau: credit 50% cho $50 gói cơ bản và 3 × $10 add-on, charge đầy đủ $50 cho gói cơ bản và charge 8 × $10 add-on. Credit = $40, charge = $130, net = $90.
Proration được tính chính xác đến từng giây dựa trên thời điểm thay đổi, không làm tròn đến ngày gần nhất. Các ví dụ trên sử dụng số ngày tròn theo ranh giới ngày để dễ hiểu.
Chọn proration mode cho các thay đổi số chỗ
  • difference_immediately — khách hàng trả phần chênh lệch giá, bất kể thay đổi được thực hiện khi nào. Dễ dự đoán nhất đối với các nhóm thường xuyên điều chỉnh seat và dễ giải thích nhất trong UI của bạn.
  • prorated_immediately — khách hàng chỉ được credit cho phần thời gian còn lại trong cycle hiện tại. Chi phí cao hơn nếu thay đổi được thực hiện càng muộn trong cycle.
  • full_immediately — khách hàng trả phí cho một cycle mới đầy đủ mà không được credit cho thời gian chưa sử dụng.
  • do_not_bill — thay đổi seat có hiệu lực ngay lập tức nhưng hiện tại không tính phí. Seat được thêm sẽ miễn phí cho đến lần gia hạn tiếp theo; seat bị xóa sẽ bị thu hồi mà không được credit. Ngày gia hạn được giữ nguyên và số seat mới được tính đầy đủ kể từ lần gia hạn đó. Đây là mode duy nhất không đặt lại cycle thanh toán.
Các chỗ được cấp qua do_not_bill không được credit trong lần thay đổi plan sau đó vì chúng chưa từng bị tính phí. Nếu bạn thêm 5 chỗ bằng do_not_bill rồi chuyển xuống còn 3 chỗ, khách hàng sẽ bị tính đầy đủ cho 3 chỗ mà không được credit cho 5 chỗ họ đã sử dụng.
Luôn gọi previewChangePlan và hiển thị số tiền trả về trước khi xác nhận. Xem Proration Guide để so sánh chi tiết.

Preview trước khi thay đổi

Luôn preview proration trước khi thực hiện thay đổi:

Theo dõi chỗ bằng Webhooks

Theo dõi các thay đổi số chỗ bằng cách lắng nghe subscription webhook:

Các Event liên quan

Ví dụ Webhook Handler

Mảng addons trong payload webhook chứa quantity addon hiện tại. Cộng các giá trị này để lấy tổng số chỗ. Nếu gói cơ bản bao gồm chỗ (ví dụ: bao gồm 5 chỗ), hãy cộng số đó vào tổng addon trong logic của ứng dụng.

Thực thi giới hạn số chỗ

Ứng dụng của bạn phải thực thi giới hạn số chỗ. Dodo Payments theo dõi việc thanh toán, nhưng bạn kiểm soát quyền truy cập.
Ngăn chặn nghiêm ngặt việc thêm người dùng vượt quá số lượng chỗ.

Mẫu nâng cao

Các loại chỗ khác nhau

Cung cấp các loại chỗ khác nhau với mức giá khác nhau:
Triển khai: Tạo các add-on riêng cho từng loại chỗ.

Chiết khấu chỗ hàng năm

Cung cấp mức giá chỗ hàng năm được giảm:
Triển khai: Tạo các sản phẩm riêng cho plan hàng tháng và hàng năm với mức giá add-on khác nhau.

Yêu cầu số chỗ tối thiểu

Yêu cầu số lượng chỗ tối thiểu cho một số plan nhất định:

Best Practices

Best Practices về định giá

  • Giao tiếp rõ ràng: Hiển thị nổi bật giá theo từng chỗ trên trang định giá
  • Chỗ được bao gồm: Cân nhắc bao gồm một vài chỗ trong giá cơ bản để giảm trở ngại
  • Chiết khấu theo số lượng: Cung cấp mức giá thấp hơn cho mỗi chỗ đối với các nhóm lớn hơn để giành được hợp đồng doanh nghiệp
  • Ưu đãi hàng năm: Giảm giá các plan hàng năm để cải thiện dòng tiền và khả năng giữ chân khách hàng

Best Practices về kỹ thuật

  • Cache số lượng chỗ: Cache số lượng chỗ của subscription cục bộ để tránh gọi API trong mỗi request
  • Đồng bộ thường xuyên: Định kỳ đồng bộ số lượng chỗ cục bộ với Dodo Payments qua API
  • Xử lý lỗi: Nếu thay đổi số chỗ thất bại, hiển thị thông báo lỗi rõ ràng và các tùy chọn retry
  • Audit Trail: Ghi log mọi thay đổi số chỗ để xử lý tranh chấp thanh toán và tuân thủ

Best Practices về trải nghiệm người dùng

  • Phản hồi theo thời gian thực: Hiển thị ngay tác động chi phí khi điều chỉnh seat
  • Các bước xác nhận: Yêu cầu xác nhận trước khi thay đổi thanh toán
  • Minh bạch về Proration: Giải thích rõ các khoản phí prorated trước khi áp dụng
  • Dễ dàng hạ cấp: Đừng khiến việc giảm seat trở nên khó khăn (điều này giúp xây dựng lòng tin)

Khắc phục sự cố

Triệu chứng: App hiển thị số lượng chỗ khác với subscription.Nguyên nhân:
  • Webhook chưa được nhận hoặc xử lý
  • Race condition trong quá trình thay đổi số chỗ
  • Dữ liệu cache chưa được cập nhật
Giải pháp:
  1. Triển khai webhook handler cho subscription.plan_changed
  2. Thêm nút “Sync with billing” để fetch subscription hiện tại
  3. Đặt cache TTL nhằm đảm bảo làm mới thường xuyên
Triệu chứng: Khách hàng bối rối trước số tiền bị tính giữa chu kỳ.Nguyên nhân: Sử dụng prorated_immediately vào cuối chu kỳ thanh toán (xem ví dụ Khoản phí bất ngờ ở trên).Giải pháp:
  1. Luôn sử dụng previewChangePlan trước khi thực hiện thay đổi
  2. Hiển thị phân tích rõ ràng: “Thêm X seat sẽ tốn $Y hôm nay”
  3. Chuyển sang difference_immediately nếu bạn muốn khoản phí luôn khớp với phần chênh lệch giá
Triệu chứng: Seat add-on không khả dụng trong checkout.Nguyên nhân:
  • Add-on chưa được đính kèm vào sản phẩm
  • Add-on đã được lưu trữ hoặc xóa
  • Sản phẩm và add-on không cùng loại tiền tệ
Giải pháp:
  1. Xác minh add-on đã được đính kèm trong cài đặt sản phẩm
  2. Kiểm tra trạng thái add-on trong dashboard Add-Ons
  3. Đảm bảo loại tiền tệ khớp hoàn toàn
Triệu chứng: Khách hàng muốn giảm số chỗ nhưng vẫn còn người dùng được gán.Giải pháp:
  1. Hiển thị những người dùng phải bị xóa trước khi giảm số chỗ
  2. Triển khai quy trình: Xóa người dùng → Giảm số chỗ
  3. Cân nhắc thời gian gia hạn trước khi thực thi việc giảm số chỗ

Tài liệu liên quan

Seat-Based Pricing Tutorial

Hướng dẫn triển khai đầy đủ kèm code.

Add-ons

Tìm hiểu chuyên sâu về hệ thống add-on.

Plan Changes & Proration

Xử lý các thay đổi subscription.

Subscription Webhooks

Theo dõi các event của subscription.
Lần sửa đổi cuối 26 tháng 9, 2026