Три починки, каждая сперва увидена красной.
1. Мастер обещал показы как факт: «~8 150». Живой замер 04.08 по кабинету:
чужая кампания с бюджетом 13 000 руб за четверо суток набрала 457 показов
и потратила 138 руб — деньги не кончились, кончились люди. Число из мастера
это потолок, до которого кампания почти наверняка не дотянет. Стало
«не больше 8 150» плюс объяснение: упрётся в список, а не в деньги;
за несостоявшиеся показы деньги вернутся. Поправлено на шаге частоты
и в сводке перед отправкой.
2. Остановка «нет денег» возвращала заморозку, НЕ заплатив за уже показанное.
Списание делает часовая задача, а она берёт только кампании со статусом
«крутится» — остановленную пропускала навсегда. Показы последнего часа
уходили клиенту даром, а Яндексу за них платили мы. Та же дыра, что чинили
в паузе, только через другую дверь. Теперь: сперва заплати, потом отпускай;
не узнал число показов — не отпускай вовсе.
3. Остановка ходит в Директ по два раза на каждую кампанию, и делала это
ВНУТРИ денежной транзакции — замок строки висел всё время сетевых запросов.
Вынесено наружу: денежная операция закрывается, и только потом остановка.
Плюс минимум площадки в мастере. Директ не берёт кампанию дешевле 300 руб
за каждый календарный день и отвечает по-английски на последнем шаге, когда
клиент уже пятнадцать часов собирал аудиторию. Теперь мастер предупреждает
заранее и по-русски. Формула вынесена в YandexMinimumSpend и одна на портал:
ею пользуются и запуск, и мастер — две копии однажды разошлись бы.
Сторожа: 7 новых на бэкенде и фронте, каждый принят красным.
Прогоны: реклама 458 тестов зелёные, Larastan 0, vue-tsc чисто.