Rodrigo Becao scored a second-half header as Udinese inflicted a 1-0 Serie A defeat on AC Milan in head coach Marco Giampaolo's first competitive game with the Rossoneri.
Milan started without any of their new signings and looked devoid of attacking ideas for the majority of Sunday's match at Dacia Arena, where they fell to Becao's only goal of the game 72 minutes in.
Giampaolo's visitors failed to register an attempt on target in Udine, and Milan's Gianluigi Donnarumma had been the busier of the two goalkeepers before the breakthrough moment in a contest that contained few clear-cut opportunities.
A first league defeat in five matches to Udinese means a losing start for Giampaolo, whose decision to omit each of his side's new signings backfired.
Milan's Alessio Romagnoli flicked the ball wide from a promising position and Udinese's Kevin Lasagna miscued a shot into the stands following a poor clearance from Donnarumma in the only openings of a quiet first half.
The biggest talking point before the interval came in stoppage time as Milan's Samu Castillejo appeared to deflect a cross with his arm, but VAR adjudged that the contact was made outside the box and no penalty was given.
Udinese's Rolando Mandragora fired in the game's first shot on target with 49 minutes played and Seko Fofana was the next to test Donnarumma with a curled strike a couple of minutes later.
Donnarumma was becoming increasingly busy as he was also required to keep out Mato Jajalo's shot with an hour on the clock, and the pressure eventually told.
A minute after being brought off the bench, Rodrigo De Paul sent in an outswinging corner and Becao guided his header into the bottom-right corner on his Serie A debut.
Milan pressed for an equaliser, and were frustrated when a penalty appeal was rejected. The closest either side came to another goal was when Lasagna's shot was saved.
What does it mean? New signings must be integrated
Giampaolo revealed on the eve of the match he would only start the players available to him throughout the close season and as a result Milan had a familiar feel to them.
With Ismael Bennacer, Rade Krunic, Leo Duarte and Franck Kessie named on the bench, the visitors looked stale throughout the match and must massively improve if they are to break back into the top four.
Becao the difference
For all the talk of Milan's signings, it was one of Udinese's new boys who made the difference. Signed from Brazilian side Bahia during the close season, centre-back Becao made the most of some slack defending to score the only goal of the game.
Borini sums up Milan's struggles
Milan fired no shots on target in the first half of a Serie A match for the first time since October 2018. Fabio Borini did little to influence play and was unsurprisingly the first visiting player to be replaced with an hour played.
Milan welcome newly-promoted Brescia to San Siro next Saturday and Udinese host Parma the following day.