Как настроить опрос удовлетворённости в GLPI

Как GLPI на самом деле запускает, хранит и измеряет опрос удовлетворённости: из какого столбца glpi_entities берётся каждая настройка, почему опрос иногда не отправляется (закрытие vs решение, cron createinquest) и что мы делаем при сопровождении, чтобы повысить долю ответов.

В этой статьеРазделов: 5

Опрос удовлетворённости, на который никто не отвечает, не приводит ни к каким решениям. В этом руководстве показано, как GLPI на самом деле запускает, хранит и измеряет опрос удовлетворённости, — из какого столбца берётся каждая настройка, почему опрос иногда просто не отправляется и что мы делаем при сопровождении клиентских сред, чтобы поднять долю ответов с нуля.

Где настраивается опрос (и почему для каждой организации отдельно)

Вопреки тому, что многие ищут, опрос удовлетворённости в GLPI — это не глобальная кнопка: он настраивается для каждой организации в Администрирование > Организации > (выберите организацию) > вкладка Поддержка. Каждое поле экрана записывается в столбец таблицы glpi_entities, а значение может наследоваться от родительской организации. Зная столбец за каждым полем, можно диагностировать проблему через SQL, когда интерфейс «говорит», что всё в порядке.

Поле на экранеСтолбец в glpi_entitiesЧто делает
Конфигурацияinquest_config-2 наследовать, 0 нет, 1 внутренний (звёзды), 2 внешний (URL)
Создать опрос черезinquest_delayдней после закрытия до создания опроса
Доляinquest_rate% заявок, выбираемых случайно (100 = все)
Длительностьinquest_durationдней, за которые пользователь должен ответить (0 = без ограничения)
URL (только внешний)inquest_URLадрес внешнего опроса с подстановочными метками
(внутреннее)max_closedateотметка: до какого момента cron уже обработал заявки

Поле Конфигурация со значением -2 (наследовать) — тихая ловушка: дочерняя организация может выглядеть включённой, а на самом деле наследовать «без опроса» от корневой. В более новых версиях тот же механизм появился и для изменений, в аналогичных столбцах с суффиксом _change.

Настоящий триггер: закрытие + cron, а не решение

Здесь кроется причина номер 1 того, что «опрос не уходит». Опрос не создаётся, когда заявка решена (статус 5, Решена); он создаётся, когда заявка закрыта (статус 6, Закрыта), и даже тогда — только когда запускается задача cron createinquest и выбирает эту заявку в пределах inquest_rate. Это два независимых условия:

  1. Заявка должна закрыться. Если автоматическое закрытие выключено, а специалисты только «решают» заявки, они навсегда остаются в статусе Решена, и ни один опрос не создаётся. Автоматическое закрытие — это поле autoclose_delay той же организации.
  2. Cron должен работать во внешнем режиме. Задача createinquest создаёт опросы для закрытых заявок. Во внутреннем режиме она запускается только тогда, когда кто-то загружает страницу, — в организациях с низким трафиком она может не запускаться днями.

Именно так было в одной среде, которую мы взяли на сопровождение: опрос был «включён» уже несколько месяцев, а в базе не было ни одного ответа. Дело было не в шаблоне и не в доле. createinquest работал во внутреннем режиме (mode = 1) в GLPI с низким трафиком, поэтому cron практически никогда не срабатывал; вдобавок автоматическое закрытие было выключено, так что почти ничего не доходило до статуса Закрыта. Мы включили внешний cron операционной системы и настроили autoclose_delay: в тот же день опросы начали создаваться. С тех пор, беря любой GLPI на сопровождение, мы проверяем эти два пункта — это постоянный элемент нашего регламента.

Внешний cron — это одна строка в системном crontab, выполняемая от имени пользователя PHP:

# /etc/cron.d/glpi - cron externo do GLPI (usuário do PHP-FPM)
# 1 disparo por minuto; processa TODAS as tarefas em modo externo,
# inclusive "createinquest" (geração das pesquisas de satisfação).
* * * * *  apache  /usr/bin/php /var/www/glpi/front/cron.php >/dev/null 2>&1

А диагностика прямо в базе подтверждает, работает ли задача и когда она запускалась в последний раз:

-- Estado da tarefa que gera as pesquisas (usar usuário somente-leitura)
-- state: 0=desabilitada 1=aguardando 2=rodando
-- mode:  1=interno (roda em page load)  2=externo (roda no cron do SO)
-- frequency: intervalo em segundos (padrão 86400 = 1 dia)
SELECT name, state, mode, frequency,
       lastrun,
       DATE_ADD(lastrun, INTERVAL frequency SECOND) AS proxima_prevista
FROM glpi_crontasks
WHERE name = 'createinquest';

Шаблон уведомления

Когда опрос создан, пользователя приглашает уведомление. Настройте его в Настройки > Уведомления > Шаблоны уведомлений, в шаблоне, связанном с событием удовлетворённости для Ticket. Полезные теги:

  • ##ticket.urlsatisfaction## — прямая ссылка на опрос с авторизацией (самое важное).
  • ##ticket.id## и ##ticket.title## — чтобы пользователь вспомнил, о каком обращении речь.
  • ##satisfaction.text## / ##satisfaction.type## — текст и тип опроса.

Типичная ошибка здесь — старательно писать длинное письмо: чем больше текста перед ссылкой, тем ниже конверсия. Одна строка контекста, ссылка — и всё.

Как на самом деле измерить долю ответов

Честная средняя доля ответов на опросы по e-mail — в диапазоне от 10% до 20%; считать 30% «плохим» результатом нереалистично. Все ответы хранятся в glpi_ticketsatisfactions, по одной строке на каждый созданный опрос. Если ответа не было, date_answered остаётся пустым — так отличают «отправлен» от «отвечен»:

-- Taxa de resposta e média (últimos 90 dias), usuário somente-leitura
-- type: 1=interna (estrelas)  2=externa (URL)
-- satisfaction: 0 a 5; date_answered nulo = ainda não respondida
SELECT
    COUNT(*)                                                   AS geradas,
    SUM(date_answered IS NOT NULL)                            AS respondidas,
    ROUND(100 * SUM(date_answered IS NOT NULL) / COUNT(*), 1) AS taxa_resposta_pct,
    ROUND(AVG(CASE WHEN date_answered IS NOT NULL
                   THEN satisfaction END), 2)                 AS media_0a5
FROM glpi_ticketsatisfactions
WHERE date_begin >= DATE_SUB(CURDATE(), INTERVAL 90 DAY);

Обратите внимание: среднее учитывает только тех, кто ответил. Расчёт среднего по всем строкам (включая пустые) искажает число — это ещё одно искажение, которое мы уже исправляли в отчёте клиента.

Как поднять долю ответов с нуля

Правильная настройка — обязательное условие; количество ответов — отдельная битва. Что работает на практике:

  • Блокировать новые заявки до ответа с помощью модуля Pending Survey: пользователь снова видит неотвеченный опрос, когда пытается создать следующую заявку. Это даёт самый заметный эффект.
  • Сократить inquest_delay, чтобы опрос создавался ближе к закрытию, пока обращение ещё свежо в памяти.
  • Уведомлять по другому каналу, помимо e-mail, например через WhatsApp.
  • Сохранять простоту: 1 оценка и 1 необязательный комментарий. Длинный опрос снижает конверсию.

Ловушка inquest_rate: случайный выбор происходит в момент работы cron и не имеет обратной силы. Снижение со 100% до 30% не «отменяет» уже созданные опросы, а повторное повышение не возвращает уже прошедшие заявки — max_closedate движется только вперёд.

Нужен опрос удовлетворённости, который действительно измеряет, с надёжным cron и здоровой долей ответов? Сопровождение GLPI от NexTool берёт на себя настройку, мониторинг cron и ежемесячные отчёты для вашей службы поддержки. Узнайте об услуге поддержки и сопровождения.


Проверено командой NexTool Solutions.

Часто задаваемые вопросы

Причин в основном две. Заявка может быть только решена (статус 5) и никогда не закрыта (статус 6) — опрос создаётся только при закрытии; проверьте автоматическое закрытие (autoclose_delay) организации. Кроме того, задача cron createinquest может работать во внутреннем режиме, который запускается только при загрузке страницы; в средах с низким трафиком перейдите на внешний cron операционной системы.

В glpi_ticketsatisfactions, по одной строке на созданный опрос: tickets_id, type (1 внутренний, 2 внешний), date_begin (создание), date_answered (пусто, пока нет ответа), satisfaction (от 0 до 5) и comment. Настройки для каждой организации хранятся в glpi_entities (inquest_config, inquest_rate, inquest_delay, inquest_duration, inquest_URL).

Через cron. Закрытие лишь делает заявку подходящей; фактически запись опроса создаёт задача createinquest с учётом inquest_delay (задержка) и inquest_rate (случайный выбор). Без работающего cron закрытые заявки остаются подходящими, но без опроса.

Встроенный опрос — это CSAT от 0 до 5 (звёзды) с комментарием, а не NPS. Для NPS или нескольких вопросов используйте внешний режим (inquest_config = 2), указав в inquest_URL инструмент для опросов и передав идентификатор заявки параметром.

Нет. Случайный выбор происходит в момент, когда cron обрабатывает каждую заявку, и не имеет обратной силы. Снижение доли не удаляет уже созданные опросы, а повышение не возвращает предыдущие заявки — отметка max_closedate только движется вперёд.

В Настройки > Уведомления > Шаблоны уведомлений отредактируйте шаблон события удовлетворённости для Ticket. Используйте ##ticket.urlsatisfaction## для ссылки на опрос и ##ticket.id##/##ticket.title## как напоминание. Пишите коротко: чем меньше текста перед ссылкой, тем выше конверсия.

Нужна помощь?