Моя корзина Экономьте на еженедельных закупках
Экономьте на еженедельных закупках

Экономьте на покупках продуктов домой вместе с «Моей корзиной»

Другие сервисы показывают, где дешевле каждый товар. «Моя корзина» считает итог всей закупки — вместе с доставкой, минимальным чеком и остатком лимита по вашим картам — и говорит, что где брать.

Ваши продукты, а не каталог Список собирается из ваших чеков: те же марки, та же граммовка, то же количество. Ничего не нужно заводить заново.
Ваши карты и их лимиты Процент, минимальный чек, срок и сколько кэшбэка уже потрачено за период. После исчерпания лимита выгода считается честно — без него.
Итог, а не цена строки Закупка делится между магазинами так, чтобы итог вышел минимальным — со штрафом за лишний заказ и порогами бесплатной доставки.
Прикинуть свою выгоду Открыть приложение Исходный код
Пример: недельная закупка на 16 позиций

Экономия считается от привычного магазина

Как обычно, в одном магазине 3 690,40 ₽
Разбить на два 3 415,25 ₽
Экономия 275,15 ₽ 7,46 %
Заплатим в двух магазинах Было бы в одном

В расчёт уже включён штраф 150 ₽ за второй заказ — иначе разбиение всегда выглядело бы выгоднее, чем оно есть.

Магнит 9 позиций
Товары2 007,10 ₽
Доставка0,00 ₽
Кэшбэк 5 %−100,36 ₽
Итого1 906,74 ₽
Чек на 7,10 ₽ выше порога бесплатной доставки в 2 000 ₽
ВкусВилл 7 позиций
Товары1 509,45 ₽
Доставка0,00 ₽
Кэшбэк 10 %−150,94 ₽
Итого1 358,51 ₽
Чек на 9,45 ₽ выше минимального в 1 500 ₽, с которого работает кэшбэк
Самое неочевидное

Дешевле по строке — не значит дешевле в итоге

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

Уехало туда, где дороже
Пюре детское яблоко-груша
Магнит 45,90 ₽ ВкусВилл 52,90 ₽

Переплата 7 ₽ держит чек ВкусВилла выше 1 500 ₽. Без неё пропадает кэшбэк 150,94 ₽ — в двадцать раз больше переплаты.

Осталось там, где дороже
Икра лососевая копчёная 180 г
ВкусВилл 154,00 ₽ Магнит 189,00 ₽

Уберите её из Магнита — чек падает ниже 2 000 ₽ и добавляется доставка 149 ₽. Экономия 35 ₽ оборачивается расходом.

Выгода есть только у варианта целиком — поэтому перебираются все разбиения корзины, а не выбирается самая низкая цена в каждой строке:

subtotal = сумма(цена × количество) по позициям, отнесённым в магазин
доставка = 0, если subtotal ≥ порога бесплатной доставки, иначе тариф
кэшбэк   = 0, если subtotal < минимального чека,
           иначе min(subtotal × процент ⁄ 100, остаток лимита карты)
итог     = subtotal + доставка − кэшбэк
вариант  = сумма итогов + штраф × (число магазинов − 1)
Откуда берутся данные

Три источника: чеки, магазины, банки

Чтобы расчёт был честным, нужны три вещи: что семья обычно покупает, сколько это стоит сегодня в каждом магазине и какие условия дают карты. Каждая приходит своим путём.

Покупки

Что и в каком количестве берёт семья. Отсюда же берётся сумма, с которой сравнивается экономия.

Чек из PDF от ОФДработает Разбирается построчно: позиция, количество, цена. Весовые узнаются по дробному количеству.
Чек текстомработает Если PDF не читается, подойдёт обычная текстовая выгрузка.
JSON из «Мои чеки онлайн» ФНСработает И от операторов фискальных данных. Суммы там в копейках — пересчитываются в рубли, структура ищется на любой глубине вложенности.
Таблица заказа CSV или XLSXработает Выгрузка из личного кабинета магазина или список, собранный руками. Колонки узнаются по названию, лишние игнорируются.
Выгрузка из ФНС по авторизациив планах Чтобы чеки подтягивались сами, без выгрузки файла руками.

Сайты магазинов

Цены меняются каждый день, поэтому берутся не из памяти, а с сайта — и сохраняются снимками, из которых растёт история цен.

Магнитживые цены Каталог сайта: страница поиска отдаёт карточки с ценами, карточка товара открывается по артикулу. Цена зависит от выбранного магазина, регион задаётся кодом.
ВкусВиллне отвечает Сайт не отзывается на запросы, поэтому цены берутся из заранее записанного прайса — и это видно в интерфейсе.
Пятёрочкаиз ваших чеков Базовый магазин: цены приходят вместе с загруженной покупкой, от них и считается экономия.
Едадилв планах Акции офлайн-каталогов Пятёрочки, Ленты и Дикси — то, чего нет в интернет-витринах.
Ozon Fresh, Лента, Самокат, Яндекс Лавкав планах Витрины рисуются скриптами, поэтому понадобится браузерный разбор, а не простой запрос.
Перекрёстокнужен другой путь Обычным запросом не берётся: либо расширение браузера на стороне пользователя, либо договорённость с магазином.

Банки

Кэшбэк решает не меньше, чем цена: процент, лимит за период, минимальный чек и срок меняют ответ целиком.

Свой справочник карт и акцийработает Магазин, процент, лимит, минимальный чек, срок и отметка об активации — вводятся руками один раз.
Загрузка акций из CSVработает Когда карт много, проще залить таблицей, чем вбивать по одной.
Остаток лимита за периодучитывается Выбранный кэшбэк вычитается из лимита: после исчерпания следующие позиции идут уже без скидки, и расчёт это знает.
Персональные предложения из приложений банковв планах Они у каждого свои и живут внутри приложения. Собирать их предполагается расширением браузера — на стороне пользователя и с его ведома.
Карты лояльности и подписки магазиновв планах Подписка с бесплатной доставкой меняет арифметику так же сильно, как кэшбэк.
Промокоды на первый и повторный заказв планах Разовые скидки, которые сейчас приходится держать в голове.
Разбор вблизи

Откуда берётся цена Магнита

Открытого адреса, по которому можно просто спросить цену, Магнит не даёт — тот, что напрашивался сам собой, отвечает «страница не найдена». Зато обычная страница сайта приходит уже собранной: товары и цены лежат прямо в ней, в том же виде, в каком их показывают вам в браузере. Оттуда и читаем.

  1. Поиск. Запрос к странице поиска с названием товара. В ответ приходит каталог: карточки товаров идут в разметке подряд, у каждой в заголовке ссылки лежит полное название, а рядом — цена.
  2. Выбор. Из карточек собираются кандидаты, каждому считается похожесть на ваш товар. Показываются три лучших — какой из них правильный, решает человек, и это решение запоминается.
  3. Артикул. В ссылке на товар стоит числовой артикул. Он и становится ключом: карточка товара открывается по одному артикулу, без остальной части адреса.
  4. Обновление. Дальше цена берётся сразу по артикулу, без поиска. Каждый ответ сохраняется снимком с отметкой времени — так набирается история цен.
поиск   magnit.ru/search/?term=огурцы короткоплодные
        → артикул 1000227406
          «Огурцы короткоплодные тепличные 450г»
          119,99 ₽

цена    magnit.ru/product/1000227406
        → 119,99 ₽

Граммовка вынимается из названия: «450г» в конце превращается в вес, по нему товары сравниваются с допуском ±20 %.

Цена в Магните зависит от конкретного магазина. Без указания кода сайт отдаёт свой по умолчанию — сейчас это Краснодар. Свой код видно в адресной строке после выбора магазина, и он прописывается в настройках: тогда расчёт считает по вашим ценам, а не по чужому городу.

1 запрос в секунду — не больше ответы кэшируются на 6 часов после 3 неудач подряд — резервный прайс до конца сеанса разметка сменилась — тихий откат, а не падение

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

Магазины не обязаны отдавать цены роботам: разметка меняется без предупреждения, а часть витрин закрыта намеренно. Поэтому источники не связаны друг с другом: отвалился один — остальные считают дальше, — а юридическая сторона разбора оценивается до того, как продуктом начнёт пользоваться кто-то кроме семьи.

Что происходит внутри

Четыре шага от чека до ответа

  1. Покупки

    Чек PDF от ОФД, JSON из «Мои чеки онлайн» ФНС или таблица заказа из личного кабинета магазина. Весовые узнаются по дробному количеству.

  2. Узнаём товар

    «ВК/ПОЛ.Сыр СТРАЧАТЕЛЛА мяг.200г» превращается в понятную строку и связывается с тем, что лежит в магазинах. Один раз связали — больше не спросим.

  3. Цены

    Коннектор магазина отдаёт актуальную цену. Снимки не перезаписываются — из них растёт история цен.

  4. Перебор

    Все разбиения корзины между магазинами, для каждого — лучшая карта. Наверх выходят три варианта.

Без прикрас

Что стоит знать заранее

ЧастьСостояниеПодробности
Точность цен ориентир Цены на сайте и в зале расходятся на 5–15 %, поэтому итог — ориентир, а не прайс-лист. Пороги доставки и кэшбэка считаются точно, цены — как получится у магазина в момент запроса.
Глубина перебора 2 магазина Разбиение на три и больше — в планах, вместе с учётом замен, когда товара нет в наличии, и объяснением, почему позиция попала именно сюда.
Данные в примере вымышленные Чек, условия карт и названия банков демонстрационные. Свои подставятся при первой загрузке покупок.
Проверки 71 тест Следят за тем, чтобы формула, разбор чеков и разбиение считались одинаково от сборки к сборке. Итог каждого варианта пересчитывается независимо от кода оптимизатора.