{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"How grace periods work for lines of credit","siteUrl":"https://docs.peachfinance.com","description":"API and product documentation for Peach Finance, a lending-as-a-service platform.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"how-grace-periods-work-for-lines-of-credit","__idx":0},"children":["How grace periods work for lines of credit"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This page explains how grace periods work for lines of credit. To run a migration, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/migration-procedure"},"children":["the LOC migration procedure"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-grace-period-means","__idx":1},"children":["What grace period means"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A grace period is a window during which ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The rules are:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Pay in full by due date"]}," → grace continues; no interest on that balance for the period"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Don't pay in full"]}," → grace is lost; interest accrues retroactively on the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["unpaid portion"]}," from the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["statement date"]}," (not the due date)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["To restore grace"]}," → pay in full for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numPeriodsToRestoreGrace"]}," consecutive periods"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"daily-grace-tracking-isgraceperiodeligible","__idx":2},"children":["Daily grace tracking (isGracePeriodEligible)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Grace is tracked via a boolean flag (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isGracePeriodEligible"]},") on each obligation. DLM checks this flag every day to decide whether to accrue interest:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"if draw.isGracePeriodApplicable == true\n  AND obligation.isGracePeriodEligible == true\n  → DO NOT accrue interest for this day\nelse\n  → accrue interest normally\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The system carries the prior day's grace status forward as a default and updates it on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dueDate + 1"]}," (see below)."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-due-date--1-check","__idx":3},"children":["The due date + 1 check"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The critical decision point for grace is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["one day after the due date"]},". This is when Peach evaluates whether the borrower paid in full, and either revokes or reinstates grace."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If the borrower paid in full"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fulfilledByDueDateAmount >= fullBalanceAmount"]},"):"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If already in grace → no change (grace continues)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["If not in grace → check the past ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numPeriodsToRestoreGrace - 1"]}," obligations. If all of them were also paid in full, ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["reinstate grace"]},": set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isGracePeriodEligible = true"]}," and trigger a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["replay"]}," from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["period.startDate"]},". The replay retroactively removes interest that was accrued while grace was ineligible."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If the borrower did NOT pay in full"]}," and the obligation was grace-eligible:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Revoke grace"]},": set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isGracePeriodEligible = false"]}," and trigger a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["replay"]}," from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["period.startDate"]},". The replay retroactively accrues interest on the unpaid portion from the statement date forward."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"danger"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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 ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["unpaid balance"]}," from the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["statement date"]},", not the due date. Make sure borrower communications explain this behavior."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"numperiodstorestoregrace-and-the-migration-override","__idx":4},"children":["numPeriodsToRestoreGrace and the migration override"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["After grace is revoked, the borrower must pay in full for N consecutive periods to regain eligibility. This is controlled by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numPeriodsToRestoreGrace"]}," (typically configured on the draw or loan type)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Migration override"]},": For the migration previous period, Peach overrides ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numPeriodsToRestoreGrace"]}," to ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The configured ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["numPeriodsToRestoreGrace"]}," takes full effect starting in the period after migration."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transaction-effective-date-manipulation","__idx":5},"children":["Transaction effective date manipulation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a payment is applied between ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["statementDate"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dueDate"]}," on a draw that is grace-eligible, Peach manipulates the transaction's effective date:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"transaction.effectiveDate = obligation.statementDate  (backdated)\ntransaction.displayDate = actual_payment_date          (for customer statements)\n→ replay from period.startDate\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This 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."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"grace-adjustment-for-refunds-and-cashbacks","__idx":6},"children":["Grace adjustment for refunds and cashbacks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"effectiveFullBalance = fullBalanceAmount - adjustmentAfterStatementAmount\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For 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."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"loan-level-vs-draw-level-grace","__idx":7},"children":["Loan-level vs. draw-level grace"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Grace can be tracked at two levels:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Level"},"children":["Level"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Configuration"},"children":["Configuration"]},{"$$mdtype":"Tag","name":"th","attributes":{"align":"left","data-label":"Behavior"},"children":["Behavior"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Loan-level"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loc.isGracePeriodApplicable = true"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["All draws share one grace status. If any draw loses grace, the entire LOC loses grace."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Draw-level"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["draw.atOrigination.gracePeriod.isGracePeriodApplicable = true"]}]},{"$$mdtype":"Tag","name":"td","attributes":{"align":"left"},"children":["Each draw tracks grace independently."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"why-this-matters-for-migration","__idx":8},"children":["Why this matters for migration"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isGracePeriodEligible"]}," correctly"]}," in the migration period data. If the borrower was in grace before migration, set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},". If they had lost grace, set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Record the grace balance"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gracePeriod.fullBalanceAmount"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gracePeriod.fulfilledByDueDateAmount"]},") accurately. These determine whether the due date + 1 check revokes or reinstates grace."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["If grace is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["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."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The migration override"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["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."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":9},"children":["See also"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/migration-procedure"},"children":["LOC migration procedure"]}," — Set grace eligibility correctly during migration."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/how-loc-billing-cycles-work"},"children":["How LOC billing cycles work"]}," — The statement-to-due-date timeline grace depends on."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration/how-loc-draws-work"},"children":["How LOC draws work"]}," — Loan-level vs. draw-level grace tracking."]}]}]},"headings":[{"value":"How grace periods work for lines of credit","id":"how-grace-periods-work-for-lines-of-credit","depth":1},{"value":"What grace period means","id":"what-grace-period-means","depth":2},{"value":"Daily grace tracking (isGracePeriodEligible)","id":"daily-grace-tracking-isgraceperiodeligible","depth":2},{"value":"The due date + 1 check","id":"the-due-date--1-check","depth":2},{"value":"numPeriodsToRestoreGrace and the migration override","id":"numperiodstorestoregrace-and-the-migration-override","depth":2},{"value":"Transaction effective date manipulation","id":"transaction-effective-date-manipulation","depth":2},{"value":"Grace adjustment for refunds and cashbacks","id":"grace-adjustment-for-refunds-and-cashbacks","depth":2},{"value":"Loan-level vs. draw-level grace","id":"loan-level-vs-draw-level-grace","depth":2},{"value":"Why this matters for migration","id":"why-this-matters-for-migration","depth":2},{"value":"See also","id":"see-also","depth":2}],"frontmatter":{"title":"How grace periods work for lines of credit","description":"How LOC grace periods work in Peach: the pay-in-full rule, daily grace tracking, the due-date-plus-one check, retroactive interest, restoration.","verifiedDate":"2026-06-10T00:00:00.000Z","verifiedSpec":"loc-migration.yml","verifiedRef":"peach@41d1f8a","seo":{"title":"How grace periods work for lines of credit"}},"lastModified":"2026-06-10T22:51:20.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/loan-lifecycle/loc-migration/how-grace-periods-work","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}