Không phải hệ thống thanh toán nào cũng chỉ thu tiền một lần. Với SaaS, membership, khóa học thuê bao, nền tảng nội dung trả phí hoặc phần mềm B2B, doanh nghiệp thường cần thu tiền theo tháng, theo năm hoặc theo chu kỳ sử dụng.
Đây là lúc Stripe Billing phát huy vai trò.
Stripe Billing là bộ công cụ giúp doanh nghiệp quản lý subscription, invoice, trial, coupon, upgrade, downgrade, hủy gói và thu tiền định kỳ. Thay vì tự xây dựng toàn bộ hệ thống lập hóa đơn và gia hạn thanh toán, doanh nghiệp có thể dùng Stripe Billing để xử lý phần lớn logic phức tạp.
Bài viết này sẽ giải thích các khái niệm cốt lõi trong Stripe Billing và cách thiết kế luồng subscription thực tế. Nếu bạn chưa đọc các phần trước, hãy xem lại Stripe Checkout, Payment Intent và Webhook Stripe để nắm rõ nền tảng trước khi đi vào subscription.
Subscription khác gì thanh toán một lần?
Thanh toán một lần tương đối đơn giản: khách hàng chọn sản phẩm, thanh toán, hệ thống xác nhận, đơn hàng hoàn tất.
Theo tài liệu subscription của Stripe, subscription phức tạp hơn vì quan hệ giữa khách hàng và doanh nghiệp kéo dài theo thời gian, đồng thời cần lưu thêm thông tin khách hàng để phục vụ các lần thu tiền sau.
Một subscription có thể phát sinh nhiều tình huống:
- khách hàng bắt đầu dùng thử;
- khách hàng thanh toán tháng đầu tiên;
- hệ thống tự gia hạn ở kỳ tiếp theo;
- thẻ hết hạn hoặc thanh toán thất bại;
- khách hàng đổi từ gói Basic lên Pro;
- khách hàng hủy gói;
- doanh nghiệp áp dụng coupon;
- invoice cần được tạo và gửi;
- quyền truy cập sản phẩm cần bật hoặc tắt theo trạng thái subscription.
Vì vậy, khi làm subscription, developer không chỉ xử lý một giao dịch mà phải xử lý cả vòng đời khách hàng.
Các khái niệm chính trong Stripe Billing
Product
Product đại diện cho sản phẩm hoặc dịch vụ mà doanh nghiệp bán. Ví dụ:
- Gói Basic;
- Gói Pro;
- Gói Enterprise;
- Membership Premium;
- Phần mềm quản lý dự án.
Product mô tả thứ được bán, nhưng chưa nhất thiết nói rõ giá và chu kỳ thanh toán.
Price
Price đại diện cho giá bán của Product. Một Product có thể có nhiều Price.
Ví dụ Product “Gói Pro” có thể có:
- 10 USD/tháng;
- 100 USD/năm;
- 200 USD/tháng cho team lớn;
- giá dùng thử hoặc giá khuyến mãi.
Trong Stripe Billing, Price rất quan trọng vì Subscription thường gắn với Price chứ không chỉ Product.
Customer
Customer là khách hàng trong Stripe. Mỗi người dùng hoặc tổ chức trong hệ thống nội bộ thường nên được mapping với một Stripe Customer.
Customer giúp Stripe lưu:
- email;
- tên;
- payment method;
- invoice;
- subscription;
- billing address;
- lịch sử thanh toán.
Hệ thống nội bộ nên lưu stripe_customer_id để đối chiếu.
Subscription
Subscription đại diện cho việc một Customer đăng ký một hoặc nhiều Price theo chu kỳ. Đây là đối tượng trung tâm của mô hình thanh toán định kỳ.
Subscription có trạng thái riêng, ví dụ active, trialing, past_due, canceled hoặc incomplete tùy tình huống.
Invoice
Invoice là hóa đơn được tạo cho subscription hoặc các khoản thu khác. Với subscription, Stripe có thể tự tạo invoice mỗi kỳ billing.
Invoice giúp doanh nghiệp biết:
- kỳ thanh toán nào đang được thu;
- số tiền cần thanh toán;
- invoice đã được thanh toán chưa;
- thanh toán thất bại hay thành công;
- có áp dụng tax, coupon hoặc discount không.
Luồng subscription cơ bản
Một luồng subscription đơn giản có thể diễn ra như sau:
- Người dùng chọn gói Pro trên website.
- Backend tạo Checkout Session ở mode
subscription. - Khách hàng nhập thông tin thanh toán trên Stripe Checkout.
- Stripe tạo Customer và Subscription.
- Stripe gửi webhook
checkout.session.completed. - Backend lưu
stripe_customer_idvàsubscription_id. - Khi invoice đầu tiên thanh toán thành công, Stripe gửi
invoice.paid. - Backend kích hoạt quyền sử dụng gói Pro.
- Mỗi kỳ gia hạn, Stripe tiếp tục tạo invoice và thu tiền.
- Backend cập nhật quyền truy cập theo webhook.
Điểm cần nhớ là với subscription, event checkout.session.completed chưa phải lúc nào cũng đủ để quyết định toàn bộ quyền truy cập lâu dài. Hệ thống nên theo dõi thêm invoice và subscription event.
Các webhook quan trọng với subscription
Theo tài liệu subscription webhooks của Stripe, webhook rất quan trọng với subscription vì nhiều hoạt động diễn ra bất đồng bộ. Một số event cần quan tâm:
customer.subscription.created: subscription được tạo.customer.subscription.updated: subscription thay đổi, ví dụ đổi gói hoặc đổi trạng thái.customer.subscription.deleted: subscription kết thúc hoặc bị hủy.invoice.created: invoice được tạo.invoice.finalized: invoice đã sẵn sàng để thanh toán.invoice.paid: invoice đã được thanh toán.invoice.payment_failed: thanh toán invoice thất bại.invoice.payment_action_required: cần khách hàng xác thực thêm.customer.subscription.trial_will_end: trial sắp kết thúc.
Trong nhiều hệ thống SaaS, invoice.paid là event quan trọng để cấp hoặc duy trì quyền truy cập. Stripe cũng nêu rõ rằng khi invoice được thanh toán, subscription thường chuyển sang trạng thái active, nhưng hệ thống vẫn nên thiết kế access control dựa trên webhook và trạng thái subscription hiện tại. Khi invoice không thanh toán được, hệ thống có thể gửi email nhắc khách hàng cập nhật thẻ, chuyển tài khoản sang trạng thái hạn chế hoặc áp dụng grace period.
Trial trong Stripe Billing
Trial là thời gian dùng thử trước khi thu tiền. Ví dụ, SaaS cho người dùng dùng thử 7 ngày hoặc 14 ngày.
Khi thiết kế trial, cần làm rõ:
- có yêu cầu nhập thẻ trước khi trial không;
- hết trial thì tự động thu tiền hay yêu cầu xác nhận;
- người dùng có được hủy trước khi bị thu tiền không;
- email nhắc trial sắp hết gửi lúc nào;
- nếu không có payment method thì subscription chuyển trạng thái gì.
Stripe có event customer.subscription.trial_will_end, thường được dùng để nhắc khách hàng trước khi trial kết thúc. Với trải nghiệm tốt, doanh nghiệp nên thông báo rõ ràng thay vì để khách hàng bất ngờ bị thu tiền.
Upgrade, downgrade và cancel
Một subscription thực tế cần hỗ trợ thay đổi gói.
Upgrade là chuyển lên gói cao hơn. Ví dụ Basic sang Pro. Doanh nghiệp cần quyết định có tính phí ngay phần chênh lệch hay chờ kỳ tiếp theo. Với các thay đổi giữa chu kỳ, cần hiểu thêm về proration trong Stripe Billing.
Downgrade là chuyển xuống gói thấp hơn. Doanh nghiệp cần quyết định áp dụng ngay hay cuối chu kỳ.
Cancel là hủy subscription. Có hai cách phổ biến:
- hủy ngay lập tức;
- hủy ở cuối chu kỳ đã thanh toán.
Các quyết định này không chỉ là kỹ thuật mà còn là chính sách sản phẩm. Developer nên làm rõ với product/business trước khi triển khai.
Customer Portal
Stripe Customer Portal là trang do Stripe cung cấp để khách hàng tự quản lý thông tin billing.
Tùy cấu hình, Customer Portal có thể cho phép khách hàng:
- cập nhật phương thức thanh toán;
- xem invoice;
- tải hóa đơn;
- đổi gói;
- hủy subscription;
- cập nhật thông tin thanh toán.
Customer Portal giúp giảm đáng kể khối lượng phát triển dashboard billing nội bộ. Với nhiều SaaS, đây là lựa chọn hợp lý ở giai đoạn đầu.
Tuy nhiên, doanh nghiệp vẫn cần đồng bộ thay đổi từ Customer Portal về hệ thống nội bộ qua webhook. Ví dụ, nếu khách hàng hủy gói trong portal, backend cần nhận customer.subscription.deleted hoặc event liên quan để cập nhật quyền truy cập.
Các lỗi thường gặp khi làm Stripe Billing
Lỗi 1: Chỉ lưu trạng thái subscription trong frontend.
Quyền truy cập phải được quyết định từ backend/database, không dựa vào dữ liệu tạm phía client.
Lỗi 2: Chỉ nghe checkout.session.completed.
Với subscription, cần nghe thêm invoice và subscription events để xử lý gia hạn, thất bại, hủy gói.
Lỗi 3: Không xử lý thanh toán thất bại.
Thẻ hết hạn, thiếu tiền hoặc yêu cầu xác thực thêm là chuyện thường gặp. Hệ thống cần có flow nhắc khách hàng và cập nhật quyền truy cập.
Lỗi 4: Không lưu stripe_customer_id và subscription_id.
Thiếu mapping này sẽ làm việc debug, đối soát và mở Customer Portal khó khăn.
Lỗi 5: Không định nghĩa rõ chính sách upgrade/downgrade/cancel.
Stripe hỗ trợ kỹ thuật, nhưng chính sách tính tiền và quyền truy cập vẫn cần doanh nghiệp quyết định rõ.
FAQ
Stripe Billing có phù hợp với SaaS không?
Có. Stripe Billing là một trong những giải pháp phổ biến cho SaaS vì hỗ trợ subscription, invoice, trial, coupon, customer portal và webhook.
Có cần tự xây trang quản lý subscription không?
Không bắt buộc. Có thể dùng Stripe Customer Portal để khách hàng tự quản lý billing. Sau này nếu cần trải nghiệm riêng, doanh nghiệp có thể xây dashboard tùy chỉnh.
Event nào quan trọng nhất với subscription?
Tùy hệ thống, nhưng thường cần quan tâm invoice.paid, invoice.payment_failed, customer.subscription.updated và customer.subscription.deleted.
Kết luận
Stripe Billing giúp doanh nghiệp xử lý phần phức tạp của thanh toán định kỳ: subscription, invoice, trial, gia hạn, thất bại thanh toán và quản lý phương thức thanh toán. Với SaaS hoặc membership, đây là nền tảng quan trọng để xây dựng mô hình doanh thu lặp lại.
Điểm mấu chốt khi làm Stripe Billing là không chỉ tạo subscription thành công, mà phải quản lý toàn bộ vòng đời của subscription bằng webhook và database nội bộ. Khi thiết kế đúng từ đầu, hệ thống sẽ dễ mở rộng hơn khi thêm gói mới, coupon, trial, upgrade, downgrade hoặc billing portal.
Nguồn tham khảo
- Stripe subscription overview
- Stripe subscription webhooks
- Stripe Customer Portal
- Stripe subscription invoices
- Stripe products and prices
