Why experience matters when incorporating a property business
Property118

Why experience matters when incorporating a property business
The Property118 incorporation model has probably undergone more scrutiny than any other landlord incorporation strategy in the United Kingdom. After years of HMRC investigations and a full 10-day First-tier Tribunal Appeal hearing, the Tribunal overturned HMRC’s allocation of Scheme Reference Numbers, resulting in the cancellation of those references and an associated Stop Notice.
As Property118’s incorporation work became more widely known, criticism inevitably followed. Some commentators alleged that we were promoting tax avoidance. Others described us as scheme promoters, cowboys, grifters, clowns and worse. HMRC allocated Scheme Reference Numbers to arrangements associated with our work and ultimately issued a Stop Notice.
Many observers assumed that Property118 would retreat, while others assumed that landlords who had followed our recommendations would be left to deal with the consequences alone, but that is not what happened.
For over two years, Property118 paused incorporation-based consultancy pending the outcome of the Tribunal process. Now that we have judicial clarity, we are open for incorporation-based consultancy again.
Standing behind our clients
When scrutiny intensified, Property118 faced a choice. We could attempt to distance ourselves from the arrangements and leave clients to defend themselves, or we could stand behind the guidance we had provided and support the landlords who had placed their trust in us.
We chose the latter.
We supported clients through HMRC enquiries, compliance checks and Discovery Assessments. We sought advice from leading barristers and King’s Counsel. We undertook legal challenges and ultimately defended our position before the First-tier Tribunal. The process was expensive, time-consuming and often stressful for everyone involved, but walking away was never an option that our integrity could even contemplate.
What the Tribunal decided
The First-tier Tribunal ultimately ruled that Property118’s activities did NOT breach the DOTAS regulations.
The significance of that decision extends beyond the immediate outcome, because it demonstrates that the simplistic narrative advanced by some critics did not withstand detailed legal scrutiny. It reinforces the distinction between promoting tax avoidance and helping landlords utilise statutory provisions that Parliament has deliberately enacted. It also highlights the value of practical experience in an area where commercial realities are often every bit as important as technical tax analysis.
Many people expressed opinions about landlord incorporations; Property118 was prepared to defend its position before a Tribunal.
There is a meaningful difference between commenting from the sidelines and standing behind clients when the consequences become real.
The tax outcomes the Tribunal recognised
The Tribunal did not seek to deny the existence of tax advantages associated with incorporation, or Property118’s recommended path to implementation. In fact, the Tribunal expressly identified a number of tax outcomes that may arise when a landlord transitions a property business into a limited company structure. These included:
- The ability to avoid the effects of the Section 24 finance cost restrictions, which apply to individuals and partnerships but not to companies.
- The ability for future business profits to be taxed at corporation tax rates rather than higher rates of income tax.
- The availability of Incorporation Relief under Section 162 TCGA 1992, enabling capital gains to be deferred when a qualifying business is transferred to a company.
- The ability for historic capital gains in the properties to be effectively rolled into the shares issued on incorporation, a consequence often referred to as “washing out gains” or “rebasing acqusition value”
- The preservation of Incorporation Relief that might otherwise have been restricted if refinancing had taken place at the point of incorporation.
- The ability for landlords to finance the extraction of their positive capital account balances prior to incorporation, without additional tax consequences.
The existence of these tax outcomes was not controversial. The Tribunal expressly recognised them when summarising the competing arguments before it.
Critics often presented these tax outcomes as though they were somehow unique to the Property118 incorporation model, but they are not.
Every one of these outcomes arises from legislation enacted by Parliament, HMRC concessions, or long-established principles of tax law. The Tribunal’s role was not to decide whether those tax outcomes existed. It was to determine whether the arrangements fell within the specific statutory tests required by the DOTAS legislation.
The Property118 Tax Tribunal ruling can be read here.
Why did the Tribunal conclude that DOTAS did not apply?
The DOTAS legislation does not say that any arrangement producing a tax advantage must be disclosed. If it did, routine business incorporations throughout the United Kingdom would potentially fall within the regime.
The Tribunal recognised that Parliament has deliberately enacted a range of statutory reliefs and exemptions designed to facilitate genuine business reorganisations. Incorporation Relief is one example, the treatment of SDLT for partnership incorporations is another. The ability for a company to deduct finance costs in full is simply a consequence of the corporation tax code enacted by Parliament.
The crucial question was therefore not whether tax advantages existed, but whether the arrangements fell within the specific descriptions and hallmarks prescribed by the DOTAS legislation.
Having considered the evidence in detail, the Tribunal concluded that HMRC’s allocation of Scheme Reference Numbers should be cancelled.
The Tribunal did not conclude that the Property118 incorporation model produced no tax advantages, it expressly recognised that it could. What the Tribunal did conclude was that the existence of those tax advantages did not, in the circumstances of this case, make the arrangements notifiable under the DOTAS regime. For landlords, that is an important because it reflects a principle that has existed throughout the UK tax system for decades. Parliament regularly creates reliefs, exemptions and alternative routes by which businesses can organise their affairs. Choosing to use legislation in the way Parliament intended is not the same thing as participating in a notifiable tax avoidance scheme.
The Tribunal proceedings contained thousands of pages of evidence and multiple barristers and King’s Counsel were involved. Both HMRC and the Tribunal scrutinised every aspect of the arrangements in extraordinary detail. The Court time alone was 10-full-days. Throughout that process, one thing became increasingly clear; the landlords who engaged Property118 were not primarily motivated by tax, they wanted to solve business problems.
Why experience matters most
There is no specific qualification that makes somebody an expert in landlord incorporations. No university degree, professional designation or regulatory licence can, on its own, equip an adviser with the breadth of knowledge required to guide landlords through what is often one of the most significant restructuring decisions of their business lives.
A solicitor may be an expert in company law, an accountant may specialise in taxation, and a mortgage broker may have extensive knowledge of lender criteria and refinancing options. However, incorporation sits at the point where all of these disciplines overlap, which is why experience often proves far more valuable than any individual qualification.
At Property118, we have always believed that practical outcomes matter more than professional labels. That belief has been shaped by helping more landlords incorporate their property businesses than any other company, assisting more landlords through HMRC compliance checks relating to incorporation than any other company, and successfully challenging more HMRC Discovery Assessments arising from landlord incorporations than any other company.
Those achievements were not acquired in a classroom; they were earned by helping real landlords solve real-world problems.
The majority of landlords who approached Property118 had spent many years, and often several decades, building substantial property businesses. They had accumulated significant equity, built up positive capital account balances and reached a point where their priorities were beginning to change. Retirement planning became increasingly important and succession planning started to move higher up the agenda. Many wanted to involve children in the future of the business without immediately surrendering control of everything they had spent a lifetime creating.
The difficulty was that conventional incorporation often created commercial challenges that few advisers were discussing. Landlords wanted to know how they could retain flexibility over wealth they had already accumulated. They wanted to understand how future refinancing might work. They wanted to separate historic capital from future business growth. They wanted to know how their children might eventually become involved and how the business could continue beyond their own lifetime.
These were not tax questions; they were business questions, and they deserved business solutions.
Why the Property118 landlord incorporation model was developed
The objective was never to create tax advantages that Parliament had not intended. The tax reliefs associated with incorporation already existed and were deliberately enacted to facilitate genuine business reorganisations. The challenge was making incorporation commercially workable for landlords whose circumstances were often more complex than those contemplated by traditional incorporation models.
At its heart, the Property118 incorporation model was built around flexibility.
It recognised that many landlords had accumulated substantial wealth before incorporation and wanted to preserve appropriate access to that wealth after incorporation. It recognised that positive capital account balances often represented decades of hard work, risk-taking and profits that had already been taxed. It recognised that retirement planning, succession planning, refinancing flexibility and long-term business continuity were frequently more important to landlords than achieving the lowest possible tax bill.
The objective was therefore to help landlords achieve the benefits of incorporation without unnecessarily sacrificing flexibility over historic capital. It also sought to avoid situations where refinancing at the point of incorporation could create unnecessary cost, complexity or even tax liabilities without generating any cash from which those liabilities could be paid. Deferring refinancing until there was a genuine commercial reason to undertake it gave landlords greater flexibility whilst preserving future options.
The Property118 incorporation model explained
One of the major hurdles landlords face during incorporation is dealing with existing financing arrangements. Many lenders are unwilling to novate (transfer) existing mortgages when properties are being transferred from personal to corporate ownership. This reluctance is often due to perceived risks or because the lender’s policies don’t accommodate such restructures. However, the Property118 solution allows landlords to defer the immediate need for refinancing, thus avoiding the often insurmountable obstacle of finding a lender who will refinance and novate mortgages at the point of incorporation, plus deferring the substantial cost and hassle of arranging new mortgages until a more commercially advantageous time.
The Property118 model focuses first on the transfer of beneficial ownership while retaining the legal ownership in the landlord’s name. This ensures that the lender’s security over the property remains intact under Sections 85-87 and Section 114 of the Law of Property Act (LPA) 1925. By keeping the legal title in the original owner’s name during the incorporation process, the lender’s legal charge on the property is unaffected, meaning they retain full security against the borrower’s mortgage obligations.
This structure offers several key advantages:
- No Immediate Need to Refinance: Landlords can defer refinancing to a time that is more commercially suitable, avoiding penalties, fees, or rushed negotiations that might arise from
trying to novate mortgages during incorporation. - Legal Protection for Lenders: The LPA 1925 ensures that the lender’s security interest remains fully protected during this phase. Since the legal title to the property remains with
the original borrower (the landlord), the lender’s charge continues to be valid. There is no need for lenders to consent to a transfer of the beneficial interest, as their security remains
tied to the legal ownership, which does not change during the incorporation process. - Flexibility in Lender Engagement: The structure allows landlords to engage with lenders at a later stage when the corporate entity is better established, improving their chances of securing favourable terms. This can help landlords avoid early repayment charges or fees that could result from refinancing prematurely.
- Minimising Disruption: Incorporating a property business is already a complex process, and adding the requirement to refinance all existing loans simultaneously can create unnecessary
operational burdens and introduce significant risk to the process. By deferring this need, the method advocated by Property118 allows landlords to focus on smoothly transitioning their business to corporate ownership, before addressing refinancing.
This model mitigates the risks identified in Simon’s Taxes at B9:114 …
“The incorporation of a buy-to-let property business may involve refinancing the existing mortgages which could possibly prevent HMRC applying ESC D32. If the company does not assume the same liabilities of the transferor, but instead raises finance of its own, which is passed to the transferor to settle its debts related to the properties being transferred, there is considerable risk that HMRC might choose not to apply its concession.”
The above expert guidance from Simon’s Taxes is clearly derived from HMRC’s explanation of ESC D32 in CG65745, in particular the words “indemnity” and “taken over”.
“The transferor is not required to transfer business liabilities to the company but often does so. This is normally done in practice by the company giving the transferor an indemnity in respect of those liabilities.
In strictness, business liabilities taken over by the company represent additional consideration for the transfer and relief under TCGA92/S162 should be restricted. However, ESC/D32 enables any business liabilities taken over by the company to be ignored when quantifying `other consideration’ in recognition of the fact that the transferor is not receiving cash to meet any tax liabilities on the transfer and that the shares in the company are worth less than if the business had been transferred unfettered by liabilities.”
ESC/D32
Where liabilities are taken over by a company on the transfer of a business to the company, the Revenue are prepared for the purposes of the ‘rollover’ provision in TCGA 1992 s 162, not to treat such liabilities as consideration. If therefore the other conditions of s 162 are satisfied, no capital gain arises on the transfer. Relief under s 162 is not precluded by the fact that some or all of the liabilities of the business are not taken over by the company.”
The first element of the Property118 incorporation model is designed to protect landlords, not to circumvent tax obligations.
The second element is a commercial strategy designed to address liquidity and financing challenges that landlords face when incorporating their property businesses.
- Expert Advice from Simon’s Taxes B9:112: “If there is a substantial capital account in the unincorporated business, the business owner(s) should be advised to draw this down before incorporation. Otherwise, that capital will be locked into the value of the shares.” This extraction is crucial to avoid having capital trapped within the company structure, limiting access to it.
- Support from HMRC Manual BIM45700: HMRC’s guidance (BIM45700) states: “A proprietor of a business may withdraw the profits of the business and the capital they have introduced to the business, even though substitute funding then has to be provided by interest-bearing loans.” This confirms that withdrawing the capital before incorporation is legitimate, even if the company assumes responsibility for the borrowed funds.
Property118’s solution to these commercial problems:
- Pre-Incorporation Borrowing by the Unincorporated Business: Before incorporation, the unincorporated property business borrows money using bridging finance or another short-term loan. This provides the business with the necessary liquidity to enable the landlord to extract the positive balance from their capital account (which represents retained profits and capital injections) before the business transitions into a limited company. It is important to note that positive capital account balances will have previously been subjected to taxation, which is why the withdrawal is not taxed again.
- Company Assumes the Liabilities: Upon incorporation, the newly formed company assumes responsibility for the short term lending via an indemnity agreement. The company, rather than the individual, now holds the liability for repaying the loan.
- Support from HMRC Guidance CG65745: HMRC guidance CG65745 confirms that liabilities assumed by the company in the course of incorporation do not count as consideration for CGT purposes, provided the conditions for incorporation relief under TCGA 1992, Section 162 are met.
- Loaning the Cash Back to the Company: The former business owner, now a shareholder, loans the extracted capital back to the company. This is recorded in the company’s accounts as a shareholder’s loan. The company is likely to use these funds to pay short-term financing but may decide to take on longer-term financing to repay the short-term loans, leaving the company with extra working capital.
- Repayment of the Shareholder’s Loan: Over time, the company repays the shareholder’s loan. These repayments are tax-efficient because they represent the return of capital, not income or dividends, and therefore do not trigger personal tax liabilities for the shareholder.
Why landlords continue to choose Property118
The landlords who engage Property118 are rarely searching for a clever tax scheme. More often, they are searching for clarity.
They want confidence that the business they have spent years building will continue to to prosper and reassurance that their business can continue beyond their own involvement.
Successful incorporations begin with a clear understanding of what the landlord is trying to achieve. The tax consequences are important and should never be ignored, but the most successful outcomes are almost always driven by commercial objectives rather than taxation alone.
That philosophy continues to guide everything we do today.
BOOK YOUR CONSULTATION TODAY
1. Property business details
Get your free PDF report
(function(){
var uid = “crm-form-263729fd”;
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) < 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":"29a6d2dd-1824-4d07-ae3f-5e14607d1599","type":"number","label":"Gross annual rent"}];
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://crm-api.property118.com";
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/’ + “ffff0ec7-9df5-4d37-9e93-d9bb0b6b64fc” + ‘/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’, “ffff0ec7-9df5-4d37-9e93-d9bb0b6b64fc”);
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.';
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 <= 1 ) { return; }
var r = btn.closest( '.crm-repeater-row' );
if ( r ) { r.remove(); }
rep.dispatchEvent( new CustomEvent( 'crm-repeater-change', { bubbles: true } ) );
} );
}
} );
})();
.p118-crm-form{–navy:#0b3d66;–pale:#f5f8fb;–line:#cfd9e3;–muted:#5b6775;max-width:980px;margin:24px auto;font-family:Arial,Helvetica,sans-serif;color:#1f2937}
.p118-crm-form .crm-field{margin-bottom:14px}
.p118-crm-form label{display:block;font-weight:700;color:var(–navy);margin-bottom:6px}
.p118-crm-form input[type=”number”],.p118-crm-form input[type=”text”],.p118-crm-form input[type=”email”],.p118-crm-form select{width:100%;min-height:44px;border:1px solid #aebdca;border-radius:7px;padding:10px 11px;background:#fff;font-size:16px;color:#1f2937;box-sizing:border-box}
.p118-crm-form input:focus,.p118-crm-form select:focus,.p118-crm-form button:focus{outline:3px solid rgba(21,93,145,.24);outline-offset:1px}
/* section headings */
.p118-crm-form .crm-section,.p118-crm-form h2,.p118-crm-form h3{color:var(–navy);font-size:20px;margin:22px 0 6px;padding-top:10px;border-top:1px solid var(–line)}
/* shareholder repeater rows as cards */
.p118-crm-form .crm-repeater-field>label{font-size:20px;border-top:1px solid var(–line);padding-top:10px;margin-top:22px}
.p118-crm-form .crm-repeater-rows{counter-reset:p118sh}
.p118-crm-form .crm-repeater-row{counter-increment:p118sh;position:relative;border:1px solid #b9c7d3;border-radius:10px;padding:52px 16px 16px;margin-top:12px;background:#fbfdff}
.p118-crm-form .crm-repeater-row::before{content:”Shareholder ” counter(p118sh);position:absolute;top:15px;left:16px;font-size:18px;font-weight:700;color:var(–navy)}
.p118-crm-form .crm-repeater-row-fields{display:grid;grid-template-columns:1fr;gap:12px}
.p118-crm-form .p118-btl-calc-btn{appearance:none;border:0;border-radius:8px;padding:13px 20px;font-size:16px;font-weight:700;cursor:pointer;background:var(–navy);color:#fff;margin:12px 0}
.p118-crm-form .crm-repeater-row .crm-field{margin-bottom:0}
.p118-crm-form .crm-repeater-row-fields input:not([type=”checkbox”]),.p118-crm-form .crm-repeater-row-fields select{width:100%;box-sizing:border-box}
/* single-checkbox booleans (salary optimisation, dividends, pension, non-resident toggles) */
.p118-crm-form .crm-repeater-row-fields .crm-choices label{display:flex;gap:9px;align-items:center;font-weight:400;min-height:44px;margin:0;cursor:pointer}
.p118-crm-form .crm-repeater-row-fields .crm-choices input[type=”checkbox”]{width:18px;height:18px;min-height:0;flex:0 0 auto;margin:0}
.p118-crm-form .crm-repeater-remove{position:absolute;top:12px;right:12px;background:#fff;color:#9f1239;border:1px solid #e6a6b8;border-radius:8px;padding:6px 10px;font-size:13px;font-weight:700;cursor:pointer}
.p118-crm-form .crm-repeater-add,.p118-crm-form button[type=”submit”]{appearance:none;border:0;border-radius:8px;padding:12px 17px;font-size:16px;font-weight:700;cursor:pointer}
.p118-crm-form .crm-repeater-add{background:#e6eef5;color:var(–navy);border:1px solid #b9cad9;margin-top:12px}
.p118-crm-form button[type=”submit”]{background:var(–navy);color:#fff}
/* consent + submit area */
.p118-crm-form .crm-consent-label{font-weight:400;display:flex;gap:8px;align-items:flex-start}
/* results */
.p118-btl-results{margin-top:20px}
.p118-btl-hint{background:var(–pale);border:1px dashed var(–line);border-radius:10px;padding:16px;color:var(–muted);font-size:15px}
.p118-btl-out{border:2px solid var(–navy);border-radius:12px;background:var(–pale);padding:18px}
.p118-btl-headline{font-weight:700;font-size:18px;margin:0 0 14px}
.p118-btl-headline.p118-pos{color:#17633a}
.p118-btl-headline.p118-neg{color:#9f1239}
.p118-btl-tablewrap{overflow-x:auto;margin-top:12px}
.p118-btl-table{width:100%;border-collapse:collapse;background:#fff;font-size:14px;min-width:640px}
.p118-btl-table th,.p118-btl-table td{border:1px solid #d6e0e8;padding:9px 10px;vertical-align:top}
.p118-btl-table th{background:var(–navy);color:#fff;text-align:left}
.p118-btl-table td+td{text-align:right;white-space:nowrap}
.p118-btl-table tr:nth-child(even) td{background:#f8fafc}
.p118-btl-table tr.p118-btl-strong td{font-weight:700}
.p118-btl-table td.p118-btl-net{text-align:right;white-space:nowrap}
/* summary cards */
.p118-btl-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:14px 0}
.p118-btl-card{background:#fff;border:1px solid var(–line);border-radius:10px;padding:15px;display:flex;flex-direction:column}
.p118-btl-cardlabel{display:block;color:var(–muted);font-size:13px;margin-bottom:7px}
/* margin-top:auto pins the value to the bottom of each (equal-height) card, so
all three values line up even when a label wraps to two lines */
.p118-btl-value{font-size:24px;font-weight:700;color:var(–navy);margin-top:auto}
.p118-btl-value.p118-pos{color:#17633a}
.p118-btl-value.p118-neg{color:#9f1239}
@media(max-width:760px){.p118-btl-summary{grid-template-columns:1fr}}
/* figures-used recap + warning notes */
.p118-btl-figures{background:#fff;border:1px solid var(–line);border-radius:10px;padding:15px;margin-top:15px}
.p118-btl-figures p{margin:6px 0 0;line-height:1.5}
.p118-btl-warning{background:#fff8e6;border:1px solid #e8cc80;border-radius:9px;padding:12px;margin-top:14px;font-size:14px;line-height:1.5}
/* “Estimated result” heading (override the section-heading border-top) */
.p118-btl-out .p118-btl-resulttitle{border-top:0;padding-top:0;margin:0 0 10px;color:var(–navy);font-size:21px}
/* static disclaimer notes, always visible below the form */
.p118-btl-notes{margin-top:18px}
.p118-btl-note{font-size:12px;color:var(–muted);line-height:1.5;margin-top:14px}
/* title + intro at the top (matches the standalone calculator) */
.p118-btl-header{margin-bottom:8px}
.p118-btl-title{color:var(–navy);font-size:28px;line-height:1.2;margin:0 0 10px}
.p118-btl-intro{line-height:1.55;margin:0 0 6px;color:#1f2937}
(function(){
‘use strict';
// ── Field ids (must match the seeded BTL Calculator form) ──────────────────
var F = {
year:’8ca5faab-7fd0-4263-ab16-c28cac2a33dd’,
rent:’29a6d2dd-1824-4d07-ae3f-5e14607d1599′,
interest:’a4cb8069-1050-4ccd-951f-d5aa4dea1cee’,
costMode:’3decd8c1-e458-4085-bb5c-fab26e71432b’,
costPct:’b6bf5767-e12f-4c46-aec2-06a7eba263f3′,
costAmt:’e9cb6264-8168-4b6d-81ff-c4ed51212e4f’,
associated:’aaa3b1a0-7c1d-4e01-aa7b-069a6335ff7d’,
extraction:’fdce52bf-c76f-449c-a63b-bce9e7906c6b’,
extractionPct:’8bd621d8-8eef-4114-9db9-d0f5f7c17963′,
shareholders:’c441faed-5bf9-4290-9335-37c9aba50a40′,
shName:’fe7f6621-acd1-42b9-b4fc-37ca29cbaf1a’,
shShare:’9df50ba8-ff5a-454a-9748-4bb9cb45f5c8′,
shResident:’e5601232-087b-4db0-8d4a-4b4a91cbbeb3′,
shOtherIncome:’3843a208-bb92-4b89-be11-9bd3088b57e9′,
shOtherDiv:’5609d332-3866-48ea-9ca1-4eb519005d46′,
shOptimise:’bce9079f-806e-4f61-b9ec-ea9591cd448f’,
shDividends:’b2b09c3b-0ef8-4ec5-8c29-686d2db85d8a’,
shPension:’5e6320c4-fd4b-4a97-93a0-f9048581c39a’,
// non-UK-resident only (shown when “UK tax resident?” = No)
shEntitledPa:’7c1de2f0-11aa-4b22-9c33-a1b2c3d40001′,
shApplyDivTax:’7c1de2f0-11aa-4b22-9c33-a1b2c3d40002′,
shApplySalaryTax:’7c1de2f0-11aa-4b22-9c33-a1b2c3d40003′,
name:’df54eedb-ec85-410c-b865-c14e5d5983c6′,
reportData:’c8e98065-9275-4fd9-9bbe-607e5eb8e588′
};
var repeater = document.querySelector(‘.crm-repeater[data-repeater-id=”‘ + F.shareholders + ‘”]’);
var mount = document.querySelector(‘.p118-btl-results’);
var reportField = document.querySelector(‘[name=”‘ + F.reportData + ‘”]’);
if (!repeater || !mount) { return; }
var form = repeater.closest(‘form’) || document;
// ── helpers to read the native fields ──────────────────────────────────────
function el(id){ return form.querySelector(‘[name=”‘ + id + ‘”]’); }
function val(id){ var e = el(id); return e ? e.value : ”; }
function num(id){ var v = parseFloat(val(id)); return isFinite(v) ? v : 0; }
function entered(id){ var e = el(id); return !!e && String(e.value).trim() !== ”; }
// read a sub-field inside a given repeater row by its child field id
function rowEl(row, childId){ var w = row.querySelector(‘[data-field-id=”‘ + childId + ‘”]’); return w ? w.querySelector(‘input,select,textarea’) : null; }
function rowVal(row, childId){ var e = rowEl(row, childId); return e ? e.value : ”; }
function rowNum(row, childId){ var v = parseFloat(rowVal(row, childId)); return isFinite(v) ? v : 0; }
function rowYes(row, childId, dflt){ var e = rowEl(row, childId); if (!e) return dflt; if (e.type === ‘checkbox’) return !!e.checked; return e.value === ‘yes'; }
function money(v){ return new Intl.NumberFormat(‘en-GB’,{style:’currency’,currency:’GBP’,maximumFractionDigits:0}).format(isFinite(v)?v:0); }
function percent(v){ return (isFinite(v)?v:0).toFixed(1).replace(‘.0′,”) + ‘%'; }
function escapeHtml(v){ return String(v||”).replace(/[&'”]/g,function(ch){return {‘&':’&’,”:’>’,”‘”:’'’,'”‘:’"’}[ch];}); }
// ── TAX ENGINE (unchanged — same maths as the standalone calculator) ───────
var TAX = {
‘2026’:{pa:12570,basicBand:37700,additionalThreshold:125140,generalRates:[0.20,0.40,0.45],propertyRates:[0.20,0.40,0.45],dividendRates:[0.1075,0.3575,0.3935],dividendAllowance:500,section24Rate:0.20,employeePT:12570,employeeUEL:50270,employeeMain:0.08,employeeUpper:0.02,employerST:5000,employerRate:0.15,ctLowerLimit:50000,ctUpperLimit:250000,ctSmallRate:0.19,ctMainRate:0.25,ctMarginalFraction:0.015},
‘2027’:{pa:12570,basicBand:37700,additionalThreshold:125140,generalRates:[0.20,0.40,0.45],propertyRates:[0.22,0.42,0.47],dividendRates:[0.1075,0.3575,0.3935],dividendAllowance:500,section24Rate:0.22,employeePT:12570,employeeUEL:50270,employeeMain:0.08,employeeUpper:0.02,employerST:5000,employerRate:0.15,ctLowerLimit:50000,ctUpperLimit:250000,ctSmallRate:0.19,ctMainRate:0.25,ctMarginalFraction:0.015}
};
function personalAllowance(ani,eligible,tax){ if(!eligible){return 0;} return Math.max(0,tax.pa-Math.max(0,ani-100000)/2); }
function allocateTax(amount,occupied,rates,zeroRateAllowance,tax){
amount=Math.max(0,amount);occupied=Math.max(0,occupied);zeroRateAllowance=Math.max(0,zeroRateAllowance||0);
var basicAvailable=Math.max(0,tax.basicBand-Math.min(occupied,tax.basicBand));
var basic=Math.min(amount,basicAvailable);var remaining=amount-basic;occupied+=basic;
var higherAvailable=Math.max(0,tax.additionalThreshold-Math.max(occupied,tax.basicBand));
var higher=Math.min(remaining,higherAvailable);remaining-=higher;var additional=Math.max(0,remaining);
var slices=[basic,higher,additional];var totalTax=0;
for(var i=0;i<3;i++){var free=Math.min(slices[i],zeroRateAllowance);zeroRateAllowance-=free;totalTax+=(slices[i]-free)*rates[i];}
return {tax:totalTax,occupied:occupied+higher+additional,slices:slices};
}
function computeIncomeTax(input,tax){
var other=Math.max(0,input.other||0),property=Math.max(0,input.property||0),dividends=Math.max(0,input.dividends||0);
if(input.applyDividendTax===false){dividends=0;}
var ani=other+property+dividends;var allowance=personalAllowance(ani,input.personalAllowance!==false,tax);var remainingPA=allowance;
var otherTaxable=Math.max(0,other-remainingPA);remainingPA=Math.max(0,remainingPA-other);
var propertyTaxable=Math.max(0,property-remainingPA);remainingPA=Math.max(0,remainingPA-property);
var dividendTaxable=Math.max(0,dividends-remainingPA);var occupied=0,total=0;
var a=allocateTax(otherTaxable,occupied,tax.generalRates,0,tax);total+=a.tax;occupied=a.occupied;
var b=allocateTax(propertyTaxable,occupied,tax.propertyRates,0,tax);total+=b.tax;occupied=b.occupied;
var c=allocateTax(dividendTaxable,occupied,tax.dividendRates,tax.dividendAllowance,tax);total+=c.tax;occupied=c.occupied;
return {tax:total,allowance:allowance,ani:ani,taxable:occupied};
}
function employeeNIC(salary,tax,statePensionAge,apply){ if(!apply||statePensionAge||salary<=tax.employeePT){return 0;} return Math.max(0,Math.min(salary,tax.employeeUEL)-tax.employeePT)*tax.employeeMain+Math.max(0,salary-tax.employeeUEL)*tax.employeeUpper; }
function employerNIC(salary,tax,apply){ if(!apply||salary<=tax.employerST){return 0;} return (salary-tax.employerST)*tax.employerRate; }
function corporationTax(profit,associated,tax){ if(profit<=0){return 0;} var divisor=associated+1,lower=tax.ctLowerLimit/divisor,upper=tax.ctUpperLimit/divisor; if(profit=upper){return profit*tax.ctMainRate;} return profit*tax.ctMainRate-(upper-profit)*tax.ctMarginalFraction; }
function personalScenario(state,shareholders){
var tax=TAX[state.year];var propertyProfitBeforeInterest=state.rent-state.costs;var totalTax=0,totalCredit=0,totalCash=state.rent-state.costs-state.interest;var rows=[];
shareholders.forEach(function(s){
var propertyProfit=Math.max(0,propertyProfitBeforeInterest*s.share);var interest=state.interest*s.share;
var base=computeIncomeTax({other:s.otherIncome,property:0,dividends:s.otherDividends,personalAllowance:s.personalAllowance,applyDividendTax:s.applyDividendTax},tax);
var full=computeIncomeTax({other:s.otherIncome,property:propertyProfit,dividends:s.otherDividends,personalAllowance:s.personalAllowance,applyDividendTax:s.applyDividendTax},tax);
var adjustedAboveAllowance=Math.max(0,full.ani-full.allowance);var creditBase=Math.min(interest,propertyProfit,adjustedAboveAllowance);
var credit=Math.max(0,creditBase*tax.section24Rate);var incremental=Math.max(0,full.tax-credit-base.tax);
totalTax+=incremental;totalCredit+=credit;
});
return {tax:totalTax,credit:totalCredit,cashAfterTax:totalCash-totalTax,combinedWealth:totalCash-totalTax};
}
function dividendAllocations(dividendPool,shareholders){
var participants=shareholders.filter(function(s){return s.receivesDividends;});var participatingShares=participants.reduce(function(sum,s){return sum+s.share;},0);var result={};
shareholders.forEach(function(s){result[s.index]=0;});if(dividendPool<=0||participatingShares<=0){return result;}
participants.forEach(function(s){result[s.index]=dividendPool*(s.share/participatingShares);});return result;
}
function companyScenario(state,shareholders,salaries){
var tax=TAX[state.year];var operatingProfit=state.rent-state.costs-state.interest;var employerNi=0,totalSalary=0;
shareholders.forEach(function(s,i){var salary=Math.max(0,salaries[i]||0);totalSalary+=salary;employerNi+=employerNIC(salary,tax,s.applySalaryTax);});
var preCT=operatingProfit-totalSalary-employerNi;if(preCT0){return null;}
var ct=corporationTax(preCT,state.associated,tax);var postCT=preCT-ct;var dividendPool=Math.max(0,postCT)*state.extractionPct;
var dividendByShareholder=dividendAllocations(dividendPool,shareholders);var personalTax=0,employeeNi=0,netCash=0,rows=[];
shareholders.forEach(function(s,i){
var salary=Math.max(0,salaries[i]||0);var dividend=dividendByShareholder[s.index]||0;
var base=computeIncomeTax({other:s.otherIncome,property:0,dividends:s.otherDividends,personalAllowance:s.personalAllowance,applyDividendTax:s.applyDividendTax},tax);
var taxableSalary=s.applySalaryTax?salary:0;
var full=computeIncomeTax({other:s.otherIncome+taxableSalary,property:0,dividends:s.otherDividends+dividend,personalAllowance:s.personalAllowance,applyDividendTax:s.applyDividendTax},tax);
var incomeTax=Math.max(0,full.tax-base.tax);var eni=employeeNIC(salary,tax,s.statePensionAge,s.applySalaryTax);
personalTax+=incomeTax;employeeNi+=eni;netCash+=salary+dividend-incomeTax-eni;
rows.push({name:s.name,resident:s.resident,salary:salary,dividend:dividend,incomeTax:incomeTax,employeeNi:eni,net:salary+dividend-incomeTax-eni});
});
var retained=postCT-dividendPool;var combinedWealth=retained+netCash;
return {operatingProfit:operatingProfit,employerNi:employerNi,employeeNi:employeeNi,ct:ct,dividendPool:dividendPool,personalTax:personalTax,retained:retained,combinedWealth:combinedWealth,rows:rows};
}
function salaryOptimisationLimit(s,state,tax){ if(!s.optimiseSalary||!s.personalAllowance){return 0;} var dividendsForAllowance=s.applyDividendTax?s.otherDividends:0;var allowance=personalAllowance(s.otherIncome+dividendsForAllowance,true,tax);var unusedAllowance=Math.max(0,allowance-s.otherIncome);var companyCashProfit=Math.max(0,state.rent-state.costs-state.interest);return Math.min(unusedAllowance,companyCashProfit); }
function candidateSalaries(s,state,tax){ var limit=salaryOptimisationLimit(s,state,tax);if(limit<=0){return [0];}var values=[0,Math.min(limit,tax.employerST),Math.min(limit,tax.employeePT),limit];var step=limit<=5000?50:100;for(var x=0;x<=limit;x+=step){values.push(x);}var unique={};values.forEach(function(v){v=Math.max(0,Math.min(limit,Math.round(v/10)*10));unique[v]=true;});return Object.keys(unique).map(Number).sort(function(a,b){return a-b;}); }
function optimiseSalaries(state,shareholders){
var tax=TAX[state.year];var salaries=shareholders.map(function(){return 0;});var best=companyScenario(state,shareholders,salaries);if(!best){return null;}
for(var pass=0;pass<8;pass++){var changed=false;
for(var i=0;ilocalBest.combinedWealth+0.01){localBest=result;localSalary=candidate;}});
if(localSalary!==salaries[i]){salaries[i]=localSalary;best=localBest;changed=true;}}
if(!changed){break;}}
for(var j=0;j<shareholders.length;j++){if(!shareholders[j].optimiseSalary){continue;}var current=salaries[j],limit=salaryOptimisationLimit(shareholders[j],state,tax);
for(var c2=Math.max(0,current-500);c2best.combinedWealth+0.01){best=result;salaries=trial;}}}
return best;
}
// ── read the form ──────────────────────────────────────────────────────────
function getState(){
var costMode=val(F.costMode)||’percent';var rent=num(F.rent);
var costs=costMode===’amount’?num(F.costAmt):rent*(num(F.costPct)/100);
var extractionMode=val(F.extraction)||’retain';
var extractionPct=extractionMode===’retain’?0:(extractionMode===’all’?1:num(F.extractionPct)/100);
return {year:val(F.year)||’2026′,rent:rent,interest:num(F.interest),costs:costs,associated:Math.max(0,Math.floor(num(F.associated))),extractionMode:extractionMode,extractionPct:Math.max(0,Math.min(1,extractionPct))};
}
function getShareholders(){
var rows=repeater.querySelectorAll(‘.crm-repeater-row’);
return Array.prototype.map.call(rows,function(row,index){
var resident=rowVal(row,F.shResident)!==’no';
return {index:index,name:(rowVal(row,F.shName)||”).trim()||(‘Shareholder ‘+(index+1)),share:Math.max(0,rowNum(row,F.shShare))/100,resident:resident,
otherIncome:Math.max(0,rowNum(row,F.shOtherIncome)),otherDividends:Math.max(0,rowNum(row,F.shOtherDiv)),
optimiseSalary:rowYes(row,F.shOptimise,true),receivesDividends:rowYes(row,F.shDividends,true),statePensionAge:rowYes(row,F.shPension,false),
// UK residents get full PA + UK dividend/PAYE treatment; for a non-resident
// read the three conditional fields (defaults match the original: PA off,
// dividend tax off, salary PAYE/NI on).
personalAllowance:resident?true:rowYes(row,F.shEntitledPa,false),
applyDividendTax:resident?true:rowYes(row,F.shApplyDivTax,false),
applySalaryTax:resident?true:rowYes(row,F.shApplySalaryTax,true),
entered:{share:String(rowVal(row,F.shShare)).trim()!==”}};
});
}
function personName(){
var f=form.querySelector(‘[name=”‘+F.name+'[first]”]’),l=form.querySelector(‘[name=”‘+F.name+'[last]”]’);
return ((f?f.value:”)+’ ‘+(l?l.value:”)).trim();
}
// ── render + report_data ────────────────────────────────────────────────────
function showMessage(msg){ mount.innerHTML=’
‘; if(reportField){reportField.value=”;} }
function recompute(){
var state=getState();var shareholders=getShareholders();
if(!entered(F.rent)||state.rent0.0001){ return showMessage(‘Ownership percentages must total 100% (currently ‘+percent(shareTotal*100)+’).’); }
var personal=personalScenario(state,shareholders);
var optimised=optimiseSalaries(state,shareholders);
if(!optimised){ return showMessage(‘No feasible salary combination for these figures.’); }
var diff=optimised.combinedWealth-personal.combinedWealth;var cls=diff>=0?’p118-pos':’p118-neg';
var headline=diff>=0?’The optimised company structure leaves an estimated ‘+money(diff)+’ more in combined cash and retained profit each year.':’Personal ownership leaves an estimated ‘+money(Math.abs(diff))+’ more cash each year.';
var nonResident=shareholders.some(function(s){return !s.resident;});
var html=’
Estimated result
‘+headline+’
‘+
‘
‘
‘+
‘
‘+
‘
‘+
‘
‘+
‘
| Metric | Personal ownership | Company (optimised) |
|---|---|---|
‘+
‘
| Shareholder | UK tax status | Salary | Dividend | Income Tax | Employee NI | Net received |
|---|---|---|---|---|---|---|
| ‘+money(r.net)+’ |
‘+
‘
Gross annual rent: ‘+money(state.rent)+’. Non-finance costs: ‘+money(state.costs)+’. Annual mortgage interest and other finance costs: ‘+money(state.interest)+’.
‘+
(nonResident?’
‘:”)+
‘
‘+
‘
‘+
‘
‘;
mount.innerHTML=html;
if(reportField){
reportField.value=JSON.stringify({
name:personName()||undefined,taxYear:state.year,rent:state.rent,costs:state.costs,interest:state.interest,
personal:{tax:personal.tax,credit:personal.credit,combinedWealth:personal.combinedWealth},
company:{operatingProfit:optimised.operatingProfit,ct:optimised.ct,nationalInsurance:optimised.employerNi+optimised.employeeNi,personalTax:optimised.personalTax,dividendPool:optimised.dividendPool,retained:optimised.retained,combinedWealth:optimised.combinedWealth,
shareholders:optimised.rows.map(function(r){return {name:r.name,resident:r.resident,salary:r.salary,dividend:r.dividend,incomeTax:r.incomeTax,employeeNi:r.employeeNi,net:r.net};})}
});
}
return true;
}
function cell(v){ return ‘
‘; }
function row2(label,a,b){ return ‘
‘; }
// ── two-step flow: “Calculate comparison” computes + reveals the report step ─
var revealed=false;
var resultsField=mount.closest(‘.crm-field’)||mount;
var submitWrap=form.querySelector(‘.crm-submit’);
// Everything AFTER the results mount is the “Get your free PDF report” step —
// hidden until the user calculates. (Submit lives outside the field flow on
// the WP render, so handle it explicitly too.)
var reportEls=[];var sib=resultsField.nextElementSibling;
while(sib){reportEls.push(sib);sib=sib.nextElementSibling;}
function setReportVisible(v){
reportEls.forEach(function(e){e.style.display=v?”:’none';});
if(submitWrap){submitWrap.style.display=v?”:’none';}
}
setReportVisible(false);
// Conditional inputs — show cost %/amount + extraction % based on the selects,
// like the original calculator. Runs on load + on every change.
function showField(id,show){ var e=el(id); var w=e?e.closest(‘.crm-field’):null; if(w){ w.style.display=show?”:’none'; } }
// Per shareholder row: the three UK-treatment fields are only relevant to a
// non-UK-resident, so reveal them only when that row’s “UK tax resident?” = No
// (exactly like the standalone calculator).
function toggleShareholderRow(row){
var nonRes = rowVal(row,F.shResident)===’no';
[F.shEntitledPa,F.shApplyDivTax,F.shApplySalaryTax].forEach(function(cid){
var w = row.querySelector(‘[data-field-id=”‘+cid+'”]’);
if(w){ w.style.display = nonRes ? ” : ‘none'; }
});
}
function toggleShareholderRows(){ Array.prototype.forEach.call(repeater.querySelectorAll(‘.crm-repeater-row’),toggleShareholderRow); }
// Checkbox fields can’t be default-checked via the field config, so seed each
// row’s defaults once (salary optimisation + dividend allocation + PAYE/NI on;
// everything else off). Marked so a user un-tick is never re-applied.
function initShareholderRow(row){
if(row.getAttribute(‘data-p118-init’)===’1′){return;}
row.setAttribute(‘data-p118-init’,’1′);
[F.shOptimise,F.shDividends,F.shApplySalaryTax].forEach(function(cid){
var e=rowEl(row,cid); if(e&&e.type===’checkbox’){e.checked=true;}
});
// “UK tax resident?” renders with a blank “— Select —”; default it to Yes.
var res=rowEl(row,F.shResident); if(res&&res.tagName===’SELECT’&&!res.value){res.value=’yes';}
}
function initShareholderRows(){ Array.prototype.forEach.call(repeater.querySelectorAll(‘.crm-repeater-row’),initShareholderRow); }
function toggleConditional(){
var cm=val(F.costMode)||’percent’, ex=val(F.extraction)||’retain';
showField(F.costPct, cm===’percent’);
showField(F.costAmt, cm===’amount’);
showField(F.extractionPct, ex===’partial’);
toggleShareholderRows();
}
initShareholderRows();
toggleConditional();
form.addEventListener(‘change’, toggleConditional);
var calcBtn=document.createElement(‘button’);
calcBtn.type=’button';calcBtn.className=’p118-btl-calc-btn';calcBtn.textContent=’Calculate comparison';
if(resultsField.parentNode){resultsField.parentNode.insertBefore(calcBtn,resultsField);}
calcBtn.addEventListener(‘click’,function(){ if(recompute()){ revealed=true; setReportVisible(true); } });
// Once the report step is showing, keep the figures live as they tweak inputs.
var t;
function schedule(){ if(!revealed){return;} clearTimeout(t); t=setTimeout(recompute,120); }
form.addEventListener(‘input’,schedule);
form.addEventListener(‘change’,schedule);
document.addEventListener(‘crm-repeater-change’,function(e){ if(repeater.contains(e.target)||e.target===repeater){ initShareholderRows(); toggleShareholderRows(); if(revealed){ schedule(); } } });
// Title + intro at the very top, matching the standalone calculator.
if (form && form.tagName === ‘FORM’ && !form.querySelector(‘.p118-btl-header’)) {
var header=document.createElement(‘div’);
header.className=’p118-btl-header';
header.innerHTML=’
Buy-to-let tax comparison calculator
Compare the estimated annual position where a residential property business is owned personally or through a limited company. Property information is entered first, followed by each owner or shareholder.
‘;
form.insertBefore(header, form.firstChild);
}
// Static disclaimers — always visible below the form (as in the standalone
// calculator). Appended outside the so the two-step reveal never hides them.
var notes=document.createElement(‘div’);
notes.className=’p118-btl-notes';
notes.innerHTML=’
This calculator is an indicative comparison for England, Wales and Northern Ireland. It does not calculate SDLT, CGT, ATED, Employment Allowance, pension contributions, student loans, Gift Aid, Marriage Allowance, High Income Child Benefit Charge, brought-forward losses or brought-forward finance costs. It does not model overseas tax or individual double-taxation treaties. Any salary must relate to genuine work performed for the company.
‘+
‘
If the company is structured with multiple classes of shares, it may be possible for the founders or directors to distribute profits in proportions that differ from the overall shareholdings. The structure may also allow the value of the founders’ shares to be frozen, with future growth allocated to other share classes to incentivise the next generation and support longer-term inheritance tax planning.
‘;
(form.parentNode||form).appendChild(notes);
showMessage(‘Enter your figures above, then press Calculate comparison.’);
})();
BOOK YOUR CONSULTATION TODAY
The post Why experience matters when incorporating a property business appeared first on Property118.
View Full Article: Why experience matters when incorporating a property business
Landlords face deposit dilemma as government considers future reforms
Property118

Landlords face deposit dilemma as government considers future reforms
Thousands of landlords could face a rethink over how they handle tenant deposits if future reforms come into force.
The government has hinted at axing insurance-backed deposit schemes, but the plans are not yet law.
Now industry experts are warning landlords to understand their options and consider the risks before any changes are introduced.
Two types of insurance-based schemes
There are currently two types of insurance-based schemes that work in different ways for landlords and tenants.
Under an insurance-backed deposit protection scheme, a tenant pays a traditional deposit, for example £1,200, while the landlord or letting agent holds the money rather than placing it into a custodial scheme.
An insurance policy is then used to provide protection, such as in cases where the agent is unable to return the deposit. These schemes have historically provided landlords with an alternative route to meeting deposit protection requirements.
Deposit replacement products, such as Reposit, Zero Deposit and Flatfair, work differently. Instead of paying a traditional deposit, the tenant pays a one-off fee or premium. The provider then gives the landlord protection against costs such as damage or rent arrears up to an agreed limit, often linked to the equivalent deposit amount.
While there has been discussion around possible changes to insurance-backed deposit schemes, no new legislation has yet been introduced.
The bigger potential change for the deposits sector is expected to come through the government’s review of the tenancy deposit system, which is due to begin during 2027.
Propertymark is urging landlords to start preparing to understand the different options available to them.
Require landlords to review current arrangements
Henry Griffith, senior policy and campaigns officer at Propertymark, told Property118: “We welcome clarity on the future of deposit arrangements under the Renters’ Rights Act and recognise the importance of ensuring that any changes provide confidence and protection for both landlords and tenants.
“The potential ending of insurance-based deposit protection schemes will require some landlords to review their current arrangements.
“While these schemes have provided a route for some landlords to meet their legal obligations without holding tenant money directly, it is important to distinguish between insurance-backed deposit protection and deposit replacement products.
“Deposit replacement schemes operate differently, with tenants paying a fee or premium rather than providing a traditional cash deposit, and they are not simply a replacement for insurance-based protection.
“For landlords currently using insurance-backed deposit protection, the priority should be to understand how the changes will apply in practice, review their existing processes and consider the options available ahead of implementation.
“This includes looking at the costs, risks and administrative implications of alternative approaches, while ensuring that any arrangements remain compliant with the legislation and provide appropriate protection for all parties.”
Not suitable in every circumstance
Propertymark believes deposit replacement products could become more widely considered by landlords looking for alternatives, but warns that they are not a one-size-fits-all solution.
Mr Griffith adds: “Deposit replacement products may become more widely considered as landlords look for alternatives, particularly where they can help reduce upfront costs for tenants and simplify some aspects of deposit management.
“However, they are not suitable in every circumstance, and landlords should carefully consider factors including affordability, tenant demand, the level of protection offered, fees involved and how disputes and claims are handled.
“Ultimately, landlords need access to a range of compliant options so they can choose the approach that best fits their circumstances.
“Propertymark will continue to engage with the UK government and industry stakeholders to ensure that any transition is practical, clearly understood and supports a fair and effective private rented sector.”
Minor errors have great consequences
It is important for landlords to know that deposit replacement products such as Reposit are separate from insurance-backed deposit protection schemes and will continue to be available.
Reposit believes these products could play a bigger role following the Renters’ Rights Act, as landlords look for ways to manage risk.
Ben Grech, chief executive of Reposit, explains to Property118: “Products such as Reposit are absolutely still permitted and are set to play a much bigger role post-Renters’ Rights Act, not just as a deposit replacement, but as a tool to help agents and landlords operate more effectively in a more complex and compliance-driven system.
“With the shift to rolling Assured Periodic Tenancies and the removal of Section 21, risk has moved firmly towards process and compliance. In this environment, Reposit reduces that risk in a very tangible way.
“Because no deposit is held, the regulations designed to protect tenant’s money being held on account are not required, removing much of the admin and compliance risk at the start of a new tenancy. This becomes particularly important where even minor administrative errors can now have far greater consequences.
“At the same time, Reposit strengthens landlord protection. Landlords are covered for up to eight weeks’ rent, compared to the five-week cap on traditional deposits, providing greater reassurance at a time when regaining possession may take longer and rely solely on Section 8.
“Reposit also enables faster tenant commitment, as paying a one-week fee is quicker and more accessible than a large, traditional deposit, helping agents secure lets more quickly. This also helps to ease affordability pressures for tenants, in a market where there is continued upward pressure on rents.”
Important for landlords to stay informed
A spokesperson for the National Residential Landlords Association (NRLA) told Property118 that until any further changes are confirmed, landlords can continue using the deposit arrangements currently available to them.
For now, whilst landlords don’t need to make any immediate changes, it’s important for landlords to stay informed. With no one-size-fits-all solution, knowing the risks and benefits of each scheme will be crucial.
The post Landlords face deposit dilemma as government considers future reforms appeared first on Property118.
View Full Article: Landlords face deposit dilemma as government considers future reforms
Government vows Renters’ Rights Act will tackle rental discrimination
Property118

Government vows Renters’ Rights Act will tackle rental discrimination
The government has claimed the Renters’ Rights Act cracks down on rental discrimination in the private rented sector.
In a parliamentary written answer, housing minister Matthew Pennycook claimed the act addresses overt discriminatory practices.
Under the Renters’ Rights Act, it is illegal for landlords and letting agents to discriminate against prospective tenants who receive benefits or have children, with fines of up to £7,000 for those who break the rules.
Bear down on rental discrimination practices
Labour MP Tanmanjeet Singh Dhesi asked: “Whether the government has considered the potential merits of requiring (a) letting agents and (b) landlords to provide a reason to rental housing applicants for applications being unsuccessful to ensure compliance with the Equality Act 2010 and Renters Rights Act”.
Mr Pennycook said: “The Renters’ Rights Act extends existing protections against discrimination in the lettings process under the Equality Act 2010 to those in receipt of benefits or with children.
“The act also provides local authorities with strong investigatory and enforcement powers to bear down on rental discrimination practices in the private rented sector.
“It addresses both overt discriminatory practices, such as ‘No DSS’ adverts, and situations where landlords or letting agents use other indirect practices in order to prevent someone entering into a tenancy.”
He adds: “My Department also encourages good practice across property agents. The Property Ombudsman already has a code of practice for letting agents which is mandatory for its members; and we will publish, later this year, a non-statutory code of practice setting out minimum best practice standards, and consider legislation to ensure compliance.
“Our new Private Rented Sector Ombudsman, once established, will be able to publish guidance and codes of practice for landlords, which will further help to drive up standards across this sector.”
As previously reported by Property118, the government has hinted that the Private Rented Sector (PRS) Ombudsman could take into account previous cases of inadequate conduct by landlords.
The post Government vows Renters’ Rights Act will tackle rental discrimination appeared first on Property118.
View Full Article: Government vows Renters’ Rights Act will tackle rental discrimination
Categories
- Landlords (19)
- Real Estate (9)
- Renewables & Green Issues (1)
- Rental Property Investment (1)
- Tenants (21)
- Uncategorized (12,940)
Archives
- September 2026 (23)
- August 2026 (61)
- July 2026 (63)
- June 2026 (70)
- May 2026 (70)
- April 2026 (78)
- March 2026 (72)
- February 2026 (55)
- January 2026 (52)
- December 2025 (62)
- August 2025 (51)
- July 2025 (51)
- June 2025 (49)
- May 2025 (50)
- April 2025 (48)
- March 2025 (54)
- February 2025 (51)
- January 2025 (52)
- December 2024 (55)
- November 2024 (64)
- October 2024 (82)
- September 2024 (69)
- August 2024 (55)
- July 2024 (64)
- June 2024 (54)
- May 2024 (73)
- April 2024 (59)
- March 2024 (49)
- February 2024 (57)
- January 2024 (58)
- December 2023 (56)
- November 2023 (59)
- October 2023 (67)
- September 2023 (136)
- August 2023 (131)
- July 2023 (129)
- June 2023 (128)
- May 2023 (140)
- April 2023 (121)
- March 2023 (168)
- February 2023 (155)
- January 2023 (152)
- December 2022 (136)
- November 2022 (158)
- October 2022 (146)
- September 2022 (148)
- August 2022 (169)
- July 2022 (124)
- June 2022 (124)
- May 2022 (130)
- April 2022 (116)
- March 2022 (155)
- February 2022 (124)
- January 2022 (120)
- December 2021 (117)
- November 2021 (139)
- October 2021 (130)
- September 2021 (138)
- August 2021 (110)
- July 2021 (110)
- June 2021 (60)
- May 2021 (127)
- April 2021 (122)
- March 2021 (156)
- February 2021 (154)
- January 2021 (133)
- December 2020 (126)
- November 2020 (159)
- October 2020 (169)
- September 2020 (181)
- August 2020 (147)
- July 2020 (172)
- June 2020 (158)
- May 2020 (177)
- April 2020 (188)
- March 2020 (234)
- February 2020 (212)
- January 2020 (164)
- December 2019 (107)
- November 2019 (131)
- October 2019 (145)
- September 2019 (123)
- August 2019 (112)
- July 2019 (93)
- June 2019 (82)
- May 2019 (94)
- April 2019 (88)
- March 2019 (78)
- February 2019 (77)
- January 2019 (71)
- December 2018 (37)
- November 2018 (85)
- October 2018 (108)
- September 2018 (110)
- August 2018 (135)
- July 2018 (140)
- June 2018 (118)
- May 2018 (113)
- April 2018 (64)
- March 2018 (96)
- February 2018 (82)
- January 2018 (92)
- December 2017 (62)
- November 2017 (100)
- October 2017 (105)
- September 2017 (97)
- August 2017 (101)
- July 2017 (104)
- June 2017 (155)
- May 2017 (135)
- April 2017 (113)
- March 2017 (138)
- February 2017 (150)
- January 2017 (127)
- December 2016 (90)
- November 2016 (135)
- October 2016 (149)
- September 2016 (135)
- August 2016 (48)
- July 2016 (52)
- June 2016 (54)
- May 2016 (52)
- April 2016 (24)
- October 2014 (8)
- April 2012 (2)
- December 2011 (2)
- November 2011 (10)
- October 2011 (9)
- September 2011 (9)
- August 2011 (3)
Calendar
Recent Posts
- Could a new LLP tax judgment help landlords caught in HMRC’s Spotlight 63?
- Why the nonsense £65 landlord database tax is just the start
- One million landlords set to use tenant deposit alternatives
- Why September could be the month to rethink your property portfolio
- Rents look set to rise as tenant demand grows – RICS

admin