Действие фильма происходит в 1941 году. Первая сцена изображает московскую школу № 201, где Зоя беззаботно танцует вальс. Голос диктора сообщает о вторжении германской армии. Друг Зои Женя отправляется на фронт и вскоре погибает. Зоя, чтобы отомстить за него, идёт на призывной пункт. Благодаря хорошему знанию немецкого языка она попадает в разведшколу, после тренировок в учебном лагере отправляется на фронт.
Разведгруппа Зои успешно справляется с первым заданием — подрывает немецкую колонну на волоколамском направлении. Затем ей поручают уничтожить пункт связи в деревне Петрищево. Зоя попадает в плен, подвергается истязаниям (в том числе избиению плетью и групповому изнасилованию), но остаётся несломленной. На следующий день её вешают как поджигательницу. На эшафоте Зоя призывает жителей деревни не бояться смерти и убивать фашистов.
Посмертно Зоя становится первой женщиной, удостоенной во время Великой Отечественной войны звания Героя Советского Союза.
Работа над проектом началась в 2017 году: режиссёром стал Егор Кончаловский[6], сценарий написала Елизавета Трусевич. При этом подчёркивалось, что сюжет построен исключительно на документах и свидетельствах очевидцев, недостоверной информации, включая разного рода «мифы о войне», там нет[7].
В основу картины лёг сценарий, написанный Андреем Назаровым и Леонидом Пляскиным. Режиссёром стал Пляскин, позже к нему присоединился Максим Бриус. Производством занималась «Киностудия имени Максима Горького» (Москва) при участии РВИО и при финансовой поддержке Министерства культуры Российской Федерации[1][2], выделившего на создание фильма 60 миллионов рублей[8]. На сайте РВИО был открыт сбор пожертвований на те же цели, и всего было собрано около 600 тысяч рублей[9].
Актер Вольфганг Черни, сыгравший гауптмана Эриха Зоммера, сначала отказался от роли, так как не хотел играть садиста. В итоге эту роль переписали: Зоммер нет в числе мучителей, он видит в Зое единомышленника и пытается её спасти[10].
Первые съёмки проходили с 10 по 13 февраля 2019 года в Белоруссии. Отдельные сцены снимались в деревне Забродье Вилейского районаМинской области, где с трудом нашли сохранившиеся с довоенных лет деревенские постройки[1][2]. 19 апреля 2019 года съёмки картины закончились[11]. Изначально прокат фильма планировалось приурочить к 75-летию победы в войне (9 мая 2020 года), но из-за пандемии COVID-19 его пришлось отложить.
Фильм получил ряд отрицательных и резко негативных отзывов со стороны историков, журналистов, деятелей искусства. Разгромные рецензии выпустили Коммерсантъ[18], Литературная газета[19], Независимая газета[20], Кино Mail.ru[21]. Единственный[22] положительный обзор был опубликован InterMedia[23]. Критики отмечают несоответствие многих показанных в фильме событий историческим фактам, нарушения логики, плоскость персонажей, неудачный подбор актёров, неуместные сцены. Критике подверглась деидеологизация образа Зои Космодемьянской, бывшей в реальности убеждённой коммунисткой[24][25][26][27].
8 июня 2021 года известный российский киноблогер Евгений Баженов (он же BadComedian) опубликовал на своем YouTube-канале критический обзор фильма под названием «ЗОЯ (Спасение рядового Иисуса)». Одна из его претензий к создателям «Зои» — искажение фактов и неуместное использование религиозного подтекста. По словам блогера, в картине Космодемьянскую с помощью сценарных и визуальных приёмов показывают как сентиментальную женщину и святую мученицу, что не соответствует её образу, который формируется мемуарами и научными работами, — серьёзного, спокойного, отважного человека[28][29]. Бывший министр культуры России, председатель РВИО Владимир Мединский в интервью на YouTube-канале «Metametrica» назвал обзор Баженова измывательством над памятью о Зое, сказав при этом, что обзор он не смотрел, а знает о его содержании по детальному пересказу. Мединский признал, что не смотрел фильм и не знаком с историей Зои, а от неудобных вопросов на исторические темы уклонился, назвав себя журналистом, а не историком[30]. Баженов подробно ответил на претензии Мединского, опубликовав объемный пост в своем Telegram-канале[30][31].