Good lease deals on less than great cars

Ive a friend who is a broker who sorted it all. Prices are in line with those above, bit cheaper but it's based on an actual car not one I have to wait for.
 
All in all, great.

The base spec of the Octavia vRS comes with DAB, Bluetooth, Dual Zone Climate, Cruise Control, Auto lights and Wipers and half leather interior. I haven't added any options. Its all around a decent place to spend time.

My only issue is I have the least good (I don't want to say worst as its not bad, its just not the best) engine and gearbox combination. The manual gearbox on the diesel is just a bit annoying. You will change gear 4 times down a motorway slip road, and the power all arrives in a big lump just before you run out of revs. Ideally I'd either have a petrol manual or a diesel auto, but both were considerably more expensive (£2k+ more over the 2 years) and I wasn't prepared to pay that for what is mainly 'a car'. At the moment I am mostly driving motorways anyway so the gearbox is a non issue.

I test drove a DSG 2.0 diesel and it was great, but like I said, not £2k more great.

I also searched around and couldn't find a PCP deal that came anywhere close to that lease either. I also investigated higher mileage contracts and it always worked out cheaper to pay the excess mileage charge rather than get a higher mileage agreement.

I'm over 2.5 years into owning a vRS estate diesel. Can't fault it. Good car, loads of space, drives well. That's coming from a 5 series car before hand.

I got 0% APR, free servicing for 30k, £1500 down and £249 a month for 3 years. Due to change later this year but would consider another one for sure.
 
I'm in no rush, I've got other cars, this is a station car.

That's fine, was just confused as you said it was an actual car (I thought in stock) rather than one you needed to wait for, but then waiting a month for it!

I did look at the Polo's as the GTI deals were very good! In the end I plumped for the boring dagdag Golf :(

How are the payments working out on the Polo?
 
I got bored this afternoon and wrote a user script for the Contract Hire and Leasing site. It gets rid of a load of junk on the page, makes the listings clearer but most helpfully adds the amortised costs to each listing, and orders the deals on the page by best value to worst. That's not to say there's not cheaper ones on other pages, but it guarantees the best one on this page is the first. It's most helpful when viewing a deals for a specific model.

It bascially turns this in to this.

To get it to work you'll need to download TamperMonkey/GreaseMonkey (or any other user script extension) for your browser, then add this to it:

Code:
// ==UserScript==
// @name         Contract Hire and Leasing Calculator
// @namespace    http://rorymccrossan.co.uk
// @version      1.0
// @description  Adds helpful information to each deal
// @author       Rory McCrossan
// @match        http://www.contracthireandleasing.com/personal/*
// @match        http://www.contracthireandleasing.com/business/*
// @grant        none
// ==/UserScript==

$('<style />', {
    text: '.overall-cost { text-align: right; padding: 0; position: absolute; top: 0; left: 0; right: 0; background-color: #DDD; }' + 
    '.deal .title-wrap { padding: 0 0 0 10px; }' + 
    '.all-price-wrap { padding: 0 10px 10px 0 }' + 
    'ul.amortised li { list-style: inherit; display: inline-block; position: relative; padding-left: 15px; text-align: left; margin: 0 5px 0 15px; }' + 
    'ul.amortised li:before { position: absolute; left: 0; content: "\u25b6"; }' +
    '.manufacturer-banner, #ootwWindow, .right-panel, .leaderboard-wrap, .deal-panel h2, .crosslinks, .inline-srb-wrap, footer { display: none; }' + 
    '.content { margin-top: 0; padding: 5px 3%; }' + 
    '#btnClose { top: 33px; right: 0; border-left: 5px solid #FFF }' + 
    '.deal-panel .listing-text { width: 50%; float: left; padding: 7px 0; }' + 
    '.pagination.posts { width: 50%; clear: none; padding: 0 0 10px; margin: 0;}' +
    '.search-button-wrap { width: 25%; float: right; position: relative; padding: 0 }' +
    '.keywords-wrap { width: 75%; float: left; margin: 0 }' + 
    '.adv-options { padding: 0 }' +
    '#alldeals .deal { color: #333; background-color: transparent; border: 1px solid #DDD; padding-top: 30px; }' +
    '#alldeals .deal:first-child { color: #080; background-color: #ecffef; border-color: #88E886; }' + 
    '#alldeals .deal:first-child .deal-table { background-color: transparent }' + 
    '#alldeals .deal:first-child ul.amortised li { font-weight: bold; }' + 
    '#alldeals .deal:first-child .overall-cost { background-color: #88E886; }'
}).appendTo('head');

$('.pagination.posts').clone(true).insertAfter('.listing-text');
$('.search-button-wrap').appendTo('.adv-hold');
$('<div class="deal-container"></div>').appendTo('#alldeals');

$('#alldeals .deal').each(function(i) {
    var $deal = $(this);
    
    // price calc
    var monthlyPrice = $deal.find('.deal-price').text().replace('£', '').replace(',', '');
    var initialPayment = parseFloat($deal.find('.deal-user').text().replace('£', '').replace(',', ''));
    var profileText = $deal.find('.deal-profile').text();
        
    var monthRegex = /(\d+)\+(\d+)/gi;
    var monthMatches = monthRegex.exec(profileText);
    
    if (isNaN(initialPayment)) {
        initialPayment = monthMatches[1] * monthlyPrice;
    }            
    
    var months = parseInt(monthMatches[2]);
    var years = (months + 1) / 12;
    
    var totalCost = ((monthlyPrice * months) + initialPayment).toFixed(2);
    var yearlyCost = (totalCost / years).toFixed(2);
    var $costDiv = $('<div class="overall-cost" />');
    
    var $amortisedData = $('<ul class="amortised" />').appendTo($costDiv);
    $('<li />', { 
        text: '£' + groupNumber((yearlyCost / 12).toFixed(2)) + ' / mo',
        class: 'monthly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(yearlyCost) + ' / yr', 
        class: 'yearly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(totalCost) + ' total',
        class: 'total'
    }).prependTo($amortisedData);
    
    $deal.data('yearly-cost', yearlyCost).prepend($costDiv);
}).sort(function(a, b) {
    return $(a).data('yearly-cost') - $(b).data('yearly-cost');
}).appendTo('.deal-container');

function toFloat(input) {
    return parseFloat(input.replace(/[^0-9\.]+/g,""));
}

function groupNumber(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

Let me know if you find any weird results. Hope it helps!
 
Last edited:
Dammit - Only £630 more expensive than the Golf over 2 years....I know which one I would rather have!

Let us know how you get on when it turns up!

Cheapest I have found so far for 8k and 10k miles over 2 years are on Yes-Lease, for the 3dr DSG.

8k - 5188
10k - 5404

Both include £300 admin fee, so slightly more than Housey but not sure if he had an admin fee to pay!

Housey, if you didn't, will your friend be able to do me the same deal? :D
 
I got bored this afternoon and wrote a user script for the Contract Hire and Leasing site. It gets rid of a load of junk on the page, makes the listings clearer but most helpfully adds the amortised costs to each listing, and orders the deals on the page by best value to worst. That's not to say there's not cheaper ones on other pages, but it guarantees the best one on this page is the first. It's most helpful when viewing a deals for a specific model.

It bascially turns this in to this.

To get it to work you'll need to download TamperMonkey/GreaseMonkey (or any other user script extension) for your browser, then add this to it:

Code:
// ==UserScript==
// @name         Contract Hire and Leasing Calculator
// @namespace    http://rorymccrossan.co.uk
// @version      1.0
// @description  Adds helpful information to each deal
// @author       Rory McCrossan
// @match        http://www.contracthireandleasing.com/personal/*
// @match        http://www.contracthireandleasing.com/business/*
// @grant        none
// ==/UserScript==

$('<style />', {
    text: '.overall-cost { text-align: right; padding: 0; position: absolute; top: 0; left: 0; right: 0; background-color: #DDD; }' + 
    '.deal .title-wrap { padding: 0 0 0 10px; }' + 
    '.all-price-wrap { padding: 0 10px 10px 0 }' + 
    'ul.amortised li { list-style: inherit; display: inline-block; position: relative; padding-left: 15px; text-align: left; margin: 0 5px 0 15px; }' + 
    'ul.amortised li:before { position: absolute; left: 0; content: "\u25b6"; }' +
    '.manufacturer-banner, #ootwWindow, .right-panel, .leaderboard-wrap, .deal-panel h2, .crosslinks, .inline-srb-wrap, footer { display: none; }' + 
    '.content { margin-top: 0; padding: 5px 3%; }' + 
    '#btnClose { top: 33px; right: 0; border-left: 5px solid #FFF }' + 
    '.deal-panel .listing-text { width: 50%; float: left; padding: 7px 0; }' + 
    '.pagination.posts { width: 50%; clear: none; padding: 0 0 10px; margin: 0;}' +
    '.search-button-wrap { width: 25%; float: right; position: relative; padding: 0 }' +
    '.keywords-wrap { width: 75%; float: left; margin: 0 }' + 
    '.adv-options { padding: 0 }' +
    '#alldeals .deal { color: #333; background-color: transparent; border: 1px solid #DDD; padding-top: 30px; }' +
    '#alldeals .deal:first-child { color: #080; background-color: #ecffef; border-color: #88E886; }' + 
    '#alldeals .deal:first-child .deal-table { background-color: transparent }' + 
    '#alldeals .deal:first-child ul.amortised li { font-weight: bold; }' + 
    '#alldeals .deal:first-child .overall-cost { background-color: #88E886; }'
}).appendTo('head');

$('.pagination.posts').clone(true).insertAfter('.listing-text');
$('.search-button-wrap').appendTo('.adv-hold');
$('<div class="deal-container"></div>').appendTo('#alldeals');

$('#alldeals .deal').each(function(i) {
    var $deal = $(this);
    
    // price calc
    var monthlyPrice = $deal.find('.deal-price').text().replace('£', '').replace(',', '');
    var initialPayment = parseFloat($deal.find('.deal-user').text().replace('£', '').replace(',', ''));
    var profileText = $deal.find('.deal-profile').text();
        
    var monthRegex = /(\d+)\+(\d+)/gi;
    var monthMatches = monthRegex.exec(profileText);
    
    if (isNaN(initialPayment)) {
        initialPayment = monthMatches[1] * monthlyPrice;
    }            
    
    var months = parseInt(monthMatches[2]);
    var years = (months + 1) / 12;
    
    var totalCost = ((monthlyPrice * months) + initialPayment).toFixed(2);
    var yearlyCost = (totalCost / years).toFixed(2);
    var $costDiv = $('<div class="overall-cost" />');
    
    var $amortisedData = $('<ul class="amortised" />').appendTo($costDiv);
    $('<li />', { 
        text: '£' + groupNumber((yearlyCost / 12).toFixed(2)) + ' / mo',
        class: 'monthly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(yearlyCost) + ' / yr', 
        class: 'yearly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(totalCost) + ' total',
        class: 'total'
    }).prependTo($amortisedData);
    
    $deal.data('yearly-cost', yearlyCost).prepend($costDiv);
}).sort(function(a, b) {
    return $(a).data('yearly-cost') - $(b).data('yearly-cost');
}).appendTo('.deal-container');

function toFloat(input) {
    return parseFloat(input.replace(/[^0-9\.]+/g,""));
}

function groupNumber(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

Let me know if you find any weird results. Hope it helps!

This looks great, good work.

Edit - Tried it, works well! Just had to change the script to include https:// as well. You should get it posted on the pistonheads thread!
 
Last edited:
I got bored this afternoon and wrote a user script for the Contract Hire and Leasing site. It gets rid of a load of junk on the page, makes the listings clearer but most helpfully adds the amortised costs to each listing, and orders the deals on the page by best value to worst. That's not to say there's not cheaper ones on other pages, but it guarantees the best one on this page is the first. It's most helpful when viewing a deals for a specific model.

It bascially turns this in to this.

To get it to work you'll need to download TamperMonkey/GreaseMonkey (or any other user script extension) for your browser, then add this to it:

Code:
// ==UserScript==
// @name         Contract Hire and Leasing Calculator
// @namespace    http://rorymccrossan.co.uk
// @version      1.0
// @description  Adds helpful information to each deal
// @author       Rory McCrossan
// @match        http://www.contracthireandleasing.com/personal/*
// @match        http://www.contracthireandleasing.com/business/*
// @grant        none
// ==/UserScript==

$('<style />', {
    text: '.overall-cost { text-align: right; padding: 0; position: absolute; top: 0; left: 0; right: 0; background-color: #DDD; }' + 
    '.deal .title-wrap { padding: 0 0 0 10px; }' + 
    '.all-price-wrap { padding: 0 10px 10px 0 }' + 
    'ul.amortised li { list-style: inherit; display: inline-block; position: relative; padding-left: 15px; text-align: left; margin: 0 5px 0 15px; }' + 
    'ul.amortised li:before { position: absolute; left: 0; content: "\u25b6"; }' +
    '.manufacturer-banner, #ootwWindow, .right-panel, .leaderboard-wrap, .deal-panel h2, .crosslinks, .inline-srb-wrap, footer { display: none; }' + 
    '.content { margin-top: 0; padding: 5px 3%; }' + 
    '#btnClose { top: 33px; right: 0; border-left: 5px solid #FFF }' + 
    '.deal-panel .listing-text { width: 50%; float: left; padding: 7px 0; }' + 
    '.pagination.posts { width: 50%; clear: none; padding: 0 0 10px; margin: 0;}' +
    '.search-button-wrap { width: 25%; float: right; position: relative; padding: 0 }' +
    '.keywords-wrap { width: 75%; float: left; margin: 0 }' + 
    '.adv-options { padding: 0 }' +
    '#alldeals .deal { color: #333; background-color: transparent; border: 1px solid #DDD; padding-top: 30px; }' +
    '#alldeals .deal:first-child { color: #080; background-color: #ecffef; border-color: #88E886; }' + 
    '#alldeals .deal:first-child .deal-table { background-color: transparent }' + 
    '#alldeals .deal:first-child ul.amortised li { font-weight: bold; }' + 
    '#alldeals .deal:first-child .overall-cost { background-color: #88E886; }'
}).appendTo('head');

$('.pagination.posts').clone(true).insertAfter('.listing-text');
$('.search-button-wrap').appendTo('.adv-hold');
$('<div class="deal-container"></div>').appendTo('#alldeals');

$('#alldeals .deal').each(function(i) {
    var $deal = $(this);
    
    // price calc
    var monthlyPrice = $deal.find('.deal-price').text().replace('£', '').replace(',', '');
    var initialPayment = parseFloat($deal.find('.deal-user').text().replace('£', '').replace(',', ''));
    var profileText = $deal.find('.deal-profile').text();
        
    var monthRegex = /(\d+)\+(\d+)/gi;
    var monthMatches = monthRegex.exec(profileText);
    
    if (isNaN(initialPayment)) {
        initialPayment = monthMatches[1] * monthlyPrice;
    }            
    
    var months = parseInt(monthMatches[2]);
    var years = (months + 1) / 12;
    
    var totalCost = ((monthlyPrice * months) + initialPayment).toFixed(2);
    var yearlyCost = (totalCost / years).toFixed(2);
    var $costDiv = $('<div class="overall-cost" />');
    
    var $amortisedData = $('<ul class="amortised" />').appendTo($costDiv);
    $('<li />', { 
        text: '£' + groupNumber((yearlyCost / 12).toFixed(2)) + ' / mo',
        class: 'monthly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(yearlyCost) + ' / yr', 
        class: 'yearly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(totalCost) + ' total',
        class: 'total'
    }).prependTo($amortisedData);
    
    $deal.data('yearly-cost', yearlyCost).prepend($costDiv);
}).sort(function(a, b) {
    return $(a).data('yearly-cost') - $(b).data('yearly-cost');
}).appendTo('.deal-container');

function toFloat(input) {
    return parseFloat(input.replace(/[^0-9\.]+/g,""));
}

function groupNumber(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

Let me know if you find any weird results. Hope it helps!

You absolute genius!

Now if you can do something similar for all the lease websites amalgamate them into one and call it carleasecompare.com!

Amazing

EDIT
OMG It includes the total and yearly costs as well? That is awesome! Hats off sir!
Deffo consider posting on the PH forum as this will be useful to many others!
 
Last edited:
I got bored this afternoon and wrote a user script for the Contract Hire and Leasing site. It gets rid of a load of junk on the page, makes the listings clearer but most helpfully adds the amortised costs to each listing, and orders the deals on the page by best value to worst. That's not to say there's not cheaper ones on other pages, but it guarantees the best one on this page is the first. It's most helpful when viewing a deals for a specific model.

It bascially turns this in to this.

To get it to work you'll need to download TamperMonkey/GreaseMonkey (or any other user script extension) for your browser, then add this to it:

Code:
// ==UserScript==
// @name         Contract Hire and Leasing Calculator
// @namespace    http://rorymccrossan.co.uk
// @version      1.0
// @description  Adds helpful information to each deal
// @author       Rory McCrossan
// @match        http://www.contracthireandleasing.com/personal/*
// @match        http://www.contracthireandleasing.com/business/*
// @grant        none
// ==/UserScript==

$('<style />', {
    text: '.overall-cost { text-align: right; padding: 0; position: absolute; top: 0; left: 0; right: 0; background-color: #DDD; }' + 
    '.deal .title-wrap { padding: 0 0 0 10px; }' + 
    '.all-price-wrap { padding: 0 10px 10px 0 }' + 
    'ul.amortised li { list-style: inherit; display: inline-block; position: relative; padding-left: 15px; text-align: left; margin: 0 5px 0 15px; }' + 
    'ul.amortised li:before { position: absolute; left: 0; content: "\u25b6"; }' +
    '.manufacturer-banner, #ootwWindow, .right-panel, .leaderboard-wrap, .deal-panel h2, .crosslinks, .inline-srb-wrap, footer { display: none; }' + 
    '.content { margin-top: 0; padding: 5px 3%; }' + 
    '#btnClose { top: 33px; right: 0; border-left: 5px solid #FFF }' + 
    '.deal-panel .listing-text { width: 50%; float: left; padding: 7px 0; }' + 
    '.pagination.posts { width: 50%; clear: none; padding: 0 0 10px; margin: 0;}' +
    '.search-button-wrap { width: 25%; float: right; position: relative; padding: 0 }' +
    '.keywords-wrap { width: 75%; float: left; margin: 0 }' + 
    '.adv-options { padding: 0 }' +
    '#alldeals .deal { color: #333; background-color: transparent; border: 1px solid #DDD; padding-top: 30px; }' +
    '#alldeals .deal:first-child { color: #080; background-color: #ecffef; border-color: #88E886; }' + 
    '#alldeals .deal:first-child .deal-table { background-color: transparent }' + 
    '#alldeals .deal:first-child ul.amortised li { font-weight: bold; }' + 
    '#alldeals .deal:first-child .overall-cost { background-color: #88E886; }'
}).appendTo('head');

$('.pagination.posts').clone(true).insertAfter('.listing-text');
$('.search-button-wrap').appendTo('.adv-hold');
$('<div class="deal-container"></div>').appendTo('#alldeals');

$('#alldeals .deal').each(function(i) {
    var $deal = $(this);
    
    // price calc
    var monthlyPrice = $deal.find('.deal-price').text().replace('£', '').replace(',', '');
    var initialPayment = parseFloat($deal.find('.deal-user').text().replace('£', '').replace(',', ''));
    var profileText = $deal.find('.deal-profile').text();
        
    var monthRegex = /(\d+)\+(\d+)/gi;
    var monthMatches = monthRegex.exec(profileText);
    
    if (isNaN(initialPayment)) {
        initialPayment = monthMatches[1] * monthlyPrice;
    }            
    
    var months = parseInt(monthMatches[2]);
    var years = (months + 1) / 12;
    
    var totalCost = ((monthlyPrice * months) + initialPayment).toFixed(2);
    var yearlyCost = (totalCost / years).toFixed(2);
    var $costDiv = $('<div class="overall-cost" />');
    
    var $amortisedData = $('<ul class="amortised" />').appendTo($costDiv);
    $('<li />', { 
        text: '£' + groupNumber((yearlyCost / 12).toFixed(2)) + ' / mo',
        class: 'monthly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(yearlyCost) + ' / yr', 
        class: 'yearly'
    }).prependTo($amortisedData);
    $('<li />', { 
        text: '£' + groupNumber(totalCost) + ' total',
        class: 'total'
    }).prependTo($amortisedData);
    
    $deal.data('yearly-cost', yearlyCost).prepend($costDiv);
}).sort(function(a, b) {
    return $(a).data('yearly-cost') - $(b).data('yearly-cost');
}).appendTo('.deal-container');

function toFloat(input) {
    return parseFloat(input.replace(/[^0-9\.]+/g,""));
}

function groupNumber(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

Let me know if you find any weird results. Hope it helps!

In my day proper programming was this...

10 Print "Housey is Ace"
20 Goto 10

Run

Now it seems so more, well, easy. :eek:
 
You need to make this work on all lease sites then deffo make your own site with it.

if you do that when your boaRd I would love to see what you do whenyour not
 
I will try that script out at home tonight.

Focus is in the garage tomorrow, if it's going to be expensive I think I'll look into getting an Octavia.
 
He's coming in quite a bit higher than the broker websites unfortunately, I'll have to double check.

Will give him a call though to see if he can come down in price.

That's strange?

Best to give him a call and make sure its spec for spec the same deal as he has access to the main system.

Whatever quote is out there, he should be able to match at the very least without admin fees.

Have you emailed him the quote from the website? That's what I do then he looks it up to see if its there or not.

The brokers use the same system he does so if it is on offer he will also see it, if not then generally the brokers will be trying to sell you a non existent deal.
 
Back
Top Bottom