Casper De Norre struck the only goal of the game as Swansea City’s 2023-24 season ended with defeat to Millwall at the Swansea.com Stadium.
The Belgian arrived to fire home with 18 minutes to play after the hosts had lost the ball in their own half, and it proved enough to settle the contest.
The Swans had seen skipper Matt Grimes denied from the penalty spot a few minutes before the Millwall breakthrough, while Jamie Paterson and Ronald were unable to convert presentable chances.
The game ended with both sides a man down as Jerry Yates and Japhet Tanganga saw red in the closing stages after a clash between the pair started a melee.
The result ended Swansea’s unbeaten run, but head coach Luke Williams will feel there is plenty to take from a final quarter of the season where his side’s form and performances have improved and have been more than competitive when compared with teams in the upper reaches of the division.
The Swans had shown two changes from the draw at Norwich City as Bashir Humphreys and Charlie Patino came in for Harry Darling and Jay Fulton.
Following a minute of applause in memory of two club greats in Terry Medwin and Leighton James, the hosts started brightly in a fixture between two sides who had been top of the form table over the previous four games.
Ronald whipped in a cross that was just too strong for Ollie Cooper while, at the other end, Josh Key made an important block after a long throw had bounced in the Swansea box.
The Swans should have led 12 minutes in when Liam Cullen fizzed in a cross from the left, with Ronald just unable to turn the ball home at the far post.
Key went tumbling in the box after a surging run but any appeals were quickly waved away by referee Geoff Eltringham.
The game began to settle down after that lively opening; the visitors prepared to sit off and look for opportunities on the counter, with the Swans having more of the ball and stepping on to their opponents.
Paterson headed over after Cooper had driven infield and sent in an inviting cross, before a strong challenge from Jake Cooper ended a driving run from Ronald which took the Brazilian from his own half to the edge of the Millwall box.
Ronald threatened again, Matija Sarkic getting off his line quickly to hoover up a Patino pass in behind.
Carl Rushworth had almost been a bystander at the other end, but Swansea’s player of the season showed strong wrists to beat away a firm strike from Ryan Longman as Millwall countered in the final moments of a goalless opening half.
Patino found Paterson in space early in the second half, but the winger’s ball back across goal was seized upon by Sarkic.
Danny McNamara then made an important challenge as Ronald looked to break into the area before Cullen was flagged offside as he ran on to a lofted Patino pass.
Millwall lifted the pressure, McNamara sending a low strike skidding wide of the target as he tried to find the far corner.
Rushworth then held a Jake Cooper header just before the hour mark before Swansea had the chance to break the deadlock when Ronald was felled as he twisted and turned away from his man in the box.
Captain Grimes assumed the responsibility, but was denied by Sarkic.
Swansea kept pressing, Key seeing a stinging drive deflected over the bar, but when Ronald tried to loft the ball over a defender deep in his own half, Millwall countered and Longman’s pull-back was finished by De Norre.
The hosts pressed for an equaliser but the pair of red cards led to a scrappy, niggly ending as the Swans finished the campaign 14th in the Championship table.
Swansea City: Carl Rushworth, Josh Key, Ben Cabango, Matt Grimes (captain), Jamie Paterson (Jerry Yates 74), Josh Tymon, Charlie Patino (Liam Walsh 61), Liam Cullen, Ollie Cooper (Jamal Lowe 61), Bashir Humphreys, Ronald (Azeem Abdulai 73).
Unused Substitutes: Andy Fisher, Mykola Kuharevich, Nathan Wood, Aimar Govea, Filip Lissah.
Millwall: Matija Sarkic, Danny McNamara, Jake Cooper, Japhet Tanganga, Billy Mitchell (George Saville 77), Tom Bradshaw (George Honeyman 77), Zian Flemming (Shuan Hutchinson 87), Ryan Longman, Ryan Leonard (Brooke Norton-Cuffy 58), Casper De Norre, Romain Esse (Duncan Watmore 58).
Unused Substitutes: Connal Trueman, Adam Mayor, Aidomo Emakhu, Wes Harding.
Referee: Geoff Eltringham
Attendance: 17,661