In August 2012, Villarreal announced that Cristian Zapata has left the club to join Milan on a season-long loan.
Zapata made headline news in the Champions league against Spanish giants Barcelona. With Milan’s opening in a 2–0 victory of the first leg, the ball was deflected on to his hand and landed in front of Kevin-Prince Boateng who scored a goal seconds later. The referee did not judge it an attempted touch of the ball but allowed Boateng’s goal to be counted while Zapata was credited with an ‘assist’. The replay showed the ball making contact with his face. In his first Milan derby against Inter Milan, Cristian Zapata was praised for his defending and for playing a key role in counter-attacks.In 2013, Zapata signed a contract with Milan until summer 2016.
In January 2015, Zapata suffered an injury keeping him sidelined for two months. Upon recovery, he featured as an unused substitute.
On 5 February 2017, Zapata was named as captain in his first league game of the season, a 0-1 home defeat against Sampdoria, due to the absence of team captain Riccardo Montolivo and third captain Mattia De Sciglio because of injuries. Vice-captain Ignazio Abate later appeared in the game as a substitute with Zapata keeping the captain’s armband.
On 15 April 2017, Zapata scored an equalizer in the Milan derby against Inter Milan at the 97th minute. The match resulted in a 2-2 draw. It was also the first Milan game under the ownership of Rossoneri Sport Investment, headed by Li Yonghong, with Zapata giving away his jersey as a gift to the Chinese entrepreneur soon after the final whistle.
On 17 April 2018 he was confirmed to be vice-captain instead of Giacomo Bonaventura as he kept the armband during the game against S.S.C. Napoli, where captain Leonardo Bonucci was unavailable and Giacomo Bonaventura was playing, he celebrated this news with an outstanding performance with his former Villarreal CF teammate Mateo Musacchio.
Cristian Zapata left AC Milan on 30 June 2019 after his contract with the rossoneri expired. Cristian was offered new contract on few occasions, however he chose to change team. After he left AC Milan, Cristian joined the Serie A club Genoa.