Grace periods allow borrowers to avoid paying interest when they pay their full statement balance by the due date. Understanding grace is essential for migration because incorrectly initialized grace status will cause Peach to accrue interest when it shouldn't — or fail to accrue interest when it should.
This page explains how grace periods work for lines of credit. To run a migration, see the LOC migration procedure.
A grace period is a window during which no interest accrues on a balance, provided the borrower pays the full statement balance by the due date. This is a regulatory concept common in credit cards.
The rules are:
- Pay in full by due date → grace continues; no interest on that balance for the period
- Don't pay in full → grace is lost; interest accrues retroactively on the unpaid portion from the statement date (not the due date)
- To restore grace → pay in full for
numPeriodsToRestoreGraceconsecutive periods
Grace is tracked via a boolean flag (isGracePeriodEligible) on each obligation. DLM checks this flag every day to decide whether to accrue interest:
if draw.isGracePeriodApplicable == true
AND obligation.isGracePeriodEligible == true
→ DO NOT accrue interest for this day
else
→ accrue interest normallyThe system carries the prior day's grace status forward as a default and updates it on dueDate + 1 (see below).
The critical decision point for grace is one day after the due date. This is when Peach evaluates whether the borrower paid in full, and either revokes or reinstates grace.
If the borrower paid in full (fulfilledByDueDateAmount >= fullBalanceAmount):
- If already in grace → no change (grace continues)
- If not in grace → check the past
numPeriodsToRestoreGrace - 1obligations. If all of them were also paid in full, reinstate grace: setisGracePeriodEligible = trueand trigger a replay fromperiod.startDate. The replay retroactively removes interest that was accrued while grace was ineligible.
If the borrower did NOT pay in full and the obligation was grace-eligible:
- Revoke grace: set
isGracePeriodEligible = falseand trigger a replay fromperiod.startDate. The replay retroactively accrues interest on the unpaid portion from the statement date forward.
When grace is revoked, the retroactive interest charge can be large if the borrower had been in grace with a high balance. The interest accrues on the unpaid balance from the statement date, not the due date. Make sure borrower communications explain this behavior.
After grace is revoked, the borrower must pay in full for N consecutive periods to regain eligibility. This is controlled by numPeriodsToRestoreGrace (typically configured on the draw or loan type).
Migration override: For the migration previous period, Peach overrides numPeriodsToRestoreGrace to 1 regardless of the configured value. This means a borrower who lost grace before migration only needs to pay in full for one period post-migration to restore it. The override exists because Peach does not have per-draw grace history for pre-migration periods and defaults to the behavior most favorable to the borrower.
The configured numPeriodsToRestoreGrace takes full effect starting in the period after migration.
When a payment is applied between statementDate and dueDate on a draw that is grace-eligible, Peach manipulates the transaction's effective date:
transaction.effectiveDate = obligation.statementDate (backdated)
transaction.displayDate = actual_payment_date (for customer statements)
→ replay from period.startDateThis ensures that the interest calculation treats the payment as if it was made on the statement date. Without this, a payment on due date - 5 would leave 5 days of interest unaddressed in the calculation.
If a refund or cashback is issued between the statement date and the due date, it reduces the amount the borrower needs to pay to maintain grace:
effectiveFullBalance = fullBalanceAmount - adjustmentAfterStatementAmountFor example: if the statement balance is $1,000 and a $200 merchant refund is issued before the due date, the borrower only needs to pay $800 by the due date to keep grace.
Grace can be tracked at two levels:
| Level | Configuration | Behavior |
|---|---|---|
| Loan-level | loc.isGracePeriodApplicable = true | All draws share one grace status. If any draw loses grace, the entire LOC loses grace. |
| Draw-level | draw.atOrigination.gracePeriod.isGracePeriodApplicable = true | Each draw tracks grace independently. |
During migration, the system sets loan-level grace based on the aggregate of all draw-level grace statuses: if all draws are grace-eligible, the LOC is grace-eligible.
- Set
isGracePeriodEligiblecorrectly in the migration period data. If the borrower was in grace before migration, set totrue. If they had lost grace, set tofalse. - Record the grace balance (
gracePeriod.fullBalanceAmountandgracePeriod.fulfilledByDueDateAmount) accurately. These determine whether the due date + 1 check revokes or reinstates grace. - If grace is
false, understand that post-migration interest will accrue retroactively from the statement date of the migration period — which may create a significant interest charge on the first post-migration statement. - The migration override (
numPeriodsToRestoreGrace = 1) means borrowers who lost grace before migration can regain it after just one on-time full payment post-migration, even if the loan type normally requires multiple consecutive periods.
- LOC migration procedure — Set grace eligibility correctly during migration.
- How LOC billing cycles work — The statement-to-due-date timeline grace depends on.
- How LOC draws work — Loan-level vs. draw-level grace tracking.