Как сделать пошаговую форму с записью данных в БД?
Есть несколько вариантов. Я не эксперт (исключительно любитель), так что не утверждаю, что хотя бы один из них реально правильный.

Вариант 1. Создание сессии на стороне сервера, сохранение данных из формы в самой сессии.
Вариант 2. Создание сессии, но сохранение данных в БД. Присваиваем уникальный ID пользователю (как правило, это решает за нас атрибут AUTO_INCREMENT в бд) и в сессии храним лишь этот id. При повтором открытии формы пользователем берем из сессии его id, ищем в бд, и если есть уже заполненные им поля формы, то подставляем эти значения в форму.
Вариант 3. Без сервера и бд. Сохраняем все введенные данные с помощью js в LocalStorage. При повторном заходе клиента, просто смотрим, есть ли в хранилище введенные им данные, и если есть, подставляем в форму.  Но если в форме есть поля с загрузкой файлов, то в этом случае, нужно будет их хранить, например, в base64.

В первом и третьем варианте подразумевается, что в после заполнения всех полей формы все данные всё равно будут записаны в БД.

UPD: тут зависит от конкретного случая. Если, например, на первом этапе пользователь воодит свой E-mail, и он вам понадобится, например, для рассылок, независимо от того, заполнил он форму полностью или нет - то лучше второй вариант. Если же вам не нужны данные пользователя, пока он не заполнит все поля - то третий вариант будет проще и лучше. Ну и первый вариант в этом случае тоже подойдет
Тут много описано про сессии и да, это это корректный подход при незавершенной базовой регистрации.

А вот если у тебя уже есть в базе логин и пасс пользователя, по которому можно зайти. Или привязка к социальной сети, то тут помогут триггеры в базе в виде boolean-значений. Скажем:

user сущность с колонками:
1. is_active — так можно делать ленивое удаление.
2. is_confirmed — подтвердил почту.

И т.д. Так, ты сможешь проверять в роуте текущее состояние и в зависимости от сценария пускать в ту или иную сторону. Например при is_confirmed == false → вместо ЛК отправлять на страницу с кнопкой «выслать ключ еще раз».

Я думаю ты видел такое на сервисах.