הערות שטח

ליבה אחת, אפליקציות רבות: איך עובדת פלטפורמת בנקאות whitelabel

פלטפורמת בנקאות whitelabel היא ליבת בנקאות אחת עם צד לקוח שאפשר להחליף. הליבה היא החלק שחייב להיות נכון: ספר חשבונות בשיטת הרישום הכפול, חשבונות לקוח, KYC ו-onboarding, הנפקה ועיבוד של כרטיסים, מסילות קריפטו ו-stablecoin, וקונסולת התפעול שרצה מאחורי הכול. האפליקציה היא החלק שהלקוח רואה — השם שלה, הצבעים, צורת המסכים, תת-קבוצת הפיצ'רים שהופעלה. Whitelabel אומר שליבה אחת יכולה ללבוש פנים רבות בלי להיבנות מחדש מתחת לכל אחת מהן. ליבה אחת, אפליקציות רבות.

במילים פשוטות, זו טענה לגבי המקום שבו עוברים התפרים. כל מה שנוגע בכסף משותף, מבוקר ומותאם פעם אחת; כל מה שנוגע בלקוח מוגדר לכל tenant. העבודה ההנדסית החשובה היא לשמור על הקו הזה ישר — לתת לצד הלקוח להשתנות בחופשיות בלי שהליבה שעליה הוא נשען תתפצל לעולם. זה פירוק של האופן שבו הקו נמתח, ולמה למתוח אותו עם design tokens עדיף על למתוח אותו עם fork.

מה אף פעם לא משתנה: הליבה

נתחיל בחצי שאסור לו להיות יצירתי. העברה נרשמת באותה דרך בין אם האפליקציה קוראת לה שליחה, תשלום או משיכה: שתי רשומות בספר חשבונות בשיטת הרישום הכפול, ושום דבר לא נמחק לעולם — הספר רק מוסיף, ולכן החזר הוא רשומת נגד שמפנה למקור, לא מחיקה. חשבונות, יתרות ו-holds של אישורי תשלום חיים כאן. כך גם KYC ו-onboarding, הנפקה וסליקה של כרטיסים, ומסילות הקריפטו וה-stablecoin. מאחוריהם עומדת קונסולת תפעול אחת, שבה כל פעולה מורשית דורשת ציון סיבה ונרשמת ביומן ביקורת.

מכל אלה יש בדיוק אחד, וזו הנקודה. סליקה, התאמות ותאימות רגולטורית קשה לעשות נכון ויקר לעשות לא נכון, ולכן בונים אותן פעם אחת וכל אפליקציה יורשת את התוצאה. כשה-tenant מקים לקוח, רמת ה-KYC שהליבה קובעת נעה עם הלקוח אל הקונסולה, בלי קשר לאיזו אפליקציה צילמה את המסמכים. הליבה לא יודעת ולא אכפת לה איך קוראים לאפליקציה שמעליה — היא רואה חשבונות ורשומות, לא מותגים.

מה משתנה: שפה עיצובית, ארכיטקטורת מידע, תמהיל פיצ'רים

כל מה שמעל הליבה חופשי לזוז, בשלושה צירים. הראשון הוא שפה עיצובית: צבע, טיפוגרפיה, רדיוס פינות, ריווח, תנועה — הדקדוק החזותי של המותג. השני הוא ארכיטקטורת מידע: מה יושב במסך הבית, איך נקראים התהליכים ובאיזה סדר, איזו פעולה במרחק הקשה אחת ואיזו בשלוש. השלישי הוא תמהיל הפיצ'רים: אילו מודולים מופעלים בכלל. אפליקציית העברות רזה ו-super-app צפופה יכולות לרוץ על אותה ליבה בדיוק, בלי לחלוק אפילו מסך אחד.

דף המוצר ב-/products/pay עובר על חמישה כיוונים מפורטים, והם נקראים הכי טוב כדוגמאות מתוך אינסוף ולא כתפריט של חמישה. Halcyon היא בורסה נקייה — מאופקת, עם מעט משטחים, והמסחר במרכז. Lumen היא super-app שבה הכסף נע בתוך השיחה, ותשלומי צ'אט, מנויים ו-earn חולקים את מסך הבית. Fern מובילה בהעברות — תשלומים בקבוצות והמרת מט"ח לפי כללים קודם כול. Volt היא גרסת stablecoin כהה עם ממיין משכורת וכרטיסי צוות. Meridian היא רב-מטבעית: חשבון EUR לצד USDC, יתרת נסיעות ב-GBP וחשבון BTC שאליו נוחתות הטבות הכרטיס. חמישה מותגים, חמש ארכיטקטורות מידע, חמישה תמהילי פיצ'רים — ספר חשבונות אחד, KYC אחד ומעבד כרטיסים אחד מתחת לכולם.

מכל זה לא נובע שהמוצר הוא חמש אפליקציות. החמישה הם כיוונים שאותו pipeline יכול לקחת; המספר שחשוב אינו חמש, אלא כמה tenants תקימו. כל אחד מהם הוכחה לכך שצד הלקוח יכול להיות שונה עד צורת מסך הבית, בעוד הליבה שמתחתיו אפילו לא מרגישה בכך.

הליבה היא החלק שאסור לכם להמציא מחדש; האפליקציה היא החלק שאסור לכם להגביל. פלטפורמת whitelabel היא המשמעת לשמור ששני המשפטים האלה נכונים בו-זמנית.
— Protocore · Platform engineering

למה theming ברמת ה-tokens עדיף על פיצול הקוד

יש שתי דרכים לגרום למוצר אחד להיראות כמו רבים. הברורה היא fork: מעתיקים את הקוד לכל לקוח, מעצבים מחדש ומשחררים. זה עובד בדיוק לגרסה אחת. מאותה נקודה כל תיקון באג וכל שינוי רגולטורי צריכים להיות מיושמים N פעמים על פני N עותקים שסוטים זה מזה, העותקים יוצאים מסנכרון, ומשטח האבטחה שצריך להבין גדל כפול מספר הלקוחות. Fork הופך מערכת אחת שמבינים להרבה מערכות שלא.

Theming ברמת ה-tokens הופך את התמונה. יש codebase אחד. מותג הוא קבוצת ערכים — tokens לצבע, טיפוגרפיה, רדיוס וריווח; תצורת רכיבים; וסט feature flags — שנפתרים בזמן build לאפליקציה ממותגת. משנים token וכל מסך שקורא אותו זז יחד, כי שום דבר לא מקודד קשיח ערך שהיה צריך לבוא מ-token. תיקון בתהליך ההעברה יוצא לכל ה-tenants בבת אחת, כי יש רק תהליך העברה אחד לתקן. המותגים נבדלים בתצורה שלהם, לא בקוד המקור.

איפה יושבת מערכת העיצוב

ה-tokens אינם רעיון מרחף; הם artifact שמשוחרר בפועל. ה-Protocore Design System — /products/pds — הוא 144 design tokens ו-889 utility classes: אוצר המילים שבו כל אפליקציה מעוצבת. הוא dark-first, מבוסס tokens, ועם radius אפס כברירת מחדל, ואותו סט tokens מופק ל-web, ל-.NET ול-native, כך שצבע שהוגדר פעם אחת הוא אותו צבע במסך React, בקונסולת דסקטופ ובבילד מובייל native. המותג של tenant מובע כ-overrides מעל אוצר המילים הזה, ולכן עיצוב מחדש של אפליקציה הוא שינוי תצורה ולא כתיבה מחדש.

זה גם מה שהופך את צד הלקוח לחופשי באמת ולא חופשי רק בתוך תבנית. מפני שהשפה העיצובית חיה ב-tokens וב-utility classes ולא ב-stylesheets חד-פעמיים, מעצב יכול להרחיק tenant הרבה מבילד הייחוס — פלטה, טיפוגרפיה, צפיפות וקצב משלו — בלי לגעת בליבה ובלי לפצל את האפליקציה. הצבע חודר עמוק, אבל הוא עדיין רק צבע; הצנרת שמתחתיו משותפת.

האפליקציה היא תצורה, לא build

תמהיל הפיצ'רים כפוף לאותו כלל. כל מודול — תשלומי צ'אט, earn, קריפטו, כרטיסים, מנויים, כרטיסי צוות, הפניות — הוא מתג שמופעל לכל tenant, ואפשר לפתוח flag לפרוסה של משתמשים לפני שמרחיבים. מפעילים מחליפים אותם מלוח תצורה, לא מ-deploy. כך שההבדל בין אפליקציית העברות חשופה ל-super-app מלאה אינו שני פרויקטים; אלה שתי תצורות של פרויקט אחד. אפליקציית הייחוס שממנה כל tenant מתחיל היא בילד ניטרלי במיתוג Protocore, עם כל התפריט נוכח — כל whitelabel הוא הבילד הזה עם tokens שנדרסו ומודולים שהופעלו או כובו.

הגבול, בלי עיגולי פינות

ליבה אחת, אפליקציות רבות מצדיקה את המנגנון רק כשיש לכם באמת אפליקציות רבות — או אפליקציה אחת שאתם מתכוונים לעצב מחדש, לסדר מחדש ולהגדיר מחדש לאורך זמן בלי לבנות את הבנק מחדש בכל סבב. אם אתם משחררים אפליקציה קבועה אחת שלעולם לא תלבש מותג שני, אתם לא צריכים פלטפורמת whitelabel; אתם צריכים אפליקציה. היא מוכיחה את עצמה במקרה שלשמו נבנתה: פלטפורמה שמעמידה מוצרי בנקאות ממותגים tenant אחרי tenant, כל אחד בבירור שלו, ואף אחד מהם לא fork. הפירוק המלא — חמשת הכיוונים, אפליקציית הייחוס וקונסולת התפעול שמאחוריהם — ב-/products/pay, ומערכת העיצוב שמתחת ב-/products/pds.

יש מערכת לבנות?

ספרו לנו מהי הבעיה. נחזור עם ארכיטקטורה ותוכנית.