Personal Loan - V2 Configuration
Product Type: Unsecured Personal Lending
Use Case: General purpose loans for individuals
Typical Amount: ₦50,000 - ₦5,000,000
Typical Tenor: 6-60 months
Interest Rate: 15.5% - 35% per annum
Overview
Personal loans are unsecured general-purpose loans designed for individual customers. They offer flexible terms for various personal needs including education, home improvements, medical expenses, and debt consolidation.
Key Features
- No collateral required
- Fixed monthly repayments
- Flexible loan amounts and tenors
- Income verification required
- Optional guarantor
- Early repayment allowed
YAML Field Reference
Basic Information Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
productCode | String | ✅ Yes | Unique code identifying the loan product | "PL-001" |
productName | String | ✅ Yes | Display name of the product | "Personal Loan" |
description | String | No | Detailed product description | "Unsecured personal loan for individuals" |
isActive | Boolean | No | Whether product is currently active | true |
loanProductType | String | No | Type of loan product (V1 compatibility) | "FixedTermLoan" |
repaymentAllocationOrder | String | No | Order of payment allocation | "FEES_PENALTY_INTEREST_PRINCIPAL" |
lineOfBusiness | Enum | No | Business line classification | "Retail" |
currencyCode | String | No | Currency code (e.g., NGN, USD) | "NGN" |
Loan Tenure Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
minimumMonths | Integer | ✅ Yes | Minimum loan duration in months | 6 |
maximumMonths | Integer | ✅ Yes | Maximum loan duration in months | 60 |
defaultMonths | Integer | No | Default tenure offered | 12 |
Principal Range Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
minimumAmount | Decimal | No | Minimum loan amount | 50000 |
maximumAmount | Decimal | No | Maximum loan amount | 5000000 |
defaultAmount | Decimal | No | Default loan amount suggested | 500000 |
Interest Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
isEnabled | Boolean | ✅ Yes | Whether interest is charged | true |
rate.default | Decimal | ✅ Yes | Default interest rate (%) | 15.5 |
rate.minimum | Decimal | No | Minimum interest rate (%) | 12.0 |
rate.maximum | Decimal | No | Maximum interest rate (%) | 35.0 |
calculationMethod | Enum | ✅ Yes | Interest calculation method | "DecliningBalance" |
deductionMethod | Enum | No | How interest is collected | "PaymentDueDate" |
rateTerms | Enum | No | Rate expression (per year/month) | "PerYear" |
Interest Calculation Methods:
DecliningBalance- Interest calculated on reducing balance (most common)Flat- Interest calculated on original principal amountDecliningBalanceEqualInstallments- Equal monthly payments with declining interest
Repayment Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
frequency | Enum | ✅ Yes | Repayment frequency | "Monthly" |
allocationOrder | String | No | Payment allocation priority | "FEES_PENALTY_INTEREST_PRINCIPAL" |
principalCollectionInterval | Integer | No | Collect principal every X repayments | 1 |
firstDueDateOffset | Integer | No | Days until first repayment | 30 |
Repayment Frequencies: Daily, Weekly, Biweekly, Monthly, Quarterly, Annually
Fees Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
fees[].code | String | ✅ Yes | Unique fee code | "PROC_FEE" |
fees[].name | String | ✅ Yes | Fee display name | "Processing Fee" |
fees[].feeType | Enum | ✅ Yes | When fee is applied | "DeductedDisbursement" |
fees[].calculationType | Enum | ✅ Yes | How fee is calculated | "PercentOfPrincipal" |
fees[].value | Decimal | ✅ Yes | Fee amount or percentage | 2.5 |
fees[].minimum | Decimal | No | Minimum fee amount | 5000 |
fees[].maximum | Decimal | No | Maximum fee amount | 50000 |
fees[].glAccountId | Integer | No | GL account for fee income | 40001 |
Fee Types:
Manual- Applied manuallyDeductedDisbursement- Deducted from loan amountCapitalizedDisbursement- Added to principalUpfrontDisbursement- Paid before disbursementLateRepayment- Charged on late payments
Penalty Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
isEnabled | Boolean | No | Whether penalties are charged | true |
tolerancePeriod | Integer | No | Grace period in days before penalty | 3 |
calculationMethod | Enum | No | Penalty calculation basis | "OverduePrincipal_DaysLate_Rate" |
rate.default | Decimal | No | Default penalty rate (%) | 2.0 |
rate.minimum | Decimal | No | Minimum penalty rate (%) | 1.0 |
rate.maximum | Decimal | No | Maximum penalty rate (%) | 5.0 |
Collateral Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
isRequired | Boolean | No | Whether collateral is mandatory | false |
types[] | Array | No | Accepted collateral types | ["Property", "Vehicle"] |
coverageRatio | Decimal | No | Required collateral value ratio (%) | 120 |
Eligibility Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
minimumAge | Integer | No | Minimum customer age | 21 |
maximumAge | Integer | No | Maximum customer age | 60 |
minimumIncome | Decimal | No | Minimum monthly income required | 50000 |
employmentStatus[] | Array | No | Accepted employment types | ["Employed", "SelfEmployed"] |
requiredDocuments[] | Array | No | Required documentation | ["NationalID", "ProofOfIncome"] |
kycLevel | Enum | No | Required KYC level | "Tier2" |
Notifications Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
sendApplicationConfirmation | Boolean | No | Notify on application submission | true |
sendApprovalNotification | Boolean | No | Notify on approval | true |
sendDisbursementNotification | Boolean | No | Notify on disbursement | true |
sendRepaymentReminders | Boolean | No | Send repayment reminders | true |
reminderDaysBefore | Integer | No | Days before due date to remind | 3 |
channels.sms | Boolean | No | Enable SMS notifications | true |
channels.email | Boolean | No | Enable email notifications | true |
channels.push | Boolean | No | Enable push notifications | false |
Complete Sample YAML Configuration
basicInfo:
productCode: "PL-STANDARD-001"
productName: "Standard Personal Loan"
description: "Unsecured personal loan for general purposes"
isActive: true
loanProductType: "FixedTermLoan"
repaymentAllocationOrder: "FEES_PENALTY_INTEREST_PRINCIPAL"
lineOfBusiness: "Retail"
currencyCode: "NGN"
loanTenure:
minimumMonths: 6
maximumMonths: 60
defaultMonths: 12
principalRange:
minimumAmount: 50000
maximumAmount: 5000000
defaultAmount: 500000
interestConfig:
isEnabled: true
rate:
default: 15.5
minimum: 12.0
maximum: 35.0
calculationMethod: "DecliningBalance"
deductionMethod: "PaymentDueDate"
rateTerms: "PerYear"
repaymentConfig:
frequency: "Monthly"
allocationOrder: "FEES_PENALTY_INTEREST_PRINCIPAL"
principalCollectionInterval: 1
firstDueDateOffset: 30
fees:
- code: "PROC_FEE"
name: "Processing Fee"
feeType: "DeductedDisbursement"
calculationType: "PercentOfPrincipal"
value: 2.5
minimum: 5000
maximum: 50000
glAccountId: 40001
- code: "MGMT_FEE"
name: "Management Fee"
feeType: "CapitalizedDisbursement"
calculationType: "Flat"
value: 10000
glAccountId: 40002
penaltyConfig:
isEnabled: true
tolerancePeriod: 3
calculationMethod: "OverduePrincipal_DaysLate_Rate"
rate:
default: 2.0
minimum: 1.0
maximum: 5.0
collateralConfig:
isRequired: false
types:
- "Property"
- "Vehicle"
- "Guarantor"
coverageRatio: 0 # Not required for personal loans
eligibilityConfig:
minimumAge: 21
maximumAge: 60
minimumIncome: 50000
employmentStatus:
- "Employed"
- "SelfEmployed"
requiredDocuments:
- "NationalID"
- "ProofOfIncome"
- "UtilityBill"
kycLevel: "Tier2"
notificationsConfig:
sendApplicationConfirmation: true
sendApprovalNotification: true
sendDisbursementNotification: true
sendRepaymentReminders: true
reminderDaysBefore: 3
channels:
sms: true
email: true
push: false
accountingConfig:
methodology: "Accrual"
glAccounts:
portfolioControlAccount: 10501
interestReceivableAccount: 10502
feeReceivableAccount: 10503
penaltyReceivableAccount: 10504
interestIncomeAccount: 40101
feeIncomeAccount: 40102
penaltyIncomeAccount: 40103
Use Cases & Examples
Example 1: Standard Personal Loan
Scenario: Customer needs ₦500,000 for home renovation over 12 months.
Configuration:
- Principal: ₦500,000
- Tenor: 12 months
- Interest: 15.5% per annum (Declining Balance)
- Processing Fee: 2.5% (₦12,500)
Monthly Repayment Calculation:
Using Declining Balance:
Monthly Interest Rate = 15.5% / 12 = 1.292%
Monthly Payment = ₦500,000 × [0.01292 × (1 + 0.01292)^12] / [(1 + 0.01292)^12 - 1]
Monthly Payment ≈ ₦44,859
Total Repayment: ₦538,308
Total Interest: ₦38,308
Example 2: Low-Income Personal Loan
principalRange:
minimumAmount: 50000
maximumAmount: 500000 # Lower max
defaultAmount: 200000
interestConfig:
rate:
default: 18.0 # Slightly higher risk
minimum: 15.0
maximum: 25.0
eligibilityConfig:
minimumIncome: 30000 # Lower income threshold
maximumAge: 55 # Lower age limit
Example 3: High-Value Personal Loan
principalRange:
minimumAmount: 1000000
maximumAmount: 10000000 # Higher max
interestConfig:
rate:
default: 12.5 # Better rate for higher amounts
minimum: 10.0
maximum: 18.0
eligibilityConfig:
minimumIncome: 300000 # Higher income requirement
requiredDocuments:
- "NationalID"
- "ProofOfIncome"
- "BankStatements6Months"
- "TaxClearance"
Common Configurations
Quick Approval Personal Loan
eligibilityConfig:
minimumAge: 25
minimumIncome: 100000
requiredDocuments:
- "NationalID"
- "BankStatement3Months"
collateralConfig:
isRequired: false
notificationsConfig:
sendApplicationConfirmation: true
channels:
sms: true
email: true
Secured Personal Loan (Lower Rate)
interestConfig:
rate:
default: 12.0 # Lower due to collateral
minimum: 10.0
maximum: 18.0
collateralConfig:
isRequired: true
types:
- "Property"
- "Vehicle"
coverageRatio: 120
Interest Calculation Examples
Declining Balance (Reducing Balance)
Most Common Method - Interest calculated on remaining principal.
Loan Amount: ₦500,000
Interest Rate: 15.5% p.a. (1.292% monthly)
Tenor: 12 months
Month 1:
Opening Balance: ₦500,000
Interest: ₦500,000 × 1.292% = ₦6,458
Principal: ₦44,859 - ₦6,458 = ₦38,401
Closing Balance: ₦461,599
Month 2:
Opening Balance: ₦461,599
Interest: ₦461,599 × 1.292% = ₦5,963
Principal: ₦44,859 - ₦5,963 = ₦38,896
Closing Balance: ₦422,703
...continues until paid off
Flat Rate (Less Common)
Interest calculated on original principal throughout.
Loan Amount: ₦500,000
Interest Rate: 15.5% p.a. flat
Tenor: 12 months
Total Interest: ₦500,000 × 15.5% = ₦77,500
Total Repayment: ₦577,500
Monthly Payment: ₦577,500 / 12 = ₦48,125 (fixed)
Validation Rules
Built-in Validations
-
Tenure Validation:
minimumMonthsmust be > 0maximumMonthsmust be >=minimumMonths
-
Principal Validation:
minimumAmountmust be > 0maximumAmountmust be >=minimumAmount
-
Interest Rate Validation:
defaultmust be betweenminimumandmaximum- All rates must be > 0
-
Fee Validation:
- Each fee must have unique
code valuemust be > 0- If
minimum/maximumspecified,valuemust be within range
- Each fee must have unique
Business Rule Validations
Implementation details removed for security.
Contact support for implementation guidance.
Troubleshooting
Issue: "Interest rate out of range"
Cause: Requested rate not within configured min/max.
Solution: Check interestConfig.rate bounds:
interestConfig:
rate:
default: 15.5
minimum: 12.0 # Must be <= default
maximum: 35.0 # Must be >= default
Issue: "Tenure not allowed"
Cause: Requested months outside configured range.
Solution: Verify loanTenure settings:
loanTenure:
minimumMonths: 6
maximumMonths: 60 # Must accommodate request
Issue: "Fee calculation error"
Cause: Fee configuration mismatch.
Solution: Ensure fee calculation type matches value:
fees:
- calculationType: "PercentOfPrincipal"
value: 2.5 # Percentage (not 0.025)
- calculationType: "Flat"
value: 10000 # Fixed amount
Migration from V1
V1 Field Mapping
| V1 Field/Table | V2 YAML Path |
|---|---|
LoanProduct.LoanProductType | basicInfo.loanProductType |
LoanProduct.RepaymentAllocationOrder | basicInfo.repaymentAllocationOrder |
LoanProductInterestSetting.* | interestConfig.* |
RepaymentReschedulingSetting.* | repaymentConfig.* |
LoanAmountSetting.* | principalRange.* |
LoanProductPenaltySetting.* | penaltyConfig.* |
LoanProductFee records | fees[] array |
Migration Script Example
Implementation details removed for security.
Contact support for implementation guidance.
Last Updated: January 2, 2026
API Version: V2 (BPMCore)
Product Category: Loan Products
Complexity: ââ (Moderate)