Configuring the Business Formulas

The Business Formulas processor handles different inputs from your digital journey in order to generate desired outputs. By inserting arguments and using them in steps, the system creates complex calculations to be triggered in a flow. The order of the formula execution for the scoring done by the marketplace:

The order of the formula execution for the scoring done by the bank is:

IMPORTANT!  
The formulas and matrices are for example purposes only. They are subject to internal modifications for each implementation.

BNPL_KO

This formula calculates the knock-out criteria for the customer.

Field Example
Name BNPL_KO
Formula Input BNPL_KO
Start date 07/03/2022 16:42

Formula steps:

Name Description Master Type SubType Calculation Type Formula
KO_bnplWithDpdPast12Months It checks if the number of days is over 15. Simple Type Boolean Normal
Copy
result = DataSet("BNPL_KO_BnplWithDpdPast12Months", ("bnplWithDpdPast12Months", bnplWithDpdPast12Months)) == 1;
KO_dpdForBnplActiveProducts It checks if the number of active products is zero. Simple Type Boolean Normal
Copy
result = DataSet("BNPL_KO_DpdForBnplActiveProducts", ("dpdForBnplActiveProducts", dpdForBnplActiveProducts)) == 1;
KO_ordersReturnedPercentage It checks if the orders returned percetage is 0.5. Simple Type Boolean Normal
Copy
result = DataSet("BNPL_KO_OrdersReturnedPercentage", ("ordersReturnedPercentage", ordersReturnedPercentage)) == 1;
KO_bnplRefusedPaymentsNoLast30Days It checks if the refused payments in the last 30 days is over 5. Simple Type Boolean Normal
Copy
result = DataSet("BNPL_KO_BnplRefusedPaymentsNoLast30Days", ("bnplRefusedPaymentsNoLast30Days", bnplRefusedPaymentsNoLast30Days)) == 1;
KO_hasModifiedCredentialsPast24Hours It checks if the credentials were modified in the last 24h. Simple Type Boolean Normal
Copy
result = DataSet("BNPL_KO_HasModifiedCredentialsPast24Hours", ("hasModifiedCredentialsPast24Hours", hasModifiedCredentialsPast24Hours)) == 1;
KO_Final It determines the knock-out of the customer. Simple Type Boolean Normal
Copy
var criterias = KO_bnplWithDpdPast12Months && KO_dpdForBnplActiveProducts && KO_ordersReturnedPercentage && KO_bnplRefusedPaymentsNoLast30Days && KO_hasModifiedCredentialsPast24Hours;
result = !criterias;

Data Set BNPL_KO_BnplWithDpdPast12Months

Matrix
bnplWithDpdPast12Months Values Description
(15;] 0 The customer fails the check.
[;15] 1 The customer passes the check.

Data Set BNPL_KO_DpdForBnplActiveProducts

Matrix
dpdForBnplActiveProducts Values Description
(0;] 0 The customer fails the check.
[;0] 1 The customer passes the check.

Data set BNPL_KO_ordersReturnedPercentage

Matrix
ordersReturnedPercentage Values Description
(0.5;] 0 The customer fails the check.
[;0.5] 1 The customer passes the check.

Data set BNPL_KO_bnplRefusedPaymentsNoLast30Days

Matrix
bnplRefusedPaymentsNoLast30Days Values Description
(5;] 0 The customer fails the check.
[;5] 1 The customer passes the check.

Data set BNPL_KO_hasModifiedCredentialsPast24Hours

Matrix
hasModifiedCredentialsPast24Hours Values Description
(0;] 0 The customer fails the check.
[;0] 1 The customer passes the check.

BNPL_Scoring

After the customer continued to the check out page, the system decided if the customer is eligible for the limit. The data is hard-coded, but it can be fetched via API. For eligibility rules, the customer fails if:

  • Buy Now, Pay Later with DPD >15 days in the past 12 months
  • DPD more then 0 for Buy Now, Pay Later active products
  • orders returned in the past 30 days >50%
  • payments for Buy Now, Pay Later initiated at checkout and refused >5 in the past  30 days
  • customer has modified the credentials in the past 24 hours.
Field Example
Name BNPL_Scoring
Formula Input BNPL_Scoring
Start date 07/03/2022 17:40

Formula steps:

Name Description Master Type SubType Calculation Type Formula
SCORING_customerLoyalty It determines the customer loyalty. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_CustomerLoyalty", ("CustomerLoyalty", customerLoyalty));
SCORING_averageCheckoutTicketSIze It determines the average checkout ticket size in the past 12 months. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_AverageCheckoutTIcketSize", ("AverageCheckoutTicketSize", averageCheckoutTicketSize));
SCORING_mostCommonInstrument It determines the type of payment used by the customer used in the last 12 months. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_MostCommonPaymentInstrument", ("MostCommonPayment", paymentInstrument));
SCORING_maxDPD It determines the maximum DPD in the past 12 months for Buy Now, Pay Later payments. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_MaxDPD", ("maxDPD", maxDPD));
SCORING_advancePay It determines how many times the customer paid

in advanced in the past 12 months

.
Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_AdvancePayments", ("AdvancePayments", payedInAdvance));
SCORING_usageRate It determines the usage rate for Buy Now, Pay Later in past 12 months. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_UsageRate", ("BNPLUsageRate", BNPLUsageRate));
SCORING_returnedProductsPercent It determines the

% of returned products in the past 12 months, min 10 orders placed.

Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_ReturnedProductsPercent", ("returnedProductsPercent", returnedProductsPercent));
SCORING_uniqueCardsUsed It determines the number of unique cards used for transactions in the past 12 months, it must be more than 10 orders. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_UniqueCardsUsed", ("UniqueCardsUsed", uniqueCardsNo));
SCORING_CustomerAge It determines the age of the customer. Simple Type Whole Number Normal
Copy
result = DataSet("BNPL_Scoring_CustomerAge", ("CustomerAge", customerAge));
Userscore It calculates the scoring per customer. Simple Type Whole Number Normal
Copy
result = SCORING_customerLoyalty + SCORING_averageCheckoutTicketSIze + SCORING_mostCommonInstrument +   SCORING_maxDPD + SCORING_advancePay + SCORING_usageRate + SCORING_returnedProductsPercent 
+ SCORING_uniqueCardsUsed + SCORING_CustomerAge;
 

Data set BNPL_Scoring_CustomerLoyalty

The hard-coded values from the following data sets are placed in FTOS_EC_ShoppingCartLoader.

It is measured in years.

Matrix
Customer LoyaltyValuesDescription
[-1;-1]5N/A
[0;1)5customer for <1 year
[1;2]10customer for 1-2 years
(2;3]15customer for 2-3 years
(3;4]20

customer for 3-4 years

The hard-coded value is 4.

(4;]25customer for >4 years
 

Data set BNPL_Scoring_AverageCheckoutTIcketSize

It is measured in euros.

Matrix
AverageCheckoutTicketSizeValuesDescription
[-1;-1]5N/A
[0;10)5<50 EURO
[10;30]10<20 EURO
[31;50]15

20 - 50 EURO

The hard-coded value is 31.

[51;100]2051 -100 EURO
[101;300]25101-300 EURO
[301;500]30301- 500 EURO
[501;]35>500 EURO
 

Data set BNPL_Scoring_MostCommonPaymentInstrument

Matrix
MostCommonPaymentValueDescription
N/A5 
Cash at delivery5 
Debit Card10 
Credit Card15 
Bank Transfer10The hard-coded value is Bank Transfer.
BNPL20 
 

Data set BNPL_SCORING_maxDPD

Matrix
maxDPDValuesDescription
[-1;-1]5N/A
[0;0]250 days past due
[1;5]15between 1 and 5 DPD
[6;10]10between 6 and 10 DPD
(10;15]5between 10 and 15 DPD
 

Data Set BNPL_Scoring_AdvancePayments

Matrix
AdvancePaymentsValuesDescription
[-1;-1]5N/A
[0;0]5Never payed in advance
[1;1]10Payed in advance at least once
(1;]20

Payed in advance more than once

The hard-coded value is 2.

Data Set BNPL_Scoring_UsageRate

Matrix
BNPLUsageRateValuesDescription
[-1;-1]5The customer has never paid using Buy Now, Pay Later.
[0;0]5 
[1;5]10The customer has paid using Buy Now, Pay Later 1-5 times.
[6;10]15The customer has paid using Buy Now, Pay Later 6-10 times.
[11;20]20

The hard-coded value is 20.

The customer has paid using Buy Now, Pay Later 11-20 times.

[21;40]25The customer has paid using Buy Now, Pay Later 21-40 times.
(40;]30The customer has paid using Buy Now, Pay Later >40 times.
 

Data set BNPL_SCORING_returnedProductsPercent

Matrix
returnedProductsPercentValuesDescription
[-1;-1]5N/A
[0;5]20<5% of returned products
(5;10]155-10% of returned products
(10;25]10

>10% - 25% of returned products

The hard-coded value is 20.

(25;50]5>25%- 50% of returned products
 

Data set BNPL_SCORING_uniqueCardsUsed

Matrix
UniqueCardsUsedValuesDescription
[-1;-1]5N/A
[0;2)30<2
[2;3]20

between 2 - 3 cards

The hard-coded value is 3.

[4;5]10between 4 -5 cards
(5;]5>5 cards
 

Data set BNPL_SCORING_CustomerAge

Matrix
CustomerAgeValuesDescription
[-1;-1]5N/A
[18;25]5between 18 and 25 years
(25;35]10between 25 and 35 years
(35;50]15

between 35 and 50 years

The hard-coded value is 40.

(50;]20over 50 years

BNPL_Limit

It calculates the limit of the customer. If the user score is over 100, the system assigns a limit to that user and progresses to the next calculation Product availability rules. If the user score is below 100, the system does not show any Buy Now, Pay Later products in the Payment screen. If the total check out value is over or equal to the limit, then the system does not trigger the risk calculations and the customer cannot pay with Buy Now, Pay Later.

FieldExample
NameBNPL_Scoring
Formula InputBNPL_Scoring
Start date07/03/2022 17:40
 

Formula steps:

NameMaster TypeSubTypeCalculation TypeFormula
LIMIT_userscoreSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Limit", ("UserScore", userScore), ("currencyCode", currencyCode));

The currencyCode is hard-coded to EUR.

Data set BNPL_Limit

Matrix
UserScoreValuesDescription
[45;100]0 
[101;150]250 
[151;180]500 
[181;225]1000The hard-coded value is 200.

BNPL_RK_AvailableProducts

This formula calculates the available products.

FieldExample
NameBNPL_RK_AvailableProducts
Formula InputBNPL_RK_AvailableProducts
Start date07/03/2022 12:54

Formula steps:

NameDescriptionMaster TypeSubTypeCalculation TypeNumber of iterationsFormula
availableProductsThis formula calculates based on the data set BNPL_Risk_AvailableProducts containing the product code and the score the available products to be offered.CollectionTextIterationproductCodes
Copy
var available = DataSet("BNPL_Risk_AvailableProducts", ("Score", score), ("ProductCode", productCodes[i]), ("CountryCode", countryCode));
if (available == 1) {
    result[i] = productCodes[i];
}
else result[i] = null;
 

Data set BNPL_Risk_AvailableProducts has two data set values depending on the country Germany or France.

BNPL_Risk_AvailableProducts - DE

Score/ProductBNPL30DBNPL3XBNPL4XBNPL5XBNPL6XBNPL7XBNPL8XBNPL9XBNPL10XBNPL11XBNPL12X
[101;150]01000000000
[151;180]01111000000
[181;]01111000000
[;100]00000000000

BNPL_Risk_AvailableProducts - FR

Score/ProductBNPL30DBNPL3XBNPL4XBNPL5XBNPL6XBNPL7XBNPL8XBNPL9XBNPL10XBNPL11XBNPL12X
[;100]00000000000
[101;150]11000000000
[151;180]11111110000
[181;]11111111111

BNPL_RK_RiskLevel

After the customer selected the product type, the system calculates the risk level based on the total cart value and the product used. Based on the risk level, the system can decide to ask for additional information from the customer so that they can access the Buy Now, Pay Later product.

FieldExample
NameBNPL_RK_RiskLevel
Formula InputBNPL_RK_RiskLevel
Start date07/03/2022 14:56

Formula steps:

NameDescriptionMaster TypeSubTypeCalculation TypeFormula
riskLevelThis formula determines the risk level based on the amount and product code. Each amount range has a risk level.Simple TypeTextNormal
Copy
result = DataSet("BNPL_RK_RiskLevel", ("amount", amount), ("productCode", productCode));

Data set BNPL_RK_RiskLevel

Name

Matrix

BNPL_RK_RiskLevel - BNPL10X
AmountRisk
(;300)1
[300;800]2
(800;)3
BNPL_RK_RiskLevel - BNPL11X
AmountRisk
(;300)1
[300;800]2
(800;)3
BNPL_RK_RiskLevel - BNPL12X
AmountRisk
(;300)1
[300;800]2
(800;)3
BNPL_RK_RiskLevel - BNPL30D
AmountRisk
(;100)1
[100;300]2
(300;)3
BNPL_RK_RiskLevel - BNPL3X
AmountRisk
(;200)1
[200;600]2
(600;)3
BNPL_RK_RiskLevel - BNPL4X
AmountRisk
(;200)1
[200;600]2
(600;)3
BNPL_RK_RiskLevel - BNPL5X
AmountRisk
(;200)1
[200;600]2
(600;)3
BNPL_RK_RiskLevel - BNPL6X
AmountRisk
(;200)1
[200;600]2
(600;)3
BNPL_RK_RiskLevel - BNPL7X
AmountRisk
(;250)1
[250;700]2
(700;)3
BNPL_RK_RiskLevel - BNPL8X
AmountRisk
(;250)1
[250;700]2
(700;)3
BNPL_RK_RiskLevel - BNPL9X
AmountRisk
(;250)1
[250;700]2
(700;)3
   

BNPL_FinancialCalculation

This formula calculates whether the loan is approved or not.

FieldExample
NameBNPL_FinancialCalculation
Formula InputBNPL_FinancialCalculation
Start date04/04/2022 17:54

Formula steps:

NameMaster TypeSub TypeCalculation TypeFormula
DTISimple TypeDecimalNormal
Copy
result = expense / income;
availableDTISimple TypeDecimalNormal
Copy
result = maxDTI - DTI;
maxInstallmentSimple TypeDecimalNormal
Copy
if (availableDTI > 0) {
    result = (decimal)(availableDTI * income);
}
else result = (decimal)(0);
decisionSimple TypeTextNormal
Copy
if (availableDTI > 0 && maxInstallment >= monthlyInstallment)
    result = "Approved";
else result = "Rejected";

BNPL_KO_Risk

This formula determines the risk level of a customer based on age and employment status.

FieldExample
NameBNPL_KO_Risk
Formula InputBNPL_KO_Risk
Start date21/03/2022 09:44

Formula steps:

NameMaster TypeSubTypeCalculationTypeExclude From MappingFormula
KO_Risk_AgeSimple TypeBooleanNormalFALSE
Copy
result = DataSet("BNPL_KO_Risk_Age", ("age", age)) == 1;
KO_Risk_EmploymentStatusSimple TypeBooleanNormalFALSE
Copy
result = DataSet("BNPL_KO_Risk_EmploymentStatus", ("EmploymentStatus", employmentStatus)) == 1;
KO_Risk_DecisionSimple TypeBooleanNormalFALSE
Copy
result = KO_Risk_Age || KO_Risk_EmploymentStatus;
 

Data set BNPL_KO_Risk_Age

AgeValues
[;18)1
[18;]0
 

Data set BNPL_KO_Risk_EmploymentStatus

EmploymentStatusValues
Unemployed1
Student1
Housewife1

BNPL_MaxDTI_Risk

This formula determines the value for the risk category based on the user score.

FieldExample
NameBNPL_MaxDTI_Risk
Formula InputBNPL_MaxDTI_Risk
Start date01/04/2022 03:00

Formula steps:

NameMaster TypeSub TypeCalculation Type

Formula

Exclude From Mapping
MAXDTI_riskCategorySimple TypeTextNormal
Copy
result = DataSet("BNPL_Scoring_Risk_Category", ("UserScore", userScore));
FALSE
MAXDTISimple TypeDecimalNormal
Copy
result = DataSet("BNPL_Scoring_Risk_MaxDTI", ("RiskCategory", MAXDTI_riskCategory));
FALSE
 

Data set BNPL_Scoring_Risk_Category

User ScoreValues
[45;100]D
[101;150]C
[151;180]B
[181;225]A
 

Data set BNPL_Scoring_Risk_MaxDTI

Risk CategoryValues
A0.4
B0.3
C0.2
D0

BNPL_Scoring_Risk

This formula determines the scoring of a customer based on the age, marital status, employment status, time spent at current employer, DPD, active number of loans, education and user score.

FieldExample
NameBNPL_Scoring_Risk
Formula InputBNPL_Scoring_Risk
Start date01/04/2022 03:00

Formula steps:

NameMaster TypeSub TypeCalculation TypeFormulaExclude From Mapping
SCORING_ageSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_Age", ("Age", age));
FALSE
SCORING_maritalStatusSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_MaritalStatus", ("MaritalStatus", maritalStatus));
FALSE
SCORING_employmentStatusSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_EmploymentStatus", ("EmploymentStatus", employmentStatus));
FALSE
SCORING_timeAtCurrEmployerSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_EmploymentStatus", ("EmploymentStatus", employmentStatus));
FALSE
SCORING_DPDSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_DPD", ("DPD", DPD));
FALSE
SCORING_activeLoansNoSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_ActiveLoansNo", ("ActiveLoansNo", activeLoansNo));
FALSE
SCORING_educationSimple TypeWhole NumberNormal
Copy
result = DataSet("BNPL_Scoring_Risk_Education", ("Education", education));
FALSE
userScoreSimple TypeWhole NumberNormal
Copy
result = SCORING_age + SCORING_maritalStatus + SCORING_employmentStatus + 
SCORING_timeAtCurrEmployer + SCORING_DPD + SCORING_activeLoansNo + SCORING_education;
FALSE
 

Data set BNPL_Scoring_Risk_Age

AgeValues
[;26)5
[26;31]10
[32;41]15
[42;51]35
[52;]30
 

Data set BNPL_Scoring_Risk_MaritalStatus

Marital StatusValues
Married35
Civil partnership10
Single10
Widow20
Separated15
 

Data set BNPL_Scoring_Risk_EmploymentStatus

Employment StatusValues
Full-time employed30
Retired25
Self employed15
Management/ Mandate contract10
Unemployed/ Student/ Housewife5
 

Data set BNPL_Scoring_Risk_ActiveLoansNo

Active Loans NoValues
[0;0]30
[1;1]15
[2;2]10
[3;]5
[-1;-1]5
[-2;-2]10
 

Data set BNPL_Scoring_Risk_TimeSpentAtCurrentEmployer

Time Spent Current EmployerValues
(10;)30
(5;10]10
(2;5]15
[1;2]10
(;1)5
  

Data set BNPL_Scoring_Risk_DPD

DPDValues
[0;29]35
[30;59]15
[60;89]10
[90;]5
[-2;-2]20
[-1;-1]5
 

Data set BNPL_Scoring_Risk_Education

EducationValues
University30
High school20
Middle school15
Elementary school10