Skip to content

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 Spread

For 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

PolicyBehavior
FUTURE_ONLYRecalculates all unpaid future schedule rows using the new rate. EMI and interest amounts change immediately.
FROM_NEXT_ACCRUALUpdates 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:

  1. For each eligible loan, the system fetches the latest index rate.
  2. Calculates new_rate = index_rate + spread.
  3. 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.
  4. 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

  1. Open the loan account detail dialog.
  2. Go to the Actions tab.
  3. Click Reprice.
  4. Enter the new interest rate and an optional reason.
  5. 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:

  1. Click the Batch Operations menu.
  2. Select Reprice Variable Rates.
  3. 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:

FieldDescription
old_rate_valueRate before the change
new_rate_valueRate after the change
index_rate_codeThe index code used (e.g. CBR, LIBOR)
reasonDescription of why the rate changed
created_atTimestamp of the change

You can retrieve this history via the Rate Change History API endpoint.

API Endpoints

MethodPathDescription
POST/loan-accounts/batch-repriceBatch reprice all variable-rate loans
POST/loan-accounts/manual-repriceManually reprice a single loan
GET/loan-accounts/rate-change-historyRetrieve 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=20

Loan Product Configuration

For variable rate repricing to work, the loan product must have:

FieldRequirement
index_rate_codeMust be set to a valid rate index code (e.g. CBR)
index_spreadThe margin added to the index rate (e.g. 10.0 for 10%)
repricing_policyFUTURE_ONLY or FROM_NEXT_ACCRUAL

Products without an index_rate_code are treated as fixed-rate and are skipped during repricing.

Troubleshooting

IssueCauseFix
Loan not repricedProduct has no index_rate_codeSet the index rate code on the loan product
Rate unchanged after batchIndex rate + spread equals current rateThis is expected — no change needed
Schedule not recalculatedRepricing policy is FROM_NEXT_ACCRUALThis is by design — schedule stays unchanged
All installments paidNo unpaid rows to recalculateExpected for fully-paid loans
"0 repriced, N errors"Schedule recalc failed (e.g. no unpaid rows)Rate + log still applied; check loan schedule

PinkApple ERP by Stat Solutions Network