Sparta Rotterdam As a South Hollander, Dumfries began his football career at Spartaan '20 and spent two years before he was released by the club for being "not considered good enough as a boy" and was not well liked by teammates and even trainers. Shortly after, Dumfries then joined
Smitshoek, having to "sign up for himself" and said about his time at the club, saying: "As a youth I could already go to Spartaan'20, but that was difficult. My parents always had to bring me, I had to wait until I could ride my own bike. It took some getting used to. Smitshoek was a village, this was in the city. You had to fight for your place, maybe I was a bit too timid among all those city boys. You might find it hard to believe now, but I was a bit shy and reserved. They were all men, tough guys." Dumfries then signed up for amateur side
Barendrecht and spent a year at the club. Having progressed with the club's youth system within months, he signed his first professional contract with Sparta Rotterdam on a multi-year contract, keeping him at the club until 2017. Dumfries then made his professional debut on 20 February 2015 against
FC Emmen, coming on as a second-half substitute, in a 2–1 loss. He later made two more appearances in the 2014–15 season, both coming on as a substitute. At the start of the 2015–16 season, Dumfries started out on the substitute bench before he established himself in the first team, playing in the right–back position and helped Sparta Rotterdam become contenders for promotion to
Eredivisie. On 7 November 2015, Dumfries signed a contract extension with the club, keeping him at the club until 2019. He then scored his first goal in his professional career, in a 5–2 win against
RKC Waalwijk on 18 January 2016. Dumfries started in every match, playing in the right–back position, to help the club maintain their promotion to Eredivisie until he was suspended for one match for picking up five yellow cards this season. After serving a one match suspension, Dumfries returned to the starting line–up against
Almere City on 14 March 2016, as Sparta Rotterdam lost 1–0. He later helped the club beat
Jong Ajax 3–1 on 11 April 2016 to confirm their promotion to the
Eredivisie next season. Throughout the 2015–16 season, Dumfries' performance led to Dutch media, calling him the best player in the league. For his performance, he won both
Eerste Divisie Talent of the Year Award and the Bronze Bull. At the end of the 2015–16 season, Dumfries went on to make thirty–three appearances and scoring once in all competitions. At the start of the 2016–17 season, Dumfries said about the new season, saying: "So the Eredivisie came for me at a good time. I want to keep developing myself, so it's good to have better and smarter opponents against me now. They force me to be smarter in choosing the moments I can come up with, but I think I picked this up pretty quickly." He continued to establish himself in the first team, playing in the right–back position. However, Dumfries received a red card for a second bookable offence, in a 1–1 draw against
AZ Alkmaar on 2 October 2016. After serving a one match suspension, he returned to the starting line–up, in a 1–0 loss against PSV Eindhoven on 22 October 2016. Dumfries then scored his first Eredivisie goal, in a 3–2 loss against
Excelsior on 19 November 2016. After serving a one match suspension in the next match, he returned to the starting line–up, in a 6–1 loss against
Feyenoord on 4 December 2016. However, Dumfries found himself competing with new signing
Janne Saksela over the right–back position. As a result, he was dropped to the substitute in favour of Saksela for two separate matches. Despite this, Dumfries continued to regain his first team place, playing in the right–back position for the rest of the 2016–17 season. He later helped Sparta Rotterdam avoid relegation after the club won the last two matches of the season against
FC Twente and
Go Ahead Eagles. A month after leaving Sparta Rotterdam, Dumfries was given a farewell send-off prior to the club's match against
PEC Zwolle, along with departing teammates
Mart Dijkstra,
Rick Ketting and
David Mendes da Silva.
Heerenveen In October 2016, Dumfries stated that he wanted to leave Sparta Rotterdam in hopes of playing in a higher level. In summer 2017, Dumfries joined
Heerenveen to replace Belgium-bound
Stefano Marzo and signed a four–year contract with the club. He made his debut for Heerenveen, starting a match in the opening game of the season against
FC Groningen and set up two goals, in a 3–3 draw. Dumfries set up three goals, with twice against
ADO Den Haag and once against PSV Eindhoven on 26 August 2017 and 10 September 2017 respectively. Both of the matches led to Dutch media
Algemeen Dagblad named him Team of the Week. He also awarded Eredivisie's Talent of the Month for August. During a match against PSV Eindhoven, Dumfries was subjected of the attention after
Jürgen Locadia allegedly spat him, which was caught on camera, leading to an investigation from the KNVB committee. Eventually, Locadia was cleared by the committee after the player came forward with the investigation. Since making his debut for the club, he quickly established himself in the first team, playing in the right–back position. His performances impressed the Dutch media that Dumfries was named Team of the Week by Algemeen Dagblad at least four occasions in the 2017–18 season. On 9 December 2017, he scored his first goal for Heerenveen, scoring a header with a first equaliser, in an eventual 2–2 draw against
VVV-Venlo. In a league match against AZ Alkmaar on 23 December 2017, Dumfries scored an own goal to give the opposition team an equaliser, which the club eventually lost 3–1. But he was able to make amends by scoring his second goal for Heerenveen, in a 2–1 win against his former club, Sparta Rotterdam on 26 January 2018. A week later on 6 February 2018, Dumfries scored his third goal for the club and setting up one of the goals, in a 3–2 loss against PEC Zwolle. After serving a one match suspension due to picking up five yellow cards this season, he returned to the starting line–up against
Willem II and set up a goal, in a 2–0 win on 3 March 2018. In the first leg of the
league playoffs for the place in the UEFA Europa League spot against
FC Utrecht, Dumfries scored his fourth goal of the season, in a 4–3 win. However, in the return leg, FC Utrecht managed to turn the deficit with the results by winning 2–1, resulting the opposition team going through, thanks to away goal rule. At the end of the 2017–18 season, he went on to make thirty–seven appearances and scoring four times in all competitions.
PSV On 19 June 2018, Dumfries signed a five-year contract for
PSV Eindhoven on a four–year contract, keeping him until 2023. The transfer fee reportedly be to have cost 5.5 million euros. It came after when he replaced the departing defender duo
Joshua Brenet and
Santiago Arias.
2018–19 season Dumfries made his PSV Eindhoven debut, playing in the right–back position against Feyenoord in
the Johan Cruyff Shield and started the whole game throughout 120 minutes, as PSV Eindhoven lost 6–5 on penalties. He scored on his league debut, scoring from a header, as the club won 4–0 against FC Utrecht in the opening game of the season. After the match, Dumfries was named Team of the Week by both De Telegraaf and Algemeen Dagblad. He helped PSV Eindhoven got off to a good start to the season, including qualifying for the UEFA Champions League Group Stage after beating
Bate Borisov 6–3 on aggregate and saw the club on a winning streak, resulting in them at the top of the table by the end of the month. Dumfries made his UEFA Champions League debut against
FC Barcelona on 18 September 2018 and started the whole game in the right–back, as PSV Eindhoven lost 4–0. He helped PSV Eindhoven keep five clean sheets in five league matches between 15 September 2018 and 20 October 2018, including a 3–0 win over
rivals,
Ajax. Dumfries scored his second goal for the club against FC Groningen on 27 October 2018, which turned out to be a winning goal, in a 2–1 win. Since the start of the 2018–19 season, he immediately established himself in the first team, playing in the right–back position. He then helped the club keep three clean sheets in three matches between 3 March 2019 and 17 March 2019 in attempt to maintain their title contender status. Dumfries set up two goals in two matches between 7 April 2019 and 14 April 2019 against
Vitesse and
De Graafschap. This was followed up by scoring his fourth goal of the season, in a 3–1 win against ADO Den Haag. However, he was unable to help PSV Eindhoven defend the league title after surrendering it to their rivals, Ajax. Having played in every league match throughout his first season at the club, Dumfries went on to make forty–three appearances and scoring four times in all competitions. For his performance, he was named
Eredivisie Team of the Year of 2018–19 season In the opening game of the season, he scored his first goal of the season, scoring an equaliser header, in a 1–1 draw against
FC Twente. Throughout the club's matches in the UEFA Europa League qualification, Dumfries started four times and helped PSV Eindhoven advance to the group stage after beating
FK Haugesund and
Apollon Limassol (which he also earned a scoresheet in the first leg). He then scored his third goal of the season, in a 3–1 win against FC Groningen on 25 September 2019. A week later on 6 October 2019 against
VVV-Venlo, Dumfries set up a goal for teammate
Steven Bergwijn, who in return, set up a goal for him, as the club won 4–1. After the absence of
Ibrahim Afellay and
Pablo Rosario, it was announced that the player would be appointed as the new captain of PSV Eindhoven. He hinted about taking a captaincy for the club earlier in the season. Dumfries captained his first match for PSV Eindhoven against his former club, SC Heerenveen on 24 November 2019 and helped the club win 2–1. However, he was suspended for one match for picking five yellow cards, causing him to miss a match against PEC Zwolle on 21 December 2019 and was an ever–present in the right–back position since the start of the 2019–20 season until his suspension. Along the way, Dumfries received criticism for his performance, both domestically and internationally in the first half of the 2019–20 season, which he vowed to make an improvement in the second half of the season. After serving a one match suspension, Dumfries scored on his return, scoring a late minute equaliser, in a 1–1 draw against VVV-Venlo on 19 January 2020. This was followed up by scoring again in a 1–1 draw against FC Twente. Two weeks later on 8 February 2020, he scored his seventh goal of the season, in a 3–0 win against Willem II. Dumfries scored his eighth goal of the season, in a 1–0 win against FC Groningen on 8 March 2020, in what turned out to be the last game of the season and the team in fourth place when the season was curtailed because of the
COVID-19 pandemic. By the time the season was suspended, he went on to make forty appearances and scoring eight times in all competitions.
2020–21 season Ahead of the 2020–21 season, Dumfries was linked with a move to
Serie A clubs, such as,
Juventus and
Milan. Despite weighing up his options, he ended up staying at PSV Eindhoven, leading the club to start a new contract negotiation with the player. At the start of the 2020–21 season, Dumfries continued to resume his captain role at PSV Eindhoven after
Roger Schmidt chose him over
Pablo Rosario. He helped the club make a good start to the season in first place in the first five league matches of the season and reaching the group stage in the UEFA Europa League. After recovering from COVID-19, Dumfries made his return to the starting line–up against Willem II on 8 November 2020 and set up two goals, in a 3–0 win. Following this, he continued to regain his first team place, playing in the right–back position, as well as, retaining his captaincy for PSV Eindhoven. Dumfries then scored his first goal of the season, in a 4–0 win against
AC Omonia in the UEFA Europa League on 10 December 2020. He made his 100th appearance for the club, in a 2–1 win against
De Graafschap in the
second round of the KNVB Cup on 16 December 2020. Three days later on 19 December 2020, Dumfries scored his third goal of the season, in a 4–1 win against
RKC Waalwijk. In late–December, he later said his aim as captain was to help PSV Eindhoven win the league. Dumfries scored his third goal of the season, in a 2–0 win against
FC Volendam in
the last 16 of the KNVB Cup on 19 January 2021. Having played in the right–back position for most of the season, he played in the right–midfield position against Vitesse on 21 February 2021, due to a rotation change made by Schmidt and the club went on to win 3–1. Dumfries then scored his fourth goal of the season, in a 3–0 win against Heracles Almelo on 4 April 2021. This was followed up by helping PSV Eindhoven keep two clean sheets in the next two matches to make it three in a row. His suspension against SC Heerenveen on 2 May 2021 saw the club draw 2–2, resulting in them losing their league title chances to rivals, Ajax. Despite suffering minor injuries on three separate occasions throughout the 2020–21 season, he went on to make forty–one appearances and scoring four times in all competitions. Throughout the 2020–21 season, contract negotiations were a talking point as to whether Dumfries would stay at PSV Eindhoven. By February, the agreement has yet been reached between the two parties. In April 2021, it was expected that the player would be leaving the club in the summer transfer window. Throughout
UEFA Euro 2020 with impressive performances, interest in signing the player increased from clubs around Europe, with
Everton and
Bayern Munich and
Inter Milan interested.
Inter Milan on 9 August 2023. Dumfries joined
Serie A champions
Inter Milan on 14 August 2021 for €12.5 million, with a further €2.5 million as a bonus for the PSV Eindhoven. It was reported by the Dutch media that his former clubs would receive compensations as part of the transfer. Upon joining the club, he was given a number two shirt. Dumfries made his debut for Inter Milan as a second-half substitute against
Genoa on the opening day of the
2021–22 Serie A season, winning 4–0.
2023–24 season Dumfries began his third season at Inter as the first choice right wingback. He scored his first goal of the season on the second match day, scoring Inter's first goal in what would prove to be a 2–0 away victory for the
Nerazzurri against
Cagliari.
2024–25 season Dumfries was a pivotal figure for Inter Milan during the
2024–25 season, showcasing his versatility and consistency across multiple competitions. He operated primarily and mainly as a right wing-back in
Simone Inzaghi's defensive tactical setup. On 15 September 2024, Dumfries scored a late equalizer at the
Brianteo Stadium in a 1–1 draw against
Monza, salvaging a point for Inter in a challenging away fixture and eventually got named the MVP of the game. Also, in a thrilling high-scoring 4-all draw against the
Bianconeri, he scored Inter's fourth goal giving Inter a two-goal cushion before Juventus fought back to win a point. He went on a goalscoring galore in January 2025, scoring in four different games that month including a brace, the only goals, against
Atalanta in the semifinals of the
Supercoppa Italiana and another in a 2-2 draw with
Bologna, another in a Serie A game against
Empoli FC in a 3-1 win and the last one, in the month of January 2025, coming in a dominant 4–1 victory against
Leece. On 30 April, he scored twice against
Barcelona which ended in an eventual 3-3 draw away from home. Six days later, on 7 May, Dumfries provided 2 assists in a 4-3 win after extra time against Barça, sending Inter through to their second Champions League final in just under three years under
Simone Inzaghi. After both ties against Barcelona, Dumfries said, "It was a crazy match again, seven goals on Tuesday, it was incredible.", he added "We fought until the end, and very proud of the way we fought today." In December 2025 it was announced that Dumfries exchanged his agent Jorge Mendes for Ali Barat. ==International career==