Back to Property Insights
Landlord mortgage rates fall across lenders
Industry News

Landlord mortgage rates fall across lenders

Property118 · · 10 min read

Property118 Landlord mortgage rates fall across lenders Landlords looking to fix their borrowing costs are being offered lower mortgage pricing across standard, specialist and large portfolio products. Paragon Bank has cut fixed rates by 15 basis points across its Core and Tailored ranges , with pricing starting from 3.40%. United Trust Bank (UTB) has reduced two-year fixed rates by up to 50 basis points, while Rely has introduced discounted products for portfolio landlords. The deals cover single properties, houses in multiple occupation (HMOs), multi-unit blocks (MUBs) and multi-unit freehold blocks (MUFBs), depending on the lender. Lenders explain reductions Paragon mortgage product manager James Harrison said: “These reductions provide landlords with lower pricing across a broad selection of two-year and five-year fixed products, covering both standard and more specialist property types. “The range has been structured to provide a choice of rates and product fee arrangements, including nil-fee, percentage-fee and fixed-fee mortgages.” Gene Clohessy, the director of buy to let and bridging at UTB, said: “We’re building real momentum in Buy-to-Let and these rate reductions are another important step in making UTB an even stronger option for brokers and their landlord customers. “Price is important, but brokers also need lenders with sensible criteria, experienced and knowledgeable people and the appetite to understand a case.” Paragon mortgage options At 75% loan to value (LTV), Paragon’s two-year Green Mortgage rates start at 3.40% for properties with EPC ratings of A to C, while rates for EPC D or E homes begin at 3.45%. Both products carry a 5% fee, include £500 cashback and are joined by HMO and MUB rates starting at 3.55%, with alternatives from 4.55% carrying a 3% fee or from 6.05% with no product fee. Five-year Green Mortgage rates at 75% LTV start from 4.80%, rising to 4.85% for EPC D or E properties and 4.95% for HMOs and MUBs, with a 5% fee and £1,000 cashback. Tailored two-year rates start at 5.15% for eligible single properties and 5.30% for HMOs and MUBs, while corresponding five-year rates begin at 5.55% and 5.70%. UTB and Rely deals UTB’s standard two-year fixed rates now start at 3.89%, with specialist HMO and MUFB products available from 4.04%. Its five-year rates remain at 5.69% for standard properties and 5.99% for specialist cases, while previous ownership experience is no longer required for eligible HMO and MUFB applications. The lender has also raised its maximum exposure for portfolio landlords to 10 buy to let loans and £3 million for each applicant. Rely’s limited-edition two- and five-year fixes for landlords with at least 11 properties carry a 5% fee at 75% LTV and are priced up to 40 basis points below its standard range, while new products at 60% and 65% LTV offer discounts of up to 15 basis points for landlords with four or more mortgaged properties. For assistance with any type of buy to let (BTL), property or commercial finance please complete the contact form below: Name * Phone * Email * Project details and funding requirements How can I help you? Privacy Policy * I have read and accept Property118’s Privacy Policy (function(){var el=document.getElementById("ts-56e3e3c4-4400-4e49-8f5a-211f6f540e49");if(!el)return;var b=document.body,h=document.documentElement;var dark=b.classList.contains("dark-mode")||b.classList.contains("dark")||b.classList.contains("night-mode")||h.classList.contains("dark");if(!dark){var bg=window.getComputedStyle(b).backgroundColor,m=bg.match(/\d+/g);if(m)dark=(m[0]*0.299+m[1]*0.587+m[2]*0.114) Submit (function(){ var uid = "crm-form-9314eca3"; var form = document.getElementById(uid + '-form'); var wrap = document.getElementById(uid); var msg = wrap.querySelector('.crm-message'); var totalPages = 1; var curPage = 0; // ── Conditional logic ──────────────────────────────────────────────── var condMap = {}; function getFieldValue(fieldId) { var els = form.querySelectorAll('[name="' + fieldId + '"], [name="' + fieldId + '[]"]'); if (!els.length) return ''; var first = els[0]; if (first.type === 'checkbox' || first.type === 'radio') { var checked = []; els.forEach(function(el){ if (el.checked) checked.push(el.value); }); return checked.join(','); } return first.value; } function evalRule(rule) { var val = getFieldValue(rule.fieldId); var cmp = rule.value; switch (rule.operator) { case 'is': return val === cmp; case 'isnot': return val !== cmp; case 'greaterthan': return parseFloat(val) > parseFloat(cmp); case 'lessthan': return parseFloat(val) [ ][ ]', so the prefix arm above // collects EVERY rendered row. Demanding all of them be filled means one blank // extra row - added by mistake, or rendered by settings.minRows - blocks Next and // Submit with a generic message on the wrapper. Only the first row is required. var firstRow = form.querySelector('[data-field-id="' + fld.id + '"] .crm-repeater-row'); if (firstRow) { reqEls = Array.prototype.filter.call(reqEls, function (el) { return firstRow.contains(el); }); } var toTest = reqEls.length ? reqEls : [els[0]]; return Array.prototype.every.call(toTest, function (el) { return (el.value || '').trim() !== ''; }); } function crmFirstInvalid(pageIdx) { for (var i = 0; i [ ][ ]". // Group those flat keys into an array of row objects under the repeater // id. Plain fields, checkbox "[]" arrays and single-bracket composites // (name[first], address[city]) don't match the double-bracket pattern, so // ordinary submissions are unchanged. var _repRe = /^(.+?)\[(\d+)\]\[(.+)\]$/; var _repIds = {}; Object.keys( data ).forEach( function ( key ) { var m = key.match( _repRe ); if ( ! m ) { return; } var rid = m[1], row = parseInt( m[2], 10 ), sub = m[3]; _repIds[ rid ] = true; if ( ! Array.isArray( data[ rid ] ) ) { data[ rid ] = []; } if ( ! data[ rid ][ row ] || typeof data[ rid ][ row ] !== 'object' ) { data[ rid ][ row ] = {}; } data[ rid ][ row ][ sub ] = data[ key ]; delete data[ key ]; } ); Object.keys( _repIds ).forEach( function ( rid ) { if ( Array.isArray( data[ rid ] ) ) { data[ rid ] = data[ rid ].filter( function ( r ) { return r && typeof r === 'object'; } ); } } ); // GF auto-substituted {user_agent} / {referer} on hidden fields // at render time. We do the equivalent right before submit so // fields whose default value carries these placeholders // resolve to the browser's actual values rather than being // stored as literal "{user_agent}" / "{referer}" strings. // The last ARTICLE the visitor read (set client-side on post views by // P118_Article_Views). Used to attribute the enquiry to the article // even after navigating away or with a stripped/absent referer. var lastPost = ''; try { var lpm = document.cookie.match(/(?:^|;\s*)p118_last_post=([^;]+)/); if (lpm) lastPost = decodeURIComponent(lpm[1]); } catch (e) {} var subs = { '{user_agent}': navigator.userAgent || '', // Prefer the last article read; fall back to the (lossy) HTTP referer. '{referer}': lastPost || document.referrer || '', '{last_post}': lastPost || '', '{embed_url}': window.location.href || '', }; for (var name in data) { if (!data.hasOwnProperty(name)) continue; var v = data[name]; if (typeof v !== 'string') continue; for (var tag in subs) { if (v.indexOf(tag) !== -1) v = v.split(tag).join(subs[tag]); } data[name] = v; } // Agent/BDM attribution — read LIVE so it works even on a fully cached // page (the browser always sees the real URL + cookie). URL ?ataid=/?cid= // first, then the 30-day agent_id/cid cookies set by atat-tracking.php. var _qp = new URLSearchParams(window.location.search); var _ataid = _qp.get('ataid') || (document.cookie.match(/(?:^|;\s*)agent_id=([^;]+)/) || [])[1] || ''; var _cid = _qp.get('cid') || (document.cookie.match(/(?:^|;\s*)cid=([^;]+)/) || [])[1] || ''; if (_ataid) data.agent_id = decodeURIComponent(_ataid); if (_cid) data.bdm_id = decodeURIComponent(_cid); // Which page the form was actually on. Read live for the same reason // as the attribution above: on a cached page the server has no idea // which URL it is being served as, but the browser always does. data._sourceUrl = window.location.href; // …and what sent them to it. Read live for the same reason: a cached // page cannot know either, but the browser does. Blank when they // typed the address, used a bookmark, or came from an email client — // which is the honest answer, not a gap to be filled in server-side. data._referrerUrl = document.referrer || ''; return data; } function uploadFiles(data) { var fileInputs = form.querySelectorAll('input[type=file][data-crm-file-field]'); var uploads = []; fileInputs.forEach(function(el) { if (!el.files || !el.files[0]) return; var fd = new FormData(); fd.append('file', el.files[0]); var fieldName = el.name; uploads.push( fetch(crmApiUrl + '/public/forms/' + "b4348f3c-1c58-40d2-a4e1-f5ef3a585dcc" + '/upload', { method: 'POST', body: fd }) .then(function(r) { if (!r.ok) throw new Error('File upload failed (' + r.status + ')'); return r.json(); }) .then(function(res) { if (res.path) data[fieldName] = res.path; else throw new Error(res.error || 'File upload failed'); }) ); }); return Promise.all(uploads).then(function() { return data; }); } function submitFormData(data) { var body = new FormData(); body.append('action', 'p118_crm_submit'); body.append('form_id', "b4348f3c-1c58-40d2-a4e1-f5ef3a585dcc"); body.append('data', JSON.stringify(data)); // Embed-page context for GF-style merge tags ({embed_url}, // {embed_post:post_title}, {embed_post:ID}). Captured PHP-side // at render time, then echoed to JS so the submit fetch can // forward to V2 as request headers. body.append('embed_url', ""); body.append('embed_post_id', "0"); body.append('embed_post_title', ""); return fetch("https:\/\/www.property118.com\/wp-admin\/admin-ajax.php", { method: 'POST', body: body, credentials: 'same-origin' }) .then(function(r){ return r.json(); }) .then(function(res){ var p = res.data || res; if (p && p.success) { if (p.confirmationType === 'form' && p.nextFormId) { return swapInNextForm(p.nextFormId, p.prefill || {}); } if (p.confirmationType === 'redirect' && p.confirmationRedirectUrl) { window.location.href = p.confirmationRedirectUrl; } else { form.style.display = 'none'; msg.className = 'crm-message success'; msg.innerHTML = p.confirmationMessage || 'Thank you for your submission.'; // Carry the calculator's own results across. A calculator form // renders its figures into [data-iht-results] as the visitor // types; hiding the form hid those too, so the completion // screen went blank and the visitor lost what they had just // worked out. Nothing happens on forms without that element. var resultsEl = form.querySelector('[data-iht-results]'); if (resultsEl && resultsEl.innerHTML.trim()) { var carried = document.createElement('div'); carried.className = 'crm-message-results'; carried.innerHTML = resultsEl.innerHTML; msg.appendChild(carried); } // Download link for a generated report, present only when the // API filed the PDF before responding. Built through the DOM // rather than concatenated into innerHTML so the URL cannot // inject markup. if (p.reportDownloadUrl) { var dlWrap = document.createElement('p'); dlWrap.className = 'crm-report-download'; var dl = document.createElement('a'); dl.className = 'crm-report-button'; // Building through the DOM stops markup injection but not a // javascript: URL, which would run in this origin the moment // the submitter clicks the button. dl.href = /^https?:\/\//i.test(String(p.reportDownloadUrl)) ? p.reportDownloadUrl : '#'; dl.target = '_blank'; dl.rel = 'noopener noreferrer'; dl.textContent = 'Download your report (PDF)'; dlWrap.appendChild(dl); msg.appendChild(dlWrap); } msg.style.display = 'block'; if (msg.scrollIntoView) { msg.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } } else { throw new Error((p && p.error) || 'Submission failed.'); } }); } // Replace this whole form widget with another form, rendered server-side // with the carried-over values seeded in. Inline injected via // innerHTML won't run, so we re-create each script node to execute it // (this is what wires up the new form's submit / conditional logic). function swapInNextForm(nextFormId, prefill) { var rbody = new FormData(); rbody.append('action', 'p118_crm_render_form'); rbody.append('form_id', nextFormId); rbody.append('prefill', JSON.stringify(prefill || {})); return fetch("https:\/\/www.property118.com\/wp-admin\/admin-ajax.php", { method: 'POST', body: rbody, credentials: 'same-origin' }) .then(function(r){ return r.json(); }) .then(function(res2){ var pd = res2.data || res2; if (!pd || !pd.html) { throw new Error((pd && pd.error) || 'Could not load the next form.'); } var frag = document.createElement('div'); frag.innerHTML = pd.html; var parent = wrap.parentNode; var nodes = []; while (frag.firstChild) { var node = frag.firstChild; parent.insertBefore(node, wrap); nodes.push(node); } parent.removeChild(wrap); function reexec(old) { var s = document.createElement('script'); for (var a = 0; a The post Landlord mortgage rates fall across lenders appeared first on Property118 .

Originally published by

Property118

Read full article