Vừa rồi đội ngũ dự án mình đã xây dựng xong những tính năng cơ bản của Seitrace – một dự án Explorer official và lớn nhất trên SEI blockchain, và cũng là explorer đầu tiên hỗ trợ một chain chạy song song EVM/Cosmos.
Giới thiệu
Với vai trò là Product Manager của dự án, cũng như sự đặt hàng của nhiều anh em developer trên mạng SEI blockchain về việc sử dụng API miễn phí và có trả phí để lấy dữ liệu on-chain đã visualize về sử dụng trên dự án của họ, mình đã research về cách xây dựng tính năng Subscription/mua API. Bài viết hôm nay mình sẽ chia sẻ những gì mình đã phân tích được một cách tổng quan về:
Tính năng subscription dưới góc nhìn của một Product Owner/ Business Analyst
![Seitrace](https://hoangphan.blog/wp-content/uploads/2024/07/seitrace-1024x728.png)
Dữ liệu trả ra API từ đâu mà có?
Nếu bạn nào có phát triển các dự án trên blockchain, sẽ biết là các dữ liệu on-chain sẽ được lưu trữ trên các block, trong mỗi block sẽ chứa nhiều transactions, và các block này sẽ nối lại với nhau tạo thành một chuỗi các blocks
![Transactions in blocks](https://hoangphan.blog/wp-content/uploads/2024/07/blockchain.png)
![hash of block](https://hoangphan.blog/wp-content/uploads/2024/07/hash-of-block.png)
Còn phía dự án Seitrace, Sẽ kết nối với các node RPC của blockchain => Crawl dữ liệu thô từ blockchain về (thông tin các transactions, blocks, status, smart contracts, …) => decode/xào nấu những dữ liệu đó sao cho dễ dùng => dùng Indexer để lập chỉ mục và lưu trữ các dữ liệu đã xào nấu vào những database riêng của Seitrace để từ đó truy vấn nhanh chóng và hiệu quả.
Và các dữ liệu này sẽ được dùng để hiển thị ra trên ứng dụng Seitrace, và cũng với những dữ liệu này phía dự án cũng cho các bên dự án khác sử dụng thông qua API, nhưng sẽ có những mức phí khác nhau.
Kế hoạch phân tích
Để có thể phân tích đầy đủ thì mình list out ra thành những task nhỏ cần làm
![Things to do](https://hoangphan.blog/wp-content/uploads/2024/07/seitrace-api-tasks-1024x642.png)
Mình thì cũng hay phân tích các dự án lớn và đi từ đầu (từ lúc mới có ý tưởng), thậm chí là chưa bao giờ làm qua, nhưng thường ngại các phần thanh toán, vì dính nhiều cái liên quan đến pháp lý, đăng ký theo công ty, chia sẻ lợi nhuận nên thường sẽ research đầu tiên => trong bài toán này mình cũng nghiên cứu phần payment đầu tiên.
Luồng thanh toán
Để tìm bên cung cấp dịch vụ thanh toán, thì cần nghĩ tới việc thanh toán thì có thanh toán 1 lần, hoặc thụ động, và một loại nữa là gọi hằng tháng (subscription) để trừ tiền 😀 Và ngoài ra thì bên hỗ trợ thanh toán phải hỗ trợ cho các bên dự án crypto, thanh toán quốc tế với nhiều quốc gia, có phương thức thanh toán qua crypto.
=> Đối với loại thụ động, hoặc thanh toán 1 lần thì dễ, kiểu như gửi số tài khoản cho user chuyển qua => rồi có 1 bộ listen để xem nếu user đã thanh toán => thì chuyển trạng thái thành công.
=> Đối với loại thanh toán hằng tháng => thì trừ tự động => phải qua một bên thứ 3 và cho accept các loại thẻ, hoặc hỗ trợ kiểu như ví đã nạp tiền sẵn và tự động trừ.
![Bảng giá thanh toán](https://hoangphan.blog/wp-content/uploads/2024/07/monthlypayment-1024x498.png)
Sau một hồi check qua nhiều phương án thanh toán, mình nhận thấy có những phương án phù hợp nhất:
- Stripe: https://stripe.com/pricing – phí có hơi cao 1 tíu, có hỗ trợ upgrade, downgrade (nâng gói/hạ gói), hỗ trợ thanh toán qua thẻ, có hỗ trợ các dự án crypto, có hỗ trợ thanh toán qua crypto (USDC), tài liệu gần như đầy đủ nhất 😀 đáng để anh em đọc và học hỏi.
- Coinbase commerce: https://www.coinbase.com/commerce – phí rẻ hơn bên stripe, có hỗ trợ refund, hỗ trợ payment 100% = crypto luôn, nhưng chưa hỗ trợ tự động trừ tiền mỗi tháng.
Một số kênh khác các bạn có thể tham khảo trong luồng thanh toán:
- https://developer.bitpay.com/reference/create-a-subscription
- https://developer.coingate.com/reference/renew-subscription
Bên mình đã chọn sử dụng Coinbase commerce với 2 lý do, 1. Stripe phí cao :v, 2. Thủ tục Stripe khá rờm rà, mất 1 thời gian dài để contact, làm việc, và sau đó tích hợp, trong khi tính năng này chỉ có 8 tuần để phân tích, thiết kế, phát triển và test => Ưu tiên sài Coinbase, khi lượng user tăng quá nhiều và nhu cầu thanh toán qua thẻ tăng => Tích hợp Stripe sau.
![Học tiếng Anh online](https://hoangphan.blog/wp-content/uploads/2024/05/enrichenglish-hoangphan.blog_-768x432.jpg)
Nhưng… sau khi đã chốt sử dụng Coinbase ở giai đoạn đầu và phân tích luồng xong, tới bước dev & đăng ký tài khoản 😀 Coinbase cũng rườm rà =)) bữa giờ team mình đăng ký đã được 3 tuần rồi mà chưa xong :D, mặc dù công ty bên mình là bên UK luôn mà thủ tục khá lâu :D….
=> Chốt lại là chơi check bằng tay trước, kiểu như tới ngày thanh toán thì nhắn tin cho tụi mua API để gửi bill (hay kiểu số tài khoản á), rồi nó chuyển vào xong rồi check xem tiền vào chưa và apply manual trong Admin dashboard.
=)) Công cốc 1 ngày research và vẽ luồng của mình 😀 – cơ mà đợi khi dự án chạy ổn cũng như lượng người mua API tăng lên thì tích hợp sau cũng được, luồng vẽ rồi sau dev chiến thôi 😀
—
Nhưng ở đây mình cũng sẽ chia sẻ luồng payment cho mọi người xem luôn há.
Với Stripe: (Khi lượng user tăng quá nhiều + có nhu cầu thanh toán qua phương thức truyền thống)
- Stripe đã hỗ trợ sẵn luồng subscription => Sẽ sử dụng luôn của bên đó (có cả upgrade, downgrade, cancel, …) => Cần đăng ký tài khoản & cài đặt các gói => Seitrace không cần xây dựng “Subscription System“
- Thường Stripe lại ưu tiên thanh toán qua các kênh truyền thống (credit card, debit card), nên sẽ kết hợp với xử lý qua Coinbase commerce để xuất bill, cũng như thanh toán với nhiều nguồn tiền crypto hơn (BTC, ETH, USDC, USDT, …) từ Metamask (phổ biến nhất trong crypto), Coinbase wallet.
- Do đó khi một giao dịch được hoàn tất qua kênh Coinbase Commerce => Bên webhook của trả về cho Seitrace & Seitrace trả về lại cho bên Stripe để cập nhật.
- Vì luồng này khá quen thuộc và docs của Stripe khá rõ => Anh em đọc thêm trên đó nha.
Bước 1: Stripe đưa ra thông tin subscription mỗi tháng
Bước 2: Gọi từ Stripe qua hub của hệ thống mình => Gọi qua bên Coinbase Commerce
Bước 3: User sau khi thanh toán xong => gọi ngược lại Stripe để update theo luồng Upgrade/Downgrade
Trong quá trình trên, ae có thể gọi về system và store data/logs lại nhé
Với chỉ thanh toán qua Coinbase Commerce: (sẽ develop sau khi lượng user tăng lên, cũng như đăng ký được với Coinbase)
- Với việc đi qua Coinbase commere, và chưa có subscription system => Seitrace phải tự xây.
- Khi tự xây thì sẽ liên quan đến các luồng upgrade, downgrade, thanh đổi gói, cancel gói, … => mình sẽ nói ở phần dưới của bài viết sau nhé.
- Thì luồng cơ bản của thanh toán => Khi phát sinh thanh toán (bạn xem sequence diagram ở dưới nhé) – từ bước số 2.
Với việc thanh toán có thể phát sinh từ nhiều luồng (thanh toán lần đầu, thanh toán khi mua thêm credit, thanh toán phát sinh, thanh toán hằng tháng, thanh toán khi thay đổi gói (upgrade/downgrade), …)
Với thanh toán nhưng check manual: (đang develop => này đỡ tốn thời gian đợi accept từ các bên nền tảng 3rd, mà có thể giảm thời gian dev, test => từ đó mục tiêu 8 tuần build xong tính năng (cùng với nhiều tính năng khác release trong giai đoạn này) sẽ dễ dàng hơn)
=)) Luồng này chưa vẽ, tại như luồng qua Coinbase, mà bỏ bớt, bạn đọc có thể xem luồng trên và bỏ đi bước gọi qua Coinbase Commerce API, thay vào đó gửi thông tin thanh toán (Số tiền, thông tin/mô tả thanh toán, địa chỉ nhận tiền, thời gian phải thanh toán) qua email, cũng như trả vào FE để hiển thị lên màn hình, thậm chí có nút share public để gửi qua tin nhắn cho user, có thể có đếm giờ/hoặc không tuỳ logic => Và khi thanh toán xong => vào Admin dashboard update trạng thái thanh toán => tự động gửi mail báo cho user sau khi update trạng thái.
Luồng subscription, upgrade, downgrade
Ở đây mình chỉ copy 1 phần nhỏ luồng cho anh em xem nhé, ae nào khi nào cần làm kỹ thì có thể phân tích kỹ hơn 😀 Share hết bí mật sao được 😀
Giả sử có các gói Subscription
– Miễn phí (Free): $0/tháng
– Advanced: $100/tháng
– Professional: $200/tháng
Luồng các trường hợp
1. Từ Free -> Advanced
– Trạng thái ban đầu: Người dùng đang sử dụng gói Free.
– Hành động: Người dùng chọn nâng cấp lên gói Advanced.
– Xử lý:
+ Người dùng sẽ được yêu cầu thanh toán $100 cho tháng đầu tiên của gói Advanced.
+ Sau khi thanh toán, gói của người dùng sẽ được nâng cấp ngay lập tức lên gói Advanced.
+ Kỳ thanh toán tiếp theo sẽ là $100 vào cùng ngày tháng sau.
2. Từ Advanced -> Free
– Trạng thái ban đầu: Người dùng đang sử dụng gói Advanced với phí $100/tháng.
– Hành động: Người dùng chọn hạ cấp xuống gói Free.
– Xử lý:
+ Gói Advanced sẽ tiếp tục được duy trì cho đến cuối chu kỳ thanh toán hiện tại.
+ Sau khi kết thúc chu kỳ thanh toán hiện tại, gói của người dùng sẽ tự động chuyển về gói Free.
+ Không có khoản hoàn tiền cho phần thời gian chưa sử dụng của gói Advanced.
3. Từ Advanced -> Professional
– Trạng thái ban đầu: Người dùng đang sử dụng gói Advanced với phí $100/tháng.
– Hành động: Người dùng chọn nâng cấp lên gói Professional.
– Xử lý:
+ Phần tiền đã trả cho gói Advanced sẽ được tính tỷ lệ theo số ngày đã sử dụng trong tháng.
+ Số tiền còn lại sẽ được khấu trừ vào chi phí của gói Professional.
+ Người dùng sẽ thanh toán số tiền chênh lệch để nâng cấp lên gói Professional.
+ Ví dụ: Nếu người dùng đã sử dụng gói Advanced được 15 ngày, số tiền còn lại là $50. Người dùng sẽ cần thanh toán thêm $150 để nâng cấp lên gói Professional.
+ Ngay sau khi thanh toán, gói của người dùng sẽ được nâng cấp lên gói Professional.
4. Từ Professional -> Advanced
– Trạng thái ban đầu: Người dùng đang sử dụng gói Professional với phí $200/tháng.
– Hành động: Người dùng chọn hạ cấp xuống gói Advanced.
– Xử lý:
+ Gói Professional sẽ tiếp tục được duy trì cho đến cuối chu kỳ thanh toán hiện tại.
+ Sau khi kết thúc chu kỳ thanh toán hiện tại, gói của người dùng sẽ tự động chuyển về gói Advanced với phí $100/tháng.
+ Không có khoản hoàn tiền cho phần thời gian chưa sử dụng của gói Professional.
Tổng Kết
– Nâng cấp (Upgrade): Người dùng sẽ phải thanh toán chi phí chênh lệch tương ứng với số ngày còn lại trong chu kỳ thanh toán hiện tại.
– Hạ cấp (Downgrade): Người dùng sẽ tiếp tục sử dụng gói hiện tại cho đến hết chu kỳ thanh toán và không có khoản hoàn tiền cho phần thời gian chưa sử dụng của gói cao hơn.
Ngoài ra còn luồng từ monthly qua yearly/annual, và ngược lại kết hợp với việc từ gói rẻ -> gói mắc hơn, hoặc mắc hơn -> rẻ hơn. Các trường hợp này sẽ tuỳ logic của từng dự án mà thay đổi khác nhau 1 ít. Và cũng khá phức tạp khi có trường hợp gói mắc về gói rẻ, nhưng vì từ monthly qua annual => có phát sinh phí, nghĩa là mắc qua rẻ nhưng lại không phải luồng downgrade như ở trên có đề cập 😀
Đối với bên Seitrace =)) sau khi mình phân tích đủ các luồng, Dev khóc => quyết định không chơi luồng upgrade/downgrade ở giai đoạn này vì nguồn lực build không đủ => chặn luồng này luôn, chỉ hỗ trợ upgrade/downgrade, hoặc chuyển monthly qua yearly hoặc ngược lại thì đều phải nhắn tin :)))
Thật ra thì với mình khi phân tích mình nhìn đủ các trường hợp để mang ra trao đổi, còn với tư duy xây dựng product mình hay build basic với mục đích chính là sử dụng được, cover được các case nhưng có thể làm manual ở giai đoạn đầu, và sau đó sẽ tự động hoá dần, điều này nằm sâu trong tư duy của mình từ khi chuyển qua làm product, thậm chí khi mình tự xây trung tâm tiếng Anh enrichenglish.net cũng đang áp dụng như vậy, chạy được, ra doanh thu rồi khi có thời gian, nguồn lực sẽ nâng cấp dần dần, cũng như biết chỗ nào sai và sửa.
Bạn xem luồng manual bên mình ở dưới nhé.
Subscription first time
Ở luồng này thì mình viết bằng text với idea cơ bản nhé:
- Xét xem đang là sub lần đầu => Server xử lý và tính giá tiền, thời hạn + thông tin các kiểu
- Trả cho UI để hiển thị => user confirm => tạo bill và gửi yêu cầu qua Coinbase để tạo bill bên Coinbase
- Trả thông tin lại cho user (UI và email) => user thanh toán
- => Đợi user thanh toán và Webhood của Coinbase trả kết quả => update gói & thời hạn mới của gói cho user ở phía Sub Mgmt Server + gửi mail successful
- Đối với không thanh toán => huỷ bill sau khi hết hạn.
Trước khi sub => Thì cũng có các luồng liên quan đến đăng nhập, tạo gói free, xử lý các logic để phân biệt đang gói nào, và đang thực hiện luồng sub lần đầu hay upgrade/downgrade,….
Payment monthly
- Có 1 con Cronjob sẽ quét DB subscription daily => phát hiện anh nào tới hạn thanh toán (có thể set là 5 ngày trước khi hết hạn)
- Tạo thông tin thanh toán và gửi qua Coinbase Commerce tạo bill
- => gửi thông tin bill qua email cho user
- => Đợi user thanh toán và Webhood của Coinbase trả kết quả => update gói & thời hạn mới của gói cho user ở phía Sub Mgmt Server + gửi mail successful
- Đối với không thanh toán => thì quét nhắc lại trước khi hết hạn 24h
- Trường hợp hết hạn mà không thanh toán => update gói về free (cancel package) + gửi email cancellation
Sử dụng API => Trừ tiền
Luồng này thì có nhiều phương án, các bạn có thể tham khảo thêm từ các subscription API khác nhé, mình chỉ liệt kê 1 số luồng và không nói quá sau, bạn nào làm tới tính năng này thì research thêm sau nhé.
- Dựa theo gói => giới hạn tính năng, lượt request theo giây, giờ, ngày, tháng,… và khi hết thì không được sài nữa (Giống như đăng ký 4Gb của các nhà mạng 😀 tốc độ nhanh chậm, ngày nhiêu Gb :v hết thì không được sài nữa)
- Cũng là trường trên nhưng mà hết thì được sài với tốc độ chậm 😀
- Cũng là trường hợp trên nhưng khi hết thì tính giá riêng (thường mắc hơn rất nhiều so với mua gói, và trừ tiền dần trong tài khoản) => này khó áp dụng khi không có cà thẻ hoặc tiền có sẵn trong tài khoản => có thể ignore.
- Cũng là trường hợp đầu tiên, nhưng khi hết thì được mua thêm những gói mini khác (ví dụ như mua thêm 1Gb sử dụng trong 24h với tốc độ của gói đã mua trước đó)
- Hoặc cho sài tẹt ga, nhưng cũng có giới hạn tốc độ theo giây, theo giờ (kiểu như mua gói mạng dây Viettel trả tiền theo tháng hoặc 12 tháng tặng 1 tháng, có tốc độ đó thì mạng chạy chậm hơn, nhưng được sài tẹt ga)
- Hoặc quy ra thành Credit, cứ mỗi lượt sẽ trừ tiền bớt, sài nhiều thì hết sớm, sài ít thì lâu hết, có thể mua thêm gói mini nếu hết 😀
- Hoặc là mua thêm cộng dồn (kiểu trả nhiêu sài nhiều rồi trừ dần – như tiền nạp vào thuê bao di động)
Và tuỳ theo gói sẽ có các luồng trừ tiền/limit khác nhau.
Bên mình sau khi nghiên cứu thì thấy hướng credit sẽ dễ develop hơn, ít tốn nguồn lực => chọn và sau này tuỳ nhu cầu của người dùng cũng như áp dụng số liệu product research để thay đổi sau.
Bên mình cũng thêm luồng khi sử dụng gần hết data => sẽ gửi email báo (một dạng warning) => thì thêm con cronjob quét daily.
Về giao diện
Về mặt giao diện thì có thể phân ra các nhóm màn hình sau:
- Màn hình thông tin bán các gói API, đăng ký mua (kiểu như mấy trang landing page quảng cáo á) => do có thanh toán => tích hợp UI thanh toán vào (ví dụ đăng ký 4G, các bạn vào app xem list gói + nhấn đăng ký + confirm thanh toán, hoặc nhắn tin qua tổng đài đăng ký ấy).
- Luồng quản lý gói & dữ liệu đã sử dụng, ở đây sẽ hiển thông tin gói chi tiết, số lượng credit, lưu lượng, limit đã sử dụng, còn lại bao nhiêu, và có nút mua thêm các gói mini, cũng như nơi tạo và quản lý API key. Kèm theo đó là dữ liệu bill history, API usage logs, chart usage các kiểu
![API billing history](https://hoangphan.blog/wp-content/uploads/2024/07/bill-history-1024x280.png)
![API key stats](https://hoangphan.blog/wp-content/uploads/2024/07/API-key-stats-1024x517.png)
3. Giao diện phía quản lý của Seitrace (Admin dashboard)
- Danh sách customers
- Customer details + thông tin gói, subscription, change plan for user,….
- Nơi cấu hình các package (Gói, thông tin gói, các limit, giá gói theo tháng, năm, giảm giá,….)
- Cấu hình giá trị của từng API theo credit, … rồi bên Pro, Free thì như thế nào,…
- Ngoài ra còn các giao diện tính năng khác, tuỳ theo người phân tích có thể đưa ra cho phù hợp
Kết luận
- Bài toán subscription được nhiều bên xây dựng rồi, bạn có thể tham khảo các logic mình phân tích, và ánh xạ lên nhiều bên khác nhau để chọn cho phù hợp, hoặc tự build.
- Với mỗi dự án thì nhu cầu sẽ khác nhau do đó bạn có thể linh hoạt điều chỉnh tính năng
- Dự án bên mình nguồn lực khá ít, do đó xây dựng theo hướng đơn giản trước, khi doanh thu và nhu cầu tăng => sẽ mở rộng dần
- Đối với người phân tích dự án thì nhìn rộng và phân tích các trường hợp có thể xảy ra, thậm chí có thể phân tích hết trước dù khi làm chỉ là 1 phần nhỏ, hoặc chọn phân tích kỹ phần sẽ làm và phần chưa làm có thể chỉ phân tích luồng chính và đi details sau khi cần.
- Luồng này liên quan đến tiền của người dùng do đó phần security khá quan trọng 😀 anh em cũng lưu ý kỹ nha.
- Phần thanh toán hằng tháng thì nên sài qua bên thứ 3 nếu cho thanh toán qua thẻ, vì liên quan đến nhiều license và quy định bảo mật 😀
- Anw, bài viết khá dài, cảm ơn bạn đã đọc đến đây nha <3
[…] có thể đọc bài “Phân tích tính năng subscription” của mình để biết được cách mình đã phân tích, ở bài này mình sẽ […]