Contract Termination


Operational Use Cases

  • Merchant cancellation: For Dynamic repayment schedule engine contracts (BNPL or promotional plans) where the merchant cancels fulfillment and no further interest should accrue.
  • Customer withdrawal before fulfillment: Borrower backs out before goods/services are delivered; lender needs to freeze the plan while funds are reconciled.
  • Dispute management: Temporarily halt a Dynamic loan when a dispute escalates and the lender wants all amounts due immediately without classifying it as charge-off.

Only supported on the Dynamic repayment schedule engine. When you post the command, Embarc immediately records the outstanding principal/interest/fees as a CONTRACT_TERMINATION transaction dated on the current business day, sets the loan sub-status to CONTRACT_TERMINATION, and rewrites the schedule so the entire amount is due immediately. No cash or GL entries are posted—the balance stays on receivables until you follow up with a payoff, refund, charge-off, write-off, etc.

Lifecycle Snapshot

flowchart LR
    A[Confirm termination trigger] --> B[Submit contract termination command]
    B --> C[Loan tagged as Contract Termination]
    C --> D[Future principal and fees accelerated]
    D --> E{Resume plan later?}
    E -->|No| F[Move to charge-off or closure]
    E -->|Yes| G[Submit undoContractTermination]

API Playbook

  1. Apply termination

    POST /v1/loans/{loanId}/transactions?command=contractTermination
    {
      "locale": "en",
      "dateFormat": "dd MMM yyyy",
      "note": "Merchant cancelled order XYZ",
      "externalId": "CT-XYZ-2025-08-02"
    }

    Validations:

    • Loan must be Active, Dynamic engine, not charged-off, and not already terminated.
    • The transaction date is always the current business date (payload dates are ignored).
  2. Undo (if needed)

    POST /v1/loans/{loanId}/transactions?command=undoContractTermination
    {
      "note": "Dispute resolved",
      "reversalExternalId": "CT-XYZ-UNDO-2025-08-05"
    }

    Loan must still be in contract-termination sub-status and the termination transaction has to be the latest user transaction.

  3. Next steps

    • After termination, decide whether to charge off, close, or resume the loan depending on policy.

Tips for Operations Teams

  • Use the note to capture merchant case IDs so future reviewers know why the plan was frozen.
  • Because the transaction is non-cash and posts no GL entries, plan any payoff/refund/charge-off flows after termination to cleanse the receivable.
  • Auto- or scheduled repayments remain allowed, but they will now apply against the single accelerated installment.

Baseline Example (Dynamic Loan B)

Baseline B has three remaining installments (principal USD 300, interest USD 5.54) after the promo period. Posting contractTermination on 18 Feb 2026 (just before installment #4 falls due) produces:

Before terminationDue dateInterestPrincipalTotal
Installment #42026-02-212.77100.00102.77
Installment #52026-03-071.85100.00101.85
Installment #62026-03-210.92100.00100.92
After termination (dated 2026-02-18)InterestPrincipalTotal
Accelerated payoff5.54300.00305.54

Embarc sums the outstanding principal/interest/fees and records them as a single accelerated installment dated on the contract-termination day. The loan remains Active but now carries the CONTRACT_TERMINATION sub-status, so downstream systems can treat the balance as immediately due even though no cash has moved yet.

Transactions created

DateTypeTotal AmountAllocation (Interest / Principal)Notes
18 Feb 2026CONTRACT_TERMINATION305.545.54 / 300.00Accelerates installments #4–#6 for Baseline B (all components rolled up).

Loan summary delta

MetricBeforeAfterImpact
Principal outstandingUSD 300.00USD 300.00Balance unchanged until collections or refunds occur.
Interest outstandingUSD 5.54USD 5.54Interest recognised immediately.
Next due date21 Feb 202618 Feb 2026Accelerated to termination date.
Sub-statusActiveContract TerminationDownstream dashboards can now filter by this sub-status.

Accounting snapshot

No GL entries are posted when the contract termination command runs. The CONTRACT_TERMINATION transaction exists solely to collapse the repayment schedule and tag the loan; principal and interest balances remain on receivables until a later servicing action (repayment, refund, charge-off, write-off) resolves them.

Verification checklist

  1. GET /v1/loans/{loanId}?associations=all before/after:
    • Confirm loanSummary.status shows the sub-status change.
    • Verify repaymentSchedule.periods now contains a single accelerated entry dated 18 Feb 2026.
  2. Review transactions[] for the CONTRACT_TERMINATION record (amount 305.54 on the business date).
  3. If you run separate dashboards, filter on the CONTRACT_TERMINATION sub-status to surface these loans.

Sandbox request template

POST /v1/loans/{{baselineDynamicLoanId}}/transactions?command=contractTermination
{
  "locale": "en",
  "dateFormat": "dd MMM yyyy",
  "note": "Merchant cancelled order XYZ",
  "externalId": "CT-BL-B-0001"
}

Run immediately after cloning Baseline B (before installment #4 is processed) and follow the verification checklist.