Переносим онлайн-школу на GetCourse: пошаговый план без потери доступов
Когда школа, с которой я работал, решила переехать со своего сайта на GetCourse, владелец первым делом спросил: «А доступы у учеников не слетят?»
Не слетели. Хотя пару раз было близко.
Я Георгий, техспец, с GetCourse работаю больше пяти лет. Ниже по порядку, как мы переносили эту школу, и пара моих ошибок с других переездов, которые лучше знать заранее.
Почему школы переезжают на GetCourse
Сайт у школы был самописный, на React. Пока проект был маленьким, всех всё устраивало. Потом каждая правка в оплате или доступах стала задачей для разработчика, и с поддержкой всего этого постоянно были проблемы. Бот работал в отдельном конструкторе, аналитика в другом сервисе, связывали их интеграции, и если что-то ломалось, узнавали об этом обычно от ученика, который уже написал в поддержку.
На GetCourse всё собралось в одном кабинете. Стало куда легче. Плюс новое оформление уроков: страницы курсов выглядят аккуратно без своей вёрстки, а раньше ради каждой такой правки звали разработчика.
С другими школами похоже.
Кто-то упёрся в возможности старой платформы, у кого-то поддержка своего кода стоит дороже подписки. Итог один: хочется держать всё в одном месте.
Что переносится, а что собирается заново
Договорились сразу: переносим только данные. Это ученики с доступами к купленным курсам и разрешения на сообщения в мессенджерах.
Логику переносить было неоткуда. На старом сайте она была зашита прямо в код: кому открыть курс, какое письмо отправить после оплаты и так далее. В GetCourse это собирается из тренингов, групп и процессов, так что всё выстроили заново.
Воронку бота сделали в модуле «Воронки». Там видно, сколько людей дошло до каждого шага, а на старом сайте ради такой картины приходилось руками сводить данные из двух сервисов.
Историю старых заказов целиком не переносили. Ученику важно, чтобы после переезда открылся его курс; старые чеки в кабинете ему ни к чему.
Что настроить в GetCourse до переноса учеников
Людей гружу в самом конце.
Иначе человек получит письмо о переезде, зайдёт, а в кабинете пусто. Сначала тренинги и группы, под каждый продукт своя. Доступ к тренингу открывает именно группа, поэтому при импорте достаточно положить человека в нужную. Если продуктов много, группы лучше продумать до загрузки: потом раскладывать людей руками та ещё радость.
Оплату подключаю через Get Модуль, это встроенный приём платежей. Там всё есть из коробки: карты, СБП, рассрочки, оплата частями и зарубежные карты. Подключают быстро. Но заявку я всё равно подаю в первые дни, чтобы до переключения успеть проверить оплату живыми деньгами.
С почтой мы застряли. Пока настройки почты не подтверждены до конца, импорт пользователей закрыт, а у нас подтверждено было не всё. Выручила техподдержка GetCourse. Открыли импорт на три дня, и мы успели загрузить базу. Но рассчитывать на такое не стоит, почту лучше сделать сразу.
Если на старом сайте был свой дизайн, часть можно перенести темой оформления, которую я вешаю на конкретный тренинг в его настройках: тогда она применяется ко всем урокам и не задевает остальной аккаунт. После привязки страницы ещё минут пять открываются по-старому. В первый раз я решил, что где-то ошибся, и начал всё переделывать. А надо было просто подождать.
Переносим учеников и доступы
Выгрузка и импорт
С самописного сайта базу выгружаешь сам. Я собрал её одним запросом к базе, и с запросом помогла нейросеть. На выходе почта, имя, телефон и список купленных курсов; последнее поле потом стало колонкой с группой.
GetCourse берёт CSV в UTF-8 до 20 МБ, колонки можно ставить в любом порядке. Большую базу режу на файлы по продуктам. Обычно это от 30 до 150 тысяч учеников.
Импорт лежит в «Пользователях»: «Добавить», потом «Импортировать из csv». Первым делом там бросается в глаза предупреждение: по загруженным пользователям могут запуститься активные рассылки и процессы. Его легко проглядеть. А если в аккаунте уже запущен прогрев для новичков, его получит вся старая база, включая тех, кто учится у вас второй год и давно прошёл все эти письма.
Поэтому при загрузке я выбираю группы, ставлю «Отписать от всех рассылок (кроме Уведомлений)» и не включаю стартовое письмо. Пошагово импорт описан в базе знаний, в статье «Как импортировать пользователей из файла».

Ещё там есть строка мелким шрифтом: импорт разрешён только в один поток, из одного окна браузера. То есть файлы идут строго по очереди. С большой базой это вечер.
Перед запуском GetCourse показывает первые строки файла и то, как он понял колонки. Я смотрю, не попал ли телефон в поле имени. И включаю перезапись данных при совпадении почты, чтобы старые профили обновились, а не задвоились.
Дубли
Дубли будут почти наверняка. На старом сайте человек мог купить один курс с рабочей почты, второй с личной, а кто-то вместо почты вообще оставлял телефон на @ya.ru. Для GetCourse это два разных человека. Хотя человек один.
Для таких случаев есть «Склейка пользователей» в разделе учеников. Выбираешь основной профиль и дубль, и данные дубля переносятся в основной. Если отличаются имя или группы, решаешь сам, что оставить. Основным лучше брать профиль, к которому привязан вход через VK, Google или Яндекс ID. Подробнее в статье «Объединение пользователей».

Бот
С ботом было сложнее всего. Разрешения на сообщения переносятся отдельно от учеников, и мы сначала просто не понимали, как перевезти подписчиков, чтобы никто не вылетел из воронки на середине.
Сделали в итоге так.
Завели в GetCourse нового бота и пустили на него весь новый трафик. Старый бот продолжал работать на прежнем сервисе, пока у всех, кто был внутри, воронки не завершились, и только потом мы остановили их там, перенесли ключи старого бота в GetCourse и стали использовать его базу для рассылок. Сработало. Из воронки никто не вылетел.
Самое сложное было связать подписчиков бота с учениками: в базе человек записан по почте, а в Telegram у него только tg id. Тут помогла техподдержка GetCourse. Сами бы возились долго.

С ВКонтакте проще. Разрешения на сообщения из другого сервиса импортируются даже без техподдержки.
Проверяем доступы до переключения
Проверяю всегда под учеником.
В карточке пользователя для этого есть «Войти под этим пользователем». Под админом проверять бесполезно, админ же видит всё.
Однажды это спасло меня от кучи жалоб. В одной школе в настройках модуля доступ стоял «всем ученикам тренинга», а список уроков внутри показывался только одному сегменту, и под админом этого вообще не заметно. Под учеником вместо уроков была заглушка. В настройках тренинга такое можно искать долго; под учеником видно за минуту.
И сверяю цифры: сколько строк было в файле и сколько людей в итоге оказалось в группе. Не сходится, значит часть записей не загрузилась. Обычно виновата почта. Лишний пробел или русская буква в адресе.
День переключения
К этому дню база уже загружена и доступы проверены, так что остаётся по очереди перевести на GetCourse всё, что ведёт людей на старый сайт, и не сломать по дороге продажи.
Начинаю с тестового платежа на минимальную сумму, потом меняю кнопки оплаты на лендингах и ссылки в боте и письмах. Домен последним. Старый сайт всё это время работает.

Тут я ошибался дважды.
Первый раз с виджетом оплаты. Я сохранил страницу с виджетом и взял код оттуда, а в сохранённой странице лежит другой идентификатор, от вложенного фрейма, и скрипт с ним себя на странице не находит. Виджет просто не появляется. Ни ошибки, ничего. Теперь копирую код только из кабинета GetCourse.
Второй раз с доменом. Переключил DNS, открываю сайт, а там старая версия. Час, два, три. У всех уже новый сайт, у меня старый. Я полез проверять настройки, хотя с ними всё было в порядке, и только потом понял, что провайдер просто держит старый адрес у себя в кэше. С тех пор смотрю, куда ведёт домен, с сервера.
Старый сайт после переключения не выключаю ещё две-три недели. DNS у всех обновляется по-разному, в старых письмах стоят старые ссылки. Да и ученики по привычке заходят через закладки.
Первая неделя после переезда
Первую неделю я отвечаю на вопросы вместе с поддержкой школы. Пишут в основном про две вещи.
- «Не могу войти». Человек вводит почту, которой нет в базе, потому что покупал с другой. Подсказываем, какая почта у него в профиле, или склеиваем профили.
- «Не вижу курс». Попал не в ту группу или не в тот сегмент. Смотрим под ним и добавляем куда надо.
С чатами веселее.
Ссылка на чат в тренинге может стоять в трёх местах: системный виджет «Чаты тренинга», обычный HTML-блок и галка показа ссылки в настройках самого чата. Поправил одно место, про два других забыл, и ученики пишут, что чат пропал.
С видео тоже бывает. Если грузить ролики в уроки файлами, хранилище аккаунта рано или поздно кончится, а у одной школы оно забилось полностью, и после чистки часть старых уроков осталась с пустым плеером. Так что тяжёлое видео я держу на видеохостинге и вставляю ссылкой.
Нейросеть на этом переезде сэкономила мне много времени. С ней я составлял план переезда и писал запрос для выгрузки. Загрузку данных через API ей тоже можно поручить. А вот доступы под учеником всё равно проверяю руками.
Если вы тоже переносили школу, напишите в комментариях, как у вас было с ботом. У всех этот кусок устроен по-разному.
Георгий, техспец онлайн-школ. Автоматизирую GetCourse кодом и нейросетями. Telegram: @Georgiy_dev