Skip to content

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.

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.

interface ProductFee {
name: string;
amount: number;
frequency: 'once' | 'monthly' | 'yearly' | 'other';
description?: string;
payablePer: 'split' | 'application' | 'security';
payAt: 'start' | 'end';
isPromotional: boolean;
isOptional?: boolean;
}
Core Fee Fields
FieldTypeDescription
namestringName of the fee (e.g., 'Settlement Fee', 'Account Management Fee')
amountnumberDollar amount of the fee
frequencystringHow often the fee is charged: 'once', 'monthly', 'yearly', 'other'
descriptionstringOptional additional details about the fee
payablePerstringWhat the fee applies to: 'split' (per loan split), 'application' (whole application), 'security' (per property)
payAtstringWhen the fee is charged: 'start' (upfront/settlement), 'end' (at discharge)
isPromotionalbooleanWhether this is a promotional/discounted fee
isOptionalbooleanWhether 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
}

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
}

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
}

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
}

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
}
{
"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
}

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
}
]
}
  • 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
  • start: Paid at settlement/loan establishment

    • Most upfront fees fall into this category
  • end: Paid when the loan is discharged

    • Example: Settlement fees
  • once: One-time charge
  • monthly: Recurring monthly charge
  • yearly: Recurring annual charge
  • other: Variable or situational (check description)
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 usage
const upfrontCosts = calculateUpfrontCosts(
result.per_loan_rate_breakdown[0].productFees,
2, // 2 loan splits
1 // 1 property
);
console.log(`Total upfront costs: $${upfrontCosts.toLocaleString()}`);
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 usage
const monthlyCosts = calculateMonthlyCosts(
result.per_loan_rate_breakdown[0].productFees,
2 // 2 loan splits
);
console.log(`Monthly ongoing fees: $${monthlyCosts.toLocaleString()}`);
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));
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')
};
  1. Fee amounts may be $0: Some fees (like “Offset Fee” or “Early Termination Fee”) may have amount: 0, indicating no charge for that feature
  2. Optional fees: Fees marked with isOptional: true may not apply to every loan scenario
  3. Descriptions matter: Always check the description field for important context about when/how fees apply
  4. Promotional fees: When isPromotional: true, the fee may be temporary or part of a special offer
  5. Newlines in descriptions: Some descriptions contain \n characters for multi-line formatting

Last updated: 2025-11-06