Product Fees Schema
Product Fees Schema
Section titled “Product Fees Schema”The product fees schema describes all fees associated with a lender’s loan product, including establishment fees, ongoing account fees, and optional charges.
Overview
Section titled “Overview”When you receive a servicing result from the compute servicing endpoint, each loan in the per_loan_rate_breakdown array includes a productFees array detailing all associated costs.
Fee Structure
Section titled “Fee Structure”interface ProductFee { name: string; amount: number; frequency: 'once' | 'monthly' | 'yearly' | 'other'; description?: string; payablePer: 'split' | 'application' | 'security'; payAt: 'start' | 'end'; isPromotional: boolean; isOptional?: boolean;}Field Descriptions
Section titled “Field Descriptions”Core Fee Fields
| Field | Type | Description |
|---|---|---|
name | string | Name of the fee (e.g., 'Settlement Fee', 'Account Management Fee') |
amount | number | Dollar amount of the fee |
frequency | string | How often the fee is charged: 'once', 'monthly', 'yearly', 'other' |
description | string | Optional additional details about the fee |
payablePer | string | What the fee applies to: 'split' (per loan split), 'application' (whole application), 'security' (per property) |
payAt | string | When the fee is charged: 'start' (upfront/settlement), 'end' (at discharge) |
isPromotional | boolean | Whether this is a promotional/discounted fee |
isOptional | boolean | Whether this fee is optional (may not always be present) |
Example:
{ "name": "Account Management Fee", "amount": 25, "frequency": "monthly", "description": "Per loan split", "payablePer": "split", "payAt": "start", "isPromotional": false}Common Fee Types
Section titled “Common Fee Types”One-Time Fees (Upfront)
Section titled “One-Time Fees (Upfront)”Fees charged once at the start of the loan:
{ "name": "Establishment Fee", "amount": 399, "frequency": "once", "description": "Payable at settlement & includes one standard security appraisal of a property ≤ $2M.", "payablePer": "application", "payAt": "start", "isPromotional": false}{ "name": "Legal & Administration Fee", "amount": 500, "frequency": "once", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true}Ongoing Fees
Section titled “Ongoing Fees”Fees charged regularly throughout the loan term:
{ "name": "Account Management Fee", "amount": 25, "frequency": "monthly", "description": "Per loan split", "payablePer": "split", "payAt": "start", "isPromotional": false}Discharge Fees
Section titled “Discharge Fees”Fees charged when the loan ends:
{ "name": "Settlement Fee", "amount": 500, "frequency": "once", "payablePer": "split", "payAt": "end", "isPromotional": false}{ "name": "Discharge Admin Fee", "amount": 690, "frequency": "other", "description": "", "payablePer": "security", "payAt": "start", "isPromotional": false, "isOptional": true}Optional/Conditional Fees
Section titled “Optional/Conditional Fees”Fees that only apply in certain circumstances:
{ "name": "Split Loan Fee", "amount": 350, "frequency": "other", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true}{ "name": "Guarantor Fee", "amount": 250, "frequency": "once", "description": "Applied per application", "payablePer": "application", "payAt": "start", "isPromotional": false, "isOptional": true}{ "name": "Trust Fee", "amount": 250, "frequency": "other", "description": "Applied per Trust", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true}Variable/Situational Fees
Section titled “Variable/Situational Fees”{ "name": "Dishonour Fee", "amount": 50, "frequency": "other", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true}{ "name": "Security Appraisal Fee", "amount": 380, "frequency": "other", "description": "Payable at settlement for additional securities. Payable upfront for non-standard security appraisals or properties > $2M.", "payablePer": "security", "payAt": "start", "isPromotional": false, "isOptional": true}Complete Example from RedZed
Section titled “Complete Example from RedZed”Below is the complete fee structure for RedZed’s SE Prime product:
{ "productFees": [ { "name": "Settlement Fee", "amount": 500, "frequency": "once", "description": "", "payablePer": "split", "payAt": "end", "isPromotional": false }, { "name": "Legal & Administration Fee", "amount": 500, "frequency": "once", "description": "", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Split Loan Fee", "amount": 350, "frequency": "other", "description": "", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Guarantor Fee", "amount": 250, "frequency": "once", "description": "Applied per application", "payablePer": "application", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Trust Fee", "amount": 250, "frequency": "other", "description": "Applied per Trust", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Account Management Fee", "amount": 25, "frequency": "monthly", "description": "Per loan split", "payablePer": "split", "payAt": "start", "isPromotional": false }, { "name": "Dishonour Fee", "amount": 50, "frequency": "other", "description": "", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Early Termination Fee", "amount": 0, "frequency": "once", "description": "", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Discharge Admin Fee", "amount": 690, "frequency": "other", "description": "", "payablePer": "security", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Disbursement Fee", "amount": 83, "frequency": "other", "description": "", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Offset Fee", "amount": 0, "frequency": "other", "description": "No additional RedZed set-up or ongoing service fees for an Offset Sub-Account.", "payablePer": "split", "payAt": "start", "isPromotional": false, "isOptional": true }, { "name": "Establishment Fee", "amount": 399, "frequency": "once", "description": "Payable at settlement & includes one standard\nsecurity appraisal of a property ≤ $2M.\n(+Fee waived if a Security Appraisal Fee is payable for\nnon-standard security appraisals, or properties > $2M)", "payablePer": "application", "payAt": "start", "isPromotional": false }, { "name": "Security Appraisal Fee", "amount": 380, "frequency": "other", "description": "Payable at settlement for additional securities.\nPayable upfront for non-standard security\nappraisals or properties > $2M.", "payablePer": "security", "payAt": "start", "isPromotional": false, "isOptional": true } ]}Understanding Fee Application
Section titled “Understanding Fee Application”Payable Per
Section titled “Payable Per”-
split: Fee applies to each loan split- Example: 2 loan splits = 2× the fee
- Common for: Account fees, split loan fees
-
application: Fee applies once per application- Example: 2 loan splits = 1× the fee
- Common for: Establishment fees, guarantor fees
-
security: Fee applies to each property used as security- Example: 2 properties = 2× the fee
- Common for: Valuation fees, discharge fees
Payment Timing
Section titled “Payment Timing”-
start: Paid at settlement/loan establishment- Most upfront fees fall into this category
-
end: Paid when the loan is discharged- Example: Settlement fees
Frequency
Section titled “Frequency”once: One-time chargemonthly: Recurring monthly chargeyearly: Recurring annual chargeother: Variable or situational (check description)
Working with Fees
Section titled “Working with Fees”Calculate Total Upfront Costs
Section titled “Calculate Total Upfront Costs”function calculateUpfrontCosts(productFees: ProductFee[], numSplits: number, numSecurities: number): number { let total = 0;
productFees.forEach(fee => { // Only include fees payable at start if (fee.payAt !== 'start') return;
// Skip optional fees with $0 amount if (fee.isOptional && fee.amount === 0) return;
let feeAmount = fee.amount;
// Apply multiplier based on payablePer if (fee.payablePer === 'split') { feeAmount *= numSplits; } else if (fee.payablePer === 'security') { feeAmount *= numSecurities; } // 'application' fees are only charged once
total += feeAmount; });
return total;}
// Example usageconst upfrontCosts = calculateUpfrontCosts( result.per_loan_rate_breakdown[0].productFees, 2, // 2 loan splits 1 // 1 property);console.log(`Total upfront costs: $${upfrontCosts.toLocaleString()}`);Calculate Ongoing Monthly Costs
Section titled “Calculate Ongoing Monthly Costs”function calculateMonthlyCosts(productFees: ProductFee[], numSplits: number): number { let total = 0;
productFees.forEach(fee => { if (fee.frequency !== 'monthly') return;
let feeAmount = fee.amount;
if (fee.payablePer === 'split') { feeAmount *= numSplits; }
total += feeAmount; });
return total;}
// Example usageconst monthlyCosts = calculateMonthlyCosts( result.per_loan_rate_breakdown[0].productFees, 2 // 2 loan splits);console.log(`Monthly ongoing fees: $${monthlyCosts.toLocaleString()}`);Filter Optional Fees
Section titled “Filter Optional Fees”const mandatoryFees = result.per_loan_rate_breakdown[0].productFees.filter( fee => !fee.isOptional);
const optionalFees = result.per_loan_rate_breakdown[0].productFees.filter( fee => fee.isOptional);
console.log('Mandatory fees:', mandatoryFees.map(f => f.name));console.log('Optional fees:', optionalFees.map(f => f.name));Group Fees by Category
Section titled “Group Fees by Category”const feesByTiming = { upfront: result.per_loan_rate_breakdown[0].productFees.filter(f => f.payAt === 'start'), discharge: result.per_loan_rate_breakdown[0].productFees.filter(f => f.payAt === 'end')};
const feesByFrequency = { oneTime: result.per_loan_rate_breakdown[0].productFees.filter(f => f.frequency === 'once'), monthly: result.per_loan_rate_breakdown[0].productFees.filter(f => f.frequency === 'monthly'), yearly: result.per_loan_rate_breakdown[0].productFees.filter(f => f.frequency === 'yearly'), other: result.per_loan_rate_breakdown[0].productFees.filter(f => f.frequency === 'other')};Important Notes
Section titled “Important Notes”- Fee amounts may be $0: Some fees (like “Offset Fee” or “Early Termination Fee”) may have
amount: 0, indicating no charge for that feature - Optional fees: Fees marked with
isOptional: truemay not apply to every loan scenario - Descriptions matter: Always check the
descriptionfield for important context about when/how fees apply - Promotional fees: When
isPromotional: true, the fee may be temporary or part of a special offer - Newlines in descriptions: Some descriptions contain
\ncharacters for multi-line formatting
Next Steps
Section titled “Next Steps”- Servicing Result Schema - Parent schema documentation
- Compute servicing endpoint - How to request calculations
- Product schema - Understand lender product configurations
Last updated: 2025-11-06