Sparta Rotterdam Willems began his career with amateur side Spartaan '20 from whom he joined
Sparta Rotterdam. During his time with Sparta he progressed through the club's youth academy and made his senior debut on 16 January 2011, in a match against
Go Ahead Eagles. He made 16 appearances in the
Dutch second division.
PSV in 2014 On 31 August 2011, Willems joined
PSV Eindhoven on a three-year contract. He received the number 43 jersey and made his PSV debut on 23 October in a match against
Vitesse. Willems became the youngest Dutchman to play in a
UEFA competition when he started against
Hapoel Tel Aviv on 3 November in a
UEFA Europa League group stage match. That same month, he was permanently promoted to the first team squad. In December, Willems was targeted for a move to
Manchester United, with then United manager
Sir Alex Ferguson looking for "the next
Patrice Evra". On 3 April 2012, Willems' contract was upgraded and extended until 2016. Willems scored his first professional – and PSV – goal on 22 April 2012 in a match against
NEC. With this goal, he became the youngest goalscorer in the
2011–12 Eredivisie. He experienced a great amount of playing time in the 2011–12 season because full-back
Erik Pieters was injured. Although being young and quite inexperienced, Willems quickly showed evidence of his raw talent, especially his technique and attacking traits. On 15 July 2015, Willems suffered a serious injury and missed the first half of the
2015–16 season.
Eintracht Frankfurt On 17 July 2017, Willems joined
Bundesliga club
Eintracht Frankfurt to replace
Bastian Oczipka, who, in turn joined
Schalke 04. The transfer fee paid to PSV was reported as between €5 million and €9 million, depending on the source. Willems made 29 appearances during the
2017–18 season, which included the surprise win over
Bayern Munich in the
German Cup final. Willems started the
2018–19 season by starting in the
German Super Cup.
2019–20 season: Loan to Newcastle United On 2 August 2019, Willems joined
Newcastle United of the
Premier League on a season-long loan deal with an option to buy. Willems scored his first goal for Newcastle and in the
Premier League on 14 September, putting the Magpies into a shock lead at reigning
UEFA Champions League winners
Liverpool, but the side eventually fell to a 1–3 defeat. Willems then scored in a 2–2 draw with reigning
league champions
Manchester City on 30 November. He was ever-present in the Newcastle side during the first half of the season and made 20 appearances for the Magpies, until he suffered a season ending injury when he tore his ACL in January 2020. He left the club when his loan expired on 1 July 2020. Consequently, Willems returned to Frankfurt for the
2020-21 Bundesliga season. During the first half of the season, he continued his recovery from his knee injury. After almost a year of rehabilitation, Willems re-joined the group training of Eintracht Frankfurt at the beginning of 2021, but did not make any appearances for the rest of the season. Willems left Eintracht Frankfurt after his contract expired at the end of the season. In total, he made 65 appearances for the club.
Greuther Fürth In August 2021, Willems signed a two-year contract with newly promoted Bundesliga side
Greuther Fürth and has been given the number 15 jersey. He left the club on 1 September 2022, after his contract was terminated.
Groningen On 23 February 2023, Willems joined
Eredivisie club
Groningen on a contract until the end of the season.
Heracles Almelo On 14 June 2023, Willems signed a one-year contract with
Heracles Almelo, with an option for the second year.
Castellón On 25 July 2024, Willems signed for Spanish
Segunda División side
Castellón, after a trial period.
NEC On 26 June 2025, Willems agreed to return to
Eredivisie and signed a one-season contract with
NEC. ==International career==