# Квиз на GetCourse, который сохраняет ответы в карточку ученика Красивый квиз прямо в уроке или на странице GetCourse. Ответы ученика ложатся в **дополнительные поля его карточки**: их видит менеджер, по ним строятся сегменты, письма, процессы и рассылки. Ни своего сервера, ни программиста, ни платных сервисов. Квиз пишет нейросеть по готовому промпту, данные принимает **модуль воронок** GetCourse. --- ## Как это работает ``` Ученик проходит квиз (HTML-блок в уроке) │ нажал «Готово» ▼ Скрипт квиза берёт e-mail ученика из скрытого текстового блока │ ▼ POST-запрос на ссылку события Модуль воронок: нода «Событие» (внешний вызов) │ код преобразования: user.поле = body.поле ▼ Нода «Обновить поля пользователя» │ ▼ Ответы в дополнительных полях карточки ученика ``` Три детали, на которых всё держится: 1. **E-mail берётся из скрытого текстового блока.** GetCourse подставляет переменные вроде `{email}` в текстовый блок с галочкой «Заменять переменные пользователя». Скрипт квиза читает оттуда адрес и по нему понимает, в чью карточку писать. 2. **Ответы уходят прямо из браузера в событие воронки.** У ноды «Событие» есть внешний вызов: ссылка, которая принимает данные. Ключи API не нужны. 3. **Прошлые ответы возвращаются на страницу тем же способом.** Поле карточки подставляется в скрытый блок, и квиз показывает «вы уже проходили, ваш результат такой-то». --- ## Что понадобится - GetCourse с модулем воронок. Он открывается в двух местах: **Apps → Воронки** или **CRM → Воронки**. - Права администратора: создавать дополнительные поля и воронки. - Урок или страница, куда ученик заходит **авторизованным**. Без входа GetCourse не знает, кто это, и квиз попросит войти. - Любая сильная нейросеть: ChatGPT, Claude, Gemini, DeepSeek. - 40–60 минут на первый раз. --- ## Шаг 1. Придумайте квиз и заполните промпт Откройте файл **ПРОМПТ.md** и заполните раздел «1. Мой квиз». Что нужно: - тема и цель; - аудитория; - вопросы (или попросите нейросеть предложить); - как считать результат и что сказать про каждый; - фирменные цвета; - **префикс полей** — короткое слово латиницей, например `quiz` или `test1`. Префикс нужен, чтобы поля разных квизов не перепутались: из `quiz` получатся `quiz_answers`, `quiz_result` и т. д. Ссылку события пока не вписывайте, её ещё нет. Оставьте `ВСТАВЬТЕ_ССЫЛКУ_СОБЫТИЯ`. ## Шаг 2. Получите квиз от нейросети Вставьте заполненный промпт в нейросеть. В ответе должны быть пять частей: 1. Список дополнительных полей. 2. Код скрытого текстового блока. 3. Код преобразования для ноды «Событие». 4. Таблица «поле → переменная» для ноды «Обновить поля пользователя». 5. Код HTML-блока квиза. Если чего-то нет или код оборван многоточием, напишите «пришли полностью пункт N». > Совет. Сначала посмотрите квиз без GetCourse. Сохраните код HTML-блока в файл `quiz.html` и откройте в браузере. Квиз покажет «Войдите в аккаунт», потому что e-mail не найден. Это правильно. Чтобы увидеть сами вопросы, попросите нейросеть: «добавь режим предпросмотра: если в адресе есть `#preview`, используй e-mail test@test.ru и не отправляй данные». ## Шаг 3. Создайте дополнительные поля **Пользователи → Пользователи → кнопка «Дополнительные поля»** → создайте поля из списка, который дала нейросеть. Можно сложить их в отдельную папку, например «Квиз: формат обучения». | Поле | Тип | Что в нём | |---|---|---| | `quiz_answers` | Текст | все ответы в машинном виде, для повторного показа | | `quiz_text` | Текст | ответы человеческим языком, для менеджера | | `quiz_result` | Строка | итог: «Самостоятельный формат», «С куратором»… | | `quiz_score` | Строка | баллы | | `quiz_at` | Строка | когда прошёл | Важно: - **Поля создаются заранее.** Воронка не умеет создавать поле, которого нет. - **Имена — латиницей, ровно как в коде:** `quiz_answers`, а не `Quiz Answers`. - **Для длинных значений берите тип «Текст»,** а не «Строка». - **Числа присылайте строкой в поле типа «Строка».** Числовое поле GetCourse не принимает значение, которое пришло строкой из запроса. Если число нужно именно числом, например для сегмента «баллы больше 30», см. «Тонкости» ниже. Доступные типы полей: строка, текст, чекбокс «Да/Нет», выбор, множественный выбор, дата, файл, число. ## Шаг 4. Настройте воронку **Apps → Воронки** (или **CRM → Воронки**) → создайте новую воронку, например «Квиз: формат обучения». Вся воронка — две ноды и стрелка между ними: ![Воронка: нода «Событие» соединена с нодой «Обновить поля пользователя»](img/voronka-shema.png) **4.1. Нода «Событие».** Добавьте ноду-событие (пользовательское событие) и откройте её настройки. На вкладке **«Внешний вызов»** включите три галочки: | Галочка | Зачем | |---|---| | ✅ **Разрешить вызов внешней системы** | квиз сможет отправить данные по ссылке | | ✅ **Преобразовать объекты из параметров запроса** | параметры запроса превратятся в переменные, с которыми работает код ниже | | ✅ **Логировать все входящие данные** | в журнале будет видно, что пришло. Незаменимо при первой настройке | Нажмите **«Скопировать ссылку»** и сохраните её. Это адрес, на который квиз будет отправлять ответы. Он выглядит так: ``` https://ваша-школа.ru/chtm/app/builder/event/~reg/xxxxxxxx/yyyyyyyy?hash=zzzzzzzz ``` В поле **«Код преобразования»** вставьте код из ответа нейросети, пункт 3: ``` user.quiz_answers = body.quiz_answers user.quiz_text = body.quiz_text user.quiz_result = body.quiz_result user.quiz_score = body.quiz_score user.quiz_at = body.quiz_at ``` Как читать строку `user.quiz_result = body.quiz_result`: - `body` — тело запроса, который прислал квиз; - `body.quiz_result` — параметр `quiz_result` из этого запроса; - `user.quiz_result` — переменная, куда вы его кладёте, чтобы на следующем шаге записать в поле. Имя переменной может быть любым, но удобнее называть её как поле. **4.2. Нода «Обновить поля пользователя».** Добавьте её и соедините стрелкой с событием. В настройках выберите нужное дополнительное поле и укажите имя переменной, в которую вы положили значение в коде преобразования: | Дополнительное поле | Значение | |---|---| | quiz_answers | `user.quiz_answers` | | quiz_text | `user.quiz_text` | | quiz_result | `user.quiz_result` | | quiz_score | `user.quiz_score` | | quiz_at | `user.quiz_at` | **4.3. Сохраните и включите воронку.** Публиковать отдельно не нужно: у воронки есть «Сохранить» и «Включить». После включения каждое сохранение сразу её обновляет. ## Шаг 5. Добавьте блоки в урок или на страницу Откройте урок (или страницу), где будет квиз. Добавьте **два блока в таком порядке**: **Блок 1 — текстовый, скрытый.** Добавьте текстовый блок, переключите редактор в режим HTML-кода и вставьте код из пункта 2 ответа нейросети: ```html
{email} {object.quiz_answers} {quiz_answers}
``` В настройках блока **включите галочку «Заменять переменные пользователя»**. Без неё в блоке останется буквальный текст `{email}`, и квиз решит, что ученик не вошёл. > Зачем два span на одно поле. На одних страницах GetCourse срабатывает `{object.quiz_answers}`, на других — `{quiz_answers}`. Код берёт тот, что подставился. **Блок 2 — HTML.** Добавьте блок «HTML-код» и вставьте пункт 5 ответа нейросети — код квиза целиком. Сохраните урок. ## Шаг 6. Впишите ссылку события в квиз В коде HTML-блока найдите строку: ```js eventUrl: 'ВСТАВЬТЕ_ССЫЛКУ_СОБЫТИЯ', ``` Вставьте между кавычками ссылку из шага 4.1: ```js eventUrl: 'https://ваша-школа.ru/chtm/app/builder/event/~reg/xxxxxxxx/yyyyyyyy?hash=zzzzzzzz', ``` Сохраните блок. ## Шаг 7. Проверьте 1. Откройте урок под тестовым учеником (или под собой, если вы вошли). Не в режиме редактирования, а как ученик. 2. Пройдите квиз до конца. Должно появиться «Ответы сохранены». 3. Откройте карточку тестового ученика → дополнительные поля. Там ваши ответы. 4. Обновите страницу урока. Квиз должен показать прошлый результат и кнопку «Пройти заново». 5. Если поля пустые — откройте журнал входящих данных ноды «Событие» (вы включили логирование) и смотрите таблицу «Если не работает» ниже. Готово. Теперь по этим полям можно строить сегменты, отправлять письма с `{object.quiz_result}`, запускать процессы и показывать результат менеджеру в карточке. --- ## Если не работает | Что видите | Причина | Что сделать | |---|---|---| | Квиз не появился, в консоли браузера (F12) `SyntaxError` | в коде есть `{слово}` — GetCourse подменил его как переменную | попросите нейросеть: «в коде HTML-блока не должно быть ни одного `{слово}` — после каждой `{` ставь пробел, без шаблонных строк `${…}`» | | Квиз пишет «Войдите в аккаунт», хотя вы вошли | не включена «Заменять переменные пользователя» в текстовом блоке, или текстовый блок ниже HTML-блока, или id span не совпадает с кодом | включите галочку, поставьте текстовый блок первым, сверьте `quiz-email` | | «Не получилось сохранить» | воронка не включена, ссылка вставлена не целиком (без `?hash=`), или не стоит «Разрешить вызов внешней системы» | проверьте шаги 4.1, 4.3, 6 | | В журнале события данные есть, в карточке пусто | не создано дополнительное поле, опечатка в имени, или в «Обновить поля пользователя» не указана переменная | сверьте имена: в коде квиза, в коде преобразования, в ноде и в поле должно быть одно и то же | | Ответы есть, но квиз их не показывает после обновления | в текстовом блоке нет span `quiz-saved` или поле называется иначе | добавьте оба span (`{object.…}` и `{…}`) с правильным именем поля | | Появились странные новые пользователи | квиз отправлял данные до того, как нашёл e-mail | в коде должна быть проверка «в адресе есть `@` и нет `{`». Попросите нейросеть использовать готовый слой отправки из промпта без изменений | | Вёрстка квиза «поехала», что-то не видно | стили GetCourse (Bootstrap) задели квиз | квиз должен рисоваться внутри Shadow DOM — это требование есть в промпте, попросите нейросеть выполнить его | --- ## Тонкости, о которые мы спотыкались - **Ссылка события видна в коде страницы.** Это нормально, так устроен внешний вызов. Но значит, что кто-то технически может прислать в неё что угодно от имени чужого e-mail. Не выдавайте по полям квиза доступы и деньги без проверки человеком. - **Одно событие пишет все свои поля сразу.** Если квиз длинный и сохраняется частями (например, по разделам), заведите **своё событие на каждый раздел** со своими полями. Иначе следующая часть перезапишет предыдущую пустыми значениями. - **Числа в поле «Число».** Простые параметры приходят строкой, а числовое поле строку не принимает. Решение: квиз дополнительно кладёт число в параметр `customData` JSON-строкой, например `customData={"score":34}`. В коде преобразования пишете `user.quiz_score_n = body.customData && body.customData.score`. Галочка «Преобразовать объекты из параметров запроса» превращает эту строку в объект. Попросите нейросеть: «отправь баллы ещё и числом в customData». - **Большие данные — только POST.** Квиз из промпта и так отправляет POST. В адресной строке (GET) длинные ответы обрежутся. - **Сеть подвела — ответы не потеряются.** Квиз хранит копию на устройстве и досылает при следующем открытии урока. Пока не отправлено, ученик видит кнопку «Отправить ещё раз». - **Один ученик, несколько прохождений.** Поля хранят последний результат. Историю всех прохождений удобнее вести в журнале воронки или в таблице через отдельный плагин. - **Поле в письме и на страницах.** Значение поля подставляется переменной `{object.quiz_result}`. В HTML-блоке с кодом переменные не используйте, только в текстовом блоке или в письме. - **Размер блока.** Держите HTML-блок до ~55 000 знаков. Если квиз с картинками и длинными текстами не помещается — картинки загружайте в GetCourse и ставьте ссылками, тексты сокращайте. Для по-настоящему больших квизов код выносится в тему оформления, но это уже отдельная история. ## А если не GetCourse Сам квиз универсальный. На другой платформе меняются три вещи: - откуда брать e-mail или ID человека — свой способ подстановки данных пользователя; - куда отправлять — вебхук своей CRM или автоматизации (Albato, Make, n8n, Salebot, Bitrix24); - как показывать прошлые ответы. Попросите нейросеть: «адаптируй квиз под [платформа]: e-mail бери из [где], данные отправляй POST-ом на [вебхук]».