Loans
When you take out a loan — a vehicle loan, a mortgage on the office, an SBA term loan — the accounting picture has three moving parts: a liability account that tracks what you still owe, an interest expense account that captures the cost of borrowing, and the bank account the payments come from. Solid Accounting tracks all three with a built-in amortization schedule so each payment correctly splits between principal and interest.
The accounting picture
When the loan funds:
DR Bank (proceeds you got) 50,000
CR Long Term Liability — Auto Loan 50,000
Then each periodic payment splits between principal (paying down the liability) and interest (an expense):
Monthly payment of $1,083.04 on a 5-year, $50,000, 5.5% loan
DR Long Term Liability — Auto Loan 853.87 (principal)
DR Interest Expense 229.17 (interest)
CR Bank 1,083.04
Over time, the principal portion grows and the interest portion shrinks — that's why loans have amortization schedules: a payment-by-payment table of how each payment splits.
Setting up a loan
Solid stores each loan as a record with the parameters needed to compute the amortization schedule:
| Field | Notes |
|---|---|
| Name | Human-readable identifier (e.g. Truck loan — 2026 F-150) |
| Liability account | The Long Term Liability or Other Current Liability account holding the balance |
| Interest expense account | Where the interest portion of each payment lands |
| Payment account | The bank or credit-card account that funds the payments |
| Original amount | The principal balance at funding |
| Current balance | What you still owe (auto-updates with each payment) |
| Interest rate | In basis points (5.5% = 550 bp) |
| Term | Total loan length in months |
| Payment amount | The fixed periodic payment |
| Start date | When the loan funded |
| First payment date | When the first payment is due |
| Payment frequency | monthly, biweekly, or weekly |
| Active flag | Marks the loan as paid off when balance reaches zero |
When you create the loan, Solid computes the full amortization schedule — every payment, the principal/interest split, and the running balance after each — and stores it in loan_amortization. From then on, recording a loan payment is a one-click operation that posts the right split.
Recording payments
The loan-payment journal entry uses transaction_type = 'loan_payment'. From the loan's view: Record Payment. Solid:
- Looks up the next-scheduled amortization row
- Creates a journal entry with the principal/interest split per the schedule
- Updates the loan's current balance
- Marks that amortization row as paid
Multi-line shape:
Payment number 7 on the truck loan
DR Long Term Liability — Truck Loan 853.87
DR Interest Expense 229.17
CR Bank 1,083.04
The entry_number references the loan and payment number for traceability.
Extra payments / principal-only
If you make a one-off extra payment toward principal, record a separate loan-payment entry with the schedule's interest = $0 and the entire amount toward principal:
DR Long Term Liability — Truck Loan 500.00 (principal-only)
DR Interest Expense 0.00
CR Bank 500.00
Solid recomputes the remaining schedule on the fly so future payments still close out the term correctly. The original amortization schedule stays in the system as historical record; an adjusted schedule reflects what actually happens going forward.
Amortization schedule formula
The standard amortization formula:
P = (r × PV) / (1 − (1 + r)^−n)
where:
P = periodic payment amount
r = periodic interest rate (annual rate / payments-per-year)
PV = present value (loan principal)
n = total number of payments
For a $50,000 loan at 5.5% annual, 60 months:
r = 0.055 / 12 = 0.004583n = 60P = (0.004583 × 50000) / (1 − 1.004583^−60) = $954.83
For each payment, the interest portion is current_balance × r; the principal portion is P − interest; the new balance is current_balance − principal. The schedule iterates this for n payments.
Solid's amortization runner uses integer-cents math throughout (no floating-point) and enforces that the final payment closes the balance to exactly zero — any rounding remainder absorbs into the last payment.
Payment frequency variants
| Frequency | Periodic rate | Payments per year |
|---|---|---|
monthly | annual / 12 | 12 |
biweekly | annual / 26 | 26 |
weekly | annual / 52 | 52 |
Biweekly and weekly schedules pay down the principal faster than the equivalent monthly schedule, even at the same annual rate, because interest compounds less between payments. Solid handles all three identically — the formulas just use different period counts.
Reports
Two loan-specific reports:
- Loan Schedule — the full amortization table for a specific loan: payment number, date, amount, principal, interest, balance after. Useful for auditing or for showing a lender.
- Loan Summary — every active loan with original amount, current balance, interest paid year-to-date, next payment date.
Both export to PDF and CSV.
Common gotchas
Bank statement shows a payment of $1,083.05 but Solid posts $1,083.04. Common rounding mismatch. Banks compute amortization to the nearest cent per payment with various rounding rules; Solid uses integer-cents math but the rounding may differ by a penny per payment. Resolve via a Reconciliation Discrepancy adjustment of the difference, or post a one-line journal entry of $0.01 to a Rounding expense account.
Refinanced the loan — what do I do? Two journal entries:
- Pay off the old loan — DR Old Loan Liability for the remaining balance, CR Bank (or CR New Loan Liability if the refi proceeds funded the payoff)
- Create the new loan record — name, principal, rate, term as the new loan terms
Mark the old loan inactive. The amortization schedule for the new loan starts fresh.
Interest rate is variable (ARM, HELOC, prime+). Solid's amortization assumes a fixed rate. For variable-rate loans:
- At each rate-reset date, edit the loan's interest_rate
- Solid recomputes the remaining amortization at the new rate
- Past payments stay as posted
Loan funded but interest-only for the first few months. Set up the loan with the post-interest-only parameters (the principal balance after the IO period, and the term remaining). For the IO period itself, post manual journal entries each month: DR Interest Expense / CR Bank.
Extra payment doesn't seem to update the schedule. Check the loan's current_balance after the extra payment posted; it should be lower. The displayed schedule may be the original; the adjusted schedule reflects the new path. Look at the Loan Schedule report and confirm the "from this point" view shows fewer remaining payments.
Cross-references
- General Ledger → transaction types —
loan_paymentis one of the 15 transaction types - Banking → Reconciliation — how loan payments appear on the bank statement
- Fixed Assets module — assets often financed by loans