Savings Account - V2 Configuration
Product Type: Interest-Bearing Deposit Account
Use Case: Personal savings, emergency fund, goal-based saving
Minimum Balance: ₦1,000 - ₦10,000
Interest Rate: 2% - 6.5% per annum (tiered)
Transaction Limits: 4-10 free withdrawals/month
Overview
Savings accounts are interest-bearing deposit accounts designed for personal savings with tiered interest rates based on account balance. They offer limited withdrawal transactions to encourage saving behavior.
Key Features
- Tiered Interest Rates: Higher balances earn better rates
- Transaction Limits: Free withdrawals up to monthly limit
- Dormancy Tracking: Auto-dormancy after inactivity period
- Minimum Balance Requirements: Penalties for falling below threshold
- Daily Balance Interest: Interest calculated on daily balances
- Mobile & Online Banking: Digital-first access
- Auto-Savings: Standing order and round-up features
YAML Field Reference
Basic Information Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
productCode | String | ✅ Yes | Unique product code | "SA-REGULAR-001" |
productName | String | ✅ Yes | Display name | "Regular Savings Account" |
description | String | No | Product description | "Standard savings account" |
isActive | Boolean | No | Product status | true |
depositAccountType | String | ✅ Yes | Account type | "Savings" |
lineOfBusiness | Enum | No | Business classification | "Retail" |
Minimum Balance Configuration
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
minimumOpeningBalance | Decimal | ✅ Yes | Required to open account | 5000 |
minimumOperatingBalance | Decimal | ✅ Yes | Ongoing minimum | 1000 |
penaltyForBelowMinimum | Decimal | No | Monthly penalty fee | 100 |
allowZeroBalance | Boolean | No | Permit ₦0 balance | false |
Interest Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
isEnabled | Boolean | ✅ Yes | Whether interest is paid | true |
calculationMethod | Enum | ✅ Yes | Calculation approach | "DailyBalance" |
compoundingFrequency | Enum | No | Interest compounding | "Monthly" |
creditFrequency | Enum | ✅ Yes | When interest is paid | "Monthly" or "Quarterly" |
minimumBalanceForInterest | Decimal | No | Min balance to earn interest | 1000 |
Tiered Interest Rates Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
tiers[] | Array | ✅ Yes | Interest rate tiers | See below |
tiers[].from | Decimal | ✅ Yes | Tier start amount | 0 |
tiers[].to | Decimal | No | Tier end amount (null = unlimited) | 100000 |
tiers[].rate | Decimal | ✅ Yes | Interest rate (%) | 2.0 |
tierCalculationMethod | Enum | No | How to apply tiers | "Blended" or "Marginal" |
Example Tiered Structure:
tiers:
- from: 0
to: 100000
rate: 2.0
- from: 100000
to: 1000000
rate: 4.0
- from: 1000000
to: null # No upper limit
rate: 6.5
Transaction Limits Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
maxFreeWithdrawalsPerMonth | Integer | ✅ Yes | Free transactions allowed | 4 |
excessWithdrawalFee | Decimal | ✅ Yes | Fee per excess withdrawal | 100 |
maxWithdrawalsPerDay | Integer | No | Daily limit | 3 |
maxWithdrawalAmount | Decimal | No | Max single withdrawal | 100000 |
dailyWithdrawalLimit | Decimal | No | Total daily withdrawal | 500000 |
Dormancy Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
automaticallySetAccountAsDormant | Boolean | ✅ Yes | Auto-dormancy enabled | true |
dormancyAfterXDays | Integer | ✅ Yes | Days of inactivity | 180 |
reactivationFee | Decimal | No | Fee to reactivate | 500 |
notifyBeforeDormancy | Boolean | No | Send warning | true |
warningDaysBefore | Integer | No | Days before dormancy | 30 |
Fees Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
fees[].code | String | ✅ Yes | Fee code | "MAINT_FEE" |
fees[].name | String | ✅ Yes | Fee name | "Monthly Maintenance" |
fees[].feeType | Enum | ✅ Yes | Collection method | "Monthly" |
fees[].calculationType | Enum | ✅ Yes | Calculation type | "Flat" |
fees[].value | Decimal | ✅ Yes | Fee amount | 50 |
fees[].minimum | Decimal | No | Minimum fee | 50 |
fees[].maximum | Decimal | No | Maximum fee | 500 |
fees[].glAccountId | Integer | ✅ Yes | GL account | 50001 |
Statement Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
statementFrequency | Enum | No | How often statements sent | "Monthly" |
electronicStatementFree | Boolean | No | Email statements free | true |
paperStatementFee | Decimal | No | Printed statement fee | 100 |
allowSMSAlerts | Boolean | No | Transaction SMS alerts | true |
smsAlertFee | Decimal | No | Monthly SMS fee | 50 |
Auto-Savings Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
allowStandingOrders | Boolean | No | Enable recurring transfers | true |
allowRoundUpSavings | Boolean | No | Round-up feature | true |
roundUpTo | Decimal | No | Round to nearest | 100 |
minimumStandingOrderAmount | Decimal | No | Min SO amount | 1000 |
Eligibility Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
minimumAge | Integer | No | Minimum age | 18 |
maximumAge | Integer | No | Maximum age (0 = no limit) | 0 |
allowMinorAccounts | Boolean | No | Allow under-18 accounts | true |
minorAccountMaxBalance | Decimal | No | Max balance for minors | 100000 |
requiredDocuments[] | Array | ✅ Yes | Mandatory documents | ["ValidID", "ProofOfAddress", "PassportPhoto"] |
kycLevel | Enum | No | Required KYC tier | "Tier2" |
Notifications Configuration Section
| Field Name | Data Type | Required | Description | Example |
|---|---|---|---|---|
sendWelcomeEmail | Boolean | No | Welcome message | true |
sendMonthlyStatement | Boolean | No | Monthly statements | true |
sendLowBalanceAlert | Boolean | No | Alert low balance | true |
lowBalanceThreshold | Decimal | No | Alert threshold | 5000 |
sendDormancyWarning | Boolean | No | Dormancy notification | true |
channels.sms | Boolean | No | Enable SMS | true |
channels.email | Boolean | No | Enable email | true |
channels.push | Boolean | No | Enable push | true |
Complete Sample YAML Configuration
basicInfo:
productCode: "SA-REGULAR-001"
productName: "Regular Savings Account"
description: "Standard savings account with tiered interest rates"
isActive: true
depositAccountType: "Savings"
lineOfBusiness: "Retail"
currencyCode: "NGN"
minimumBalanceConfig:
minimumOpeningBalance: 5000
minimumOperatingBalance: 1000
penaltyForBelowMinimum: 100
allowZeroBalance: false
interestConfig:
isEnabled: true
calculationMethod: "DailyBalance"
compoundingFrequency: "Monthly"
creditFrequency: "Monthly"
minimumBalanceForInterest: 1000
tieredInterestRates:
tiers:
- from: 0
to: 100000
rate: 2.0
- from: 100000
to: 1000000
rate: 4.0
- from: 1000000
to: null
rate: 6.5
tierCalculationMethod: "Blended"
transactionLimitsConfig:
maxFreeWithdrawalsPerMonth: 4
excessWithdrawalFee: 100
maxWithdrawalsPerDay: 3
maxWithdrawalAmount: 100000
dailyWithdrawalLimit: 500000
dormancyConfig:
automaticallySetAccountAsDormant: true
dormancyAfterXDays: 180
reactivationFee: 500
notifyBeforeDormancy: true
warningDaysBefore: 30
fees:
- code: "MAINT_FEE"
name: "Monthly Maintenance Fee"
feeType: "Monthly"
calculationType: "Flat"
value: 50
glAccountId: 50001
waiveIfMinimumBalance: true
waiveThreshold: 10000
- code: "EXCESS_WD"
name: "Excess Withdrawal Fee"
feeType: "Transaction"
calculationType: "Flat"
value: 100
glAccountId: 50002
- code: "BELOW_MIN"
name: "Below Minimum Balance Fee"
feeType: "Monthly"
calculationType: "Flat"
value: 100
glAccountId: 50003
statementConfig:
statementFrequency: "Monthly"
electronicStatementFree: true
paperStatementFee: 100
allowSMSAlerts: true
smsAlertFee: 50
autoSavingsConfig:
allowStandingOrders: true
allowRoundUpSavings: true
roundUpTo: 100
minimumStandingOrderAmount: 1000
eligibilityConfig:
minimumAge: 18
maximumAge: 0
allowMinorAccounts: true
minorAccountMaxBalance: 100000
requiredDocuments:
- "ValidID"
- "ProofOfAddress"
- "PassportPhoto"
- "BVN"
kycLevel: "Tier2"
notificationsConfig:
sendWelcomeEmail: true
sendMonthlyStatement: true
sendLowBalanceAlert: true
lowBalanceThreshold: 5000
sendDormancyWarning: true
channels:
sms: true
email: true
push: true
Use Cases & Examples
Example 1: Standard Savings Account
Scenario: Young professional opening first savings account.
Customer Profile:
- Age: 25 years
- Employment: Salaried (₦150k/month)
- Savings Goal: Emergency fund
Account Opening:
minimumOpeningBalance: ₦5,000
Opening Deposit: ₦10,000 ✅
Documents: ID, Utility Bill, BVN ✅
KYC Level: Tier 2 ✅
Monthly Activity:
Month 1:
Opening Balance: ₦10,000
Deposits: ₦20,000 (salary savings)
Withdrawals: 2 (₦5,000 each) - FREE
Closing Balance: ₦20,000
Interest Earned:
Tier 1 (₦0-₦100k): ₦20,000 × 2% / 12 = ₦33
Fees:
Maintenance: ₦50
Net: +₦20,000 deposits +₦33 interest -₦50 fee = ₦20,033
Example 2: Tiered Interest Calculation (Blended)
Scenario: Account with ₦500,000 balance.
Configuration:
tierCalculationMethod: "Blended"
tiers:
- from: 0
to: 100000
rate: 2.0
- from: 100000
to: 1000000
rate: 4.0
Interest Calculation (Blended Method):
Balance: ₦500,000
Since balance falls in Tier 2 (₦100k-₦1M), entire balance earns Tier 2 rate:
Monthly Interest = ₦500,000 × 4% / 12 = ₦1,667
Annual Interest = ₦500,000 × 4% = ₦20,000
Example 3: Transaction Limits and Fees
Scenario: Customer exceeds free withdrawal limit.
Configuration:
maxFreeWithdrawalsPerMonth: 4
excessWithdrawalFee: ₦100
Monthly Transactions:
Withdrawal 1: ₦10,000 (FREE - 1/4)
Withdrawal 2: ₦15,000 (FREE - 2/4)
Withdrawal 3: ₦20,000 (FREE - 3/4)
Withdrawal 4: ₦5,000 (FREE - 4/4)
Withdrawal 5: ₦8,000 (CHARGED ₦100)
Withdrawal 6: ₦12,000 (CHARGED ₦100)
Total Excess Fees: ₦200
Optimization:
Strategy 1: Consolidate Withdrawals
Instead of 6 withdrawals, make 3 larger ones
Savings: ₦200
Strategy 2: Plan Ahead
Withdraw at month-end for next month needs
Stay within 4-withdrawal limit
Strategy 3: Use Multiple Channels
Some banks offer free ATM but charge teller
Check fee schedule
Tiered Interest Calculation Deep Dive
Blended Method (Simpler)
tierCalculationMethod: "Blended"
How It Works: Entire balance earns the rate of the tier it falls into.
Example:
Tiers:
Tier 1: ₦0-₦100k @ 2%
Tier 2: ₦100k-₦1M @ 4%
Tier 3: ₦1M+ @ 6.5%
Balance: ₦150,000 (falls in Tier 2)
Interest: ₦150,000 × 4% / 12 = ₦500/month
Balance: ₦1,500,000 (falls in Tier 3)
Interest: ₦1,500,000 × 6.5% / 12 = ₦8,125/month
Marginal Method (More Complex)
tierCalculationMethod: "Marginal"
How It Works: Each portion of balance earns its respective tier rate.
Example:
Balance: ₦1,500,000
Tier 1: First ₦100,000 @ 2%
= ₦100,000 × 2% / 12 = ₦167
Tier 2: Next ₦900,000 (₦100k to ₦1M) @ 4%
= ₦900,000 × 4% / 12 = ₦3,000
Tier 3: Remaining ₦500,000 (above ₦1M) @ 6.5%
= ₦500,000 × 6.5% / 12 = ₦2,708
Total Monthly Interest: ₦167 + ₦3,000 + ₦2,708 = ₦5,875
Comparison:
₦1,500,000 Balance:
Blended Method: ₦8,125/month (6.5% on all)
Marginal Method: ₦5,875/month (tiered calculation)
Difference: ₦2,250/month in favor of Blended
Why? Blended rewards higher balances more aggressively.
Dormancy Management
dormancyConfig:
automaticallySetAccountAsDormant: true
dormancyAfterXDays: 180
Dormancy Timeline:
Day 0: Last transaction
Day 30: No activity (Normal)
Day 60: No activity (Normal)
Day 90: No activity (Normal)
Day 150: Warning notification sent
Day 180: Account marked DORMANT âŒ
What Changes:
- Cannot make withdrawals
- Cannot make deposits via ATM
- Online banking disabled
- Interest may stop accruing
- Requires reactivation
Reactivation Process:
Implementation details removed for security.
Contact support for implementation guidance.
Preventing Dormancy:
ANY customer-initiated transaction resets the clock:
- Deposit (branch, ATM, transfer-in)
- Withdrawal
- Transfer-out
- Balance inquiry (some banks count this)
- Standing order execution
Transactions that DON'T count:
- Bank charges
- Interest credit
- System reversals
- Automated fees
Daily Balance Interest Calculation
interestConfig:
calculationMethod: "DailyBalance"
compoundingFrequency: "Monthly"
creditFrequency: "Monthly"
Daily Calculation:
Daily Interest = (Closing Balance × Annual Rate) / 365
Example (30-day month):
Day 1: ₦10,000 × 2% / 365 = ₦0.55
Day 2: ₦15,000 × 2% / 365 = ₦0.82
Day 3: ₦20,000 × 2% / 365 = ₦1.10
...
Day 30: ₦25,000 × 2% / 365 = ₦1.37
Sum all 30 days = Monthly Interest
With Deposits & Withdrawals:
Opening Balance: ₦50,000
Day 1-10: ₦50,000
Interest: ₦50,000 × 4% / 365 × 10 days = ₦54.79
Day 11: Deposit ₦30,000 → Balance ₦80,000
Day 11-20: ₦80,000
Interest: ₦80,000 × 4% / 365 × 10 days = ₦87.67
Day 21: Withdrawal ₦40,000 → Balance ₦40,000
Day 21-30: ₦40,000
Interest: ₦40,000 × 4% / 365 × 10 days = ₦43.84
Total Month Interest: ₦54.79 + ₦87.67 + ₦43.84 = ₦186.30
Compounding:
Month 1: Principal ₦100,000
Interest: ₦333
New Balance: ₦100,333
Month 2: Principal ₦100,333 (includes Month 1 interest)
Interest: ₦334
New Balance: ₦100,667
Effect: Interest earns interest (compound growth)
Minimum Balance Penalties
minimumBalanceConfig:
minimumOperatingBalance: ₦1,000
penaltyForBelowMinimum: ₦100
Monthly Check:
Implementation details removed for security.
Contact support for implementation guidance.
Example:
Month of January:
Day 1-20: Balance ₦5,000 (Above minimum ✅)
Day 21: Withdrawal ₦4,500 → Balance ₦500 (Below minimum âŒ)
Day 22-31: Balance ₦500
Minimum Balance for Month: ₦500
Result: ⌠Below ₦1,000 minimum
Penalty: ₦100 charged at month-end
New Balance: ₦500 - ₦100 = ₦400
Fee Waiver:
fees:
- code: "MAINT_FEE"
waiveIfMinimumBalance: true
waiveThreshold: ₦10,000
Benefit:
If monthly average balance ≥ ₦10,000:
Maintenance Fee: WAIVED ✅
If monthly average balance < ₦10,000:
Maintenance Fee: ₦50 charged âŒ
Auto-Savings Features
Standing Orders (Recurring Transfers)
autoSavingsConfig:
allowStandingOrders: true
minimumStandingOrderAmount: ₦1,000
Setup:
Source: Current Account
Destination: Savings Account
Amount: ₦10,000
Frequency: Monthly
Start Date: Every 5th of month
End Date: After 12 months
Execution:
Jan 5: ₦10,000 transferred ✅
Feb 5: ₦10,000 transferred ✅
Mar 5: ₦10,000 transferred ✅
...
Dec 5: ₦10,000 transferred ✅
Total Saved: ₦120,000 (automated)
Round-Up Savings
autoSavingsConfig:
allowRoundUpSavings: true
roundUpTo: ₦100
How It Works:
Transaction 1: POS Payment ₦1,450
Rounded Up: ₦1,500
Round-Up Amount: ₦50 → Savings Account
Transaction 2: Transfer ₦3,780
Rounded Up: ₦3,800
Round-Up Amount: ₦20 → Savings Account
Transaction 3: Bill Payment ₦12,320
Rounded Up: ₦12,400
Round-Up Amount: ₦80 → Savings Account
Monthly Round-Ups: ₦50 + ₦20 + ₦80 = ₦150
Annual Round-Ups: ~₦1,800 (painless savings!)
Validation Rules
Minimum Balance Validation
Implementation details removed for security.
Contact support for implementation guidance.
Transaction Limit Validation
Implementation details removed for security.
Contact support for implementation guidance.
Troubleshooting
Issue: "Below minimum balance penalty charged"
Cause: Account balance fell below minimum during the month.
Solutions:
Minimum: ₦1,000
Current Balance: ₦500
Penalty: ₦100
Option 1: Deposit to Meet Minimum
Deposit ₦600 → Balance ₦1,100 ✅
Option 2: Close Account
If not actively using, consider closure
Option 3: Upgrade Account Type
Some accounts have lower/no minimum
Prevention:
- Set low balance alert
- Link overdraft protection
- Automatic transfer from another account
Issue: "Excess withdrawal fees accumulating"
Cause: More than 4 withdrawals per month.
Solutions:
Monthly Withdrawals: 8
Free Limit: 4
Excess: 4 × ₦100 = ₦400 fees
Option 1: Reduce Withdrawal Frequency
Plan withdrawals, withdraw larger amounts
Reduce from 8 to 4 monthly
Save ₦400/month
Option 2: Upgrade Account
Consider current account (unlimited free)
Evaluate if benefit > cost
Option 3: Use Multiple Accounts
Spread transactions across accounts
Each account gets 4 free
Issue: "Account marked dormant"
Cause: No transactions for 180 days.
Solutions:
Status: DORMANT
Reactivation Fee: ₦500
Steps:
1. Visit branch with valid ID
2. Update KYC if needed
3. Make deposit or withdrawal
4. Pay reactivation fee
5. Account becomes active
Prevention:
- Make transaction every 3-6 months
- Set up standing order (auto-activity)
- Enable balance inquiry SMS (may count as activity)
Migration from V1
V1 Savings Account Mapping
| V1 Field/Table | V2 YAML Path |
|---|---|
| MinimumBalance | minimumBalanceConfig.minimumOperatingBalance |
| InterestRate | tieredInterestRates.tiers[].rate |
| WithdrawalLimit | transactionLimitsConfig.maxFreeWithdrawalsPerMonth |
| DormancyPeriod | dormancyConfig.dormancyAfterXDays |
| MaintenanceFee | fees[].value (where code = "MAINT_FEE") |
| InterestCalculationMethod | interestConfig.calculationMethod |
Last Updated: January 2, 2026
API Version: V2 (BPMCore)
Product Category: Deposit Products
Complexity: âââ (Moderate - Interest Tiering)