Daily interest accrual runs automatically for all active investor notes. Understand the calculation formulas, day count conventions, GL posting, and catch-up processing.
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.
tenantAccrualCheck cron job fires every 15 minutes.status = ACTIVE that have not been accrued for today.accrued_interest_balance on the note is incremented by the daily amount.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.
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 noteA $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
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.
| Convention | Days in Year | Days in Month | Use Case |
|---|---|---|---|
| ACT/365 | 365 (always) | Actual calendar days | Default. Most common for church extension funds. |
| ACT/360 | 360 | Actual calendar days | Produces slightly higher daily interest. Common in commercial lending. |
| 30/360 | 360 | 30 days (assumed) | Every month is exactly 30 days. Simplifies monthly interest calculations. |
| 30E/360 | 360 | 30 days (European) | European variant of 30/360 with slightly different end-of-month rules. |
| ACT/ACT | 365 or 366 | Actual calendar days | Uses 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.
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.
| Account | Code | Debit | Credit |
|---|---|---|---|
| Interest Expense | 6000 | Accrued amount | -- |
| Accrued Interest Payable | 2100 | -- | 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.
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.
accrued_interest_balance is updated with the total catch-up amount.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.
Interest does not accrue on notes in certain statuses. The scheduler automatically skips these notes during daily processing.
| Status | Accrual Behavior |
|---|---|
ACTIVE | Interest accrues daily. Standard processing. |
PENDING | No accrual. Funds not yet received. |
MATURED | Accrual stops on the maturity date. Any remaining accrued interest is paid at redemption. |
REDEEMED | No accrual. Note has been fully settled. |
CLOSED | No accrual. Note is archived. |
| Method | Endpoint | Description |
|---|---|---|
POST | /api/v1/investor-notes/notes/accrue-daily | Trigger daily accrual manually (batch processes all active notes) |
POST | /api/v1/investor-notes/notes/post-to-gl | Post accrued interest to the General Ledger |
GET | /api/v1/investor-notes/notes/:id/accruals | View accrual history for a specific note |
Once interest has accrued, learn how to process payments to investors via check, ACH, wire, or reinvestment.
Interest Payments Guide