Мы собирались менять ставку на рубль. Пять дней данных показали, что это шаг в никуда
Идея: не гнаться за местом, а гнаться за ценой контакта
У конкурентов такие роботы обычно парсят выдачу Авито и следят за позицией объявления в списке. Мы решили пойти официальным путём — через API, без парсинга. У этого пути есть цена: позиции в выдаче через API не отдают, зато отдают «compare» — процент конкурентов, которых твоя ставка обходит, и рекомендованную цену. Мы решили, что для клиента важнее не место в списке, а цена одного контакта с покупателем, и стали строить логику вокруг неё.
План: осторожный шаг в рубль
Прежде чем пускать робота к деньгам живого клиента, мы написали каркас: таблица правил, журнал решений, крон раз в час. Заложили логику «на глаз»: шаг ставки — один рубль, чтобы не пугать бюджет резкими скачками, проверка каждый час, между решениями пауза. Звучало разумно: маленькими шагами, аккуратно, ничего резкого. Мы даже успели написать 20 тестов на эту логику.
Но прежде чем доверить роботу реальный рубль клиента, договорились сперва просто посмотреть на реальные данные — пять дней ничего не трогать, только собирать почасовые снимки по шести аккаунтам.
Что показали данные
Насмотрели за это время много: 110 часов, 10 669 снимков, 347 объявлений. И план с рублёвым шагом развалился в первый же разбор.
Во-первых, лестница показателя «compare» у Авито пересчитывается не постоянно, а только по будням, двумя волнами — около 9 утра и около 16:00 по Москве. В выходные 12 и 13 сентября не изменилось вообще ничего: 347 объявлений с неизменными ставками, ноль событий за оба дня. Наш крон, работающий каждый час круглосуточно, все выходные бы просто крутился вхолостую.
Во-вторых, когда ставка всё же меняется, реакция мгновенная — это не плавная кривая, а поиск по готовой лестнице значений. На одном объявлении клиент вручную уронил ставку с 36 до 16 ₽ — и «compare» тем же часом прыгнул с 13% до 7%. А вот рекомендованная цена при этом не сдвинулась вообще, осталась на 76 ₽.
И главное — сама лестница шагает крупно, примерно на 10–20% от ставки. Наш «осторожный» шаг в один рубль в этом масштабе — не шаг, а шум ниже разрешения системы. Робот бы честно отработал крон, записал в журнал «изменил ставку», а по факту в позиции клиента ничего бы не сдвинулось. Мы бы получили красивый лог активности и ноль реального эффекта — и клиент, скорее всего, тоже бы этого не заметил, пока не задал вопрос, почему цена контакта не двигается.
Второй промах поменьше
Заодно вскрылось ещё кое-что: мы планировали смотреть на данные за скользящие двое суток, чтобы робот реагировал быстро. Оказалось, что за окно в двое суток хоть один контакт получили только 21 объявление из 347, а 20 и больше просмотров — только 10. Двухдневное окно почти везде — пустота, а не сигнал. Пришлось растягивать окно статистики до семи дней, иначе «цена контакта» — это цена одного случайного события, а не показатель.
Что мы поменяли
Шаг сделали процентным — 10% от текущей ставки, с полом в 1 ₽, чтобы совсем на копеечных ставках не застревать. Паузу между решениями подняли до шести часов — под обе дневные волны пересчёта. Окно статистики — семь дней вместо двух. Коридор допустимого изменения цены — расширили.
Реального клиента для пилота мы уже нашли — небольшая компания с грузовой техникой, у которой продвижение объявлений идёт через автобюджет Авито, согласилась перевести пару объявлений на ручную ставку под наш робот. Пока это сутки сухого прогона: робот пишет в журнал, что бы он сделал, но денег не трогает — самим не терпится проверить логику на реальных цифрах, но мы уже один раз чуть не запустили механизм, который бы честно работал и честно ничего не менял. Проверять то, что кажется очевидным, оказалось дешевле, чем чинить это на бюджете живого клиента.