Even the most bullish Labour activists expected the Conservatives to hold the staunch Tory seat of Old Bexley and Sidcup – but Keir Starmer will be quietly encouraged by the 10.3% swing to Labour. For all the occasional whispers that an upset could be brewing, given Boris Johnson’s recent woes over sleaze and internal Tory dissatisfaction, a byelection in the outer London constituency was never the ideal battleground for Labour. In a seat that has always been held by the Conservatives since its creation in 1983 – originally by Edward Heath – the party was defending a near-19,000 majority from the 2019 election. And, while the North Shropshire byelection later this month was prompted by the resignation of Owen Paterson, the Tory former minister whose breach of lobbying rules prompted the furore about standards, the one at Old Bexley and Sidcup followed the untimely death of James Brokenshire, a popular and respected local figure. As ever with such results, all wings of a party can pick out the lessons they want, and those within Labour already dissatisfied with Starmer will grumble that even after weeks of poor headlines for Boris Johnson, the Tory candidate still won more than 50% of the vote. Nonetheless, there will be some satisfaction within the Labour leadership about a swing which, if replicated nationally at a general election, would put the party at least close to government. Perhaps more significant is that while the new Conservative MP for the seat, Louie French, won a sizeable percentage of the vote, his majority was just under 4,500. Although the turnout in December byelections could be expected to be low, Labour strategists will be buoyed by the idea that some Tory voters, if not ready to switch sides, are at least staying at home. There was also more evidence of targeted tactical voting. With Labour the accepted challenger, the Lib Dems and Greens – neither of whom devoted significant resources to the byelection – won fewer than 1,500 votes between them. On the Conservative side, feelings might also be mixed. Supporters of Johnson will use the result as evidence the prime minister is untainted by opposition attacks of corruption and incompetence: holding a seat so strongly at a byelection after the governing party has been in power for 11 years is certainly an achievement. But Tory canvassers whose job it was to “get out the vote” on Thursday confessed they heard complaints from disaffected Conservative supporters, many of whom criticised Johnson’s leadership skills and professionalism. A familiar story related by one Tory councillor who went door-knocking in the area went: “The reports our voters have weak motivation, and [are] disaffected with Boris, have been borne out in my conversations with residents.” But now the votes have been tallied, it is clear to see the seat was always very unlikely to change hands. Looking at its demographics, the proportion of people aged over 65 is 19.2% based on the last census data, well above the London average (12.2%). When it comes to housing, 79.8% of voters are property owners – again well above the London average of 48.3%. And the borough of Bexley voted strongly for leave in the EU referendum, by 63%. But while Johnson is well known for his promise in 2019 to “get Brexit done”, voters in Old Bexley and Sidcup do not seem convinced yet that the government is delivering for them in other areas. During the campaign, some brought up issues such as: Johnson’s widely panned speech to business leaders that meandered into Peppa Pig World; the party held in No 10 attended by Johnson during the second lockdown, and broader frustration accompanied by a sense that the PM needed to sharpen up his act. What may not worry some Conservatives – but should bother Labour – is that these voters lamented the lack of an effective opposition. Starmer was said by some observers of the campaign to have been invisible during the byelection, and the Labour leader even spent polling day in Yorkshire. That is perhaps the single clearest message from Thursday’s vote: neither leader can afford to be complacent.