События повести разворачиваются в период с 1396 по 1398 год и описываются с точным соблюдением исторических фактов и лиц, что можно проверить по 2-й главе 5-го тома «Истории государства Российского» Карамзина. Симеон Воеслав, известный новгородский гость, отказывается выдать свою дочь Ольгу за Романа Ясенского, считая его недостаточно достойным и небогатым, несмотря на любовь Ольги и благородное происхождение Романа. Юрий Гостиный, младший брат Симеона и ходатай Романа, пытается убедить старшего в обратном, однако безуспешно. Роман, расстроенный решением, открыто проявляет свои чувства, что в те времена было принято и не вызывало осуждения.
Ольга давно испытывает чувства к Роману, восхищаясь его музыкальными и рассказческими талантами, а также подвигами на войне и спасением из плена у войск Тамерлана. Несмотря на уважение к родителям и собственную добродетель, она решается бежать с Романом, чтобы обрести счастье вдали от Новгорода. Однако в назначенную ночь возлюбленный не приходит, и вскоре о нём в городе больше ничего не слышно.
Накануне этого события в Новгороде проходит праздник, на котором жители наблюдают рыцарские поединки и кулачные бои между Торговой и Софийской сторонами. Вечером на вече выступают послы московского князя Василия Дмитриевича и литовского князя Витовта с требованием порвать мир с орденом меченосцев и прекратить торговлю с ганзейскими купцами. Новгородцы, желая сохранить мир и торговые преимущества, обсуждают предложение подчиниться, но Роман Ясенский, выступая против мира с врагом, вызывает поддержку у народа и посадника Тимофея.
В ту же ночь Роман отправляется за город, но в лесу попадает в плен к разбойникам, возглавляемым бывшим новгородцем Беркутом, изгнанным после междоусобиц. Узнав, что Роман везёт драгоценности для подкупа московских бояр в пользу Новгорода, Беркут с честью освобождает его. Роман прибывает в Москву и старается выполнить поручение, находя союзников среди дворян и узнавая замыслы великого князя, враждебного Новгороду. Предупредив своих земляков, он становится жертвой ареста и заключения в подземелье с ожиданием казни. Единственная надежда на спасение — предложение боярина Евстафия Сыты отказаться от Новгорода ради свободы, но Роман отвергает эту милость.
Тем временем московские войска наступают на земли Новгорода, и неверные двинцы сдают несколько крепостей. Ольга провожает в поход отца, Симеона Воеслава, который обещает найти ей достойного жениха среди новгородцев после победы, что лишь усугубляет её страдания, так как она желает лишь Романа.
В подземелье Романа освобождают всадники, посланные атаманом Беркутом, и вместе они направляются к осаждённой крепости Орлец, где сражаются новгородцы. В ходе штурма Беркут погибает, а Роман срывает знамя московитов, после чего крепость охватывает пламя и рушится, скрывая судьбу героя. Вернувшись в Новгород вместе с победителями, Симеон Воеслав встречается с дочерью, которая с радостью видит рядом с ним Романа — обещанного жениха. Молодые начинают счастливую жизнь, а Симеон, проигрывая в шахматы младшему брату, признаёт свою ошибку и радуется их счастью.