Three properties for sale in Liverpool: 1 is hypothetical, 2 are real — Which sells for the most profit?
Property118 Three properties for sale in Liverpool: 1 is hypothetical, 2 are real — Which sells for the most profit? Scenario 1 (real): A property currently listed on Rightmove through a high street agent We’re always looking for new ways to demonstrate the economic and emotional value of what we do for our sellers. Normally we use examples of properties we have sold as a way to do this but this week, we’ve decided to do something a little bit different and use a property we’re NOT selling as the reason sellers choose us. The property in question is being sold via a high street agent – a very good one, we might add. This is not intended as a criticism of their service, so we’ve rounded the prices because we don’t want the property to be identifiable. However, all figures remain within £100 of the real numbers. The property in question is being sold in Liverpool and was first listed with a guide price of £170,000. It is described as beautifully presented, with modern fittings, no onward chain and immediate availability in a vibrant area with constant demand. The advert suggests it could suit either an investor or a first-time buyer, while the layout and photographs indicate that it may previously have been a rental property. It has an EPC rating of D and is advertised with the potential to produce a rental yield of up to 9%. It was originally listed in Oct 2025. Since then, the price has been reduced three times and it is now available for offers over £140,000 – a fall of £30,000. At the time of writing, it is still not marked as sold subject to contract or under offer. If a buyer were found now allowing approximately 12 to 16 weeks for conveyancing would take the sale to around mid-January 2027 – 15 months after the property was first listed. Let’s assume they get an offer and it completes (though 33% of high street sales don’t according to stats). How much money will the seller have left after all costs are counted? During that time, the costs do not stop. To give the conventional sale every possible benefit, let us assume: The tenants left voluntarily so there were no possession costs. No money was spent redecorating or replacing fittings. There was no gap between the tenants leaving and the marketing beginning. We won’t include utilities, empty-property insurance, maintenance, security, gardening, cleaning or travelling to check the property. Nor will we attach any value to the landlord’s time, effort. Rightmove’s affordability calculator estimates monthly mortgage repayments of approximately £675. Using that purely as an illustration, 15 months of payments would total more than £10,100. Twelve months’ council tax in that postcode is approximately £2,675, and empty properties can face a 100% surcharge once they have been vacant for more than 12 months. For the purposes of this example, we’ll estimate the cost at £2,800. Now add estimated selling costs: Estate agent: £2,500 Solicitor: £1,000 That brings the illustrative costs while selling over 15 months to be approximately £16,400 Profit = Funds from sale minus costs: £140,000 – £16,400 = £123,600 Of course, we don’t know the seller’s details – they may have cleared their mortgage and have much smaller costs to pay. The study is simply intended to encourage sellers to think about hidden costs rather than estimate what those costs are. We sell rental property before evicting tenants and help the tenants to move rather than chase them through the courts if the buyer wants vacant possession. Our Hypothetical comparison: What if the tenants had remained while the property was being sold? Scenario 2 (hypothetical): The same property sold through Landlord Sales Agency Instead of emptying the property and chasing the best-case scenario, the landlord approaches Landlord Sales Agency before asking the tenants to leave. The seller estimates the value at £170,000. We believe the property is worth £165,000, but we will need to use 15% of that value to attract the right buyer, keep the tenants cooperative, give the transaction the attention we think it needs, cover our fees and costs, and make a £720 contribution towards the seller’s legal fees. The seller agrees to accept £140,250 to secure a faster, more reliable sale. Suppose the property sells and completes in four months which is typical for one of our tenanted sales. A comparable property has previously been advertised at approximately £1,300 per month. On that basis, the figures could look like this: Four months’ rent: £5,200 Gross rent remaining after £2,700 paid in mortgage costs: £2,500 Estate agency commission payable by the seller and legal fees: £0 Instead of eventually receiving £140,000 minus £16,400, the landlord walks away with £140,000 plus roughly £2,500 of rent. Profit = Funds from sale plus rent collected over mortgage costs: £142,500 That is a potential difference in PROFIT of approximately £19,000 Scenario 3 (real): A similar property in a similar area of Liverpool, sold by Landlord Sales Agency this year The seller’s valuation was £165,000 but they wanted to prioritise a quick, reliable sale. They were happy to use 15% equity for our expertise and their peace of mind. We secured a buyer within 12 days and the sale completed three months later. When surveys identified possible structural problems and damp, we used the available equity to coordinate further inspections, negotiate a revised price and arrange an urgent Gas Safety Certificate. We also continued chasing the buyer, broker and solicitors to prevent the sale from falling through. They walked away with £136,500 – that’s £12,900 MORE than the higher-valued property featured in scenario 1 and currently still for sale on Rightmove. The biggest headline price doesn’t always mean the most profit We completely understand why landlords want to “give it a go” at selling for the highest value possible. If an estate agent suggests someone might pay £170,000, it is natural to want to test the market and see what happens. Occasionally, that strategy pays off. The danger is mistaking optimism for valuation. The value of a property is what someone is willing to pay for it at the time you want to sell it. We encourage sellers to look at all options and choose what is best for their needs. If that’s chasing the best price at all costs, we’re not the company for you. All we ask is if you find that all that glitters isn’t gold, don’t leave it too late to revisit your decision. If your property has attracted no meaningful interest within eight weeks, or has remained unsold after four months; continuing to hold out for more could be an expensive mistake. We have a private database of 30,000 owner-occupiers, investors, incoming landlords and property-buying conglomerates. We market properties to them alongside the buyers we find through Rightmove, Zoopla and local agents. We use competition between buyers to drive up prices and we take our fee and cover our costs from the margin between the amount sellers agree to accept and the final sale price. This means we can only take on properties in areas with sufficient demand to secure a buyer within 30–60 days. Sellers must also have enough equity for us to solve any problems that could otherwise delay or derail the sale. If we can agree a price that works for both parties, we’ll commit our resources to the sale to find the right type of buyer for your property and make sure they are able to complete quickly. We’ll secure the sale in a way that makes it much harder for the buyer to change their mind or renegotiate the price without a valid reason – two of the biggest causes of sales falling through. We’ll do everything necessary to coordinate all parties, including solicitors, surveyors and contractors, so that you don’t have to. This helps you access the funds from your sale in the shortest possible time. Want a less risky route to a completed sale? Whether your property is tenanted or vacant, whether you have yet to list it or your current estate agent has not delivered the price, interest or progress you expected, talk to Landlord Sales Agency before more time and money slip away. We will review the property, explain what we believe it could realistically sell for and show you how the figures may compare once time, rent and selling costs are taken into account. Contact us using the form below and we’ll get back to you as soon as possible. Name * Email * Phone * Please give us details of how we can help and the properties in question * Privacy Policy * I have read and accept Property118’s Privacy Policy (function(){var el=document.getElementById("ts-607776b5-3f7b-431c-b5cc-fc304603fee3");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-ba09a29b"; var form = document.getElementById(uid + '-form'); var wrap = document.getElementById(uid); var msg = wrap.querySelector('.crm-message'); var totalPages = 1; var curPage = 0; // ── Name casing ────────────────────────────────────────────────────── // Tidy a name box as the visitor leaves it, so they are not staring at // "JOHN SMITH" in their own form. Deliberately cosmetic: the API runs // the same normalisation on submit and is the authority on what gets // stored, so a disagreement here is harmless. Kept in step with // packages/shared/src/names.ts. var NAME_PARTICLES = ' van von de del della der den di da dal du la le el bin ibn al dos das do ter ten '; var NAME_MACS = ' macdonald macintyre macleod macarthur macgregor macneil macpherson macrae mackinnon macqueen '; function nameUp(s){ return s.replace(/[a-z]/i, function(c){ return c.toUpperCase(); }); } function isParticle(w){ return NAME_PARTICLES.indexOf(' ' + w.toLowerCase() + ' ') >= 0; } function nameRecase(atom){ if (!/[a-z]/i.test(atom)) return atom; var dot = atom.charAt(atom.length - 1) === '.' ? '.' : ''; var core = dot ? atom.slice(0, -1) : atom; var lower = core.toLowerCase(); if (/^(?:II|III|IV|VI|VII|VIII|IX|XI|XII)$/.test(core.toUpperCase())) return core.toUpperCase() + dot; if (lower === 'jr' || lower === 'sr') return nameUp(lower) + dot; if (core.length === 1) return core.toUpperCase() + dot; var mc = /^mc([a-z]{2,})$/.exec(lower); if (mc) return 'Mc' + nameUp(mc[1]) + dot; if (NAME_MACS.indexOf(' ' + lower + ' ') >= 0) return 'Mac' + nameUp(lower.slice(3)) + dot; return nameUp(lower) + dot; } function nameWellFormed(atom){ // "Mccoll" has its leading capital but still wants McColl. Safe only // because "Mc" is unambiguous — "Mac" deliberately has no such rule. if (/^Mc[a-z]{2,}$/.test(atom)) return false; return /^(?:[A-Z][a-z]*|[A-Z][a-z]+[A-Z][A-Za-z]*|O[A-Z][a-z]+|[A-Z]{1,3}|[IVX]+)$/.test(atom); } function tidyName(value){ var v = (value || '').replace(/\s+/g, ' ').replace(/^ | $/g, ''); if (!v) return value; if (/[@\d,]|&[a-z]+;|&#|https?:|www\./i.test(v)) return value; // not a name var words = v.split(' '); var deliberate = words.every(function(w){ // A lone particle is not a particle — it is someone's name (Di, Al). if (words.length > 1 && isParticle(w)) return true; return w.split(/[-'\u2019.]/).filter(function(seg){ return /[a-z]/i.test(seg); }) .every(function(seg){ return nameWellFormed(seg); }); }); if (deliberate) return v; return words.map(function(w, i){ if (i > 0 && isParticle(w)) return w.toLowerCase(); return w.split(/([-'\u2019.])/).map(function(seg){ return /^[-'\u2019.]$/.test(seg) ? seg : nameRecase(seg); }).join(''); }).join(' '); } // ── Thousand separators ────────────────────────────────────────────── // Opt-in per field (data-thousands). Mirrors formatThousands() and the // caret helpers in the CRM's packages/shared/src/numbers.ts. The CRM // strips the separators again on submit, so storage is unaffected. function groupThousands(value){ var raw = String(value == null ? '' : value).replace(/,/g, ''); if (!raw) return ''; var neg = raw.charAt(0) === '-'; var body = neg ? raw.slice(1) : raw; var dot = body.indexOf('.'); var digits = function(x){ return x.replace(/[^0-9]/g, ''); }; var whole = digits(dot === -1 ? body : body.slice(0, dot)); var frac = dot === -1 ? null : digits(body.slice(dot + 1)); if (!whole && frac === null) return neg ? '-' : ''; var grouped = whole.replace(/\B(?=(\d{3})+(?!\d))/g, ','); return (neg ? '-' : '') + grouped + (frac === null ? '' : '.' + frac); } // Reposition by digit count, not character index: commas appear and // vanish to the left of the caret, and counting characters would throw // it to the end of the field on every keystroke. function caretAfterGrouping(formatted, digitsBefore){ if (digitsBefore 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/' + "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', ""); 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 Three properties for sale in Liverpool: 1 is hypothetical, 2 are real — Which sells for the most profit? appeared first on Property118 .
Originally published by
Property118