Born in Sora, Lazio, Zappacosta joined hometown's Sora's youth setup in 1998, aged six, as a forward. In 2006β07 season, he was a player of Sora's under-15 team in Lazio Region Giovanissimi League. In 2008, he moved to neighbouring Isola Liri, appearing in Campionato Nazionale Dante Berretti under-20's, and made his senior debut for the side in the 2009β10 campaign; obtaining a total of 14 caps and a goal in the league.
In January 2011 Zappacosta joined Atalanta in a co-ownership deal for β¬60,000 transfer fee. He played for the Primavera for six months. He appeared during the pre-season with the main squad.
On 31 August 2011, at age 19, he was signed by Avellino initially in temporary deal. The loan was turned into a co-ownership deal for β¬40,000 fee in 2012, after Atalanta bought him outright from Isola Liri for an undisclosed fee. He played 3 seasons for Avellino, which the first two seasons in Lega Pro Prima Divisione, winning the championship of the Group B of the third-tier in the 2012β13 season as well as crowded as the grand champions after winning Trapani of the Group A. After promotion to Serie B he decided to tattoo the date "05.05.2013". The following year he scored a debut goal in Serie B in the match won 2β1 against Novara, standing out as one of the bestfull backs in the league.
Return to Atalanta
On 4 June 2014 Zappacosta returned to Atalanta for β¬900,000 fee, signing a four-year deal. He made his official debut with Atalanta on 23 August 2014 against Pisa in a 2β0 win in the third qualifying round of the Coppa Italia. On 31 August 2014 Zappacosta made his debut in Serie A, starting in a 0β0 home draw against Hellas Verona. On 6 January 2015 he scored his first Serie A goal in the 37th minute of a 2β2 draw to Genoa. On 11 January, one week later, he scored his second goal in the 72nd minute of a 1β1 home draw against Chievo Verona. On 8 February, Zappacosta scored his third goal of the season in the 9th minute of a 3β2 away defeat against Fiorentina. He finished the 2014β15 season to Atalanta with 30 appearances, three goals and one assist.
On 10 July 2015 he was sold to Torino, in the same transfer that brought the midfielder Daniele Baselli to Piedmont, for a total of β¬10 million transfer fee. On 20 September, Zappacosta made his debut for Torino as a substitute replacing Bruno Peres in the 76th minute of a 2β0 home win over Sampdoria. He scored his first goal for the club on 28 October during a 3β3 draw at home to Genoa. Zappacosta finished his first season to Torino with 26 appearances, one goal and one assist, and his second with 29 appearances, one goal and five assists.
Chelsea
On 31 August 2017, he was sold to Chelsea for a reported fee of β¬28 million plus bonuses. He signed a four-year deal at Stamford Bridge. The transfer was completed minutes before the transfer window shut on deadline day. Zappacosta made his debut for Chelsea on 9 September as a substitute replacing Victor Moses in the 74th minute of a 2β1 away win against Leicester City. He made his Champions League debut and scored his first goal for Chelsea on 12 September 2017, in a 6β0 home win against QarabaΔ FK. With this goal, Zappacosta became the 100th Italian player to score a goal in the Champions League. His first Premier League goal came from outside the box in a 5β0 home win against Stoke City on 30 December 2017. On 29 May 2019, Zappacosta appeared in Chelsea's 4β1 victory over Arsenal in the 2019 UEFA Europa League Final, coming on as a late substitute for Eden Hazard.
Loan to Roma
On 21 August 2019, Zappacosta signed a one-year extension to his contract at Chelsea and then joined Roma on an initial six-month loan deal with an option to extend the loan until the end of the 2019β20 season. On 4 October 2019, Zappacosta suffered an anterior cruciate ligament injury during training.