De openingsfase verliep gelijkopgaand, zonder echt grote kansen voor beide ploegen. De eerste mogelijkheid was voor Souffian El Karouani, wiens vrije trap net over het doel ging. Enkele minuten later brak hij de ban met een fraaie solo door de Heerenveen-defensie, 1-0. Toch kon Utrecht niet genieten van een voorsprong bij rust, want vlak voor de thee zorgde Dylan Vente voor de gelijkmaker na een voorzet van Maxence Rivera.
Na rust greep trainer Ron Jans meteen in met drie wissels. Kort na de hervatting kreeg Mike van der Hoorn een aardige kopkans, maar doelman Bernt Klaverboer bracht redding. Utrecht bleef via kleine mogelijkheden van Sébastien Haller en Gjivai Zechiël dreigend, maar miste scherpte in de afronding.
Halverwege de tweede helft sloeg Heerenveen uit het niets wel toe. Opnieuw was het Dylan Vente die trefzeker was en de Friezen op voorsprong zette, 1-2. FC Utrecht moest in de achtervolging en zocht met veel energie naar de gelijkmaker, maar echte grote kansen bleven uit.
In de slotfase gooide de thuisploeg alles naar voren. Een kopbal van Zechiël werd nog gepakt door Heerenveen-keeper Klaverboer, maar in de 89e minuut was het alsnog raak. Uit een scrimmage in het strafschopgebied werkte invaller David Min de bal binnen, waardoor Utrecht een zwaarbevochten punt uit het vuur sleepte, 2-2.
FC Utrecht – sc Heerenveen 2-2 (1-1)
27. Souffian El Karouani 1-0
38. Dylan Vente 1-1
70. Dylan Vente 1-2
89. David Min 2-2
Scheidsrechter: Alex Bos
Gele kaarten: Mike Eerdhuijzen, Miguel Rodríguez (FC Utrecht), Joris van Overeem, Vasileios Zagaritis (sc Heerenveen)
Rode kaarten:
Toeschouwers: 23.001
Opstelling FC Utrecht:
Vasilis Barkas; Siebe Horemans, Mike van der Hoorn (68. Matisse Didden), Mike Eerdhuijzen (46. Nick Viergever), Souffian El Karouani; Niklas Vesterlund (46. Zidane Iqbal), Alonzo Engwanda, Gjivai Zechiël, Derry John Murkin (46. Adrian Blake), Miguel Rodríguez; Sébastien Haller (68. David Min).
Opstelling sc Heerenveen:
Bernt Klaverboer; Oliver Braude, Joris van Overeem, Maas Willemsen, Vasileios Zagaritis; Marcus Linday (78. Sam Kersten), Luuk Brouwers, Ringo Meerveld (87. Hristiyan Petrov); Jacob Trenskow (64. Václav Sejk), Dylan Vente, Maxence Rivera (78. Mats Egbring).