Interest Accrual

Daily interest accrual runs automatically for all active investor notes. Understand the calculation formulas, day count conventions, GL posting, and catch-up processing.

How Daily Accrual Works

CEF Core accrues interest on every ACTIVE investor note once per day. The tenantAccrualCheck scheduled job runs every 15 minutes and processes any notes that have not yet accrued for the current date. This ensures accrual happens reliably even if a single run is delayed.

  1. Scheduler triggers: The tenantAccrualCheck cron job fires every 15 minutes.
  2. Eligible notes identified: The system queries all notes with status = ACTIVE that have not been accrued for today.
  3. Daily interest calculated: For each note, the daily interest amount is computed using the note's principal, rate, and day count convention.
  4. Accrued balance updated: The accrued_interest_balance on the note is incremented by the daily amount.
  5. Accrual record created: A row is inserted into the accrual history table for audit trail purposes.

Pro Tip: You can also trigger accrual manually via POST /api/v1/investor-notes/notes/accrue-daily. This is useful for testing or processing accrual for a specific date during month-end close.

Interest Calculation Formula

The core formula for daily interest is:

daily_interest = (principal_amount x annual_rate) / days_in_year

Where:

  • principal_amount is the current outstanding principal (may change if interest is reinvested)
  • annual_rate is expressed as a decimal (e.g., 0.045 for 4.50%)
  • days_in_year is determined by the day count convention configured on the note

Worked Example

A $100,000 note at 4.50% using ACT/365:

daily_interest = ($100,000 x 0.045) / 365 = $12.33 per day

Over a 30-day month: $12.33 x 30 = $369.86 accrued interest

Day Count Conventions

The day count convention determines how many days are in a "year" for interest calculation purposes. Each convention produces slightly different daily interest amounts. Set the convention on each note via the day_count_convention field.

ConventionDays in YearDays in MonthUse Case
ACT/365365 (always)Actual calendar daysDefault. Most common for church extension funds.
ACT/360360Actual calendar daysProduces slightly higher daily interest. Common in commercial lending.
30/36036030 days (assumed)Every month is exactly 30 days. Simplifies monthly interest calculations.
30E/36036030 days (European)European variant of 30/360 with slightly different end-of-month rules.
ACT/ACT365 or 366Actual calendar daysUses actual days in the current year. Most precise for leap year handling.

Important: Changing the day count convention on an existing note does not retroactively recalculate prior accruals. The new convention applies only to future accrual calculations from the date of the change.

GL Posting for Accrued Interest

After daily accrual runs, the accumulated interest must be posted to the General Ledger. Use POST /api/v1/investor-notes/notes/post-to-gl to generate the journal entries. This is typically run as part of month-end close.

Accrual Journal Entry

AccountCodeDebitCredit
Interest Expense6000Accrued amount--
Accrued Interest Payable2100--Accrued amount

These entries are posted to the GL via the event outbox pattern, ensuring they are never lost even if the GL service is temporarily unavailable. The daily tie-out job at 2:10 AM UTC verifies that the investor notes subledger balances with the GL.

Catch-Up Processing

If the accrual scheduler is down for any reason (server maintenance, network outage), CEF Core automatically performs catch-up processing on the next run. The system detects any missed accrual dates and processes them in chronological order.

How Catch-Up Works

  1. The scheduler identifies the last accrual date for each active note.
  2. If the last accrual date is before yesterday, catch-up is triggered.
  3. Each missed day is processed individually with its own accrual record.
  4. The accrued_interest_balance is updated with the total catch-up amount.
  5. An audit log entry records the catch-up event with the date range covered.

Pro Tip: After any system downtime, check Admin → Monitoring to verify that catch-up accrual completed successfully for all notes. The monitoring dashboard shows the last accrual run timestamp and any errors.

Non-Accrual Rules

Interest does not accrue on notes in certain statuses. The scheduler automatically skips these notes during daily processing.

StatusAccrual Behavior
ACTIVEInterest accrues daily. Standard processing.
PENDINGNo accrual. Funds not yet received.
MATUREDAccrual stops on the maturity date. Any remaining accrued interest is paid at redemption.
REDEEMEDNo accrual. Note has been fully settled.
CLOSEDNo accrual. Note is archived.

API Reference

MethodEndpointDescription
POST/api/v1/investor-notes/notes/accrue-dailyTrigger daily accrual manually (batch processes all active notes)
POST/api/v1/investor-notes/notes/post-to-glPost accrued interest to the General Ledger
GET/api/v1/investor-notes/notes/:id/accrualsView accrual history for a specific note

Processing Interest Payments

Once interest has accrued, learn how to process payments to investors via check, ACH, wire, or reinvestment.

Interest Payments Guide