Appearance
Variable Rate Repricing
Variable rate repricing automatically adjusts interest rates on loans linked to an index rate (e.g. CBR, LIBOR). When the index rate changes, borrowing rates are recalculated as index rate + spread.
How It Works
Rate Calculation
New Rate = Latest Index Rate + Product SpreadFor example, if CBR = 9.75% and the loan product spread = 10%, the new rate is 19.75%.
Rate Sources
Each loan product can be linked to an index rate code (configured in Loan Product setup). The system looks up the latest published rate for that code from the rate_index_history table.
Repricing Policies
| Policy | Behavior |
|---|---|
| FUTURE_ONLY | Recalculates all unpaid future schedule rows using the new rate. EMI and interest amounts change immediately. |
| FROM_NEXT_ACCRUAL | Updates the stored rate on the loan account. The daily accrual process picks up the new rate from the next business day. No schedule recalculation. |
Automatic Repricing (EOD)
Variable rate repricing runs automatically as Step 11 of the End-of-Day (EOD) batch process. It processes all active and in-arrears loans whose product is linked to an index rate code.
What happens during auto-repricing:
- For each eligible loan, the system fetches the latest index rate.
- Calculates
new_rate = index_rate + spread. - If the new rate differs from the current rate:
- Updates
loan_account.interest_rate. - Logs the change in
pricing_rate_change_log. - If policy is
FUTURE_ONLY, recalculates unpaid schedule rows.
- Updates
- Skips loans where the rate is already up to date.
Schedule Recalculation (FUTURE_ONLY)
When a FUTURE_ONLY reprice occurs on a declining balance / horizontal loan:
- The system identifies all unpaid schedule rows.
- Recalculates EMI using the standard annuity formula with the new rate.
- Adjusts principal and interest splits for each remaining installment.
- Preserves all paid/partially-paid rows unchanged.
For flat interest or vertical loans, the recalculation distributes the remaining interest evenly across unpaid installments.
Manual Repricing
You can manually reprice a single loan from the Loan Account Detail → Actions tab.
Steps
- Open the loan account detail dialog.
- Go to the Actions tab.
- Click Reprice.
- Enter the new interest rate and an optional reason.
- Submit.
The system will:
- Update the loan's interest rate.
- Log the rate change with your reason.
- Recalculate the schedule if the product's repricing policy is
FUTURE_ONLY.
Batch Repricing (On-Demand)
You can trigger a batch reprice of all variable-rate loans from the Loan Accounts page:
- Click the Batch Operations menu.
- Select Reprice Variable Rates.
- The system processes all eligible loans and reports how many were repriced.
Rate Change History
Every rate change (automatic or manual) is logged in the pricing_rate_change_log table with:
| Field | Description |
|---|---|
old_rate_value | Rate before the change |
new_rate_value | Rate after the change |
index_rate_code | The index code used (e.g. CBR, LIBOR) |
reason | Description of why the rate changed |
created_at | Timestamp of the change |
You can retrieve this history via the Rate Change History API endpoint.
API Endpoints
| Method | Path | Description |
|---|---|---|
POST | /loan-accounts/batch-reprice | Batch reprice all variable-rate loans |
POST | /loan-accounts/manual-reprice | Manually reprice a single loan |
GET | /loan-accounts/rate-change-history | Retrieve rate change log for a loan |
Batch Reprice
http
POST /api/loan-accounts/batch-reprice
Content-Type: application/json
{
"run_date": "2026-04-25" // optional, defaults to today
}Manual Reprice
http
POST /api/loan-accounts/manual-reprice
Content-Type: application/json
{
"loan_account_id": 173,
"new_rate": 19.75,
"reason": "CBR adjustment"
}Rate Change History
http
GET /api/loan-accounts/rate-change-history?loan_account_id=173&page=1&page_size=20Loan Product Configuration
For variable rate repricing to work, the loan product must have:
| Field | Requirement |
|---|---|
index_rate_code | Must be set to a valid rate index code (e.g. CBR) |
index_spread | The margin added to the index rate (e.g. 10.0 for 10%) |
repricing_policy | FUTURE_ONLY or FROM_NEXT_ACCRUAL |
Products without an index_rate_code are treated as fixed-rate and are skipped during repricing.
Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
| Loan not repriced | Product has no index_rate_code | Set the index rate code on the loan product |
| Rate unchanged after batch | Index rate + spread equals current rate | This is expected — no change needed |
| Schedule not recalculated | Repricing policy is FROM_NEXT_ACCRUAL | This is by design — schedule stays unchanged |
| All installments paid | No unpaid rows to recalculate | Expected for fully-paid loans |
| "0 repriced, N errors" | Schedule recalc failed (e.g. no unpaid rows) | Rate + log still applied; check loan schedule |
Related
- Loan Operations — Disbursement, repayment, write-off, and more
- Loan GL Setup — GL posting rules for loan transactions
- Loan Accounts — Account management overview
