Зачем чистить
Что вы получите по итогу
Из набора в 100 000 «сырых» номеров (CSV из 6 разных источников, 8 форматов записи, 12% дублей) вы получите на выходе один файл: phone, isRegistered, firstName, lastName, serverId, bio, source, segment. Готов к импорту в любой messaging-инструмент или CRM.
Время на ход — 1 рабочий день. Стоимость для 100k номеров — порядка $400 без скидки или $160 при пополнении на $2000+. Эта инвестиция окупается уже на первой рассылке: средний кейс по нашим клиентам — снижение CPM на 30–40% и рост CTR на 1.5–2 п.п.
Шаг 1
Сбор источников в один CSV
У большинства команд телефоны разбросаны по 4–8 системам: CRM, Google Sheets, лид-формы Tilda, чекаут e-commerce, выгрузки из колл-центра, VK-таргет. Первая задача — собрать всё в один файл с единой схемой.
Минимальный набор колонок:
phone— как есть, не нормализуем на этом этапе.source— ярлык источника (crm, tilda, checkout, …).date_added— для возрастной аналитики базы.tags— список через запятую (опционально).
Если в исходнике есть имя или email — сохраните в колонках raw_name, raw_email. На шаге 5 они пригодятся для cross-check'а с тем, что вернёт MAX.
Шаг 2
Нормализация в E.164
E.164 — международный стандарт телефонных номеров: +<country><subscriber>, без пробелов и скобок. Все остальные форматы (8 800, +7 (495) …, 7-999-…) приводите к нему.
На Python:
import phonenumbers
def normalize(raw, region="RU"):
try:
n = phonenumbers.parse(raw, region)
if not phonenumbers.is_valid_number(n):
return None
return phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164)
except Exception:
return NoneОшибочно нераспознанные — в отдельный файл manual_review.csv. Не пытайтесь «починить» их регулярками: получите грязные данные.
Шаг 3
Дедупликация
После нормализации дедуп тривиален: SELECT phone, MIN(date_added), GROUP_CONCAT(source), GROUP_CONCAT(tags). На типовой 100k базе отсеивается 5–12% дублей. Сохраняйте источник и теги от всех вхождений — это пригодится для сегментации в шаге 6.
Шаг 4
HLR-lookup (опционально)
Если ваш канал — голосовой обзвон, прогоните базу через HLR-провайдера. На 100k это $100–500 и 5 минут. Получите статус SIM (active / inactive / ported / roaming) и удалите inactive до шага 5 — сэкономите бюджет на следующем этапе.
Если канал — рассылка в MAX, шаг 4 можно пропустить: HLR-неактивные могут всё равно иметь живой профиль в MAX, привязанный к старой SIM. Лучше сразу идти к социальной проверке.
Шаг 5
MaxCheck — социальная проверка
Загрузите чистый CSV в Telegram-бот (для разовой задачи) или используйте API:
curl -X POST https://api.checkmaxapp.com/v1/batch \
-H "Authorization: Bearer mc_live_…" \
-H "Content-Type: application/json" \
-d '{
"phones": [...],
"callback_url": "https://yourapp.com/maxcheck/webhook",
"format": "csv"
}'За 12–18 минут получите CSV с полями phone, registered, firstName, lastName, serverId, bio, checkedAt. Списание идёт только за registered=true — обычно это 50–70% базы.
Шаг 6
Сегментация и обогащение
На выходе разделите контакты на сегменты:
- Live + имя есть — в основной messaging с персонализацией.
- Live + имени нет — generic-копи без обращения по имени.
- Cold (нет в MAX) — переведите в email/web-push.
- Дубль другого live — выкиньте без жалости.
Импортируйте в свой messaging-инструмент или CRM. Не забудьте сохранить hash phone'а для атрибуции, не сами номера.
Шаг 7
Регулярная дельта-чистка
База быстро деградирует: ~5–8% в месяц теряют валидность (перенос номера, удаление MAX). Поставьте крон: каждые 30 дней — проверка только новых номеров и случайной 10%-выборки из «старых live». Это копейки по бюджету и стабильное качество базы.
Best practices
Что делать всегда
- Храните только хеш phone'а в аналитике, сами номера — в шифрованном хранилище.
- Логируйте каждый прогон: дата, объём, результат, источник.
- Уважайте opt-out: ведите blacklist отдельно от основной базы.
- Не сливайте «cold» сегмент в маркетинг — это бьёт по репутации отправителя.
- Тестируйте на 1k перед прогоном 100k — отловите кодировки и BOM.
Ошибки
Что чаще всего ломает workflow
- Кодировка CSV. Excel любит сохранять в Windows-1251. Принудительно UTF-8.
- Префикс 8 для РФ. Без region="RU" в libphonenumber вы получите NaN.
- Лидирующий пробел в номере. trim() обязателен до нормализации.
- Нулевой timeout на API. Batch может занимать минуты — используйте webhook.
- Игнор лимита 10k в batch. Бьёт 422; делите на чанки.
FAQ
Частые вопросы по чистке
Сколько времени уходит на каждый шаг?
Сбор источников — 1–2 часа аналитика. Нормализация и дедуп — 30 минут на скрипте. HLR — 5 минут на 100k. MaxCheck — 12–18 минут на 100k. Сегментация — 15 минут. Итого: один рабочий день вместо двух недель ручной чистки.Чем отличается «чистая» база от «грязной» на практике?
Чистая: одна колонка phone в E.164, без дублей, с пометкой источника и датой добавления. Грязная: десять разных форматов в одной колонке, дубликаты, перепутанные страны, NULL-ы.Что делать с номерами без MAX?
Не выкидывайте: переведите в email-канал или web-push. Также эти номера можно прогнать через лукапы Telegram/WhatsApp — некоторые из них живут там.Как избежать GDPR/152-ФЗ проблем?
Храните согласие на обработку и факт legal basis для каждого номера. MaxCheck не подменяет ваш opt-in — он лишь определяет, активен ли профиль в MAX.Можно ли автоматизировать дельта-чистку?
Да: cron + POST /v1/batch + вебхук в CRM. Шаблон такой автоматизации мы скоро выложим в блог.Какая стоимость на 1 миллион номеров?
При tier $5000 (60% скидка) и 50% реальных hits — около $2800. Без скидки — около $7000. ROI обычно достигается за один цикл рассылки.
Готовы запустить чистку?
5 проверок бесплатно при регистрации, минимальный депозит $10.