Two-time winners Chelsea began their Champions League campaign with a shock defeat at Dinamo Zagreb.
The Croatian champions have a woeful record in this competition - winning just five of 43 games before this meeting - but they stubbornly held on after taking a first-half lead.
The dangerous Mislav Orsic netted the 13th-minute winner, running through from the halfway line and beautifully dinking a finish past the advancing Kepa Arrizabalaga.
Dinamo came agonisingly close to a second but Stefan Ristovski's thunderous, long-range effort was superbly tipped onto the bar by Arrizabalaga.
Deadline-day signing Pierre-Emerick Aubameyang was handed his Chelsea debut and, although the ex-Arsenal skipper had a goal ruled out for offside, he largely looked off the pace.
Armando Broja replaced Aubameyang just before the hour mark, but the Albanian had little impact in an overall disjointed performance from Thomas Tuchel's men.
Chelsea launched a late onslaught on Dinamo's goal and the hosts were relieved to see Reece James' low shot rattle the foot of the post with five minutes remaining.
Serie A champions AC Milan travel to RB Salzburg (kick-off 20:00 BST) in Group E's other game.
Tuchel's century ends on sour note
In the first transfer window under their new owners, Chelsea were Europe's highest spending club with an outlay close to £300m on new signings this summer.
The Blues, though, look an incoherent outfit and although Tuchel - who took charge of the side for the 100th time against Dinamo - is not yet under pressure, the German will quickly need to work out his side's problems with hands-on new owner Todd Boehly watching closely.
A solid defensive platform was the bedrock of Tuchel's success in his first few months at the club, when he led them to their second Champions League title with victory over Manchester City.
But in seven games in all competitions this term, the Londoners have already lost three times and kept just one clean sheet, which came on the opening day of the Premier League campaign against Everton.
Former Napoli centre-back Kalidou Koulibaly is an experienced Champions League player, but defensive team-mate Wesley Fofana was making his first appearance in the competition.
And the lack of understanding between the pair - who cost more than £100m between them - in the early days of their partnership was apparent for the goal when they both went for a high ball, yet neither got to it.
It allowed Bruno Petkovic to flick the ball on for Orsic, who held off Fofana before advancing on goal and converting with the coolest of finishes.
Arrizabalaga, who started instead of out-of-form number one Edouard Mendy, did not have much to do, but denied Ristovski with a stunning save.
At the other end of the pitch, Aubameyang was given a first start since signing from Barcelona and the 33-year-old striker played in a face mask, having been involved in a violent robbery at his home which left him with a broken jaw.
The signs were good when he ran through early on, but failed to pick out a team-mate with his cutback and struggled to make an impact thereafter.
Chelsea's general showing was one of slow build-up play which did not do enough to unlock a well-organised and obdurate Dinamo backline.
The visitors chased an equaliser with time running out, but Croatia goalkeeper Dominik Livakovic saved Mason Mount's first-time strike and Kai Havertz's header from six yards out was brilliantly blocked by Robert Ljubicic.
It was just Chelsea's second group stage loss in 18 games, while Dinamo held on for a famous victory.
The perfect start from the Croatians gives them hope of reaching the knockout stage of the Champions League for the first time, having failed to do so in all previous seven appearances in the competition.
Player of the match
HavertzKai Havertz
Dinamo Zagreb
Squad number77Player nameSpikic
Squad number10Player nameBaturina
Squad number55Player namePeric
Squad number27Player nameMisic
Squad number99Player nameOrsic
Squad number18Player nameDrmic
Squad number6Player nameLauritsen
Squad number14Player nameLjubicic
Squad number40Player nameLivakovic
Squad number2Player nameMoharrami
Squad number37Player nameSutalo
Squad number13Player nameRistovski
Squad number9Player namePetkovic
Squad number7Player nameIvanusec
Squad number5Player nameAdemi
Chelsea
Squad number29Player nameHavertz
Squad number24Player nameJames
Squad number21Player nameChilwell
Squad number1Player nameArrizabalaga
Squad number8Player nameKovacic
Squad number18Player nameBroja
Squad number17Player nameSterling
Squad number19Player nameMount
Squad number26Player nameKoulibaly
Squad number32Player nameCucurella
Squad number33Player nameFofana
Squad number5Player nameJorginho
Squad number28Player nameAzpilicueta
Squad number9Player nameAubameyang
Squad number10Player namePulisic
Squad number22Player nameZiyech
Line-ups
Dinamo Zagreb
Formation 3-1-4-2
40Livakovic
13Ristovski37Sutalo55Peric
27Misic
2Moharrami7Ivanusec5Ademi14Ljubicic
9Petkovic99Orsic
40Livakovic13Ristovski37Sutalo55Peric27Misic2MoharramiSubstituted forLauritsenat 76'minutes7Ivanusec5AdemiSubstituted forBaturinaat 89'minutesBooked at 90mins14Ljubicic9PetkovicSubstituted forDrmicat 90+8'minutes99OrsicSubstituted forSpikicat 77'minutesSubstitutes
1Zagorac3Stefulj6Lauritsen10Baturina11Emreli12Bockaj18Drmic20Marin28Théophile-Catherine31Bulat33Nevistic77SpikicChelsea
Formation 3-4-3
1Arrizabalaga
28Azpilicueta33Fofana26Koulibaly
24James19Mount8Kovacic21Chilwell
29Havertz9Aubameyang17Sterling
1Arrizabalaga28AzpilicuetaSubstituted forZiyechat 45'minutes33Fofana26KoulibalyBooked at 67mins24James19MountBooked at 59mins8KovacicSubstituted forJorginhoat 59'minutes21ChilwellSubstituted forCucurellaat 71'minutes29Havertz9AubameyangSubstituted forBrojaat 59'minutes17SterlingSubstituted forPulisicat 75'minutesSubstitutes
5Jorginho10Pulisic12Loftus-Cheek13Bettinelli14Chalobah16Mendy18Broja20Zakaria22Ziyech23Gallagher30Chukwuemeka32CucurellaReferee:István KovácsAttendance:20,607Live Text
Match ends, Dinamo Zagreb 1, Chelsea 0.
Second Half ends, Dinamo Zagreb 1, Chelsea 0.
Substitution, Dinamo Zagreb. Josip Drmic replaces Bruno Petkovic.
Attempt missed. Christian Pulisic (Chelsea) header from the centre of the box is close, but misses the top left corner. Assisted by Kalidou Koulibaly following a set piece situation.
Attempt missed. Mason Mount (Chelsea) right footed shot from outside the box misses to the left following a set piece situation.
Attempt blocked. Hakim Ziyech (Chelsea) left footed shot from outside the box is blocked.
Martin Baturina (Dinamo Zagreb) is shown the yellow card for a bad foul.
Reece James (Chelsea) wins a free kick in the attacking half.
Foul by Martin Baturina (Dinamo Zagreb).
Offside, Chelsea. Hakim Ziyech tries a through ball, but Kalidou Koulibaly is caught offside.
Attempt blocked. Hakim Ziyech (Chelsea) left footed shot from outside the box is blocked.
Attempt blocked. Hakim Ziyech (Chelsea) left footed shot from outside the box is blocked.
Jorginho (Chelsea) wins a free kick in the attacking half.
Foul by Robert Ljubicic (Dinamo Zagreb).
Hand ball by Hakim Ziyech (Chelsea).
Foul by Wesley Fofana (Chelsea).
Bruno Petkovic (Dinamo Zagreb) wins a free kick on the left wing.
Substitution, Dinamo Zagreb. Martin Baturina replaces Arijan Ademi.
Kalidou Koulibaly (Chelsea) wins a free kick in the attacking half.
Foul by Arijan Ademi (Dinamo Zagreb).