Как очистить базу из 100 000 номеров перед рассылкой в Max
Пошаговый гайд: от выгрузки CSV до импорта чистой базы в рассыльщик. Дедупликация, нормализация, валидация и проверка через Max Checker.
База на 100 000 номеров — это типичный объём для среднего B2B-кампейна или ре-активации старой клиентской базы. Если запустить рассылку в MAX по такой базе «как есть», 15–35% сообщений уйдут в пустоту: на отключённые номера, на людей без MAX и на дубликаты, которые уже получили сообщение часом раньше.
Эта статья — пошаговая методология: от выгрузки CSV до момента, когда вы нажимаете «Старт» в рассыльщике с уверенностью, что каждый рубль бюджета бьёт в живую цель.
TL;DR
- 7 шагов: экспорт → нормализация → дедупликация → форматная валидация → проверка существования через Max Checker → фильтрация → импорт обратно
- Время на 100k номеров: 30–60 минут вместо нескольких рабочих дней
- Стоимость проверки 100k: ~$700 со скидкой 30% (тариф $0.01/номер)
- Типичная экономия бюджета на рассылке: 15–35% от исходного списка
- Главные ошибки: пропуск нормализации до дедупликации и проверка «постфактум» уже после первой волны рассылки
Шаг 1. Экспорт исходной базы в CSV
Откуда бы ни приходила база — CRM, рекламный кабинет, Excel от партнёра,
парсинг публичных каналов — приведите всё к одному формату: CSV в
кодировке UTF-8 с BOM, разделитель ,. Колонки минимум две: phone и
любой стабильный идентификатор для последующего объединения (например,
crm_id или email).
Если база лежит в Excel, не экспортируйте её через «Сохранить как CSV» —
Excel калечит длинные числа в научную нотацию, и +79161234567
превращается в 7.9161E+10. Сначала переведите колонку phone в
текстовый формат, затем сохраняйте.
Шаг 2. Нормализация в формат E.164
E.164 — международный стандарт записи телефонных номеров: + плюс
код страны и сам номер, без пробелов, скобок и дефисов. Подробности —
в Wikipedia: E.164.
Минимально достаточный регекс для российских номеров:
import re
def normalize_ru(raw: str) -> str | None:
digits = re.sub(r'\D', '', raw or '')
if not digits:
return None
if digits.startswith('8') and len(digits) == 11:
digits = '7' + digits[1:]
if digits.startswith('7') and len(digits) == 11:
return '+' + digits
if len(digits) == 10:
return '+7' + digits
return None # подозрительный — на ручной просмотрКлючевая ошибка, которую делают 9 из 10 команд: дедуплицируют
до нормализации. Тогда 8 (916) 123-45-67 и +79161234567
считаются разными записями. Сначала нормализуем, потом дедуплицируем —
не наоборот.
Шаг 3. Дедупликация
После нормализации дубликаты находятся одной строкой. На bash:
sort -t, -k1,1 raw.csv | awk -F, '!seen[$1]++' > dedup.csvНа pandas:
import pandas as pd
df = pd.read_csv('raw.csv', dtype={'phone': str})
df['phone'] = df['phone'].map(normalize_ru)
df = df.dropna(subset=['phone']).drop_duplicates(subset=['phone'])На объёме 100k обычно теряется 3–8% записей. Если у вас 15%+ дубликатов —
это сигнал, что в исходной базе склеены несколько источников, и стоит
сохранить колонку source, чтобы понимать, откуда пришёл каждый номер.
Шаг 4. Форматная валидация
Не всё, что после нормализации выглядит как номер, — реальный номер. Стоит проверить:
- длину (для +7 ровно 12 символов)
- что код мобильного оператора попадает в действующий диапазон (Россвязь публикует ресурсы)
- что номер не из служебных диапазонов (горячие линии, короткие номера)
Эта валидация бесплатная и отрезает 1–3% откровенного мусора, который иначе вы оплатили бы при проверке существования.
Шаг 5. Проверка существования через Max Checker
Это ключевой шаг — отделить «номер существует в формате» от «номер зарегистрирован в MAX и доступен для рассылки». Подробнее о механике — в Как это работает.
Вы получаете на выходе CSV с тремя статусами на номер:
| Статус | Что значит | Что делать |
|---|---|---|
registered | Аккаунт MAX существует, рассылка возможна | В отправку |
not_found | Номера нет в MAX | Исключить из рассылки в MAX |
unknown | Сервер не дал однозначного ответа (редко, <0.5%) | Перепроверить или исключить |
Стоимость на 100k со скидкой 30% (порог $500) — $700. Если делаете кампанию каждый месяц и совокупно превышаете 200k — выгоднее закинуть $2000 и получить тариф 40% (см. тарифы).
Шаг 6. Фильтрация и сегментация
После Max Checker оставляйте только registered. Дополнительно
сегментируйте по полям, которые вернул чекер (имя, фамилия, server ID —
читайте подробнее про server ID):
- персонализация по имени поднимает CTR в среднем на 12–18%
- наличие фамилии — сигнал «реального» аккаунта, такие конверсятся лучше
- одинаковый server ID у группы номеров часто означает корпоративный пул — обращение «вы» вместо «ты» уместнее
Шаг 7. Импорт обратно в рассыльщик
Финальный CSV должен быть чистым: одна колонка phone в E.164, плюс
поля для персонализации. Перед импортом проверьте:
- кодировка UTF-8 (без BOM, если рассыльщик старый)
- разделитель совпадает с тем, что ждёт инструмент
- нет пустых строк в конце файла (типичный артефакт Excel)
Чек-лист перед запуском
- Все номера в E.164 (
+7…) - 0 дубликатов по нормализованному номеру
- Только статус
registered - Поля персонализации заполнены минимум на 70% базы
- Тестовый прогон на 100 номерах — все доставлены
- Согласие на рассылку зафиксировано (см. 152-ФЗ и проверка номеров)
Расчёт ROI
Допустим, на исходных 100k у вас была бы конверсия 0.8% при цене сообщения $0.005 (рассыльщик) + штраф репутации.
| Сценарий | Доставлено | Конверсия | Лидов | Стоимость |
|---|---|---|---|---|
| Без чистки | 65 000 | 0.6% | 390 | $500 + риск блокировки |
| С Max Checker | 78 000 | 1.1% | 858 | $1200, в т.ч. $700 чекер |
Прирост лидов в 2.2 раза при росте бюджета в 2.4 раза — но с гораздо более стабильной репутацией отправителя. На длинной дистанции это важнее одной конкретной кампании.
Частые вопросы
01.Сколько стоит проверить базу из 100 000 номеров?
При тарифе $0.01 за номер базовая стоимость $1000. С учётом скидки 30% от $500 итог $700. На объёме 100k экономия достигает $300, а время проверки сокращается с десятков часов ручного труда до 30–60 минут автоматики.
02.Можно ли проверять базу с уже хешированными номерами?
Нет. Чекеру нужен номер в формате E.164 (например, +79161234567). Если у вас MD5/SHA-256 хеши, их сначала придётся восстановить или использовать словарь обратного соответствия — иначе проверка невозможна по определению.
03.Что делать с дубликатами при объединении нескольких выгрузок?
Сначала привести все номера к E.164, затем сделать дедупликацию по нормализованному номеру (а не по сырой строке). На больших объёмах используйте sort -u или pandas drop_duplicates: иначе пропустите номера, отличающиеся пробелом или дефисом.
04.Чем грозит рассылка без предварительной валидации?
Высокий процент недоставленных сообщений → антиспам-фильтры мессенджера понижают репутацию аккаунта или зеркала. На длинной дистанции это удорожает каждый успешный контакт в разы и может привести к блокировке отправителя.
Читать дальше