Весна 1924 г. Лев Глебович Ганин живет в русском пансионе в Берлине. Помимо Ганина в пансионе живут математик Алексей Иванович Алферов, человек «с жидкой бородкой и блестящим пухлым носом», «старый российский поэт» Антон Сергеевич Подтягин, Клара -«полногрудая, вся в черном шелку, очень уютная барышня», работающая машинисткой и влюбленная в Ганина, а также балетные танцовщики Колин и Горноцветов. «Особый оттенок, таинственная жеманность» отделяет последних от других пансионеров, но, «говоря по совести, нельзя порицать голубиное счастье этой безобидной четы».
В прошлом году по приезде в Берлин Ганин сразу нашел работу. Был он и рабочим, и официантом, и статистом. Оставшихся у него денег достаточно, чтобы выехать из Берлина, но для этого нужно порвать с Людмилой, связь с которой длится уже три месяца и ему порядком надоела. А как порвать, Ганин не знает. Окно его выходит на полотно железной дороги, и поэтому «возможность уехать дразнит неотвязно». Он объявляет хозяйке, что уедет в субботу.
От Алферова Ганин узнает, что в субботу приезжает его жена Машенька. Алферов ведет Ганина к себе, чтобы показать ему фотографии жены. Ганин узнает свою первую любовь. С этого момента он полностью погружается в воспоминания об этой любви, ему кажется, что он помолодел ровно на девять лет. На следующий день, во вторник, Ганин объявляет Людмиле, что любит другую женщину. Теперь он свободен вспоминать, как девять лет назад, когда ему было шестнадцать лет, он, выздоравливая после тифа в летней усадьбе под Воскресенском, создал себе женский образ, который через месяц встретил наяву. У Машеньки была «каштановая коса в черном банте», «татарские горящие глаза», смугловатое лицо, голос «подвижный, картавый, с неожиданными грудными звуками». Машенька была очень веселая, любила сладкое. Она жила на даче в Воскресенске. Как-то с двумя подругами она забралась в беседку в парке. Ганин заговорил с девушками, они договорились на следующий день поехать кататься на лодке. Но Машенька пришла одна. Они стали каждый день встречаться по той стороне реки, где стояла на холме пустая белая усадьба.
Когда в черную бурную ночь, накануне отъезда в Петербург к началу учебного года, он в последний раз встретился с ней на этом месте, Ганин увидел, что ставни одного из окон усадьбы приоткрыты, а к стеклу изнутри прижалось человеческое лицо. Это был сын сторожа. Ганин разбил стекло и стал «бить каменным кулаком по мокрому лицу».
На следующий день он уехал в Петербург. Машенька переселилась в Петербург только в ноябре. Началась «снеговая эпоха их любви». Встречаться было трудно, подолгу блуждать на морозе было мучительно, поэтому оба вспоминали о лете. По вечерам они часами говорили по телефону. Всякая любовь требует уединения, а у них приюта не было, их семьи не знали друг друга. В начале нового года Машеньку увезли в Москву. И странно: эта разлука оказалась для Ганина облегчением.
Летом Машенька вернулась. Она позвонила Ганину на дачу и сказала, что папа ее ни за что не хотел снова снять дачу в Воскресенске и она теперь живет в пятидесяти верстах оттуда. Ганин поехал к ней на велосипеде. Приехал уже затемно. Машенька ждала его у ворот парка. «Я твоя, — сказала она. — Делай со мной все, что хочешь». Но в парке раздавались странные шорохи, Машенька лежала слишком покорно и неподвижно. «Мне все кажется, что кто-то идет», — сказал он и поднялся.
Он встретился с Машенькой через год в дачном поезде. Она сошла на следующей станции. Больше они не видались. В годы войны Ганин и Машенька несколько раз обменялись нежными письмами. Он был в Ялте, где «готовилась военная борьба», она где-то в Малороссии. Потом они потеряли друг друга.
В пятницу Колин и Горноцветов по случаю получения ангажемента, дня рождения Клары, отъезда Ганина и предполагаемого отъезда Подтягина в Париж к племяннице решают устроить «празднество». Ганин с Подтягиным отправляется в полицейское управление, чтобы помочь тому с визой. Когда долгожданная виза получена, Подтягин случайно оставляет паспорт в трамвае. С ним случается сердечный припадок.
Праздничный ужин проходит невесело. Подтягину опять становится плохо. Ганин поит и так уже пьяного Алферова и отправляет его спать, а сам представляет, как встретит утром Машеньку на вокзале и увезет ее.
Собрав вещи, Ганин прощается с пансионерами, сидящими у постели умирающего Подтягина, и едет на вокзал. До приезда Машеньки остается час. Он усаживается на скамейку в сквере около вокзала, где четыре дня назад вспоминал тиф, усадьбу, предчувствие Машеньки. Постепенно «с беспощадной ясностью» Ганин осознает, что его роман с Машенькой кончился навсегда. «Он длился всего четыре дня, — эти четыре дня были, быть может, счастливейшей порой его жизни». Образ Машеньки остался вместе с умирающим поэтом в «доме теней». А другой Машеньки нет и не может быть. Он дожидается момента, когда по железнодорожному мосту проходит экспресс, идущий с севера. Берет таксомотор, едет на другой вокзал и садится в поезд, идущий на юго-запад Германии.