Кастомный модуль: когда готового решения под вашу задачу нет
Разработка кастомного модуля для интернет-магазина нужна тогда, когда в маркете решения под вашу задачу нет – или оно есть, но делает не то. Мы пишем расширение штатными механизмами платформы: событиями и модификаторами, без правки в файлах ядра. Сумма зависит не от описания задачи, а от того, в скольких местах магазина модуль должен вмешаться. Поэтому сначала бесплатный разбор, потом срок и смета.
5–30 рабочих дней в зависимости от количества точек вмешательства
после бесплатного аудита
Стоимость
30
Гарантия
дней после подписания акта
5–30
Срок работ
рабочих дней в зависимости от количества точек вмешательства
ноль - события платформы и модификаторы OCMOD
Правок в ядре
разбор задачи, 2–4 рабочих дня, бесплатно
Перед сметой
передаются вам вместе с документацией
Выходчики
модуль снимается без последствий для магазина
Выключение
Этапы работы
Прозрачные этапы с согласованием на каждом шагу
Общий срок:5–30 дней
1
Разбор задачи и техническое описание
1–4 рабочих дня
Слушаем задачу вашими словами, проверяем, закрывается ли она готовым решением, и раскладываем по точкам вмешательства. На выходе — документ, согласно которому считается смета и принимается работа.
2
Тестовая площадка и карта вмешательств
1–2 рабочих дня
Поднимаем копию боевого сайта с теми же расширениями. Здесь же составляется список мест, куда модуль добавляет свое поведение, и список расширений, которые в этих местах уже работают.
3
Разработка
1–15 рабочих дней
Пишем модуль событиями платформы и модификаторами, кладем в Git. Настройки в админке, обработка ошибок и журнал действий появляются вместе с основной логикой, а не дописываются в конце.
4
Проверка сценариев и совместимости
1–6 рабочих дней
Прогоняем модуль на реальных сценариях магазина и смотрим, как он живет рядом с установленными расширениями. Отдельным пунктом проверяем выключение: магазин должен работать и без модуля.
5
Установка, документация, передача
1–3 рабочих дня
Ставим на боевой сайт в согласованное окно, отдаем выходники, документацию и доступ к репозиторию. Настройка проходит с вашим человеком на живом примере.
Технологии и интеграции
На чём строим и с чем это соединяется
Стек
OpenCart 4.x — развивающая ветвь; ставим по умолчанию
OpenCart 3.x – когда модуль должен жить рядом с расширениями, сборок которых под 4.x еще нет
События платформы вместо правок ядра – модуль переживает обновление; предел: событий хватает не на каждое место, и о таких местах мы говорим до старта
Модификаторы OCMOD – меняют разметку без изменения файлов; предел: два модификатора на один шаблон ссорятся, поэтому карта вмешательств составляется в код
PHP и MySQL – родная пара платформы, лишних зависимостей не добавляем
Git – история перемен и возможность откатиться; репозиторий ваш
Тестовая площадка как копия боевой — конфликты видны до запуска
Логирование в отдельную таблицу или файл - без журнала разбор сбоя превращается в гадания
Интеграции
API платежных провайдеров
API перевозчиков
1С/BAS
KeyCRM
XML-фиды
SMTP
SMS-шлюзы
Telegram
Google Tag Manager
GA4
Что входит
Полный перечень работ и того, что вы получаете на выходе
Техническое описание задачи, согласованное до старта: в нем написано и что модуль делает, и чего он намеренно не делает — именно этот документ затем закрывает спор о границах работы
Реализация событиями платформы и модификаторами, без правок в файлах ядра – чтобы магазин можно было обновлять дальше, а не замораживать на версии без поддержки
Настройка модуля в админке: поведение меняет ваш менеджер, а не разработчик по отдельному счету
Проверка совместимости с уже установленными расширениями на копии боевого сайта — конфликты видны до запуска, а не через месяцы, когда их никто уже не свяжет с модулем
Обработка ошибок и понятные сообщения вместо молчаливого сбоя: покупатель видит, что пошло не так, менеджер видит то же в админке
Логирование действий модуля в отдельную таблицу или файл — когда что-нибудь случится, разбор начинается с журнала, а не с гадания
Код в Git с понятной структурой и комментариями: история перемен остается у вас и дает возможность откатиться
Документация: что делает, как настраивается, куда смотреть при проблемах – чтобы модуль мог подхватить другой разработчик
Установка на боевой сайт с возможностью отключить модуль без последствий для магазина
Передача выходников вам – модуль ваш, а не наш, и лицензии на него мы не продаем
Условия: оплата по этапам, гарантийный срок 30 календарных дней на выполненные работы
Когда эта услуга не подходит
Что не входит в работу — чтобы не было сюрпризов на сдаче
Совместимость с будущими обширными версиями платформы — честно обещать ее невозможно
Лицензии и поддержка сторонних модулей, с которыми наш взаимодействует
Постоянное сопровождение после гарантийного срока – это отдельная услуга с отдельными условиями
Задачи, закрываемые штатными настройками: об этом вы услышите на разборе, к счету
Хостинг, домен, эквайринг
Кому подходит
Ситуации, в которых эта услуга даёт результат
Сценарий 1 из 4
В маркете пять схожих модулей, и ни один не делает то, что нужно
Вы уже купили два, подгоняли настройками, и каждый закрывает две трети задачи. Дальше развилка: держать оба и мириться с тем, что они ссорятся за одно и то же место в шаблоне, или заказать одно расширение ровно под ваш процесс. Разбор нужен именно для того, чтобы понять, в каком из этих двух состояний вы сейчас.
Разберём вашу ситуацию на бесплатном аудите
Сценарий 2 из 4
Задача касается денег: цены, скидки, расчет доставки
Здесь коробочные решения чаще всего ломаются, потому что формула у каждого бизнеса своя: накопительная скидка, цена по уровню заказа, надбавка за габарит. Такой модуль живет одновременно в карточке, корзине, чекатах, админке и печатных формах — и именно поэтому стоит дороже, чем выглядит из описания.
Сценарий 3 из 4
Надо связать магазин с системой, у которой готового коннектора нет
Складская программа, отраслевой сервис, прайс-поставщик в непредвиденном формате. Модуль здесь выступает переводчиком между двумя системами, и главное его умение пережить то, что вторая сторона не ответила. Очередь, повторы и журнал обмена мы закладываем до того, как это станет проблемой на боевом сайте.
Сценарий 4 из 4
На сайте уже стоит чужое расширение, и оно ведет себя странно
Разбор чужого кода тоже наша работа, и начинается он с замера, а не с предположений. В оптовом магазине белья, который мы мерили, посторонний генератор карты сайта по двум стандартным адресам отдавал либо пустое тело, либо строку о собственном отключении. Снаружи сайт выглядел нормально.
Свой модуль против подгонки купленного
Чем этот вариант отличается от альтернативы
Купленный модуль из маркета плюс доработка под себяНаш подход
Что делаетто, что задумал автор; ваша задача закрывается частичноравно то, что записано в техническом описании
Обновление платформызависит от автора; заброшенный модуль держит магазин на старой версиизависит от вас: код у вас, поправить можно в любое время
Лишнее поведениефункции, которые вам не нужны, но выполняются по каждому запросуее нет – писали под один процесс
Разбор сбоятихий провал; в лучшем случае — форум авторажурнал действий и понятные сообщения
Деньгидешево на входе, далее лицензия, подгонка и время на обход чужих ограниченийбольшая сумма на старте, ноль дальнейших лицензий
Бесплатный разбор задачи под модуль
Половина запросов на кастомный модуль закрывается существующим решением или настройкой – и честно сказать это к оплате выгоднее обоим. Разбор нужен как раз для того, чтобы отделить эти случаи.
Что мы измеряем
Есть ли готовое решениеМы проверяем, закрывается ли задача штатными средствами платформы или расширением. Если да — мы это скажем, даже если это означает, что заказывать у нас нечего.
Точки вмешательстваВ скольких местах платформы модуль должен что-то изменить: карточка, каталог, корзина, чекаут, админка, обмен данными. Это главная составляющая сметы.
Конфликты с имеющимися модулямиНе пересекается ли задача с тем, что уже стоит. Два расширения, которые правят одно и то же место — источник ошибок, выявляемых за месяцы.
Состояние кода вокругСколько поправок в ядре уже сделано. Для ориентира: в измеренном нами оптовом магазине карту сайта генерировал сторонний модуль, который по стандартным адресам отдавал либо пустое тело, либо строку о собственном отключении — рабочая карта лежала на нестандартном адресе и держалась только записью в robots.txt.
Кто это будет сопровождатьНужна ли возможность передать модуль другому разработчику. Это влияет на требования к документации и способу реализации.
Срок жизни задачиТо ли это разовая потребность, то ли функция, которая будет жить годами. Разовые задачи часто дешевле решить иначе, чем модулем.
Что вы получаете
Техническое описание задачи в том виде, в каком ее можно реализовать и проверить.
Ответ, готово ли решение и почему оно подходит или не подходит.
Оценка разработки с разбивкой по точкам вмешательства.
Разговор на 30-40 минут по документу.
Срок: 2–4 рабочих дня
Почему это бесплатно
Потому что самая дорогая ошибка здесь – заказать модуль там, где хватало настройки. Несколько дней разбора дешевле разработки, которая оказалась излишней.
Что дальше
После разбора – сумма и срок, договор, счет, акт. Код и документация передаются вам вместе с работами.
Короткая форма: контакт и адрес сайта
Не нашли свой случай?
Опишите, как это устроено у вас, — ответим, подходит ли «Кастомный модуль под конкретную задачу» и что это значит в вашей ситуации. Без брифа и без звонка: один вопрос, один ответ.
Договор, акт и гарантия 30 дней
На каждый проект письменный договор: объём, сроки, сумма, порядок приёмки. После сдачи — акт и счёт, затем 30 календарных дней гарантии.
ФОП и безналичный расчёт
Исполнитель — зарегистрированный ФОП. Оплата на счёт с закрывающими документами.
Права и доступы — ваши
Код, дизайн и материалы переходят к вам после полной оплаты. Домен, хостинг, репозиторий оформляем на вас.
Портал клиента вместо переписки
Во время работы вы получаете доступ к порталу: договоры, счета, акты и статус проекта в одном месте.
Заказчики из Европы
Среди работ — проекты для Норвегии, Болгарии, Молдовы и Испании.
Цифры, которые можно проверить
Каждый кейс в портфолио — со ссылкой на живой сайт и техническим замером.
Сначала аудит, потом сумма
Прайса на сайте нет намеренно: объём одной и той же работы у двух клиентов отличается кратно.
Говорим «нет», когда не уверены
Если задача не наша или срок нереальный — скажем сразу.
Что влияет на стоимость
Почему две одинаковые на вид задачи считаются по-разному
Количество точек вмешательстваГлавная составляющая сметы. Добавить поле в карту – одно место. Считать доставку по собственной формуле – карточка, корзина, чекаут, админка, печатные формы и обмен с перевозчиком. Трудоемкость разнится на порядок.
Касается ли модуль денегРасширение, изменяющее цену, скидку или сумму заказа, требует проверки сценариев: гость и зарегистрированный, купон поверх скидки, возврат, частичная оплата. Большая часть времени идет на проверку, а не на написание кода.
Обмен с внешней системойЕсли модуль ходит в чужой API, к работе прилагается все, что делается на случай молчания другой стороны: очередь, повторы, журнал, поведение магазина, когда ответа нет вообще. Документация внешней системы нужна на старте – без нее оценка будет выдумкой.
Состояние кода вокругМагазин, в котором ядро уже правили руками, дороже: каждую точку вмешательства сначала проверяем на то, что там уже изменено. Это видно на разборе и попадает в смету отдельной строкой, а не всплывает посреди работ.
Сколько вынести в админкуКаждая настройка, которую вы сможете менять сами, – это форма, валидация и проверка. Дороже на старте, дешевле в эксплуатации. Выносить все подряд – тоже ошибка.
Версия платформыВ четверке OpenCart переписали систему событий и код под 3.x туда не переезжает дословно. Планируете обновление версии – учесть это нужно до разработки, а не после.
Кейсы
Задачи и результат в цифрах — все показатели сняты нашим замером
оптовый магазин нижнего белья, каталог более 13 тыс. позиций
Задача
Проверить техническое состояние большого оптового каталога — прежде всего, как ведут себя посторонние расширения, отвечающие за карту сайта и разметку.
Решение
Обход стандартных адресов карты сайта и robots.txt, замер отклика и вес документа, разбор структурированных данных и сверка количества страниц.
Результат
13 428 страниц товаров и 161 категория - 13 590 адресов в карте сайта, из них только 1 дубликат. TTFB 289 мс, полная загрузка 455,1 мс: третий быстрый отзыв среди 16 измеренных сайтов. Способы оплаты вынесены в структурированные данные отдельным полем acceptedPaymentMethod – для этой платформы редкость. Дефект найден измерением: стандартный адрес карты сайта отдает 200 с пустым телом, второй стандартный адрес возвращает текстовую строку об выключенном генераторе, а рабочая карта лежит на нестандартном адресе и держится только записью в robots.txt.
магазин систем автоматического полива с мелкой технической номенклатурой
Задача
Собрать каталог, в котором колени, муфты и тройники различаются только диаметром и типом резьбы: без глубокой вложенности и фильтра покупатель нужную деталь не находит.
Решение
Каталог развернули на 4 уровня вложенности, чтобы фитинги делились по типу соединения и резьбой; в категориях работает модуль фасетного фильтра. Добавили быстрый просмотр карты, заказы в один клик, отзывы, обратный звонок и виджеты мессенджеров.
Результат
300 товаров в 40 категориях на 4 уровнях вложенности цифру подтвердили двумя независимыми методами, расхождение 0%. TTFB главной 235 мс (медиана из 5 замеров), полный HTML 262 мс; вес главного 143,6 КБ без сжатия и 22,5 КБ в brotli. В чекате 6 способов доставки от 2 перевозчиков и 3 способа оплаты. То же измерение показало, что ни одного счетчика аналитики на сайте нет — то есть эффект любой наработки здесь пока нечем измерить.
Что нужно от вас
Без этого не начнём — лучше подготовить заранее
1Описание задачи своими словами, с примерами того, как оно должно работать и что вы будете считать правильным результатом.
2Доступы: админка, файлы, база, тестовая площадка или разрешение поднять его нам.
3Перечень уже установленных расширений, включая те, которые когда-то поставили и забыли выключить.
4Документацию внешних систем, с которыми модуль будет обмениваться данными, и ключи к тестовому контуру.
5Одного человека с вашей стороны с правом согласовать техническое описание и принять работу.
Если чего-то из этого нет — скажите, подскажем, как собрать или сделаем сами отдельной задачей.
Частые вопросы
Что спрашивают чаще всего — с конкретными ответами
Может, в маркете уже есть готовый модуль?
Часто есть, и проверяем мы это первым шагом к любым деньгам. Если задача закрывается существующим расширением или штатной настройкой, так и скажем — даже если это означает, что заказывать у нас нечего. Своя разработка оправдана в трех случаях: готовое делает не то, делает лишнее или влечет зависимость от автора, которого вы не хотите.
Почему сумма зависит не от описания задачи?
Ибо «добавить поле в карточку» и «считать доставку по собственной формуле» занимают одинаковые полленты описания, а работы у них разная на порядок. В первом случае место вмешательства одно. Во втором — карточка, корзина, чекаут, админка, печатные формы и обмен с перевозчиком, и в каждом из этих мест нужно проверить, что ничего не сломалось. На разборе мы раскладываем задачу по таким местам, и именно эта раскладка становится сметой.
Вы будете править файлы платформы?
Нет, это условие, от которого мы не отступаем. Модуль реализуется событиями платформы и модификаторами. Правки в ядре выглядят дешевле при разработке и дорожают при каждом последующем обновлении – именно из-за них магазины годами сидят на версиях без поддержки. Если задачу невозможно решить без смены ядра, вы услышите это до начала работ, а не в момент сдачи.
Что будет, когда модуль сломается?
Ломаться он должен предсказуемо. Обработка ошибок, понятное сообщение вместо белого экрана, журнал действий – чтобы можно было посмотреть, что произошло. Отдельное требование, которое мы предъявляем сами: модуль должен выключаться без последствий для магазина. Расширение, после отключения которого падает корзина, сделано плохо, сколько бы оно ни стоило.
Чужое расширение на сайте работает странно – это тоже ваша задача?
Да, и начинаем мы с замера. Пример с работы: в оптовом магазине белья карту сайта генерировало стороннее расширение, и по двум стандартным адресам, куда первыми идут краулеры и аудит-тулы, оно отдавало либо пустое тело, либо строку о собственном отключении. Рабочая карта лежала на нестандартном адресе и держалась исключительно записью в robots.txt. Внешне сайт выглядел здоровым.
Хочу модулем добавить фильтры в каталог — это всегда к лучшему?
Не всегда и о границе надо сказать сразу. Фильтры помогают дойти до позиции в большом ассортименте, но спроса на товар они не добавляют, а на каталоге в несколько позиций сильнее работает понятная структура категорий. Есть и техническая сторона: фильтры рождают комбинаторное количество адресов, и если не закрыть их каноникалами и robots, вы получите в индексе тысячи почти одинаковых страниц. Это ухудшение, а не улучшение, и закладывать работу с ним нужно в ту же смету.
Модуль может починить поиск по каталогу?
Может, но поможет он только тому покупателю, уже знающему название или артикул. Тому, кто еще выбирает, нужны категории и фильтры – это разные пути к товару. И отдельно: хороший поиск требует чистоплотных данных в карточках. Если названия товаров заполнены спустя рукава, ни один поисковый двигатель этого не исправит, и честнее сначала привести в порядок названия.
Как я увижу, что модуль работает?
С двух сторон. Технический журнал действий модуля: видно, что он делал, когда и с каким результатом. Бизнес – события в аналитике, если она у вас стоит. Здесь нужна оговорка: счетчик сам ничего не улучшает, он только дает возможность увидеть, а блокировщики, режим согласия и ограничения браузеров на cookie делают из GA4 показатель тенденции, а не бухгалтерскую истину. В магазине полива, который мы мерили, аналитики не было вообще — там перед любой доработкой нужно ставить измерения.
Код будет мой?
Да. Выходцы передаются вам вместе с работами, вместе с документацией: что делает, как настраивается, куда смотреть при проблемах. Модуль, который может сопровождать только его автор, это зависимость, а не решение, и продавать такое мы не хотим. Репозиторий остается у вас, поэтому передать работу другому разработчику можно никогда.
Сколько работает?
5–30 рабочих дней. Простое расширение с одной точкой вмешательства примерно неделю вместе с проверкой. Модуль, изменяющий логику расчетов и обменивающийся данными с внешней системой, идет к верхней границе, и большая часть этого времени — проверка сценариев, а не написание кода. Срок называем после разбора задачи и фиксируем вместе с суммой.
Опишите задачу своими словами – даже если формулировка еще сырая.
В ответ – техническое описание, раскладка по точкам вмешательства, срок и сумма. Если задача закрывается готовым расширением или настройкой, вы услышите это первым письмом.
Из измеренных кейсов13 428 страниц товаров и 161 категория - 13 590 адресов в карте сайта, из них только 1 дубликат
Прайса на сайте нет намеренно: объём той же работы у двух клиентов отличается в разы, и цифра «от» в этом случае ничего не объясняет. Сначала бесплатный аудит — считаем ваши страницы, дубли и скорость, — потом называем сумму и срок и фиксируем их в договоре.