[]
9:19 AM, 18th March 2026, 4 months ago Hands fanning British pound notes, representing property sale profits for landlords

It’s hard to fathom that there’s a sector of the property market that’s actually doing better this year than last year when it comes to landlord portfolios, but that’s exactly the case for landlords who have been looking to sell their properties in what’s been dubbed the “prime areas.”

As landlords yourselves, you’ve no doubt been considering selling, and for good reason. As we head towards the final hour before the Renters’ Rights Act comes in, it’s crunch time for landlords who want to clean up their acts and their portfolios before they’re served the hefty fines that accompany a long list of obscenely complicated regulations.

But for most landlords, selling is proving more tricky than expected.

Perhaps you’ve had problem tenants on low rents, in arrears, on benefits or tenants who’ve been trashing your properties. Maybe you’ve got elderly tenants who you feel like you can’t evict.

Perhaps you’re a landlord who’s simply had enough and wants to retire? Or perhaps financial reasons are pushing you to get out: Section 24, tax, mounting refurb costs, empty properties, high mortgage rates, compliance costs – all adding up to what is essentially no profits.

Whatever the reason, landlords have been struggling to sell.

 But for a substantial number of them, the opposite is true. Properties are selling faster than ever before, and for high prices.

Why? They have what we at Landlord Sales Agency call the “RRR formula.” The Right Property, at the Right Price, in the Right Location.

In particular, we’re referring to freehold houses in the North West and Midlands priced between £70,000 and £150,000. These properties are attracting serious buyers with seriously lucrative offers.

When those three elements line up, we’re noticing properties selling quickly for prices landlords are extremely happy with. It’s like no other location in England. In these areas, for these prices, landlords are selling properties like hot cakes.

In fact, many of the properties are not only selling in under 28 days, they’re frequently achieving more than landlords would receive selling directly to the investor market or rushing to auction. That’s because for properties like these, there’s been an influx of interested first time buyers. And when you pit first time buyers against new landlords or investors, prices rise.

Whilst landlords need to be realistic, in that for a fast sale they’re not going to get 100% market value; an offer that’s both higher than the investor market and a substantial amount more than panic selling at auction is exactly why they’re rushing to us at Landlord Sales Agency to sell. And we’re delivering.

In fact, every week around 80 landlords are coming to us to sell with properties that fit the RRR formula, and we’re seeing them sell faster than anything else out there.

Coupled with the fact that we take the entire management of the sales off your hands, including negotiating with tenants, and you can see why so many landlords are reaching out. Make no mistake, we still have to be savvy: listing properties for high prices isn’t going to work, you’ve got to list them for attractive prices to get viewings piling through the doors, but that’s exactly what our team does best.

So if you’re a landlord, who has freehold houses in the North West and Midlands priced between £70,000 and £150,000, get in touch today.

We have the market. Now is the best window to act. And with our formula 1 style strategy to getting properties sold, you’ll find that selling your property can be straightforward, fast and surprisingly stress-free.

Contact Landlord Sales Agency

parseFloat(cmp); case ‘lessthan’: return parseFloat(val) < parseFloat(cmp); case 'contains': return val.indexOf(cmp) !== -1; case 'startswith': return val.indexOf(cmp) === 0; case 'endswith': return val.slice(-cmp.length) === cmp; default: return false; // fail closed — mirror the CRM shared matcher } } function applyConditionals() { Object.keys(condMap).forEach(function(fieldId) { var cond = condMap[fieldId]; var rules = cond.rules || []; var match = cond.logicType === 'any' ? rules.some(evalRule) : rules.every(evalRule); var show = cond.actionType === 'show' ? match : !match; var wrapper = form.querySelector('[data-field-id="' + fieldId + '"]'); if (!wrapper) { var el = form.querySelector('[name="' + fieldId + '"], [name="' + fieldId + '[]"]'); if (el) wrapper = el.closest('.crm-field, .crm-half'); } if (wrapper) wrapper.style.display = show ? '' : 'none'; }); } form.addEventListener('change', applyConditionals); form.addEventListener('input', applyConditionals); applyConditionals(); // ── Required-field validation (Next + Submit) ──────────────────────── // Validate from the form's field config (id + type), NOT the [required] // HTML attribute: a checkbox group can't carry a meaningful `required` // (native means "tick every box"), so attribute checks skip it — which is // why empty checkbox questions slipped past Next straight to submit. var crmRequired = [{"id":"c364951b-ecb0-4a12-bfa4-9dbe564310e8","type":"name","label":"Name"},{"id":"910107df-b8a8-4541-879f-541cef9449e4","type":"email","label":"Email"},{"id":"3b317ed9-d327-4fe2-b92e-67efede67e6d","type":"phone","label":"Phone"},{"id":"c6fae2f0-c335-452b-aa03-2cc066163d71","type":"textarea","label":"Please give us details of how we can help and the properties in question"},{"id":"34c27d9f-b3d1-4a6d-b720-24000e9fa468","type":"checkbox","label":"Privacy Policy"}]; function crmWrapper(id) { var w = form.querySelector('[data-field-id="' + id + '"]'); if (!w) { var el = form.querySelector('[name="' + id + '"], [name="' + id + '[]"]'); if (el) w = el.closest('.crm-field, .crm-half'); } return w; } function crmFilled(fld) { var els = form.querySelectorAll('[name="' + fld.id + '"], [name="' + fld.id + '[]"]'); if (!els.length) return true; if (['checkbox','radio','product','consent'].indexOf(fld.type) !== -1) { return Array.prototype.some.call(els, function(el){ return el.checked; }); } return (els[0].value || '').trim() !== ''; } function crmFirstInvalid(pageIdx) { for (var i = 0; i < crmRequired.length; i++) { var fld = crmRequired[i]; var w = crmWrapper(fld.id); if (!w) continue; if (w.style.display === 'none') continue; if (pageIdx != null) { var pd = w.closest('[data-page]'); if (!pd || parseInt(pd.getAttribute('data-page')) !== pageIdx) continue; } if (!crmFilled(fld)) return fld; } return null; } // Shows the error in a red box UNDER the field, matching the form's own // .crm-message error styling, and scrolls to it. function crmMarkError(w, text) { if (!w) return; var e = w.querySelector('.crm-inline-error'); if (!e) { e = document.createElement('div'); e.className = 'crm-inline-error'; w.appendChild(e); } e.style.cssText = 'background:#fee2e2;color:#991b1b;padding:.55rem .75rem;border-radius:4px;margin-top:.4rem;font-size:.9rem'; e.textContent = text || 'Please answer this before continuing.'; } function crmClearError(w) { if (!w) return; var e = w.querySelector('.crm-inline-error'); if (e) e.parentNode.removeChild(e); } function crmReportInvalid(fld) { var w = crmWrapper(fld.id); var t = (['checkbox','product'].indexOf(fld.type) !== -1) ? 'Please select at least one option.' : (fld.type === 'radio' ? 'Please choose an option.' : 'Please fill this in.'); crmMarkError(w, t); if (w && w.scrollIntoView) w.scrollIntoView({ behavior: 'smooth', block: 'center' }); } form.addEventListener('change', function(e){ var w = e.target && e.target.closest ? e.target.closest('.crm-field, .crm-half, [data-field-id]') : null; if (w) crmClearError(w); }); form.addEventListener('input', function(e){ var w = e.target && e.target.closest ? e.target.closest('.crm-field, .crm-half, [data-field-id]') : null; if (w) crmClearError(w); }); // ── Multi-page navigation ──────────────────────────────────────────── // ── Submit ──────────────────────────────────────────────────────────── var submitBtn = form.querySelector('button[type=submit]'); var btnText = submitBtn ? submitBtn.textContent : 'Submit'; var crmApiUrl = "https://p118-crm-api.accent.sh"; function collectFormData() { var data = {}; for (var j = 0; j < form.elements.length; j++) { var el = form.elements[j]; if (!el.name) continue; if (el.type === 'file') continue; // handled by uploadFiles() if (el.type === 'radio' && !el.checked) continue; if (el.type === 'checkbox') { if (!el.checked) continue; var k = el.name.replace('[]',''); data[k] = data[k] ? data[k].concat([el.value]) : [el.value]; } else { data[el.name] = el.value; } } // Repeater fields: sub-inputs are named "[][]". // 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); 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/' + "08ceeaae-4809-444e-ba0f-88da5836c463" + '/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', "08ceeaae-4809-444e-ba0f-88da5836c463"); 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', "https://www.property118.com/landlord-properties-in-prime-areas-are-selling-faster-than-last-year/"); body.append('embed_post_id', "192396"); body.append('embed_post_title', "Landlord properties in u201cprime areasu201d are selling faster than last year"); 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.'; msg.style.display = 'block'; } } 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 < old.attributes.length; a++) { s.setAttribute(old.attributes[a].name, old.attributes[a].value); } if (!old.src) { s.textContent = old.textContent; } old.parentNode.replaceChild(s, old); } nodes.forEach(function(n){ if (n.tagName === 'SCRIPT') { reexec(n); } else if (n.querySelectorAll) { var scripts = n.querySelectorAll('script'); for (var k = 0; k < scripts.length; k++) { reexec(scripts[k]); } } }); var first = nodes[0]; try { if (first && first.scrollIntoView) first.scrollIntoView({ behavior: 'smooth', block: 'start' }); } catch (e) {} }); } form.addEventListener('submit', function(e){ e.preventDefault(); // Validate required fields before submitting. Next only guards the pages // before it, so the final page (and single-page forms) are checked here; // jump to the first page that has a problem. var vbad0 = crmFirstInvalid(null); if (vbad0) { crmReportInvalid(vbad0); return; } var data = collectFormData(); if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Processing…'; } msg.style.display = 'none'; // Standard form (no payment) uploadFiles(data) .then(function(d) { return submitFormData(d); }) .catch(function(err){ if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = btnText; } msg.className = 'crm-message error'; msg.textContent = err.message; msg.style.display = 'block'; }); }); // ── Repeater fields (add / remove rows) ────────────────────────── form.querySelectorAll( '.crm-repeater' ).forEach( function ( rep ) { var rowsWrap = rep.querySelector( '.crm-repeater-rows' ); var tpl = rep.querySelector( '.crm-repeater-template' ); var addBtn = rep.querySelector( '.crm-repeater-add' ); if ( addBtn && tpl && rowsWrap ) { addBtn.addEventListener( 'click', function () { var idx = parseInt( rep.getAttribute( 'data-next-index' ) || '1', 10 ); var tmp = document.createElement( 'div' ); tmp.innerHTML = tpl.innerHTML.split( '__ROW__' ).join( idx ); var row = tmp.firstElementChild; if ( ! row ) { return; } row.setAttribute( 'data-row', idx ); rowsWrap.appendChild( row ); rep.setAttribute( 'data-next-index', idx + 1 ); rep.dispatchEvent( new CustomEvent( 'crm-repeater-change', { bubbles: true } ) ); } ); } if ( rowsWrap ) { rowsWrap.addEventListener( 'click', function ( e ) { var btn = e.target.closest ? e.target.closest( '.crm-repeater-remove' ) : null; if ( ! btn ) { return; } if ( rowsWrap.querySelectorAll( '.crm-repeater-row' ).length

By admin