Ghi chép thực địa

Một lõi, nhiều ứng dụng: nền tảng ngân hàng whitelabel vận hành thế nào

Nền tảng ngân hàng whitelabel là một lõi ngân hàng với phần front end có thể thay thế. Lõi là phần bắt buộc phải đúng: sổ cái bút toán kép, tài khoản khách hàng, KYC và onboarding, phát hành và xử lý thẻ, các kênh crypto và stablecoin, cùng bảng điều khiển vận hành chạy phía sau tất cả. Ứng dụng là phần khách hàng nhìn thấy — tên, màu sắc, hình dạng các màn hình, tập tính năng được bật. Whitelabel nghĩa là một lõi có thể khoác nhiều gương mặt mà không phải dựng lại bên dưới mỗi gương mặt. Một lõi, nhiều ứng dụng.

Nói thẳng ra, đây là một nhận định về vị trí của các đường nối. Mọi thứ liên quan đến tiền được dùng chung, kiểm toán và đối soát một lần; mọi thứ liên quan đến khách hàng được cấu hình theo từng tenant. Phần kỹ thuật quan trọng là giữ đường ranh đó cho nghiêm: để front end tự do khác biệt trong khi lõi bên dưới không bao giờ bị fork. Bài này mổ xẻ cách vạch đường ranh ấy, và vì sao vạch bằng design token tốt hơn vạch bằng fork.

Điều không bao giờ thay đổi: lõi

Hãy bắt đầu với nửa không được phép sáng tạo. Một giao dịch chuyển tiền được ghi nhận theo cùng một cách dù ứng dụng gọi nó là gửi tiền, thanh toán hay chi hộ: hai bút toán trên sổ cái kép, và không có gì bị xóa — sổ cái chỉ ghi thêm, nên hoàn tiền là một bút toán đối ứng tham chiếu đến bút toán gốc, không phải xóa bỏ. Tài khoản, số dư và các khoản giữ tiền ủy quyền nằm ở đây. KYC và onboarding, phát hành và tất toán thẻ, các kênh crypto và stablecoin cũng vậy. Phía sau là một bảng điều khiển vận hành duy nhất, nơi mọi thao tác đặc quyền đều bắt buộc nêu lý do và được ghi vào nhật ký kiểm toán.

Mỗi thành phần này chỉ có đúng một, và đó chính là mấu chốt. Tất toán, đối soát và tuân thủ khó làm đúng và làm sai thì rất tốn kém, nên bạn xây một lần và để mọi ứng dụng thừa hưởng kết quả. Khi một tenant onboard khách hàng, cấp KYC do lõi quyết định sẽ theo khách hàng đó vào bảng điều khiển, bất kể màn hình của ứng dụng nào đã thu thập giấy tờ. Lõi không biết, cũng không quan tâm ứng dụng bên trên tên là gì — nó chỉ thấy tài khoản và bút toán, không thấy thương hiệu.

Điều thay đổi: ngôn ngữ thiết kế, kiến trúc thông tin, tập tính năng

Mọi thứ phía trên lõi đều tự do thay đổi, theo ba trục. Thứ nhất là ngôn ngữ thiết kế: màu sắc, kiểu chữ, độ bo góc, khoảng cách, chuyển động — văn phạm thị giác của thương hiệu. Thứ hai là kiến trúc thông tin: màn hình chính có gì, các luồng được đặt tên và sắp xếp ra sao, hành động nào cách một chạm và hành động nào cách ba. Thứ ba là tập tính năng: những module nào được bật. Một ứng dụng chuyển tiền gọn nhẹ và một super-app dày đặc có thể chạy cùng một lõi mà không chung nhau một màn hình nào.

Trang sản phẩm tại /products/pay trình bày năm hướng đã được dựng thực tế, và nên đọc chúng như năm ví dụ trong vô số khả năng chứ không phải một thực đơn năm món. Halcyon là một sàn giao dịch gọn gàng — tiết chế, ít màn hình, giao dịch ở vị trí trung tâm. Lumen là super-app nơi tiền di chuyển ngay trong cuộc trò chuyện, còn thanh toán qua chat, đăng ký định kỳ và earn cùng chia sẻ màn hình chính. Fern đặt chuyển tiền lên đầu — chi hộ hàng loạt và quy đổi FX theo quy tắc là ưu tiên. Volt là bản dựng stablecoin giao diện tối với bộ phân loại lương và thẻ cho nhóm. Meridian đa tiền tệ: tài khoản EUR bên cạnh USDC, số dư GBP cho du lịch, và một tài khoản BTC nơi phần thưởng thẻ được ghi có. Năm thương hiệu, năm kiến trúc thông tin, năm tập tính năng — bên dưới tất cả là một sổ cái, một KYC, một bộ xử lý thẻ.

Điều đó không có nghĩa sản phẩm là năm ứng dụng. Năm hướng này chỉ là những lối mà cùng một quy trình có thể đi; con số quan trọng không phải năm, mà là bao nhiêu tenant bạn onboard. Mỗi hướng là bằng chứng rằng front end có thể khác biệt đến tận hình dạng màn hình chính trong khi lõi bên dưới không hề hay biết.

Lõi là phần bạn không được phép phát minh lại; ứng dụng là phần bạn không được phép gò bó. Nền tảng whitelabel là kỷ luật giữ cho cả hai câu này cùng đúng một lúc.
— Protocore · Platform engineering

Vì sao theme ở cấp token tốt hơn fork mã nguồn

Có hai cách để một sản phẩm trông như nhiều sản phẩm. Cách hiển nhiên là fork: sao chép mã nguồn cho từng khách hàng, đổi giao diện rồi phát hành. Cách này chỉ hiệu quả đúng một bản phát hành. Sau đó, mỗi bản sửa lỗi và mỗi thay đổi quy định phải áp dụng N lần trên N bản sao ngày càng lệch nhau, các bản sao mất đồng bộ, và bề mặt bảo mật bạn phải kiểm soát nhân lên theo số khách hàng. Fork biến một hệ thống bạn hiểu thành nhiều hệ thống bạn không hiểu.

Theme ở cấp token đảo ngược điều đó. Chỉ có một codebase. Một thương hiệu là một tập giá trị — token cho màu sắc, kiểu chữ, độ bo góc và khoảng cách; một cấu hình component; một bộ feature flag — được phân giải lúc build thành ứng dụng mang thương hiệu. Đổi một token thì mọi màn hình đọc nó đều thay đổi theo, vì không có gì mã hóa cứng giá trị lẽ ra phải lấy từ token. Một bản sửa cho luồng chuyển tiền được phát hành tới mọi tenant cùng lúc, vì chỉ có một luồng chuyển tiền để sửa. Các thương hiệu khác nhau ở cấu hình, không phải ở mã nguồn.

Vị trí của hệ thống thiết kế

Token không phải một ý tưởng lỏng lẻo; chúng là một sản phẩm đã phát hành. Protocore Design System — /products/pds — gồm 144 design token và 889 utility class: bộ từ vựng mà mọi ứng dụng được theme bằng. Hệ thống này ưu tiên giao diện tối, dựa trên token và mặc định bo góc bằng không, và cùng một bộ token được xuất cho web, .NET và native, nên một màu định nghĩa một lần sẽ là cùng một màu trong màn hình React, bảng điều khiển desktop và bản build mobile native. Thương hiệu của tenant được biểu đạt bằng các giá trị ghi đè trên bộ từ vựng đó, vì thế đổi giao diện ứng dụng là thay đổi cấu hình chứ không phải viết lại.

Đây cũng là điều khiến front end thực sự tự do chứ không chỉ tự do trong một khuôn mẫu. Vì ngôn ngữ thiết kế nằm trong token và utility class thay vì các stylesheet dùng một lần, designer có thể đưa một tenant đi rất xa khỏi bản tham chiếu — bảng màu, kiểu chữ, mật độ và nhịp điệu riêng — mà không đụng đến lõi hay fork ứng dụng. Lớp sơn có thể phủ sâu, nhưng vẫn chỉ là lớp sơn; hệ thống đường ống bên dưới là dùng chung.

Ứng dụng là một cấu hình, không phải một bản build

Tập tính năng tuân theo cùng quy tắc. Mỗi module — thanh toán qua chat, earn, crypto, thẻ, đăng ký định kỳ, thẻ cho nhóm, giới thiệu — là một công tắc bật theo từng tenant, và một flag có thể được mở cho một phần người dùng trước khi triển khai rộng. Operator bật tắt từ bảng cấu hình, không cần deploy. Vì vậy khác biệt giữa một ứng dụng chuyển tiền tối giản và một super-app đầy đủ không phải hai dự án; đó là hai cấu hình của một dự án. Ứng dụng tham chiếu mà mọi tenant bắt đầu từ đó là bản build trung tính mang thương hiệu Protocore với đầy đủ thực đơn — mỗi whitelabel là bản build ấy với token được ghi đè và các module được bật hoặc tắt.

Ranh giới rõ ràng

Một lõi, nhiều ứng dụng chỉ đáng bỏ công xây bộ máy này khi bạn thực sự có nhiều ứng dụng — hoặc một ứng dụng bạn định thay giao diện, sắp xếp lại và điều chỉnh phạm vi theo thời gian mà không phải dựng lại ngân hàng mỗi lần. Nếu bạn chỉ phát hành một ứng dụng cố định và sẽ không bao giờ khoác thương hiệu thứ hai, bạn không cần nền tảng whitelabel; bạn cần một ứng dụng. Giá trị của nó nằm ở đúng trường hợp nó được xây cho: một nền tảng dựng các sản phẩm ngân hàng mang thương hiệu riêng hết tenant này đến tenant khác, mỗi sản phẩm rõ ràng là của riêng mình, không cái nào là một bản fork. Bản mổ xẻ đầy đủ — năm hướng, ứng dụng tham chiếu và bảng điều khiển vận hành phía sau — có tại /products/pay, và hệ thống thiết kế bên dưới tại /products/pds.

Bạn có hệ thống cần xây dựng?

Hãy cho chúng tôi biết vấn đề. Chúng tôi sẽ quay lại với kiến trúc và kế hoạch.