---
title: "Методология бенчмарка из комментария в ЛС"
description: "Как доля совпадений, доля доставки и время до первого ЛС измеряются на кампании из комментария в ЛС, и почему результатов пока не опубликовано."
canonical: https://docs.afp.monster/ru/research/comment-to-dm-benchmark
updated: 2026-08-19
pageType: research
---

Три цифры описывают, насколько хорошо работает кампания из комментария в ЛС: доля совпадений, доля доставки и время до первого ЛС. Все три определены ниже вместе с кампанией, которую нужно построить, комментариями, которые нужно опубликовать, и файлом, в котором публикуются результаты. Данные не собраны, поэтому ни одного результата на этой странице нет — методология публикуется первой, намеренно.

> **Статус:** методология опубликована; сбор данных не начат. Каждое измеренное поле в этом документе пусто до завершения первого запуска, после чего результаты и сырой набор данных публикуются здесь.

## Что значат три метрики

Каждая метрика — это счётчик, делённый на счётчик, взятый на одном запуске против одной подключённой страницы, и каждая имеет знаменатель, который исключает пробы, которые платформа вовсе не доставила AFP.

| Метрика | Определение | Единица |
|---|---|---|
| Начатые пробы | Комментарии, опубликованные во время запуска, которые породили выполнение тестовой кампании | количество |
| Доля совпадений | Пробы, чьё выполнение покинуло узел-условие через **Match**, делённые на начатые пробы | процент |
| Доля доставки | Пробы, чьё выполнение записало отправленное ЛС, делённые на пробы, чьё выполнение достигло узла `send_dm` | процент |
| Время до первого ЛС | Секунды от публикации комментария наблюдателем до появления ЛС в переписке получателя | секунды, медиана и 90-й перцентиль |

Доля совпадений измеряет узел-условие, а не триггер. Узел-триггер не несёт конфигурации ключевых слов, поэтому каждый комментарий на посте в области запускает выполнение, и условие — единственное место, где текст сравнивается. [Правила сопоставления ключевых слов](/ru/reference/keyword-matching) определяет сравнение, которое выполняет каждый тип сопоставления.

Доля доставки измеряет то, что записал AFP, а не то, что увидел получатель. Узел `send_dm`, вызывающий ошибку, записывает эту ошибку, и запуск останавливается на нём, поэтому сбой виден; сообщение, принятое Facebook или Instagram и отфильтрованное после, считается доставленным по этому определению.

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

## Где берётся каждая цифра

```d2 title="What the benchmark measures: the clock runs from the observer's comment to the DM arriving"
direction: down
post: "Observer posts a comment\nclock starts"
reach: Comment reaches the connected page
accept: "Trigger accepts it\nexecution starts"
cond: "Condition\nkeyword list" {shape: diamond}
send: Send DM node
none: Run ends with no DM
arrive: "DM appears in the recipient's conversation\nclock stops"
post -> reach -> accept -> cond
cond -> send: Match
cond -> none: No Match
send -> arrive
```

## Как строится тестовая кампания

Одна кампания, четыре узла, без ожидания. Что-либо ещё в графе добавляет переменную, не имеющую отношения к трём метрикам.

1. Создайте кампанию, привязанную к тестируемой странице, и откройте её на холсте.
2. Добавьте триггер комментария. Установите область поста на **конкретный пост** (specific post) и выберите пост, созданный для запуска, чтобы обычный трафик на других постах не мог попасть в выборку. Оставьте **уникально для пользователя** (unique per user) выключенным — с ним повторный комментатор блокируется, и проба никогда не начинается.
3. Добавьте узел-условие с типом сопоставления **Список ключевых слов** (Keyword list), указывающим на список ключевых слов, созданный для запуска. Оставьте обратное сопоставление выключенным, оставьте фильтры изображений, GIF и ссылок выключенными и оставьте **ожидание ответа** (wait for reply) выключенным, чтобы запуск разрешился за один проход.
4. Добавьте узел `send_dm` с фиксированным текстовым сообщением, подключённый к выходу **Match** условия. Не подключайте ничего к **No Match**, чтобы несовпадающий запуск заканчивался на условии и был однозначным в истории.
5. Сохраните кампанию, затем включите её. Активация валидирует граф и является отдельным действием от сохранения.
6. Отключите все остальные кампании на этой странице. Каждая активная кампания, чей триггер совпадает, запускает своё выполнение, и две кампании, отвечающие на один комментарий, делают долю доставки бессмысленной.

:::caution
Не используйте тестовое выполнение для этого. Тестовое выполнение проходит тот же граф, но не делает вызовов к Facebook или Instagram, поэтому может подтвердить, какую ветку принимает сообщение, и не может измерить ни доставку, ни тайминг.
:::

## Как выполняется запуск

Сначала окружение: одна страница Facebook и один бизнес-аккаунт Instagram, оба подключены и подписаны, под аккаунтом, чья подписка активна. Комментарий, пришедший, пока подписка неактивна, записывается как ошибка подписки, а страница, чей сохранённый доступ перестал работать, записывает ошибку повторного входа. Оба считаются сбоями окружения и исключаются из всех долей.

1. Зафиксируйте список ключевых слов на одно ключевое слово и зафиксируйте текст ЛС. Запишите оба дословно в заметках запуска.
2. Назначьте один уникальный аккаунт комментатора на пробу. Один человек имеет один активный запуск одной кампании за раз, поэтому второй комментарий с того же аккаунта, пока первый запуск ещё активен, пропускается и молча сократил бы выборку.
3. Комментируйте с аккаунтов, отличных от самой страницы. Комментарии, которые публикует страница, игнорируются, что исключает ведение запуска с аккаунта страницы.
4. Для каждой пробы опубликуйте текст комментария для её корзины и запишите время отправки по часам наблюдателя.
5. Наблюдайте за перепиской получателя и запишите время прибытия ЛС по тем же часам. Запишите отсутствие прибытия после фиксированной отсечки, выбранной до начала запуска и указанной с результатами.
6. Прочитайте историю выполнений кампании и запишите для каждой пробы, покинул ли запуск условие через Match и где он остановился. История возвращает 20 самых свежих запусков и не обновляется сама, поэтому держите каждый пакет меньше этого и читайте его перед началом следующего.
7. Отфильтруйте ленту активности по странице и временному окну запуска, затем экспортируйте её. Экспорт применяет фильтры ленты и загружается как JSON, и это журнал аудита за таблицей проба за пробой.
8. Повторите на второй платформе, не меняя форму кампании, ключевое слово или текст ЛС.

### Корзины комментариев

Каждая проба принадлежит одной корзине, и корзина фиксирует как опубликованный текст, так и ветку, которую она ожидается принять.

| Корзина | Что публикуется | Ожидаемая ветка |
|---|---|---|
| Точное ключевое слово | Только ключевое слово | Match |
| Ключевое слово в предложении | Предложение, содержащее ключевое слово как подстроку | Match |
| Ключевое слово в верхнем регистре | Ключевое слово, набранное заглавными буквами | Match  |
| Почти совпадение | Слово, которое делит префикс с ключевым словом, не содержа его | No Match |
| Несвязанный текст | Комментарий на посте, не содержащий ключевого слова | No Match |
| Только медиа | Стикер или изображение без текста | No Match |

Комментарий только с медиа достигает условия как текст-заполнитель, а не как пустая строка, поэтому он принадлежит выборке: это единственная корзина, где то, что сравнивает условие, — не то, что набрал комментатор.

## Результаты

Результатов нет. Сбор данных не начат, и ничего на этой странице не было измерено.

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

## Что будет содержать сырой набор данных

Один файл JSON на запуск, публикуемый на этой странице рядом со сводной таблицей, с одним объектом на пробу. Экспорт активности, сделанный на шаге 7, публикуется с ним без изменений, поэтому каждую пробу можно проследить до строки, которую записал AFP.

| Поле | Что хранит |
|---|---|
| `trial_id` | Порядковый номер в запуске |
| `platform` | `facebook` или `instagram` |
| `bucket` | Одно из шести названий корзин выше |
| `comment_text` | Точный опубликованный текст |
| `comment_posted_at` | Часы наблюдателя, когда комментарий был отправлен |
| `execution_started` | Было ли создано выполнение для этого комментария |
| `branch_taken` | `match`, `no_match` или `none` |
| `dm_recorded` | Записало ли выполнение отправленное ЛС |
| `dm_observed_at` | Часы наблюдателя, когда ЛС появилось в переписке |
| `time_to_first_dm_seconds` | Разница между двумя временными метками наблюдателя |
| `outcome` | `delivered`, `no_match`, `no_execution`, `environment_failure` или `timeout` |
| `notes` | Что-либо необычное в пробе, простым текстом |

Измеренные поля равны `null`, пока запуск их не заполнит. Одна проба из опубликованного скелета выглядит так:

```json
[
  {
    "trial_id": 1,
    "platform": "facebook",
    "bucket": "exact_keyword",
    "comment_text": "price",
    "comment_posted_at": null,
    "execution_started": null,
    "branch_taken": null,
    "dm_recorded": null,
    "dm_observed_at": null,
    "time_to_first_dm_seconds": null,
    "outcome": null,
    "notes": ""
  }
]
```

## Ограничения

- **За доставку отвечает не только AFP.** AFP передаёт сообщение в Facebook или Instagram;
  что происходит после, выходит за рамки всего измеренного здесь, а время до первого ЛС
  включает собственное время доставки платформы.
- **Один аккаунт, одна аудитория, одно окно.** Запуск охватывает одну страницу Facebook и
  один бизнес-аккаунт Instagram в одно время суток. Он ничего не говорит о страницах с другим
  трафиком, другим числом подписчиков или в другом регионе.
- **Часы наблюдателя ручные.** Оба конца измерения времени записываются человеком, наблюдающим
  за двумя поверхностями, поэтому разрешение грубое, а время человеческой реакции входит в число.
- **Выборка синтетическая.** Комментарии, написанные для заполнения корзин, — не те
  комментарии, которые пишут реальные подписчики, а корзина «почти совпадение» выбрана так,
  чтобы сидеть близко к границе совпадения.
- **Обработка регистра не подтверждена.** Корзина верхнего регистра измеряется, но ожидаемая
  ветка для неё не проверена, пока инженерия не подтвердит, как сравнение обрабатывает регистр
  букв.
- **Ни один конкурент не измерялся.** Эти метрики описывают только AFP. [Страницы
  сравнения](/ru/compare) прямо заявляют, что ни одно число производительности конкурента не
  было измерено.
- **Доли зафиксированы, а не гарантированы.** Ничто здесь не является уровнем сервиса.
  Опубликованная цифра описывает один запуск за один день.

## Связанное

- [Исследования](/ru/research) — стандарт, которому соответствует каждое исследование на этом сайте, и что опубликовано на данный момент.
- [Маршрутизируйте комментарии в ЛС](/ru/guides/route-comments-to-dm) — как построить кампанию, которую измеряет этот метод.
- [Протестировать и отладить кампанию](/ru/guides/test-and-debug-campaigns) — чтение истории выполнений, от которой зависит запуск.
- [Состояния выполнения](/ru/reference/execution-states) — что значит остановленное, ожидающее или неудачное выполнение при чтении.
- [Модерировать комментарии](/ru/guides/comment-moderation) — лента активности и её экспорт.
