Capitalize Income


Operational Use Cases

  • Deferred fee recognition: Move onboarding or service fees into the loan balance and recognize them gradually.
  • Promotional interest holidays: Capitalize interest that was deferred upfront on Dynamic loans.
  • Merchant-funded incentives: Spread incentives over the loan’s life while keeping accounting clean.

Supported only on the Dynamic repayment schedule engine with income capitalization enabled on the product. A scheduled amortization job posts the CAPITALIZED_INCOME_AMORTIZATION transactions over time.

Lifecycle Snapshot

flowchart LR
    A[Identify amount to defer] --> B[Submit capitalized income command]
    B --> C[Deferred balance stored on loan]
    C --> D[Scheduled job amortizes into income]
    D --> E{Need adjustment?}
    E -->|Yes| F[Submit capitalized income adjustment]
    E -->|No| G[Continue scheduled amortization]

API Playbook

  1. Add capitalized income
  POST /v1/loans/{loanId}/transactions?command=capitalizedIncome
  {
    "locale": "en",
    "dateFormat": "dd MMM yyyy",
    "transactionDate": "05 Jan 2025",
    "transactionAmount": 95.00,
    "note": "Deferred onboarding fee",
    "externalId": "CI-2025-01-05-ONBOARD"
  }

Validations:

  • Loan must be Active, Dynamic, interest-bearing, and already disbursed.
  • Sum of disbursed principal + capitalized income cannot exceed the approved (or over-applied) amount.
  1. Adjust
    POST /v1/loans/{loanId}/transactions/{capitalizedIncomeTxnId}?command=capitalizedIncomeAdjustment
    {
      "locale": "en",
      "dateFormat": "dd MMM yyyy",
      "transactionDate": "20 Jan 2025",
      "transactionAmount": 15.00,
      "note": "Partial waiver"
    }
    Amount cannot exceed the remaining unrecognized balance tied to the original transaction.

Tips for Operations Teams

  • Use externalId or notes if you need to map entries back to partner approvals.
  • Track deferred vs. recognized amounts via your finance dashboards so accounting can reconcile revenue properly.
  • Capitalized income only defers recognition. Schedule the capitalized-income amortization cron job daily so CAPITALIZED_INCOME_AMORTIZATION transactions move the liability into income; otherwise the deferred balance will remain on the books.
  • When the incentive requires actual cash settlement, process that transfer through the Payments API first, then post the capitalized income entry once funds clear.

How amortization behaves with missing or early payments

Embarc amortizes deferred income by time, not by borrower cash flow. The equal-amortization strategy calculates the day-weighted portion between the capitalization date and maturity. Therefore:

  • Missed installments do not pause revenue recognition—the job still amortizes based on elapsed days.
  • Partial/early payments also do not change the schedule; the amortization job keeps recognizing the planned amount until the deferred balance reaches zero.
  • If the loan closes early (prepay, foreclosure, write-off, charge-off, or normal close), the closure/charge-off hooks run the same amortization routine to recognize whatever is left immediately, so no deferred balance lingers on the books.

Document this policy for auditors so they understand that revenue recognition follows the configured amortization strategy rather than actual borrower payments.

Baseline Example (Dynamic Loan B)

After installment #3, Baseline B still has USD 300 outstanding. Suppose a USD 18.00 onboarding fee must be recognised evenly across the final three installments. Posting capitalizedIncome for USD 18.00 on 15 Feb 2026 yields:

DateEventDeferred income balanceNotes
15 Feb 2026capitalizedIncome transaction18.00Fee moved into the capitalised bucket instead of P&L.
21 Feb 2026Amortization job12.00CAPITALIZED_INCOME_AMORTIZATION posts USD 6.00, tied to installment #4.
07 Mar 2026Next run6.00Another USD 6.00 recognised with installment #5.
21 Mar 2026Final run0.00Remaining USD 6.00 recognised alongside installment #6.

Accounting sees three matching journal entries (debit deferred income, credit income) so revenue is recognised gradually while the borrower still pays only the standard installment amounts.

Transactions created

DateTypeAmount (USD)Allocation (Principal / Interest / Fee)Notes
15 Feb 2026CAPITALIZED_INCOME18.000.00 / 0.00 / 18.00Deferred onboarding fee.
21 Feb 2026CAPITALIZED_INCOME_AMORTIZATION6.000.00 / 0.00 / 6.00Recognition tied to installment #4.
07 Mar 2026CAPITALIZED_INCOME_AMORTIZATION6.000.00 / 0.00 / 6.00Recognition tied to installment #5.
21 Mar 2026CAPITALIZED_INCOME_AMORTIZATION6.000.00 / 0.00 / 6.00Recognition tied to installment #6.

Loan summary delta

MetricBeforeAfter CAPITALIZED_INCOMENotes
capitalizedIncomeBalanceUSD 0.00USD 18.00Immediately after posting.
After first amortizationUSD 12.00Drops by USD 6.00 each run until zero.
Installment totalsUnchangedBorrower still pays the standard installment; amortization is a bookkeeping entry.

Accounting snapshot

EntryDebitCreditAmount
Capitalize feeLoans Receivable (112601)Deferred Capitalized Income (212500)USD 18.00
Amortization (per run)Deferred Capitalized Income (212500)Fee/Interest Income (405000)USD 6.00

Verification checklist

  1. GET /v1/loans/{loanId}?associations=transactions,loanSummary to confirm the new transaction types and the deferred balance.
  2. Run/trigger the capitalized-income amortization job and recheck the deferred balance until it reaches zero.
  3. Review GL postings (if accrual accounting is enabled) to ensure the liability/income accounts match product configuration.

Sandbox request template

POST /v1/loans/{{baselineDynamicLoanId}}/transactions?command=capitalizedIncome
{
  "locale": "en",
  "dateFormat": "dd MMM yyyy",
  "transactionDate": "15 Feb 2026",
  "transactionAmount": 18.00,
  "note": "Deferred onboarding fee",
  "externalId": "CI-BL-B-0001"
}

After posting, run the amortization job (or wait for the scheduled cron) and use the verification checklist to confirm the balance declines and journal entries are produced.