Charge Refund
When to use it
- Dispute resolution: Borrower proves a fee/penalty was applied in error after paying it.
- Merchant-funded concessions: Merchant agrees to reimburse part of a late fee already collected from the borrower.
- Operational reversals: Payment processor double-collected a fee and you need to refund the duplicate amount.
Use charge refunds when cash has already moved and you need to send it back. For bookkeeping-only corrections, use charge adjustments; for unpaid charges, use waivers.
Workflow
flowchart TD
A[Charge assessed] --> B[Borrower pays charge]
B --> C[Dispute or exception raised]
C --> D[Submit charge refund command]
D --> E[GL debits fee income, credits cash]
D --> F[Charge history updated with refund entry]
Key characteristics:
- The schedule/loan summary show the refunded amount immediately; installment-linked charges reduce the specific installment’s balance.
- The transaction behaves like a negative repayment, so it supports adjustments and chargebacks.
- GL postings depend on whether the charge was a fee or penalty, ensuring the correct income account is debited.
API recap
POST /v1/loans/{loanId}/transactions?command=chargeRefund
{
"loanChargeId": 912,
"installmentNumber": 4,
"transactionAmount": 15.00,
"paymentTypeId": 1,
"note": "Promo goodwill",
"externalId": "CHGREF-912-2026-02-18",
"locale": "en",
"dateFormat": "dd MMM yyyy"
}See the API doc for optional fields (dueDate alternative, payment metadata). Embarc always stamps the refund with the current business date, regardless of the payload.
Baseline Example (Baseline A)
- Baseline A assesses a USD 40 late fee on installment #4.
- Borrower pays the fee via
command=chargePayment. - Later, servicing refunds USD 15 because the borrower provided proof of bank error.
After posting the refund:
| Metric | Before refund | After refund |
|---|---|---|
| Charge outstanding | USD 0.00 | USD 0.00 (still considered paid, but refund logged) |
loanSummary.totalFeeChargesCharged | 40.00 | 40.00 (unchanged) |
loanSummary.totalFeeChargesWaived | 0.00 | 0.00 |
loanSummary.totalFeeChargesPaid | 40.00 | 40.00 |
loanSummary.totalFeeChargesRefunded | 0.00 | 15.00 |
| Loan status | Active | Active |
Accounting entry (example mapping):
| Entry | Debit | Credit | Amount |
|---|---|---|---|
| Refund fee income | Fee Income (405000) | Cash / Clearing (101100) | USD 15.00 |
If the refund creates a borrower credit balance (e.g., fee was refunded after loan payoff), follow up with a creditBalanceRefund to return any surplus.
Tips for operations
- Identify the charge precisely: For installment fees, include the installment number or due date; otherwise the API rejects the request.
- Partial vs. full refunds: Omitting
transactionAmountrefunds the entire remaining refundable amount—use carefully. - Audit trail: Use
externalIdto tie refunds to dispute case IDs and include a descriptivenote. - Chargebacks: If a processor chargebacks the refund itself, run the chargeback command referencing the
CHARGE_REFUNDtransaction. - Reports: Reporting teams can pull
transactions.type = CHARGE_REFUNDor useloanSummary.totalFeeChargesRefunded/totalPenaltyChargesRefundedfor aggregate views.
Following this flow ensures charge refunds are transparent, auditable, and balanced across GL, statements, and regulatory reports.
Updated about 1 month ago
