Кастомний модуль: коли готового рішення під вашу задачу немає
Розробка кастомного модуля для інтернет-магазину потрібна тоді, коли в маркеті рішення під вашу задачу немає — або воно є, але робить не те. Ми пишемо розширення штатними механізмами платформи: подіями й модифікаторами, без жодної правки у файлах ядра. Сума залежить не від опису задачі, а від того, у скількох місцях магазину модуль має втрутитися. Тому спершу безкоштовний розбір, потім строк і кошторис.
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 календарних днів гарантії: помилки з нашої вини усуваємо безоплатно. Усне з дзвінка дублюємо письмово того ж дня — домовленість, якої немає в тексті, не рахується.
ФОП і безготівковий розрахунок
Виконавець — зареєстрований ФОП. Оплата на рахунок із закривними документами, які бухгалтерія проведе як витрати. Курс для гривневої оплати фіксується договором, а не з’ясовується постфактум.
Права й доступи — ваші
Код, дизайн і матеріали переходять до вас після повної оплати. Домен, хостинг, репозиторій, аналітику й рекламні кабінети оформлюємо на вас — щоб сайт не залежав від підрядника. NDA підписуємо на запит, після завершення свої доступи видаляємо самі.
Портал клієнта замість переписки
На час роботи ви отримуєте доступ до порталу: договори, рахунки, акти й стан проєкту в одному місці. Документи формуються з даних угоди, тому реквізити й суми в них не розходяться, а про оплати й дедлайни нагадує система, а не пам’ять менеджера.
Замовники з Європи
Серед робіт — проєкти для Норвегії, Болгарії та Іспанії: болгарський магазин трьома мовами з кур’єрською доставкою, іспанський з оплатою карткою й переказом, норвезький сайт клініки. Це видно в портфоліо, а не тільки в описі.
Цифри, які можна перевірити
Кожен кейс у портфоліо — з посиланням на живий сайт і технічним виміром: швидкість відповіді, вага сторінки, обсяг каталогу, знайдені дефекти. Ці цифри можна зняти самому й звірити з нашими.
Спершу аудит, потім сума
Прайсу на сайті немає навмисно: обсяг тієї самої роботи у двох клієнтів відрізняється в рази, і цифра «від» нічого не пояснює. Спершу безкоштовний розбір — рахуємо ваші сторінки, дублі й швидкість, — потім називаємо суму й строк і фіксуємо їх у договорі.
Кажемо «ні», коли не впевнені
Якщо задача не наша, строк нереальний або послуга вам просто не потрібна — скажемо це першим листом, а не після передоплати. Гарантій позицій у пошуку не даємо: їх не дає ніхто, а обіцянка без механізму — це продаж, а не робота.
NDA підписуємо на запит. Після завершення співпраці наші доступи до ваших сервісів видаляємо самі й повідомляємо про це.
Що впливає на вартість
Чому дві однакові на вигляд задачі рахуються по-різному — і що саме ми міряємо на аудиті
Кількість точок втручанняГоловна складова кошторису. Додати поле в картку — одне місце. Рахувати доставку за власною формулою — картка, кошик, чекаут, адмінка, друковані форми й обмін із перевізником. Трудомісткість різниться на порядок.
Чи торкається модуль грошейРозширення, яке змінює ціну, знижку або суму замовлення, вимагає перевірки сценаріїв: гість і зареєстрований, купон поверх знижки, повернення, часткова оплата. Більша частина часу тут іде на перевірку, а не на написання коду.
Обмін із зовнішньою системоюЯкщо модуль ходить у чужий 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 робочих днів. Просте розширення з однією точкою втручання — приблизно тиждень разом із перевіркою. Модуль, який змінює логіку розрахунків і обмінюється даними із зовнішньою системою, іде до верхньої межі, і більша частина цього часу — перевірка сценаріїв, а не написання коду. Строк називаємо після розбору задачі й фіксуємо разом із сумою.
Опишіть задачу своїми словами — навіть якщо формулювання ще сире.
У відповідь — технічний опис, розкладка по точках втручання, строк і сума. Якщо задача закривається готовим розширенням або налаштуванням, ви почуєте це першим листом.
Прайса на сайті немає навмисно: обсяг тієї самої роботи у двох клієнтів відрізняється в рази, і цифра «від» у такому разі нічого не пояснює. Спершу безкоштовний аудит — рахуємо ваші сторінки, дублі й швидкість, — потім називаємо суму й строк і фіксуємо їх у договорі.