[{"data":1,"prerenderedAt":14728},["ShallowReactive",2],{"site-uk":3,"service-uk-tekhnichnyi-audyt":129,"services-all-uk":570,"cases-uk":5044,"blog-uk":5504},{"id":4,"contacts":5,"cta":15,"extension":18,"footer":19,"meta":68,"nav":69,"serviceUi":84,"stem":127,"__hash__":128},"site_uk\u002Fuk\u002Fsite.yml",{"email":6,"telegram":7,"viber":8,"whatsapp":9,"hours":10,"city":11,"linkedin":12,"github":13,"founderLinkedin":14,"founderGithub":14},"hello@tochnodev.com","https:\u002F\u002Ft.me\u002F","viber:\u002F\u002Fchat?number=","https:\u002F\u002Fwa.me\u002F","Пн–Пт 10:00–19:00, Київ","Київ","https:\u002F\u002Fwww.linkedin.com\u002F","https:\u002F\u002Fgithub.com\u002F","",{"label":16,"to":17},"Обговорити проєкт","\u002Fbryf","yml",[20,35,56],{"title":21,"links":22},"Послуги",[23,26,29,32],{"label":24,"to":25},"Розробка сайтів","\u002Fposluhy\u002Frozrobka-saitiv",{"label":27,"to":28},"Інтернет-магазин","\u002Fposluhy\u002Finternet-mahazyn",{"label":30,"to":31},"QA-аудит","\u002Fposluhy\u002Fqa-audyt-internet-mahazynu",{"label":33,"to":34},"Tech Lead","\u002Fposluhy\u002Ftech-lead",{"title":36,"links":37},"Компанія",[38,41,44,47,50,53],{"label":39,"to":40},"Про нас","\u002Fpro-nas",{"label":42,"to":43},"Процес","\u002Fproces",{"label":45,"to":46},"Кейси","\u002Fkeisy",{"label":48,"to":49},"Блог","\u002Fblog",{"label":51,"to":52},"FAQ","\u002Ffaq",{"label":54,"to":55},"Глосарій","\u002Fhlosarii",{"title":57,"links":58},"Юридичне",[59,62,65],{"label":60,"to":61},"Політика конфіденційності","\u002Fpolityka-konfidentsiinosti",{"label":63,"to":64},"Cookies","\u002Fcookies",{"label":66,"to":67},"Умови співпраці","\u002Fumovy",{},[70,72,75,78,79,80,81],{"label":21,"to":71},"\u002Fposluhy",{"label":73,"to":74},"Під ключ","\u002Fpid-kliuch",{"label":76,"to":77},"Ціни","\u002Ftsiny",{"label":45,"to":46},{"label":42,"to":43},{"label":48,"to":49},{"label":82,"to":83},"Контакти","\u002Fkontakty",{"whoFits":85,"whatsIncluded":86,"pricingEyebrow":87,"pricingAnchor":88,"allPrices":89,"sampleResult":90,"process":91,"details":92,"faqEyebrow":51,"faqTitle":93,"related":94,"seeAlso":95,"seeAlsoCases":45,"seeAlsoPosts":96,"price":97,"crumbServices":21,"flagship":98,"ctaLead":116,"ctaSteps":117,"needs":121},"КОМУ ПІДХОДИТЬ","ЩО ВХОДИТЬ","ЦІНИ","Формати і ціни","Усі ціни","ЗРАЗОК РЕЗУЛЬТАТУ","ПРОЦЕС","ДЕТАЛЬНІШЕ","Питання про послугу","РАЗОМ З ЦИМ ЗАМОВЛЯЮТЬ","ДИВІТЬСЯ ТАКОЖ","Статті","ціна",{"crumb":30,"expressCheck":99,"badge":100,"discuss":101,"bookDays":102,"sampleAria":103,"reportTitle":104,"steps":105,"actual":106,"expected":107,"impact":108,"colAction":109,"colExpected":110,"colStatus":111,"top3":112,"screenshot":113,"faqTitle":114,"related":115},"Безкоштовний експрес-чек","ФЛАГМАН","Обговорити","Забронювати дні","Зразок","Так виглядає звіт, який ви отримаєте","КРОКИ","ФАКТИЧНО","ОЧІКУВАНО","ВПЛИВ","ДІЯ","ОЧІКУВАНИЙ РЕЗУЛЬТАТ","СТАТУС","ТОП-3 ДО ВИПРАВЛЕННЯ","скрін звіту","Питання про тестування","ПІСЛЯ АУДИТУ ЗАЗВИЧАЙ ПОТРІБНО","Відповімо за 2 робочі години. Оцінка з вилкою ціни і термінів — за 1 день.",[118,119,120],"Відповідь за 2 години","Дзвінок 20 хвилин","Оцінка за 1 день",[122,27,30,123,33,124,125,126],"Сайт під ключ","Тестування","Дизайн","Розробник у команду","Підтримка","uk\u002Fsite","AZ3xYwhvXjI6pHOp3sjZaJJhSwA1uGWFfKEpVcNpEco",{"id":130,"title":131,"artifacts":132,"audience":136,"benefit":141,"blocks":142,"body":264,"currency":494,"description":14,"duration":149,"extension":495,"faq":496,"h1":521,"icon":522,"includes":523,"key":141,"meta":524,"navigation":525,"order":526,"packages":527,"path":552,"priceFrom":553,"priceLabel":150,"priceUnit":554,"related":555,"relatedPosts":559,"seo":563,"seoDescription":564,"seoTitle":565,"slug":566,"stem":567,"tag":144,"template":568,"updated":141,"__hash__":569},"services_uk\u002Fuk\u002Fservices\u002Ftekhnichnyi-audyt.md","Технічний аудит коду",[133,134,135],"Файл і рядок коду","Ризик для бізнесу простою мовою","Оцінка годин на виправлення",[137,138,139,140],"Перед покупкою або інвестицією","Пішов розробник","Постійні баги","Зміна підрядника",null,{"answer":143,"crumb":131,"eyebrow":144,"lead":145,"cta":146,"leadNeed":30,"term":147,"fitsTitle":168,"fits":169,"scopeTitle":182,"scopeLead":183,"stack":184,"scope":189,"pkgTitle":214,"art":215,"stepsTitle":243,"steps":244,"ctaTitle":261,"urlLabel":262,"urlPh":263},"Технічний аудит коду — це незалежна перевірка безпеки, продуктивності, архітектури та технічного боргу вашого проєкту з пріоритизованим планом виправлень. Підходить власникам, які купують продукт, змінюють підрядника або втратили розробника. Вартість — від 12 000 грн (орієнтовно до 25 000 грн), термін — 5–7 днів.","ТЕХ-ЛІДСТВО · АУДИТ","Безпека, продуктивність, архітектура і технічний борг. Звіт, який зрозуміє і власник, і розробник: що болить, скільки коштує виправити і в якому порядку.","Замовити аудит",{"cmd":148,"time":149,"price":150,"lines":151},"$ tochno audit repo\u002F","5–7 днів","від 12 000 грн",[152,155,158,160,163,165],{"mark":153,"text":154},"[FAIL]","SQL injection · 2 місця",{"mark":156,"text":157},"[WARN]","Laravel 7 · EOL",{"mark":153,"text":159},"N+1 · 214 запитів",{"mark":161,"text":162},"[PASS]","Структура проєкту",{"mark":156,"text":164},"Тести: 4% покриття",{"mark":166,"text":167},"[INFO]","63 знахідки · 9 critical","Коли потрібен аудит коду",[170,173,176,179],{"icon":171,"title":137,"text":172},"hand-stop","Due diligence: що насправді всередині продукту.",{"icon":174,"title":138,"text":175},"user-off","Код залишився, документації немає. Що з цим робити?",{"icon":177,"title":139,"text":178},"bug","Виправили одне — зламалось інше. Шукаємо системну причину.",{"icon":180,"title":140,"text":181},"arrows-exchange","Незалежна оцінка перед передачею проєкту.","Що перевіряємо","Автоматичні інструменти плюс ручний огляд досвідченим тех-лідом. Інструменти знаходять симптоми, людина — причини.",[185,186,187,188],"PHPStan","Larastan","Enlightn","Blackfire",[190,196,202,208],{"title":191,"items":192},"Безпека",[193,194,195],"SQL injection, XSS, CSRF","Зберігання паролів і ключів","Права доступу і авторизація",{"title":197,"items":198},"Продуктивність",[199,200,201],"Повільні запити і N+1","Кешування і черги","Навантаження на сервер",{"title":203,"items":204},"Архітектура",[205,206,207],"Структура і залежності","Дублювання і зв'язність","Відповідність практикам Laravel",{"title":209,"items":210},"Підтримуваність",[211,212,213],"Версії PHP, Laravel, пакетів","Тести і CI","Документація і розгортання","Швидкий огляд або повний аудит",{"title":216,"file":217,"badge":218,"lines":219,"caption":241,"points":242},"Так виглядає знахідка у звіті","AUDIT-014 · Security","CRITICAL",[220,223,225,227,229,231,233,236,238],{"mark":221,"text":222},"#","Де",{"mark":14,"text":224},"app\u002FHttp\u002FControllers\u002FOrderController.php:87",{"mark":221,"text":226},"Проблема",{"mark":153,"text":228},"DB::raw(\"... WHERE id = \" . $request->id)",{"mark":14,"text":230},"Дозволяє отримати дані будь-якого замовлення",{"mark":221,"text":232},"Виправлення",{"mark":234,"text":235},"→","Order::whereKey($id)->where('user_id', auth()->id())",{"mark":221,"text":237},"Оцінка",{"mark":239,"text":240},"=","0.5 год · пріоритет: негайно","Кожна знахідка — з файлом і рядком, поясненням ризику простою мовою, прикладом виправлення і оцінкою часу.",[133,134,135],"Від доступу до звіту — тиждень",[245,249,253,257],{"when":246,"title":247,"text":248},"день 0","Доступ","Read-only доступ до репозиторію, NDA.",{"when":250,"title":251,"text":252},"дні 1–2","Аналіз","Автоматичні інструменти і огляд архітектури.",{"when":254,"title":255,"text":256},"дні 3–5","Ручний огляд","Ключові модулі, безпека, продуктивність.",{"when":258,"title":259,"text":260},"день 6–7","Звіт","PDF + розбір з командою.","Розкажіть про проєкт","Репозиторій або сайт","github.com\u002F…",{"type":265,"value":266,"toc":484},"minimark",[267,272,276,279,282,298,307,311,314,317,331,334,338,341,401,407,411,414,417,421,424,459,466,470,477],[268,269,271],"h2",{"id":270},"що-перевіряє-технічний-аудит-сайту","Що перевіряє технічний аудит сайту",[273,274,275],"p",{},"Ми поєднуємо автоматичні інструменти та ручний огляд досвідченим тех-лідом. Інструменти знаходять симптоми, а людина шукає причини. Фокус на Laravel, але аналізуємо й інший PHP: Symfony, Yii, WordPress-плагіни, самописні системи.",[273,277,278],{},"Аудит буває потрібен у чотирьох типових ситуаціях: перед покупкою або інвестицією (due diligence), коли пішов розробник і лишився код без документації, коли після кожного виправлення ламається щось інше, і перед передачею проєкту новому підряднику.",[273,280,281],{},"Аудит охоплює чотири напрями:",[283,284,285,289,292,295],"ul",{},[286,287,288],"li",{},"безпека: SQL injection, XSS, CSRF, зберігання паролів і ключів, права доступу;",[286,290,291],{},"продуктивність: повільні запити та N+1, кешування, черги, навантаження на сервер;",[286,293,294],{},"архітектура: структура й залежності, дублювання, відповідність практикам Laravel;",[286,296,297],{},"підтримуваність: версії PHP, Laravel і пакетів, тести, CI, документація та розгортання.",[273,299,300,301,306],{},"Загальне пояснення, що таке аудит коду і навіщо він потрібен, є у статті ",[302,303,305],"a",{"href":304},"\u002Fblog\u002Fshcho-take-tekhnichnyi-audyt-kodu","що таке технічний аудит коду",".",[268,308,310],{"id":309},"що-ви-отримуєте-у-звіті","Що ви отримуєте у звіті",[273,312,313],{},"Звіт має працювати і для власника, і для розробників. Перша сторінка — резюме простою мовою, далі деталі для команди.",[273,315,316],{},"Кожна знахідка містить:",[283,318,319,322,325,328],{},[286,320,321],{},"файл і рядок коду;",[286,323,324],{},"ризик для бізнесу простою мовою;",[286,326,327],{},"приклад виправлення;",[286,329,330],{},"оцінку годин на виправлення та пріоритет.",[273,332,333],{},"Наприкінці ви отримуєте план із порядком робіт і розбір з вашою командою. Звіт можна передати будь-якому підряднику: для цього він і пишеться. Якщо рекомендацій багато, ми допомагаємо розставити їх за порядком: що виправити негайно, що в наступному спринті, а що можна відкласти без ризику.",[268,335,337],{"id":336},"скільки-коштує-технічний-аудит-коду-і-від-чого-залежить-ціна","Скільки коштує технічний аудит коду і від чого залежить ціна",[273,339,340],{},"Технічний аудит коду коштує від 12 000 грн, а для великих проєктів сума зростає до 25 000 грн. Експрес-огляд обходиться у 12 000 грн, повний аудит — від 18 000 грн. Ціну фіксуємо після погодження обсягу.",[342,343,344,357],"table",{},[345,346,347],"thead",{},[348,349,350,354],"tr",{},[351,352,353],"th",{},"Фактор",[351,355,356],{},"Як впливає на ціну",[358,359,360,369,377,385,393],"tbody",{},[348,361,362,366],{},[363,364,365],"td",{},"Розмір кодової бази",[363,367,368],{},"Більше модулів означає більше годин ручного огляду",[348,370,371,374],{},[363,372,373],{},"Глибина аудиту",[363,375,376],{},"Експрес-огляд охоплює ключові модулі, повний аудит дивиться всюди",[348,378,379,382],{},[363,380,381],{},"Вік і стан проєкту",[363,383,384],{},"Застарілі версії та відсутність документації ускладнюють аналіз",[348,386,387,390],{},[363,388,389],{},"Наявність тестів і CI",[363,391,392],{},"Їхня відсутність також стає окремою знахідкою",[348,394,395,398],{},[363,396,397],{},"Потрібне виправлення",[363,399,400],{},"Пакет «аудит + виправлення» стартує від 35 000 грн",[273,402,403,404,306],{},"Якщо ви хочете, щоб ми також виправили знайдене, фікс-пакет рахується за ставкою $20–35 за годину. Усі ціни доступні на сторінці ",[302,405,406],{"href":77},"цін",[268,408,410],{"id":409},"як-проходить-аудит","Як проходить аудит",[273,412,413],{},"Від доступу до звіту проходить орієнтовно тиждень. У нульовий день ви надаєте read-only доступ до репозиторію, а ми підписуємо NDA. Перші два дні йдуть на автоматичний аналіз і огляд архітектури. Ще три дні займає ручний огляд ключових модулів, безпеки та продуктивності. Наприкінці ви отримуєте PDF і розбір з командою.",[273,415,416],{},"Доступ до продакшену не потрібен, а робота з кодом іде під NDA. Для аналізу продуктивності ми просимо дамп бази без персональних даних.",[268,418,420],{"id":419},"коли-технічний-аудит-не-потрібен","Коли технічний аудит не потрібен",[273,422,423],{},"Аудит коду дає відповідь про стан проєкту, але не завжди це те, що вам потрібно.",[283,425,426,433,445,452],{},[286,427,428,429,432],{},"Ви не знаєте, де саме ламається магазин, і хочете побачити баги очима покупця. Тут краще ",[302,430,431],{"href":31},"QA-аудит інтернет-магазину",": від 6 000 грн за 3–5 днів.",[286,434,435,436,440,441,306],{},"Вам потрібна перевірка кожного релізу. Обирайте ",[302,437,439],{"href":438},"\u002Fposluhy\u002Ftestuvannia-saitiv","ручне тестування"," або ",[302,442,444],{"href":443},"\u002Fposluhy\u002Favtomatyzatsiia-testuvannia","автоматизацію тестування",[286,446,447,448,451],{},"Потрібне одне рішення: який стек обрати чи як оцінити підрядника. Підійде консультація ",[302,449,450],{"href":34},"тех-ліда"," на 90 хвилин за 3 000–4 000 грн.",[286,453,454,455,306],{},"Ви хочете побудувати нове, а не оцінювати старе: дивіться ",[302,456,458],{"href":457},"\u002Fposluhy\u002Flaravel-rozrobka","розробку на Laravel",[273,460,461,462,306],{},"Коли саме варто залучати тех-ліда, ми пояснювали у статті ",[302,463,465],{"href":464},"\u002Fblog\u002Fkoly-potriben-tekh-lid","коли потрібен тех-лід",[268,467,469],{"id":468},"чим-наш-аудит-відрізняється","Чим наш аудит відрізняється",[273,471,472,473,306],{},"Ми не віддаємо сирий вивід інструментів. Кожна знахідка перевірена вручну та пояснена так, щоб нетехнічна людина розуміла наслідки для бізнесу. Для кожної проблеми є оцінка часу на виправлення, тому ви одразу бачите бюджет. Окремо дивимося на швидкість: як вона пов'язана з користувачами, розбираємо у статті ",[302,474,476],{"href":475},"\u002Fblog\u002Fcore-web-vitals-dlia-vlasnyka-mahazynu","Core Web Vitals для власника магазину",[273,478,479,480,483],{},"Щоб замовити аудит або уточнити обсяг, заповніть ",[302,481,482],{"href":17},"бриф"," і вкажіть репозиторій чи сайт.",{"title":14,"searchDepth":485,"depth":486,"links":487},2,3,[488,489,490,491,492,493],{"id":270,"depth":485,"text":271},{"id":309,"depth":485,"text":310},{"id":336,"depth":485,"text":337},{"id":409,"depth":485,"text":410},{"id":419,"depth":485,"text":420},{"id":468,"depth":485,"text":469},"UAH","md",[497,500,503,506,509,512,515,518],{"q":498,"a":499},"Потрібен доступ до продакшену?","Ні, достатньо read-only доступу до репозиторію. Для аналізу продуктивності — бажано дамп без персональних даних.",{"q":501,"a":502},"Аудитуєте не тільки Laravel?","Будь-який PHP: Symfony, Yii, WordPress-плагіни, самописні системи.",{"q":504,"a":505},"Звіт зрозуміє нетехнічна людина?","Так. Перша сторінка — резюме для власника, далі — деталі для розробників.",{"q":507,"a":508},"Можна показати звіт підряднику?","Звісно, для цього він і пишеться.",{"q":510,"a":511},"Скільки коштує технічний аудит коду?","Технічний аудит коду коштує від 12 000 грн, для великих проєктів орієнтовно до 25 000 грн. Експрес-огляд — 12 000 грн, повний аудит — від 18 000 грн, аудит із виправленням — від 35 000 грн. Ціна залежить від розміру коду.",{"q":513,"a":514},"Скільки часу триває аудит коду?","Зазвичай 5–7 днів від отримання доступу до готового звіту. Перші дні йдуть на автоматичний аналіз, далі ручний огляд ключових модулів, безпеки та продуктивності, наприкінці PDF-звіт і розбір із вашою командою. Терміни можуть трохи зміщуватися залежно від розміру проєкту.",{"q":516,"a":517},"Чим технічний аудит відрізняється від QA-аудиту?","Технічний аудит дивиться всередину: код, безпеку, архітектуру та продуктивність, і коштує від 12 000 грн. QA-аудит дивиться ззовні, очима покупця: чи працюють оплата, кошик і мобільна версія, і коштує від 6 000 грн. Якщо не знаєте, що обрати, почніть з безкоштовного експрес-чеку.",{"q":519,"a":520},"Що потрібно від мене для аудиту коду?","Потрібен read-only доступ до репозиторію, підписаний NDA та контакт людини, яка знає проєкт і може відповісти на питання команди аудиту. Для аналізу продуктивності бажаний дамп бази без персональних даних. Доступ до продакшену не потрібен.","Технічний аудит коду з планом виправлень","file-search",[193,194,195,199,200,201,205,206,207,211,212,213],{},true,9,[528,537,545],{"name":529,"price":530,"features":531,"featured":536},"Експрес-огляд","12 000 грн",[532,533,534,535],"Автоматичний аналіз","Огляд ключових модулів","Топ-10 ризиків","Дзвінок 30 хв",false,{"name":538,"price":539,"features":540,"featured":525},"Повний аудит","від 18 000 грн",[541,542,543,544],"Безпека, продуктивність, архітектура","Кожна знахідка з прикладом коду","План з оцінкою годин","Розбір з командою 60 хв",{"name":546,"price":547,"features":548,"featured":536},"Аудит + виправлення","від 35 000 грн",[549,550,551],"Усе з повного аудиту","Виправлення critical і high","Повторна перевірка","\u002Fuk\u002Fservices\u002Ftekhnichnyi-audyt",12000,"project",[556,557,558],"tech-lead","laravel-rozrobka","avtomatyzatsiia-testuvannia",[560,561,562],"shcho-take-tekhnichnyi-audyt-kodu","koly-potriben-tekh-lid","core-web-vitals-dlia-vlasnyka-mahazynu",{"title":131,"description":14},"Перевіряємо архітектуру, безпеку і продуктивність коду. Звіт із пріоритизованим планом виправлень. Від 12 000 грн.","Технічний аудит коду сайту — Tochno.","tekhnichnyi-audyt","uk\u002Fservices\u002Ftekhnichnyi-audyt","default","BcTYvAdpjmaWtkhe8Ag0FyipXF9mzWlTcWvrboU4tk0",[571,967,1380,1803,2204,2557,2994,3400,3772,3981,4332,4689],{"id":572,"title":573,"artifacts":574,"audience":578,"benefit":141,"blocks":583,"body":690,"currency":494,"description":14,"duration":590,"extension":495,"faq":902,"h1":927,"icon":928,"includes":929,"key":141,"meta":930,"navigation":525,"order":931,"packages":932,"path":953,"priceFrom":141,"priceLabel":591,"priceUnit":554,"related":954,"relatedPosts":958,"seo":962,"seoDescription":963,"seoTitle":964,"slug":558,"stem":965,"tag":585,"template":568,"updated":141,"__hash__":966},"services_uk\u002Fuk\u002Fservices\u002Favtomatyzatsiia-testuvannia.md","Автоматизація тестування",[575,576,577],"Відео і трейс кожного падіння","Блокування деплою при провалі","Сповіщення в Telegram",[579,580,581,582],"Релізи щотижня","Критичні сценарії","Кілька розробників","Дорогий ручний QA",{"answer":584,"crumb":573,"eyebrow":585,"lead":586,"cta":587,"leadNeed":123,"term":588,"fitsTitle":605,"fits":606,"scopeTitle":619,"scopeLead":620,"stack":621,"scope":626,"pkgTitle":651,"art":652,"stepsTitle":673,"steps":674,"ctaTitle":687,"urlLabel":688,"urlPh":689},"Автоматизація тестування — це набір автотестів на Playwright, які самі проходять ключові сценарії сайту (checkout, вхід, форми) у CI перед кожним деплоєм. Підходить командам із частими релізами. Старт — від 18 000 грн, повне покриття — від 45 000 грн, перші результати орієнтовно за 2–4 тижні.","QA · PLAYWRIGHT","Playwright-сценарії для кошика, оплати, форм і входу — у CI перед кожним деплоєм. Ручний регрес на годину перетворюється на 2 хвилини.","Обговорити автотести",{"cmd":589,"time":590,"price":591,"lines":592},"$ npx playwright test","1 хв 48 с","після аудиту",[593,595,597,599,601,603],{"mark":161,"text":594},"checkout.spec.ts · 12",{"mark":161,"text":596},"auth.spec.ts · 8",{"mark":161,"text":598},"search.spec.ts · 6",{"mark":153,"text":600},"promo.spec.ts › iOS",{"mark":161,"text":602},"forms.spec.ts · 9",{"mark":166,"text":604},"35\u002F36 · 3 браузери","Коли автотести окупаються",[607,610,613,616],{"icon":608,"title":579,"text":609},"repeat","Ручний регрес не встигає за розробкою.",{"icon":611,"title":580,"text":612},"credit-card","Оплата і checkout мають працювати завжди — без винятків.",{"icon":614,"title":581,"text":615},"users","Зміни одного ламають код іншого.",{"icon":617,"title":582,"text":618},"clock-dollar","Одні й ті самі перевірки щоразу — вручну.","Від першого тесту до CI","Автоматизуємо 20% сценаріїв, які приносять 80% грошей. Решту залишаємо ручному тестуванню.",[622,623,624,625],"Playwright","TypeScript","GitHub Actions","Allure",[627,633,639,645],{"title":628,"items":629},"Сценарії",[630,631,632],"Checkout і оплата","Реєстрація, вхід, відновлення","Пошук, фільтри, форми",{"title":634,"items":635},"Інфраструктура",[636,637,638],"Запуск у CI на кожен PR","Chrome, Safari (WebKit), Firefox","Мобільні viewport'и",{"title":640,"items":641},"Звітність",[642,643,644],"Allure-звіт з відео і трейсом","Сповіщення в Telegram \u002F Slack","Історія стабільності",{"title":646,"items":647},"Передача",[648,649,650],"Page Object для легкої підтримки","Документація для вашої команди","Навчання 2 години","Старт, покриття, підтримка",{"title":653,"file":654,"badge":655,"lines":656,"caption":671,"points":672},"Так виглядає звіт після кожного запуску","allure · build #318","35\u002F36",[657,659,661,663,665,667,669],{"mark":161,"text":658},"гість додає товар і оформлює замовлення · 8.2s",{"mark":161,"text":660},"оплата LiqPay → статус «Оплачено» · 11.4s",{"mark":161,"text":662},"промокод −10% на суму > 1000 · 4.1s",{"mark":153,"text":664},"промокод після зміни кількості · webkit",{"mark":234,"text":666},"trace.zip · video.webm · screenshot.png",{"mark":221,"text":668},"Стабільність за 30 днів",{"mark":239,"text":670},"98.6% · 2 flaky тести в карантині","Якщо тест падає — у звіті відео, трейс і скрін. Розробник бачить проблему за хвилину, без «у мене працює».",[575,576,577],"Від аудиту до зеленого CI",[675,678,681,684],{"when":676,"title":251,"text":677},"тиж. 1","Обираємо сценарії з найбільшим впливом.",{"when":679,"title":634,"text":680},"тиж. 1–2","Playwright, CI, звіти.",{"when":682,"title":628,"text":683},"тиж. 2–4","Пишемо і стабілізуємо тести.",{"when":685,"title":646,"text":686},"фінал","Документація і навчання.","Розкажіть про продукт","Посилання на сайт","shop.ua",{"type":265,"value":691,"toc":894},[692,696,699,702,716,723,727,730,733,747,750,753,757,760,820,828,832,835,838,842,845,867,874,878,881,884,891],[268,693,695],{"id":694},"що-саме-автоматизуємо","Що саме автоматизуємо",[273,697,698],{},"Автотести не замінюють усе тестування. Ми автоматизуємо ті сценарії, що найчастіше повторюються і найдорожче ламаються: це приблизно п'ята частина шляхів, які приносять більшу частину грошей. Решту краще залишити людині.",[273,700,701],{},"Типовий набір сценаріїв:",[283,703,704,707,710,713],{},[286,705,706],{},"checkout і оплата, зокрема промокоди та зміна кількості товару;",[286,708,709],{},"реєстрація, вхід, відновлення пароля;",[286,711,712],{},"пошук, фільтри та форми заявок;",[286,714,715],{},"перевірка у Chrome, Safari (WebKit) і Firefox, а також на мобільних viewport.",[273,717,718,719,306],{},"Чому саме checkout стоїть першим, розповідаємо в статті ",[302,720,722],{"href":721},"\u002Fblog\u002Fchomu-hubliatsia-zamovlennia-na-checkout","чому губляться замовлення на checkout",[268,724,726],{"id":725},"що-ви-отримуєте","Що ви отримуєте",[273,728,729],{},"Ви отримуєте не просто код тестів, а робочу систему, яка ловить помилки до релізу. Автотести запускаються на кожен pull request, а при провалі можуть блокувати деплой.",[273,731,732],{},"До комплекту входять:",[283,734,735,738,741,744],{},[286,736,737],{},"Allure-звіт із відео, трейсом і скріншотом для кожного падіння;",[286,739,740],{},"сповіщення в Telegram або Slack;",[286,742,743],{},"історія стабільності тестів, щоб бачити нестабільні (flaky) сценарії;",[286,745,746],{},"Page Object на TypeScript, документація та 2 години навчання вашої команди.",[273,748,749],{},"Для команди це означає менше суперечок про те, чи є проблема: докази лежать у звіті. Розробник бачить причину падіння за хвилини й не чує «у мене працює». Якщо тест зламався, у звіті є все, щоб відтворити проблему.",[273,751,752],{},"Окремо наголошуємо на передачі знань. Ви не залишаєтеся залежними від нас: тести написані за зрозумілою структурою, а команда проходить навчання і може додавати власні сценарії.",[268,754,756],{"id":755},"скільки-коштує-автоматизація-тестування-і-від-чого-залежить-ціна","Скільки коштує автоматизація тестування і від чого залежить ціна",[273,758,759],{},"Автоматизація тестування коштує від 18 000 грн за стартовий пакет на 8–12 сценаріїв. Покриття на 30–50 сценаріїв — від 45 000 грн. Підтримка тестів після запуску — від $400 на місяць. Точну суму називаємо після короткого аудиту або аналізу.",[342,761,762,770],{},[345,763,764],{},[348,765,766,768],{},[351,767,353],{},[351,769,356],{},[358,771,772,780,788,796,804,812],{},[348,773,774,777],{},[363,775,776],{},"Кількість сценаріїв",[363,778,779],{},"Кожен сценарій потребує написання, налагодження й стабілізації",[348,781,782,785],{},[363,783,784],{},"Браузери та мобільні viewport",[363,786,787],{},"Ширша матриця подовжує запуск і збільшує підтримку",[348,789,790,793],{},[363,791,792],{},"Складність інтеграцій",[363,794,795],{},"Платіжні шлюзи, доставка й CRM вимагають тестових середовищ",[348,797,798,801],{},[363,799,800],{},"Наявність staging і тестових даних",[363,802,803],{},"Без них частину сценаріїв довго готувати",[348,805,806,809],{},[363,807,808],{},"Налаштування CI",[363,810,811],{},"Залежить від того, де вже живе ваш репозиторій",[348,813,814,817],{},[363,815,816],{},"Підтримка після запуску",[363,818,819],{},"Нові функції потребують нових тестів",[273,821,822,823,825,826,306],{},"Усі стартові ціни зібрано на сторінці ",[302,824,406],{"href":77},". Щоб отримати оцінку під ваш проєкт, заповніть ",[302,827,482],{"href":17},[268,829,831],{"id":830},"як-проходить-робота","Як проходить робота",[273,833,834],{},"Робота йде поетапно, і на кожному етапі ви бачите результат. Спершу ми визначаємо, що саме тестувати. Саме тому ціна фіксується після аудиту: потрібно знати критичні сценарії. Це займає перший тиждень.",[273,836,837],{},"Потім за тиждень-два налаштовуємо Playwright, CI і звіти. Далі пишемо та стабілізуємо тести, зазвичай ще два-три тижні. У фіналі передаємо документацію та проводимо навчання. Нестабільні тести ми виводимо в карантин і виправляємо окремо, щоб вони не блокували вас хибними падіннями.",[268,839,841],{"id":840},"коли-автотести-не-потрібні","Коли автотести не потрібні",[273,843,844],{},"Автоматизація окупається не всюди. Якщо релізи рідкісні, сайт простий або сценарії постійно змінюються, автотести будуть дорогими в підтримці.",[283,846,847,854,860],{},[286,848,849,850,853],{},"Продукт ще шукає форму, і функції змінюються щотижня. Краще ",[302,851,852],{"href":438},"ручне тестування сайтів",": воно гнучке і стартує від $20 за годину.",[286,855,856,857,859],{},"Ви хочете один раз перевірити магазин перед запуском. Підійде ",[302,858,431],{"href":31}," від 6 000 грн, а за бажанням є пакет «аудит + автотести».",[286,861,862,863,306],{},"Підозрюєте, що проблема в архітектурі. Тоді спершу ",[302,864,866],{"href":865},"\u002Fposluhy\u002Ftekhnichnyi-audyt","технічний аудит коду",[273,868,869,870,306],{},"Загальне порівняння підходів читайте в статті ",[302,871,873],{"href":872},"\u002Fblog\u002Fruchne-chy-avtomatyzovane-testuvannia","ручне чи автоматизоване тестування",[268,875,877],{"id":876},"чим-ми-відрізняємося","Чим ми відрізняємося",[273,879,880],{},"Ми не обіцяємо «100% покриття». Ми чесно кажемо, що автотести закривають повторювані перевірки, а нові функції та UX краще перевіряє людина. Тому автоматизацію часто поєднуємо з ручним QA.",[273,882,883],{},"Playwright тестує те, що бачить користувач, тож підхід працює з Laravel, Shopify, WooCommerce та іншими платформами. Тести пишемо на TypeScript із Page Object, щоб ваша команда могла підтримувати їх самостійно.",[273,885,886,887,306],{},"Після запуску можна залишити підтримку: нові тести під нові функції, виправлення нестабільних і щомісячний звіт. Подробиці є на сторінці ",[302,888,890],{"href":889},"\u002Fposluhy\u002Fpidtrymka","підтримки",[273,892,893],{},"Якщо ви вже знаєте свої критичні сценарії, надішліть їх у брифі. Якщо ні, ми допоможемо їх виділити за результатами аудиту або короткого аналізу сайту.",{"title":14,"searchDepth":485,"depth":486,"links":895},[896,897,898,899,900,901],{"id":694,"depth":485,"text":695},{"id":725,"depth":485,"text":726},{"id":755,"depth":485,"text":756},{"id":830,"depth":485,"text":831},{"id":840,"depth":485,"text":841},{"id":876,"depth":485,"text":877},[903,906,909,912,915,918,921,924],{"q":904,"a":905},"Чому «після аудиту»?","Спершу треба знати, що тестувати. Аудит або короткий аналіз показує критичні сценарії — тоді оцінка точна.",{"q":907,"a":908},"Автотести замінять ручного QA?","Ні. Вони закривають повторювані перевірки, а нові функції і UX краще перевіряє людина.",{"q":910,"a":911},"Наша команда зможе підтримувати тести?","Так. Page Object, TypeScript і документація + 2 години навчання.",{"q":913,"a":914},"Працює з будь-якою платформою?","Так, Playwright тестує те, що бачить користувач: Laravel, Shopify, WooCommerce — неважливо.",{"q":916,"a":917},"Скільки коштує автоматизація тестування?","Стартовий пакет на 8–12 сценаріїв коштує від 18 000 грн, покриття на 30–50 сценаріїв — від 45 000 грн, підтримка тестів — від $400 на місяць. Точну суму називаємо після короткого аудиту, бо вона залежить від кількості сценаріїв.",{"q":919,"a":920},"Скільки часу триває впровадження автотестів?","Орієнтовно від одного до чотирьох тижнів, залежно від кількості сценаріїв. Перший тиждень іде на аналіз критичних шляхів, далі налаштовуємо Playwright і CI, пишемо та стабілізуємо тести. Наприкінці передаємо документацію та проводимо навчання на 2 години.",{"q":922,"a":923},"Чим Playwright відрізняється від інших інструментів для автотестів?","Playwright запускає тести в Chromium, WebKit (Safari) і Firefox, записує відео та трейс кожного падіння і добре працює в CI. Тому розробнику простіше зрозуміти причину помилки й швидко її виправити. Але вибір інструмента залежить від вашого стеку, і ми обговоримо його окремо.",{"q":925,"a":926},"Що потрібно від мене, щоб почати автоматизацію?","Потрібен доступ до сайту або staging, тестові акаунти та перелік критичних сценаріїв. Якщо перелік невідомий, ми допоможемо його скласти за результатами аудиту. Також потрібен доступ до репозиторію, де ми налаштуємо запуск тестів у CI, і контакт розробника, який допоможе з тестовими даними.","Автотести, які запускаються на кожен реліз","robot",[630,631,632,636,637,638,642,643,644,648,649,650],{},7,[933,939,947],{"name":934,"price":539,"features":935,"featured":536},"Старт",[936,808,937,938],"8–12 сценаріїв","Allure-звіт","Документація",{"name":940,"price":941,"features":942,"featured":525},"Покриття","від 45 000 грн",[943,944,945,946],"30–50 сценаріїв","3 браузери + мобільні","Інтеграція з трекером","Навчання команди",{"name":126,"price":948,"features":949,"featured":536},"від $400 \u002F міс",[950,951,952],"Нові тести під нові функції","Фікс нестабільних тестів","Щомісячний звіт","\u002Fuk\u002Fservices\u002Favtomatyzatsiia-testuvannia",[955,956,957],"qa-audyt-internet-mahazynu","testuvannia-saitiv","pidtrymka",[959,960,961],"ruchne-chy-avtomatyzovane-testuvannia","yak-my-testuiemo-bah-report-i-test-keis","chomu-hubliatsia-zamovlennia-na-checkout",{"title":573,"description":14},"Playwright-автотести ключових сценаріїв у CI: checkout, авторизація, форми. Баги ловимо до релізу, а не після скарг клієнтів.","Автоматизація тестування сайтів — Tochno.","uk\u002Fservices\u002Favtomatyzatsiia-testuvannia","DBz7huFFpYraqA22hsSqDkwH5oC5isWkfIP9EtFn0P8",{"id":968,"title":969,"artifacts":970,"audience":974,"benefit":141,"blocks":979,"body":1092,"currency":1313,"description":14,"duration":986,"extension":495,"faq":1314,"h1":1339,"icon":1340,"includes":1341,"key":141,"meta":1342,"navigation":525,"order":1343,"packages":1344,"path":1366,"priceFrom":1367,"priceLabel":987,"priceUnit":1368,"related":1369,"relatedPosts":1371,"seo":1374,"seoDescription":1375,"seoTitle":1376,"slug":1377,"stem":1378,"tag":981,"template":568,"updated":141,"__hash__":1379},"services_uk\u002Fuk\u002Fservices\u002Ffull-stack-nuxt.md","Full-stack Laravel + Nuxt",[971,972,973],"Пріоритети за цінністю для користувача","Оцінка по кожній функції","Беклог другого етапу — одразу",[975,976,977,978],"Стартап з ідеєю","Бізнес з процесом в Excel","Кабінет клієнта","Переписати старий сервіс",{"answer":980,"crumb":969,"eyebrow":981,"lead":982,"cta":983,"leadNeed":125,"term":984,"fitsTitle":1002,"fits":1003,"scopeTitle":1016,"scopeLead":1017,"stack":1018,"scope":1024,"pkgTitle":1049,"art":1050,"stepsTitle":1074,"steps":1075,"ctaTitle":687,"urlLabel":1090,"urlPh":1091},"Розробка на Nuxt і Laravel в Tochno — це full-stack формат для вебсервісів, особистих кабінетів і MVP: бекенд, фронтенд і тестування в одній команді. Підходить стартапам і бізнесу, який переносить процес з Excel у сервіс. Перший робочий реліз — орієнтовно за 6–8 тижнів, ставка від $30 за годину, MVP — від $5 000.","РОЗРОБКА · MVP","Особисті кабінети, дашборди, SaaS-продукти. Бекенд, фронтенд і тестування — одна команда, перший робочий реліз за 6–8 тижнів.","Обговорити продукт",{"cmd":985,"time":986,"price":987,"lines":988},"$ tochno mvp --stack=laravel,nuxt","6–8 тиж.","від $30 \u002F год",[989,991,993,995,998,1000],{"mark":161,"text":990},"Авторизація і ролі",{"mark":161,"text":992},"Особистий кабінет",{"mark":161,"text":994},"Оплата підписки",{"mark":996,"text":997},"[TODO]","Дашборд аналітики",{"mark":161,"text":999},"SSR, Lighthouse 94",{"mark":166,"text":1001},"staging з 1-го тижня","Для кого цей формат",[1004,1007,1010,1013],{"icon":1005,"title":975,"text":1006},"bulb","Потрібен MVP для перших клієнтів або інвесторів — без переплати за «на виріст».",{"icon":1008,"title":976,"text":1009},"building","Замінюємо таблиці внутрішнім сервісом з ролями і звітами.",{"icon":1011,"title":977,"text":1012},"user-circle","Замовлення, документи, оплати — в одному місці замість листування.",{"icon":1014,"title":978,"text":1015},"refresh","Поступова міграція без зупинки роботи користувачів.","Весь продукт, а не шматок","Починаємо з карти функцій і відрізаємо все, без чого можна запуститись. Решта — в беклог другого етапу.",[1019,1020,1021,1022,1023],"Laravel","Nuxt 3","Vue","PostgreSQL","Vercel",[1025,1031,1037,1043],{"title":1026,"items":1027},"Продукт",[1028,1029,1030],"Карта функцій і пріоритети MVP","Прототип ключових екранів","Беклог другого етапу",{"title":1032,"items":1033},"Бекенд",[1034,1035,1036],"API, ролі, права доступу","Оплата підписок, рахунки","Email і Telegram-сповіщення",{"title":1038,"items":1039},"Фронтенд",[1040,1041,1042],"Nuxt з SSR для швидкості і SEO","Адаптив, темна тема за потреби","Компонентна бібліотека",{"title":1044,"items":1045},"Запуск",[1046,1047,1048],"Тестування кожного спринту","Аналітика і моніторинг помилок","Документація і передача коду","Від прототипу до продукту",{"title":1051,"file":1052,"badge":1053,"lines":1054,"caption":1072,"points":1073},"Так виглядає план MVP після Discovery","mvp-scope.md","v1.2",[1055,1057,1059,1061,1063,1065,1067,1069,1070],{"mark":221,"text":1056},"MVP · тижні 1–8",{"mark":161,"text":1058},"Реєстрація, вхід, ролі (клієнт \u002F менеджер)",{"mark":161,"text":1060},"Створення замовлення + статуси",{"mark":161,"text":1062},"Оплата карткою, рахунок PDF",{"mark":221,"text":1064},"Етап 2 · після запуску",{"mark":996,"text":1066},"Мобільний застосунок",{"mark":996,"text":1068},"Інтеграція з 1С",{"mark":221,"text":237},{"mark":239,"text":1071},"410 год · 8 тижнів · 3 спринти","Відрізаємо все, що не потрібно для перших 100 користувачів. Ви запускаєтесь швидше і платите за те, що дійсно використовують.",[971,972,973],"Від ідеї до першого релізу",[1076,1079,1082,1086],{"when":679,"title":1077,"text":1078},"Discovery","Воркшоп, прототип, оцінка.",{"when":1080,"title":124,"text":1081},"тиж. 3","UI ключових екранів і компоненти.",{"when":1083,"title":1084,"text":1085},"тиж. 4–9","Спринти","Розробка з демо кожні 2 тижні.",{"when":1087,"title":1088,"text":1089},"тиж. 10","Реліз","Запуск, моніторинг, план етапу 2.","Прототип, презентація або конкурент","figma.com\u002F…",{"type":265,"value":1093,"toc":1305},[1094,1098,1101,1124,1127,1131,1134,1193,1199,1203,1206,1221,1227,1231,1234,1259,1266,1270,1273,1276,1279,1283,1297],[268,1095,1097],{"id":1096},"що-входить-у-розробку-mvp","Що входить у розробку MVP",[273,1099,1100],{},"Ми починаємо з карти функцій і відрізаємо все, без чого можна запуститися. Решта потрапляє в беклог другого етапу, тож перший реліз виходить швидко й без зайвого.",[283,1102,1103,1106,1109,1112,1115,1118,1121],{},[286,1104,1105],{},"карта функцій, пріоритети MVP і клікабельний прототип ключових екранів;",[286,1107,1108],{},"API, ролі й права доступу, оплата підписок і рахунки;",[286,1110,1111],{},"email- і Telegram-сповіщення;",[286,1113,1114],{},"фронтенд на Nuxt із SSR: розробка на Vue зі швидким відображенням і SEO там, де воно потрібне;",[286,1116,1117],{},"компонентна бібліотека, адаптив, темна тема за потреби;",[286,1119,1120],{},"тестування кожного спринту, аналітика й моніторинг помилок;",[286,1122,1123],{},"документація та передача коду.",[273,1125,1126],{},"Репозиторій з першого дня на вашому акаунті, тож код належить вам.",[268,1128,1130],{"id":1129},"скільки-коштує-mvp-і-від-чого-залежить-ціна","Скільки коштує MVP і від чого залежить ціна",[273,1132,1133],{},"Вартість залежить від складності продукту, тому ми радимо починати з етапу Discovery. Він коштує 15 000 грн і складається з воркшопу 2 × 90 хв, прототипу та оцінки по функціях. Сам MVP з бекендом, фронтендом і QA коштує від $5 000. Розвиток після релізу — погодинно від $30.",[342,1135,1136,1144],{},[345,1137,1138],{},[348,1139,1140,1142],{},[351,1141,353],{},[351,1143,356],{},[358,1145,1146,1154,1162,1170,1177,1185],{},[348,1147,1148,1151],{},[363,1149,1150],{},"Кількість функцій",[363,1152,1153],{},"Кожна функція — розробка, дизайн і тестування",[348,1155,1156,1159],{},[363,1157,1158],{},"Ролі й права доступу",[363,1160,1161],{},"Більше ролей — більше сценаріїв і перевірок",[348,1163,1164,1167],{},[363,1165,1166],{},"Інтеграції й оплата",[363,1168,1169],{},"Підписки, рахунки, CRM, сторонні API додають роботу",[348,1171,1172,1174],{},[363,1173,124],{},[363,1175,1176],{},"Індивідуальний UI з компонентною бібліотекою коштує більше за типовий",[348,1178,1179,1182],{},[363,1180,1181],{},"SSR і SEO",[363,1183,1184],{},"Публічні сторінки потребують окремої уваги до швидкості й індексації",[348,1186,1187,1190],{},[363,1188,1189],{},"Терміни",[363,1191,1192],{},"Скорочення строків вимагає паралельної роботи команди",[273,1194,1195,1196,1198],{},"Загальні орієнтири дивіться на сторінці ",[302,1197,406],{"href":77},", а точну суму ми називаємо після Discovery.",[268,1200,1202],{"id":1201},"як-проходить-розробка","Як проходить розробка",[273,1204,1205],{},"Процес розрахований на 2-тижневі спринти з демо.",[1207,1208,1209,1212,1215,1218],"ol",{},[286,1210,1211],{},"Discovery (тижні 1–2): воркшоп, прототип, оцінка.",[286,1213,1214],{},"Дизайн (тиждень 3): UI ключових екранів і компоненти.",[286,1216,1217],{},"Спринти (тижні 4–9): розробка з демо кожні 2 тижні, staging з першого тижня.",[286,1219,1220],{},"Реліз (тиждень 10): запуск, моніторинг і план другого етапу.",[273,1222,1223,1224,306],{},"Щоп'ятниці отримуєте короткий звіт. Оплата етапами 30 \u002F 40 \u002F 30, після запуску діє 30 днів гарантії. Деталі дивіться на сторінці ",[302,1225,1226],{"href":43},"процесу",[268,1228,1230],{"id":1229},"коли-full-stack-mvp-не-потрібен","Коли full-stack MVP не потрібен",[273,1232,1233],{},"Є ситуації, у яких краще обрати інший формат.",[283,1235,1236,1243,1251,1256],{},[286,1237,1238,1239,1242],{},"Якщо вам потрібен лише маркетинговий сайт з блогом і заявками, достатньо ",[302,1240,1241],{"href":25},"розробки сайту"," на Nuxt.",[286,1244,1245,1246,1250],{},"Якщо ідея ще сира, спершу замовте прототипи в ",[302,1247,1249],{"href":1248},"\u002Fposluhy\u002Fui-ux-dyzain","UI\u002FUX дизайні",", а потім вирішуйте щодо розробки.",[286,1252,1253,1254,306],{},"Якщо у вас уже є фронтенд і не вистачає лише API, візьміть ",[302,1255,458],{"href":457},[286,1257,1258],{},"Нативний мобільний застосунок ми не робимо: пропонуємо PWA або API для вашої мобільної команди.",[273,1260,1261,1262,306],{},"Чи потрібен Nuxt саме вам, ми пояснювали в статті ",[302,1263,1265],{"href":1264},"\u002Fblog\u002Fnuxt-dlia-marketynhovoho-saitu","Nuxt для маркетингового сайту",[268,1267,1269],{"id":1268},"що-відбувається-після-релізу","Що відбувається після релізу",[273,1271,1272],{},"Реліз MVP — це початок, а не фінал. Одразу після запуску ми налаштовуємо моніторинг помилок і аналітику, щоб ви бачили, що реально роблять користувачі, а не лише що ви припускали.",[273,1274,1275],{},"Далі ви вирішуєте, що розвивати: працюємо за беклогом другого етапу, який готуємо ще під час Discovery. Розвиток іде погодинно від $30 або спринтами, з регресом перед кожним релізом. Якщо ви хочете передати продукт власній команді, ми підготуємо документацію, передамо код і за потреби проведемо код-рев'ю їхніх перших змін.",[273,1277,1278],{},"Продуктові рішення ми намагаємося перевіряти дешево. Перед тим як писати складну функцію, пропонуємо клікабельний прототип або спрощену версію, яку можна показати кільком користувачам. Якщо функція не підтверджується, ви економите спринт розробки. Якщо підтверджується, вона переходить у беклог з оцінкою й пріоритетом, і ви самі вирішуєте, коли за неї платити.",[268,1280,1282],{"id":1281},"чим-відрізняється-tochno","Чим відрізняється Tochno",[283,1284,1285,1288,1291,1294],{},[286,1286,1287],{},"Тестування вбудоване в кожен спринт, а не залишене на фінал.",[286,1289,1290],{},"Тех-лід бере участь у проєкті особисто, зокрема в архітектурних рішеннях.",[286,1292,1293],{},"Ціни відкриті, а оцінка по кожній функції дає вам змогу самим керувати бюджетом.",[286,1295,1296],{},"Стек Laravel + Nuxt зрілий, з великою спільнотою, тому знайти розробника для продовження просто.",[273,1298,1299,1300,1302,1303,306],{},"Коли варто залучати тех-ліда до продукту, описано в статті ",[302,1301,465],{"href":464},". Щоб почати, заповніть ",[302,1304,482],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":1306},[1307,1308,1309,1310,1311,1312],{"id":1096,"depth":485,"text":1097},{"id":1129,"depth":485,"text":1130},{"id":1201,"depth":485,"text":1202},{"id":1229,"depth":485,"text":1230},{"id":1268,"depth":485,"text":1269},{"id":1281,"depth":485,"text":1282},"USD",[1315,1318,1321,1324,1327,1330,1333,1336],{"q":1316,"a":1317},"Чому Laravel + Nuxt, а не щось модне?","Зрілі інструменти з великою спільнотою: легко найняти розробника, багато готових рішень, швидка розробка.",{"q":1319,"a":1320},"Можна почати без Discovery?","Можна, якщо у вас вже є ТЗ і прототип. Інакше оцінка буде з великою вилкою.",{"q":1322,"a":1323},"Хто володіє кодом?","Ви, з першого дня. Репозиторій на вашому акаунті.",{"q":1325,"a":1326},"Зробите мобільний застосунок?","Нативний — ні. PWA або API для вашої мобільної команди — так.",{"q":1328,"a":1329},"Скільки коштує розробка MVP на Nuxt і Laravel?","MVP з бекендом, фронтендом і QA — від $5 000, розвиток — від $30 за годину. Точну суму називаємо після Discovery за 15 000 грн: з прототипом і оцінкою по функціях. Ціна може змінитися, якщо ви додаєте функції поза оцінкою.",{"q":1331,"a":1332},"Скільки часу триває розробка MVP?","Перший робочий реліз — орієнтовно 6–8 тижнів: Discovery, дизайн і спринти по 2 тижні з демо. Термін залежить від кількості функцій і швидкості погоджень. Усе, що не потрібно для запуску, йде в беклог другого етапу. Реліз виходить орієнтовно на 10-му тижні від старту Discovery.",{"q":1334,"a":1335},"Чи потрібен SSR для вебсервісу і особистого кабінету?","Для закритого кабінету SSR зазвичай не обов'язковий. Для публічних сторінок, які мають індексуватися, він важливий. У Nuxt можна поєднати обидва підходи в одному проєкті, тож рішення приймаємо на Discovery і наперед обирати не потрібно.",{"q":1337,"a":1338},"Що потрібно від мене, щоб почати розробку MVP?","Опис ідеї чи процесу, який ви хочете автоматизувати, приклади схожих сервісів і людина, що ухвалює рішення на демо. Якщо ТЗ немає, його замінює Discovery: воркшоп 2 × 90 хв і клікабельний прототип. Усе інше беремо на себе.","Вебсервіс або MVP на Laravel і Nuxt","stack-2",[1028,1029,1030,1034,1035,1036,1040,1041,1042,1046,1047,1048],{},4,[1345,1352,1360],{"name":1077,"price":1346,"features":1347,"featured":536},"15 000 грн",[1348,1349,1350,1351],"Воркшоп 2 × 90 хв","Клікабельний прототип","Оцінка по функціях","Архітектура і стек",{"name":1353,"price":1354,"features":1355,"featured":525},"MVP","від $5 000",[1356,1357,1358,1359],"Бекенд + фронтенд + QA","Спринти по 2 тижні з демо","Staging з першого тижня","30 днів гарантії",{"name":1361,"price":987,"features":1362,"featured":536},"Розвиток",[1363,1364,1365],"Розробка за беклогом","Регрес перед релізами","Моніторинг і фікси","\u002Fuk\u002Fservices\u002Ffull-stack-nuxt",30,"hour",[1370,557,558],"ui-ux-dyzain",[1372,561,1373],"nuxt-dlia-marketynhovoho-saitu","laravel-chy-opencart-wordpress-dlia-mahazynu",{"title":969,"description":14},"Вебсервіси, особисті кабінети і SaaS-продукти на Laravel і Nuxt. Перший робочий реліз за 6–8 тижнів. Від $30 за годину.","Full-stack розробка Laravel і Nuxt для MVP — Tochno.","full-stack-nuxt","uk\u002Fservices\u002Ffull-stack-nuxt","g7w-nnCoJf1KCM2yFoRclOH-ihDSg5ueGKUA2TI-eeM",{"id":1381,"title":27,"artifacts":1382,"audience":1386,"benefit":141,"blocks":1391,"body":1500,"currency":494,"description":14,"duration":1398,"extension":495,"faq":1741,"h1":1766,"icon":1416,"includes":1767,"key":141,"meta":1768,"navigation":525,"order":485,"packages":1769,"path":1791,"priceFrom":1792,"priceLabel":1399,"priceUnit":554,"related":1793,"relatedPosts":1794,"seo":1797,"seoDescription":1798,"seoTitle":1799,"slug":1800,"stem":1801,"tag":1393,"template":568,"updated":141,"__hash__":1802},"services_uk\u002Fuk\u002Fservices\u002Finternet-mahazyn.md",[1383,1384,1385],"12 реальних пристроїв","Тестова оплата реальною карткою","Звіт з відео кожного бага",[1387,1388,1389,1390],"Перехід з маркетплейсу","Старий магазин втрачає замовлення","Потрібні інтеграції","Масштабування",{"answer":1392,"crumb":27,"eyebrow":1393,"lead":1394,"cta":1395,"leadNeed":27,"term":1396,"fitsTitle":1413,"fits":1414,"scopeTitle":1427,"scopeLead":1428,"stack":1429,"scope":1432,"pkgTitle":1457,"art":1458,"stepsTitle":1483,"steps":1484,"ctaTitle":1498,"urlLabel":1499,"urlPh":689},"Розробка інтернет-магазину в Tochno — це кастомний магазин на Laravel і Nuxt: каталог, кошик, оплата, Нова Пошта та інтеграція з CRM, з тестуванням перед запуском. Підходить бізнесу, якому тісно на конструкторі або маркетплейсі. Вартість — від 150 000 грн, орієнтовний термін — 10–14 тижнів.","РОЗРОБКА · E-COMMERCE","Каталог, кошик, оплата LiqPay або Monobank, Нова Пошта і синхронізація з CRM. Checkout перевіряємо на 12 реальних пристроях до запуску, а не після перших скарг.","Обговорити магазин",{"cmd":1397,"time":1398,"price":1399,"lines":1400},"$ tochno build --type=shop","10–14 тиж.","від 150 000 грн",[1401,1403,1405,1407,1409,1411],{"mark":161,"text":1402},"checkout.spec.ts · 12 сценаріїв",{"mark":161,"text":1404},"LiqPay · Apple Pay · Google Pay",{"mark":161,"text":1406},"Нова Пошта: відділення + поштомати",{"mark":161,"text":1408},"KeyCRM · синхронізація залишків",{"mark":161,"text":1410},"GA4 e-commerce події",{"mark":166,"text":1412},"2 400 товарів · фільтри \u003C 200 мс","Кому підходить",[1415,1418,1421,1424],{"icon":1416,"title":1387,"text":1417},"building-store","Власний магазин без комісій, з вашою базою клієнтів.",{"icon":1419,"title":1388,"text":1420},"alert-triangle","Баги в checkout, повільний каталог, плагіни, які конфліктують.",{"icon":1422,"title":1389,"text":1423},"plug-connected","1С, KeyCRM, склад, кілька служб доставки.",{"icon":1425,"title":1390,"text":1426},"chart-bar","Тисячі товарів, фільтри, акції, B2B-ціни.","Що входить у магазин","Не шаблон з плагінами, а магазин під ваші процеси. Laravel-бекенд з адмінкою і швидкий Nuxt-фронт.",[1020,1430,1431,1022,622],"Laravel 11","Filament",[1433,1439,1445,1451],{"title":1434,"items":1435},"Каталог",[1436,1437,1438],"Категорії, фільтри, пошук з помилками","Варіанти товару, залишки","Імпорт з Excel \u002F 1С",{"title":1440,"items":1441},"Checkout",[1442,1443,1444],"Кошик, промокоди, гостьове оформлення","LiqPay, Monobank, накладений платіж","Нова Пошта, Укрпошта, самовивіз",{"title":1446,"items":1447},"Адмінка",[1448,1449,1450],"Замовлення зі статусами","Ролі для менеджерів","Звіти по продажах",{"title":1452,"items":1453},"Якість",[1454,1455,1456],"QA-аудит перед запуском","Автотести checkout у CI","Моніторинг помилок оплати","Від старту до великого каталогу",{"title":1459,"file":1460,"badge":1461,"lines":1462,"caption":1481,"points":1482},"Так виглядає перевірка checkout перед запуском","checkout-report.md","11\u002F12",[1463,1465,1467,1469,1471,1473,1475,1477,1479],{"mark":221,"text":1464},"Оплата",{"mark":161,"text":1466},"LiqPay · iOS Safari · Android Chrome",{"mark":161,"text":1468},"Apple Pay → скасування → кошик збережено",{"mark":221,"text":1470},"Доставка",{"mark":161,"text":1472},"Пошук міста: «Kyiv», «київ», «Киев»",{"mark":153,"text":1474},"Поштомат на iPhone SE: список не скролиться",{"mark":221,"text":1476},"Після замовлення",{"mark":161,"text":1478},"Лист за 40 с, не в спамі",{"mark":161,"text":1480},"purchase у GA4 — один раз","Кожен [FAIL] виправляємо до запуску і проганяємо повторно. Звіт залишається у вас.",[1383,1384,1385],"Від брифу до першого замовлення",[1485,1488,1491,1495],{"when":1486,"title":251,"text":1487},"тижні 1–2","Процеси, інтеграції, структура каталогу, прототип.",{"when":1489,"title":124,"text":1490},"тижні 3–5","Каталог, картка, кошик, checkout для трьох ширин.",{"when":1492,"title":1493,"text":1494},"тижні 5–12","Розробка","Спринти по 2 тижні, staging, демо.",{"when":1496,"title":1044,"text":1497},"тижні 12–14","QA-аудит, імпорт, тестові замовлення, навчання.","Розкажіть про магазин","Поточний магазин (якщо є)",{"type":265,"value":1501,"toc":1733},[1502,1506,1509,1532,1539,1543,1550,1608,1614,1618,1621,1635,1640,1644,1647,1664,1669,1673,1676,1693,1696,1699,1701,1719,1726],[268,1503,1505],{"id":1504},"що-входить-у-створення-інтернет-магазину-під-ключ","Що входить у створення інтернет-магазину під ключ",[273,1507,1508],{},"Ми будуємо магазин під ваші процеси, а не збираємо шаблон із плагінів. Бекенд на Laravel з адмінкою дає контроль над кожним кроком оформлення замовлення, а Nuxt-фронт відповідає за швидкість каталогу.",[283,1510,1511,1514,1517,1520,1523,1526,1529],{},[286,1512,1513],{},"каталог із категоріями, фільтрами, пошуком, варіантами товару й залишками;",[286,1515,1516],{},"імпорт товарів з Excel або 1С;",[286,1518,1519],{},"кошик, промокоди, гостьове оформлення замовлення;",[286,1521,1522],{},"оплата LiqPay або Monobank, накладений платіж;",[286,1524,1525],{},"Нова Пошта, Укрпошта, самовивіз;",[286,1527,1528],{},"адмінка зі статусами замовлень, ролями менеджерів і звітами по продажах;",[286,1530,1531],{},"QA-аудит перед запуском, автотести checkout у CI, моніторинг помилок оплати.",[273,1533,1534,1535,306],{},"Інтернет-магазин на Laravel тримає складну логіку, де плагіни починають конфліктувати. Порівняння платформ ми описали в статті ",[302,1536,1538],{"href":1537},"\u002Fblog\u002Flaravel-chy-opencart-wordpress-dlia-mahazynu","Laravel чи OpenCart і WordPress для магазину",[268,1540,1542],{"id":1541},"скільки-коштує-розробка-інтернет-магазину-і-від-чого-залежить-ціна","Скільки коштує розробка інтернет-магазину і від чого залежить ціна",[273,1544,1545,1546,306],{},"Створення інтернет-магазину під ключ коштує від 150 000 грн. Остаточна сума залежить від того, що саме ви замовляєте. Докладний розбір, з чого складається вартість, є в статті ",[302,1547,1549],{"href":1548},"\u002Fblog\u002Fskilky-koshtuie-rozrobka-internet-mahazynu","скільки коштує розробка інтернет-магазину",[342,1551,1552,1560],{},[345,1553,1554],{},[348,1555,1556,1558],{},[351,1557,353],{},[351,1559,356],{},[358,1561,1562,1570,1578,1585,1593,1601],{},[348,1563,1564,1567],{},[363,1565,1566],{},"Розмір каталогу",[363,1568,1569],{},"Від кількох десятків до тисяч товарів: більше імпорту, фільтрів, продуктивності",[348,1571,1572,1575],{},[363,1573,1574],{},"Складність товарів",[363,1576,1577],{},"Варіанти за розміром і кольором, комплекти, B2B-ціни додають логіку",[348,1579,1580,1582],{},[363,1581,124],{},[363,1583,1584],{},"З нуля коштує більше, ніж за готовим макетом чи брендбуком",[348,1586,1587,1590],{},[363,1588,1589],{},"Інтеграції",[363,1591,1592],{},"CRM, 1С, склад, кілька служб доставки: кожна потребує розробки й тестування",[348,1594,1595,1598],{},[363,1596,1597],{},"Оплата й доставка",[363,1599,1600],{},"Кожен спосіб оплати й доставки — окремий сценарій для перевірки",[348,1602,1603,1605],{},[363,1604,1189],{},[363,1606,1607],{},"Термінові проєкти дорожчі, бо команда працює паралельно",[273,1609,1610,1611,1613],{},"Всі стартові ціни ми публікуємо на сторінці ",[302,1612,406],{"href":77},". Точну оцінку даємо за 1 робочий день після брифу.",[268,1615,1617],{"id":1616},"як-проходить-розробка-магазину","Як проходить розробка магазину",[273,1619,1620],{},"Роботу ділимо на чотири етапи, спринти тривають по 2 тижні з демо наприкінці.",[1207,1622,1623,1626,1629,1632],{},[286,1624,1625],{},"Аналіз (орієнтовно тижні 1–2): процеси, інтеграції, структура каталогу, прототип.",[286,1627,1628],{},"Дизайн (тижні 3–5): каталог, картка товару, кошик і checkout для трьох ширин.",[286,1630,1631],{},"Розробка (тижні 5–12): спринти, staging, демо.",[286,1633,1634],{},"Запуск (тижні 12–14): QA-аудит, імпорт товарів, тестові замовлення, навчання.",[273,1636,1637,1638,306],{},"Щоп'ятниці надсилаємо звіт. Оплата йде етапами 30 \u002F 40 \u002F 30, після запуску діє 30 днів гарантії, а код і доступи залишаються у вас. Загальну схему описано на сторінці ",[302,1639,1226],{"href":43},[268,1641,1643],{"id":1642},"коли-індивідуальна-розробка-вам-не-потрібна","Коли індивідуальна розробка вам не потрібна",[273,1645,1646],{},"Кастомний магазин не завжди виправданий.",[283,1648,1649,1652,1658],{},[286,1650,1651],{},"Для 50 товарів без інтеграцій цілком вистачить конструктора або готової CMS.",[286,1653,1654,1655,1657],{},"Якщо магазин уже працює, але втрачає замовлення, спершу замовте ",[302,1656,431],{"href":31}," від 6 000 грн: він покаже, де саме вони губляться. Інколи проблема в кількох місцях checkout, а не в платформі.",[286,1659,1660,1661,306],{},"Якщо тестування вручну забирає забагато часу, допоможе ",[302,1662,1663],{"href":443},"автоматизація тестування",[273,1665,1666,1667,306],{},"Чому замовлення губляться на checkout, пояснюємо у статті ",[302,1668,722],{"href":721},[268,1670,1672],{"id":1671},"що-перевірити-перед-замовленням","Що перевірити перед замовленням",[273,1674,1675],{},"Перш ніж просити оцінку, дайте собі відповідь на кілька питань, бо від них залежить і ціна, і строк:",[283,1677,1678,1681,1684,1687,1690],{},[286,1679,1680],{},"скільки товарів у каталозі та чи є в них варіанти (розмір, колір);",[286,1682,1683],{},"звідки брати залишки та ціни: Excel, 1С, CRM чи ручне введення;",[286,1685,1686],{},"які способи оплати й доставки потрібні з першого дня;",[286,1688,1689],{},"чи потрібні B2B-ціни, акції й промокоди;",[286,1691,1692],{},"чи треба переносити товари, клієнтів і замовлення зі старого магазину.",[273,1694,1695],{},"Чим точніші відповіді, тим вужча вилка в оцінці. Якщо відповідей поки немає, це нормально: бриф допоможе їх сформулювати, а ризики ми вкажемо письмово.",[273,1697,1698],{},"Коли магазин уже працює, ми не обіцяємо чудес на старті. Спочатку дивимося на дані: де покупці йдуть із кошика, які сторінки гальмують, які способи оплати ламаються на телефонах. Лише після цього пропонуємо, що змінювати, і показуємо це в оцінці окремими рядками. Так ви платите за конкретні покращення, а не за абстрактне «оновлення».",[268,1700,1282],{"id":1281},[283,1702,1703,1706,1709,1712],{},[286,1704,1705],{},"QA вбудований у кожен спринт, а checkout ми перевіряємо на 12 реальних пристроях до запуску.",[286,1707,1708],{},"Тех-лід веде проєкт особисто, архітектурні рішення пояснює простою мовою.",[286,1710,1711],{},"Ціни відкриті, а код належить вам.",[286,1713,1714,1715,1718],{},"Після запуску можна залишитися на ",[302,1716,1717],{"href":889},"підтримці"," від 8 000 грн на місяць або піти з готовим кодом і документацією.",[273,1720,1721,1722,306],{},"Інтеграцію оплати й Нової Пошти докладно розбираємо у статті ",[302,1723,1725],{"href":1724},"\u002Fblog\u002Fintehratsiia-novoi-poshty-ta-oplaty","інтеграція Нової Пошти та оплати",[273,1727,1728,1729,1732],{},"Розкажіть про свій магазин у ",[302,1730,1731],{"href":17},"брифі",": відповімо протягом 2 робочих годин.",{"title":14,"searchDepth":485,"depth":486,"links":1734},[1735,1736,1737,1738,1739,1740],{"id":1504,"depth":485,"text":1505},{"id":1541,"depth":485,"text":1542},{"id":1616,"depth":485,"text":1617},{"id":1642,"depth":485,"text":1643},{"id":1671,"depth":485,"text":1672},{"id":1281,"depth":485,"text":1282},[1742,1745,1748,1751,1754,1757,1760,1763],{"q":1743,"a":1744},"Чому не WooCommerce чи OpenCart?","Для 50 товарів без інтеграцій — можна. Коли є CRM, склад і тисячі SKU, плагіни конфліктують і гальмують. Laravel дає контроль над кожним кроком checkout.",{"q":1746,"a":1747},"Чи перенесете товари зі старого магазину?","Так: товари, категорії, клієнтів і замовлення. Плюс редиректи, щоб не втратити позиції в Google.",{"q":1749,"a":1750},"Скільки коштує утримання?","Сервер від $20 \u002F міс. Підтримка — за бажанням, від 8 000 грн \u002F міс.",{"q":1752,"a":1753},"Коли перші продажі?","У день запуску: тестові замовлення проходимо заздалегідь, аналітика вже налаштована.",{"q":1755,"a":1756},"Скільки коштує розробка інтернет-магазину?","Інтернет-магазин під ключ — від 150 000 грн. Остаточна сума залежить від розміру каталогу, дизайну й інтеграцій з CRM, 1С та службами доставки. Точну оцінку даємо за 1 робочий день після брифу. Усі зміни поза погодженим обсягом оцінюємо письмово до початку роботи.",{"q":1758,"a":1759},"Скільки часу триває створення інтернет-магазину?","Орієнтовно 10–14 тижнів: аналіз, дизайн, розробка спринтами по 2 тижні, QA-аудит і запуск. Термін росте, якщо багато інтеграцій, великий каталог або затягуються погодження. Точний строк називаємо в договорі, після аналізу вимог і інтеграцій, а прогрес показуємо на демо щодва тижні.",{"q":1761,"a":1762},"Чи можна замовити магазин на Laravel для вже існуючого бізнесу?","Так. Магазин на Laravel зазвичай і роблять під наявні процеси: склад, CRM, облік. Ми переносимо товари й клієнтів зі старого сайту та налаштовуємо редиректи, щоб не втратити позиції в пошуку. Це доступно для будь-яких CMS, з яких ви переїжджаєте.",{"q":1764,"a":1765},"Що потрібно від мене для старту розробки інтернет-магазину?","Заповнений бриф, список товарів або вивантаження з вашої системи, перелік інтеграцій і приклади магазинів, які подобаються. Також потрібні доступи до CRM чи 1С. Фото й описи товарів готуєте ви. Решту, від структури до налаштувань, беремо на себе.","Інтернет-магазин, у якому не губляться замовлення",[1436,1437,1438,1442,1443,1444,1448,1449,1450,1454,1455,1456],{},[1770,1775,1783],{"name":934,"price":1399,"features":1771,"featured":536},[1772,1773,1774,1454],"Каталог і фільтри","LiqPay + Нова Пошта","Адмінка замовлень",{"name":1776,"price":1777,"features":1778,"featured":525},"Бізнес","від 250 000 грн",[1779,1780,1781,1782],"Усе зі «Старту»","Інтеграція з CRM \u002F 1С","Промокоди і акції","Автотести checkout",{"name":1784,"price":1785,"features":1786,"featured":536},"Міграція","від 180 000 грн",[1787,1788,1789,1790],"Перенесення товарів і клієнтів","301-редиректи для SEO","Паралельний запуск","Порівняння конверсії","\u002Fuk\u002Fservices\u002Finternet-mahazyn",150000,[955,558,957],[1795,1373,1796],"skilky-koshtuie-rozrobka-internet-mahazynu","intehratsiia-novoi-poshty-ta-oplaty",{"title":27,"description":14},"Інтернет-магазин з оплатою LiqPay, Новою Поштою і CRM. Checkout перевіряємо QA на 12 пристроях до запуску. Від 150 000 грн.","Розробка інтернет-магазину на Laravel — Tochno.","internet-mahazyn","uk\u002Fservices\u002Finternet-mahazyn","gA3kuw78HScMkHBADT2MnG3gTAq-kOxyn1ZCwe-cusg",{"id":1804,"title":1805,"artifacts":1806,"audience":1810,"benefit":141,"blocks":1814,"body":1922,"currency":1313,"description":14,"duration":1821,"extension":495,"faq":2143,"h1":2168,"icon":2169,"includes":2170,"key":141,"meta":2171,"navigation":525,"order":486,"packages":2172,"path":2195,"priceFrom":2196,"priceLabel":1822,"priceUnit":1368,"related":2197,"relatedPosts":2198,"seo":2199,"seoDescription":2200,"seoTitle":2201,"slug":557,"stem":2202,"tag":1816,"template":568,"updated":141,"__hash__":2203},"services_uk\u002Fuk\u002Fservices\u002Flaravel-rozrobka.md","Backend \u002F Laravel",[1807,1808,1809],"Код-рев'ю другим розробником","Staging на кожен PR","Репозиторій на вашому акаунті",[1589,1811,1812,1813],"Сайт гальмує","Потрібен API","Legacy-код",{"answer":1815,"crumb":1805,"eyebrow":1816,"lead":1817,"cta":1818,"leadNeed":125,"term":1819,"fitsTitle":1836,"fits":1837,"scopeTitle":1849,"scopeLead":1850,"stack":1851,"scope":1855,"pkgTitle":1877,"art":1878,"stepsTitle":1906,"steps":1907,"ctaTitle":1921,"urlLabel":262,"urlPh":263},"Розробка на Laravel у Tochno — це backend-послуга: API, інтеграції з платіжками, доставкою і CRM, черги та оптимізація повільних запитів. Підходить власникам продуктів і агенціям, яким потрібен Laravel розробник з тестами та код-рев'ю. Погодинна ставка — від $25, пакет «Спринт» — $1 800 за спринт, окрема задача — від 8 000 грн.","РОЗРОБКА · PHP","API, інтеграції з платіжками і CRM, черги, оптимізація повільних запитів. Код з тестами і рев'ю — його зможе підтримувати будь-який Laravel-розробник.","Обговорити задачу",{"cmd":1820,"time":1821,"price":1822,"lines":1823},"$ php artisan test","CI","від $25 \u002F год",[1824,1826,1828,1830,1832,1834],{"mark":161,"text":1825},"OrderApiTest · 24 тести",{"mark":161,"text":1827},"LiqPayWebhookTest",{"mark":161,"text":1829},"NovaPoshtaSyncJob",{"mark":156,"text":1831},"N+1 у \u002Fapi\u002Fcatalog",{"mark":161,"text":1833},"PHPStan level 8",{"mark":166,"text":1835},"coverage 81%","Коли потрібен окремий бекенд-розробник",[1838,1840,1843,1846],{"icon":1422,"title":1589,"text":1839},"LiqPay, Monobank, Нова Пошта, 1С, KeyCRM — з обробкою помилок і ретраями.",{"icon":1841,"title":1811,"text":1842},"gauge","Знаходимо повільні запити, додаємо індекси, кеш і черги.",{"icon":1844,"title":1812,"text":1845},"api","Для мобільного застосунку, фронтенду на Vue\u002FReact або партнерів.",{"icon":1847,"title":1813,"text":1848},"git-branch","Оновлення Laravel 8→11, рефакторинг без зупинки продакшену.","Бекенд, який витримує продакшен","Пишемо так, щоб через рік інший розробник розібрався за день: тести, типи, документація API.",[1430,1852,1022,1853,1854],"PHP 8.3","Redis","Horizon",[1856,1862,1867,1872],{"title":1857,"items":1858},"API",[1859,1860,1861],"REST або GraphQL з документацією OpenAPI","Авторизація Sanctum \u002F Passport","Версіонування і rate limiting",{"title":1589,"items":1863},[1864,1865,1866],"Платіжки з вебхуками і ідемпотентністю","Доставка: Нова Пошта, Укрпошта, Meest","CRM, 1С, Google Sheets, Telegram-боти",{"title":197,"items":1868},[1869,1870,1871],"Профілювання: Telescope, Debugbar","Індекси, eager loading, кеш","Черги і фонові задачі",{"title":1452,"items":1873},[1874,1875,1876],"Feature- і unit-тести","PHPStan, Pint, код-рев'ю","CI у GitHub Actions","Погодинно, задачею або спринтом",{"title":1879,"file":1880,"badge":1881,"lines":1882,"caption":1904,"points":1905},"Так виглядає pull request, який ви отримаєте","PR #142 · feat: LiqPay webhooks","APPROVED",[1883,1885,1888,1890,1892,1894,1896,1898,1901],{"mark":221,"text":1884},"Що зроблено",{"mark":1886,"text":1887},"+","LiqPayWebhookController з перевіркою підпису",{"mark":1886,"text":1889},"Ідемпотентність: повторний callback не дублює оплату",{"mark":1886,"text":1891},"Job UpdateOrderStatus у черзі payments",{"mark":221,"text":1893},"Тести",{"mark":161,"text":1895},"12 feature-тестів, включно з невалідним підписом",{"mark":221,"text":1897},"Як перевірити",{"mark":1899,"text":1900},"1.","staging.shop.ua → оплата тестовою карткою",{"mark":1902,"text":1903},"2.","Замовлення → статус «Оплачено» за \u003C 5 с","Кожна зміна — окремий pull request з описом, тестами і інструкцією перевірки. Ви бачите, за що платите.",[1807,1808,1809],"Від задачі до продакшену",[1908,1911,1914,1917],{"when":246,"title":1909,"text":1910},"Бриф","Доступи до репозиторію, опис задачі, критерії готовності.",{"when":1912,"title":237,"text":1913},"день 1","Години або фікс-ціна, ризики, план.",{"when":1915,"title":1493,"text":1916},"спринт","Pull request'и з тестами, staging, звіт щоп'ятниці.",{"when":1918,"title":1919,"text":1920},"реліз","Деплой","Міграції, моніторинг перші 48 годин.","Опишіть задачу",{"type":265,"value":1923,"toc":2135},[1924,1928,1931,1951,1954,1958,1961,2021,2027,2031,2034,2048,2051,2055,2058,2086,2092,2096,2099,2102,2105,2107,2121,2129],[268,1925,1927],{"id":1926},"що-входить-у-laravel-розробку","Що входить у Laravel-розробку",[273,1929,1930],{},"Ми пишемо код так, щоб через рік інший розробник розібрався в ньому за день. Для цього є тести, типи й документація API.",[283,1932,1933,1936,1939,1942,1945,1948],{},[286,1934,1935],{},"REST або GraphQL з документацією OpenAPI, авторизація через Sanctum або Passport, версіонування й rate limiting;",[286,1937,1938],{},"платіжки з вебхуками й ідемпотентністю, доставка (Нова Пошта, Укрпошта, Meest);",[286,1940,1941],{},"інтеграції з CRM, 1С, Google Sheets і Telegram-ботами;",[286,1943,1944],{},"профілювання повільних місць (Telescope, Debugbar), індекси, eager loading, кеш;",[286,1946,1947],{},"черги й фонові задачі;",[286,1949,1950],{},"feature- і unit-тести, PHPStan, Pint, код-рев'ю, CI у GitHub Actions.",[273,1952,1953],{},"Працюємо і зі своїм кодом, і з чужим: більшість задач саме такі. Перші 2–4 години йдуть на знайомство з проєктом, вони входять в оцінку.",[268,1955,1957],{"id":1956},"скільки-коштує-розробка-на-laravel-і-від-чого-залежить-ціна","Скільки коштує розробка на Laravel і від чого залежить ціна",[273,1959,1960],{},"Питання «сайт на Laravel ціна» залежить від формату співпраці. Для окремої задачі ми даємо оцінку заздалегідь, для довших робіт працюємо спринтами або погодинно.",[342,1962,1963,1971],{},[345,1964,1965],{},[348,1966,1967,1969],{},[351,1968,353],{},[351,1970,356],{},[358,1972,1973,1981,1989,1997,2005,2013],{},[348,1974,1975,1978],{},[363,1976,1977],{},"Формат",[363,1979,1980],{},"Задача від 8 000 грн, спринт $1 800, погодинно від $25",[348,1982,1983,1986],{},[363,1984,1985],{},"Стан коду",[363,1987,1988],{},"Legacy без тестів потребує більше часу на розбір і стабілізацію",[348,1990,1991,1994],{},[363,1992,1993],{},"Кількість інтеграцій",[363,1995,1996],{},"Кожна платіжка чи CRM має свої вебхуки, помилки й тести",[348,1998,1999,2002],{},[363,2000,2001],{},"Вимоги до продуктивності",[363,2003,2004],{},"Профілювання, кеш і черги додають роботу",[348,2006,2007,2010],{},[363,2008,2009],{},"Версія фреймворку",[363,2011,2012],{},"Старіші версії оновлюємо поетапно, це окремий обсяг",[348,2014,2015,2018],{},[363,2016,2017],{},"Терміновість",[363,2019,2020],{},"Швидший старт потребує перерозподілу команди",[273,2022,2023,2024,2026],{},"Ставки по ролях і загальну сітку цін дивіться на сторінці ",[302,2025,406],{"href":77},". Години рахуємо в трекері з описом кожної задачі, звіт надсилаємо щотижня.",[268,2028,2030],{"id":2029},"як-працює-laravel-аутсорс-із-нами","Як працює Laravel аутсорс із нами",[273,2032,2033],{},"Процес простий і прозорий.",[1207,2035,2036,2039,2042,2045],{},[286,2037,2038],{},"Бриф: доступи до репозиторію, опис задачі й критерії готовності.",[286,2040,2041],{},"Оцінка (наступного дня): години або фікс-ціна, ризики, план.",[286,2043,2044],{},"Розробка: pull request'и з тестами, staging на кожен PR, код-рев'ю другим розробником, звіт щоп'ятниці.",[286,2046,2047],{},"Деплой: міграції й моніторинг перші 48 годин.",[273,2049,2050],{},"Репозиторій залишається на вашому акаунті, а NDA підписуємо до отримання доступів. Підтримуємо версії Laravel від 8 до 11.",[268,2052,2054],{"id":2053},"коли-окремий-backend-вам-не-потрібен","Коли окремий backend вам не потрібен",[273,2056,2057],{},"Laravel аутсорс виправданий не в кожній ситуації.",[283,2059,2060,2068,2075,2081],{},[286,2061,2062,2063,2067],{},"Якщо ви ще не знаєте, що саме будувати, почніть з ",[302,2064,2066],{"href":2065},"\u002Fposluhy\u002Ffull-stack-nuxt","full-stack розробки на Laravel і Nuxt",": там є етап Discovery із прототипом і оцінкою.",[286,2069,2070,2071,2074],{},"Якщо вам не потрібні нові функції, а треба зрозуміти стан проєкту, замовте ",[302,2072,2073],{"href":865},"технічний аудит"," від 12 000 грн: отримаєте план виправлень.",[286,2076,2077,2078,306],{},"Якщо частіше ламається те, що вже працювало, почніть з ",[302,2079,2080],{"href":443},"автоматизації тестування",[286,2082,2083,2084,306],{},"Для простого сайту-візитки окремий backend зайвий, вистачить ",[302,2085,1241],{"href":25},[273,2087,2088,2089,306],{},"Про вибір платформи для магазину ми писали в статті ",[302,2090,2091],{"href":1537},"Laravel чи OpenCart і WordPress",[268,2093,2095],{"id":2094},"з-чого-почати-якщо-проєкт-уже-працює","З чого почати, якщо проєкт уже працює",[273,2097,2098],{},"Найчастіше до нас приходять із готовим проєктом, і початок завжди однаковий. Ви відкриваєте доступ до репозиторію й staging, а ми за кілька годин знайомимося з кодом і повертаємося з оцінкою.",[273,2100,2101],{},"Далі визначаємо пріоритети: що горить (помилки оплати, повільні запити, зламані інтеграції) і що можна відкласти. Нові функції не змішуємо з виправленнями, щоб ви бачили в звіті окремо кожну категорію робіт. Якщо в коді немає тестів, першим кроком додаємо їх до найризикованіших місць, а вже потім змінюємо логіку. Так ми не ламаємо те, що працювало.",[273,2103,2104],{},"У роботі з бекендом ми дотримуємося простих правил. Кожна зміна — це окремий pull request з описом і тестами, а не величезний комміт. Міграції проходять через staging, а перед релізом ми узгоджуємо план відкоту. Складні рішення, як-от вибір черги чи схеми кешу, коротко описуємо письмово, щоб новий розробник розумів, чому вони такі. Це економить години при передачі проєкту.",[268,2106,1282],{"id":1281},[283,2108,2109,2112,2115,2118],{},[286,2110,2111],{},"Кожен pull request проходить код-рев'ю тех-ліда або другого розробника, тестування вбудоване в процес.",[286,2113,2114],{},"Тех-лід залучений особисто, а не лише на старті.",[286,2116,2117],{},"Ціни й ставки відкриті, ви бачите, за що платите.",[286,2119,2120],{},"Код, репозиторій і доступи належать вам.",[273,2122,2123,2124,2126,2127,306],{},"Як ми перевіряємо чужий код, описано в статті ",[302,2125,305],{"href":304},", а питання платіжок і доставки розібрано в матеріалі ",[302,2128,1725],{"href":1724},[273,2130,2131,2132,2134],{},"Опишіть свою задачу в ",[302,2133,1731],{"href":17},", і ми підкажемо, який формат співпраці вам підійде.",{"title":14,"searchDepth":485,"depth":486,"links":2136},[2137,2138,2139,2140,2141,2142],{"id":1926,"depth":485,"text":1927},{"id":1956,"depth":485,"text":1957},{"id":2029,"depth":485,"text":2030},{"id":2053,"depth":485,"text":2054},{"id":2094,"depth":485,"text":2095},{"id":1281,"depth":485,"text":1282},[2144,2147,2150,2153,2156,2159,2162,2165],{"q":2145,"a":2146},"Працюєте з чужим кодом?","Так, більшість задач — саме такі. Перші 2–4 години йдуть на знайомство з кодом, це входить в оцінку.",{"q":2148,"a":2149},"Яку версію Laravel підтримуєте?","Від 8 до 11. Старіші — оновлюємо поетапно, без зупинки сайту.",{"q":2151,"a":2152},"Чи підпишете NDA?","Так, до отримання доступів.",{"q":2154,"a":2155},"Як рахуєте години?","Трекер з описом кожної задачі. Звіт щотижня, рахунок — раз на місяць або за спринт.",{"q":2157,"a":2158},"Скільки коштує розробка на Laravel?","Погодинно — від $25, спринт (орієнтовно 70 годин) — $1 800, окрема задача — від 8 000 грн. Обираємо формат під ваш обсяг. Оцінку по задачі даємо до старту, а години рахуємо в трекері з описом. Ставки по ролях відкриті на сторінці цін.",{"q":2160,"a":2161},"Скільки часу триває розробка на Laravel?","Залежить від задачі. Дрібну доробку орієнтовно можна закрити за кілька днів, інтеграцію чи API — за один-два спринти по 2 тижні. Строки й ризики називаємо на етапі оцінки, наступного дня після брифу. Для великих обсягів краще брати спринт.",{"q":2163,"a":2164},"Чи можна взяти Laravel розробника на кілька годин?","Так. Мінімальне замовлення — 1 день (8 годин) для будь-якої ролі. Це зручно для разових інтеграцій, виправлень і консультацій. Для постійної роботи в вашій команді є окрема послуга виділеного спеціаліста. Також можемо працювати під вашим процесом.",{"q":2166,"a":2167},"Що потрібно від мене, щоб почати Laravel-розробку?","Опис задачі, критерії готовності й доступ до репозиторію та staging. Якщо проєкт чужий, підпишемо NDA до видачі доступів. Решту, від оцінки до плану спринту, робимо ми протягом одного робочого дня, без зайвих дзвінків.","Backend на Laravel, який не страшно масштабувати","server-2",[1859,1860,1861,1864,1865,1866,1869,1870,1871,1874,1875,1876],{},[2173,2181,2189],{"name":2174,"price":2175,"features":2176,"featured":536},"Задача","від 8 000 грн",[2177,2178,2179,2180],"Оцінка до старту","Код з тестами","Pull request з описом","Деплой на staging",{"name":2182,"price":2183,"features":2184,"featured":525},"Спринт","$1 800 \u002F спринт",[2185,2186,2187,2188],"~70 годин розробки","Планування і демо","Звіт щоп'ятниці","Код-рев'ю тех-ліда",{"name":2190,"price":1822,"features":2191,"featured":536},"Погодинно",[2192,2193,2194],"Облік годин у трекері","Звіт по задачах","Реакція до 1 робочого дня","\u002Fuk\u002Fservices\u002Flaravel-rozrobka",25,[1377,566,558],[1373,1796,560],{"title":1805,"description":14},"API, інтеграції з платіжками і CRM, оптимізація повільних запитів. Laravel-розробник з тестами і код-рев’ю. Від $25 за годину.","Розробка на Laravel — backend під ключ — Tochno.","uk\u002Fservices\u002Flaravel-rozrobka","Tw3Fb5dmPXOfDwMRTddhIUMU2jLqgh1K4B6Kt_aorw0",{"id":2205,"title":2206,"artifacts":2207,"audience":2211,"benefit":141,"blocks":2216,"body":2319,"currency":494,"description":14,"duration":2223,"extension":495,"faq":2496,"h1":2521,"icon":2522,"includes":2523,"key":141,"meta":2524,"navigation":525,"order":2525,"packages":2526,"path":2547,"priceFrom":2548,"priceLabel":2224,"priceUnit":2549,"related":2550,"relatedPosts":2551,"seo":2552,"seoDescription":2553,"seoTitle":2554,"slug":957,"stem":2555,"tag":2218,"template":568,"updated":141,"__hash__":2556},"services_uk\u002Fuk\u002Fservices\u002Fpidtrymka.md","Підтримка та розвиток",[2208,2209,2210],"Облік годин по задачах","Інциденти з причинами","План на наступний місяць",[2212,2213,2214,2215],"Після запуску","Немає свого розробника","Критичний сайт","Постійний розвиток",{"answer":2217,"crumb":2206,"eyebrow":2218,"lead":2219,"cta":2220,"leadNeed":126,"term":2221,"fitsTitle":2238,"fits":2239,"scopeTitle":2251,"scopeLead":2252,"stack":2253,"scope":2258,"pkgTitle":2277,"art":2278,"stepsTitle":2302,"steps":2303,"ctaTitle":2318,"urlLabel":688,"urlPh":689},"Підтримка сайту — це щомісячний пакет для сайтів і магазинів після запуску: години розробки, оновлення, регрес перед релізами, моніторинг і звіт по задачах. Підходить власникам, у яких немає свого розробника. Базовий пакет коштує від 8 000 грн на місяць, моніторинг працює 24\u002F7, скасувати можна з попередженням за 2 тижні.","КОМАНДА · SLA","Щомісячний пакет для сайтів і магазинів після запуску. Дрібні доробки, оновлення, тестування перед релізами і реакція на збої — з гарантованим часом відповіді.","Підібрати пакет",{"cmd":2222,"time":2223,"price":2224,"lines":2225},"$ tochno status shop.ua","24\u002F7","від 8 000 грн \u002F міс",[2226,2228,2230,2232,2234,2236],{"mark":161,"text":2227},"Uptime 99.97% · 30 днів",{"mark":161,"text":2229},"Бекап · 03:00",{"mark":161,"text":2231},"SSL · 74 дні",{"mark":156,"text":2233},"Laravel 10 → 11 доступний",{"mark":161,"text":2235},"Регрес релізу 3.2",{"mark":166,"text":2237},"11 \u002F 16 год використано","Для кого підтримка",[2240,2243,2246,2248],{"icon":2241,"title":2212,"text":2242},"rocket","Сайт працює, але постійно з'являються дрібні задачі.",{"icon":2244,"title":2213,"text":2245},"user-x","Наймати в штат дорого, а фрилансери зникають.",{"icon":1419,"title":2214,"text":2247},"Кожна година простою — втрачені замовлення.",{"icon":2249,"title":2215,"text":2250},"trending-up","Нові функції щомісяця за планом.","Що входить у підтримку","Години, які не згоряють одразу, прозорий облік і людина, яка знає ваш сайт.",[2254,2255,2256,2257],"UptimeRobot","Sentry","GitHub","Telegram",[2259,2264,2269,2275],{"title":1493,"items":2260},[2261,2262,2263],"Доробки і нові функції","Оновлення Laravel і пакетів","Виправлення багів",{"title":123,"items":2265},[2266,2267,2268],"Регрес перед кожним релізом","Смоук після деплою","Перевірка оплати і доставки",{"title":2270,"items":2271},"Моніторинг",[2272,2273,2274],"Uptime і сповіщення","Помилки в Sentry","SSL, домен, бекапи",{"title":640,"items":2276},[2208,952,2210],"Три пакети — за обсягом і швидкістю",{"title":2279,"file":2280,"badge":2281,"lines":2282,"caption":2300,"points":2301},"Так виглядає щомісячний звіт","support · вересень 2026","18 \u002F 20 год",[2283,2285,2287,2289,2291,2293,2294,2296,2298],{"mark":221,"text":2284},"Зроблено",{"mark":161,"text":2286},"Фільтр «Колір» у каталозі · 6 год",{"mark":161,"text":2288},"Оновлення Laravel 10.48 · 2 год",{"mark":161,"text":2290},"Регрес 3 релізів · 5 год",{"mark":161,"text":2292},"Фікс: дубль замовлень при таймауті LiqPay · 3 год",{"mark":221,"text":2270},{"mark":14,"text":2295},"Uptime 99.97% · 1 інцидент, 12 хв",{"mark":221,"text":2297},"План на жовтень",{"mark":996,"text":2299},"Оновлення до Laravel 11","Кожна година — з задачею. Ви бачите, за що платите, і що заплановано далі.",[2208,2209,2210],"Як беремо сайт на підтримку",[2304,2307,2311,2315],{"when":250,"title":2305,"text":2306},"Аудит","Огляд коду, сервера, бекапів.",{"when":2308,"title":2309,"text":2310},"день 3","Налаштування","Моніторинг, Sentry, доступи.",{"when":2312,"title":2313,"text":2314},"місяць","Робота","Задачі з вашого списку, регрес.",{"when":2316,"title":259,"text":2317},"кінець місяця","Години, інциденти, план.","Розкажіть про сайт",{"type":265,"value":2320,"toc":2489},[2321,2325,2328,2355,2358,2362,2367,2418,2421,2425,2430,2433,2437,2463,2466,2470,2481],[268,2322,2324],{"id":2323},"що-входить-у-підтримку-сайту","Що входить у підтримку сайту",[273,2326,2327],{},"Ми закриваємо чотири напрями, і кожен з них прозорий для вас:",[283,2329,2330,2337,2343,2349],{},[286,2331,2332,2336],{},[2333,2334,2335],"strong",{},"Розробка."," Доробки й нові функції, оновлення Laravel та пакетів, виправлення багів.",[286,2338,2339,2342],{},[2333,2340,2341],{},"Тестування."," Регрес перед кожним релізом, смоук після деплою, перевірка оплати й доставки.",[286,2344,2345,2348],{},[2333,2346,2347],{},"Моніторинг."," Сповіщення про недоступність, помилки в Sentry, контроль SSL, домену та бекапів.",[286,2350,2351,2354],{},[2333,2352,2353],{},"Звітність."," Облік годин по задачах, щомісячний звіт, план на наступний місяць.",[273,2356,2357],{},"Ви бачите, за що платите: кожна година прив'язана до конкретної задачі. Наприкінці місяця ви отримуєте звіт із виконаними роботами, інцидентами та планом, тож розмова про наступний період іде за фактами, а не за відчуттями.",[268,2359,2361],{"id":2360},"скільки-коштує-технічна-підтримка-сайту-і-від-чого-залежить-ціна","Скільки коштує технічна підтримка сайту і від чого залежить ціна",[273,2363,2364,2365,306],{},"Технічна підтримка сайту ціна якої складається з пакета та обсягу годин. Ми пропонуємо три пакети: Базовий за 8 000 грн на місяць, Бізнес за 16 000 грн та Про за 32 000 грн. Інші ціни дивіться на сторінці ",[302,2366,406],{"href":77},[342,2368,2369,2377],{},[345,2370,2371],{},[348,2372,2373,2375],{},[351,2374,353],{},[351,2376,356],{},[358,2378,2379,2387,2395,2403,2410],{},[348,2380,2381,2384],{},[363,2382,2383],{},"Пакет",[363,2385,2386],{},"Від нього залежать кількість годин, швидкість реакції та набір перевірок",[348,2388,2389,2392],{},[363,2390,2391],{},"Швидкість реакції",[363,2393,2394],{},"Базовий — до 1 робочого дня, Бізнес — до 4 годин, Про — на збій до 1 години",[348,2396,2397,2400],{},[363,2398,2399],{},"Регрес і автотести",[363,2401,2402],{},"Регрес перед релізами входить із пакета Бізнес, автотести в CI — з пакета Про",[348,2404,2405,2407],{},[363,2406,1985],{},[363,2408,2409],{},"Застарілий код, відсутні бекапи чи тести збільшують обсяг робіт на старті",[348,2411,2412,2415],{},[363,2413,2414],{},"Складність сайту",[363,2416,2417],{},"Інтеграції з оплатою, CRM та доставкою потребують більше уваги при кожному релізі",[273,2419,2420],{},"Якщо ви вагаєтеся між пакетами, почніть із того, який відповідає критичності сайту: для візитівки вистачить Базового, для магазину із замовленнями зазвичай потрібен Бізнес, а Про обирають, коли простій коштує дорого. Додаткові години понад пакет рахуються за його ставкою, і про це ми попереджаємо заздалегідь. Невикористані години в пакетах Бізнес і Про переносяться на наступний місяць.",[268,2422,2424],{"id":2423},"супровід-інтернет-магазину-на-що-звернути-увагу","Супровід інтернет-магазину: на що звернути увагу",[273,2426,2427,2428,306],{},"Для магазину простій означає втрачені замовлення, тому супровід інтернет-магазину відрізняється від підтримки візитівки. Ми перевіряємо оплату й доставку після кожного релізу, стежимо за помилками на checkout і заздалегідь повідомляємо про оновлення, як-от міграцію на нову версію Laravel. Тестування оплати та доставки входить у регрес, тому типові збої на кроці оформлення замовлення ловляться до релізу, а не після скарги покупця. Якщо вас турбує швидкість сторінок, прочитайте ",[302,2429,476],{"href":475},[273,2431,2432],{},"Підтримка сайту працює найкраще, коли всі задачі проходять через один список. Ви пишете в Telegram або трекер, ми оцінюємо години, погоджуємо пріоритет і виконуємо. Так немає ситуації, коли дрібне прохання губиться в переписці, а наприкінці місяця ніхто не пам'ятає, на що пішов час.",[268,2434,2436],{"id":2435},"як-ми-беремо-сайт-на-підтримку","Як ми беремо сайт на підтримку",[1207,2438,2439,2445,2451,2457],{},[286,2440,2441,2444],{},[2333,2442,2443],{},"Дні 1–2."," Аудит: огляд коду, сервера та бекапів.",[286,2446,2447,2450],{},[2333,2448,2449],{},"День 3."," Налаштування моніторингу, Sentry та доступів.",[286,2452,2453,2456],{},[2333,2454,2455],{},"Протягом місяця."," Задачі з вашого списку й регрес перед релізами.",[286,2458,2459,2462],{},[2333,2460,2461],{},"Кінець місяця."," Звіт: години, інциденти, план.",[273,2464,2465],{},"Сайти, зроблені не нами, теж беремо. Перші 2–4 години йдуть на аудит і знайомство з кодом, і вони входять у перший місяць.",[268,2467,2469],{"id":2468},"коли-підтримка-не-потрібна-і-чим-відрізняється-tochno","Коли підтримка не потрібна і чим відрізняється Tochno",[273,2471,2472,2473,2476,2477,306],{},"Підтримка не замінює розробку нового проєкту, але добре її доповнює. Пакет підтримки не підійде, якщо вам потрібна одна разова робота: тоді простіше погодинна доробка або окремий аудит. Не варто брати його й для сайту, який ще не запущений. Спершу потрібна ",[302,2474,2475],{"href":25},"розробка сайту"," чи магазину. Якщо ж вам потрібна не підтримка, а людина в команді на повний день, розгляньте ",[302,2478,2480],{"href":2479},"\u002Fposluhy\u002Fvydilenyi-spetsialist","виділеного спеціаліста",[273,2482,2483,2484,2486,2487,306],{},"Підтримка поєднана з тестуванням, адже кожен реліз проходить QA до того, як помилку побачать клієнти. Ви завжди знаєте, хто саме працює з вашим сайтом, і не пояснюєте контекст щоразу заново. Ви бачите інциденти з причинами та план на наступний місяць. Про те, чому ручне й автоматизоване тестування доповнюють одне одного, читайте в статті ",[302,2485,873],{"href":872},". Щоб підібрати пакет, заповніть ",[302,2488,482],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":2490},[2491,2492,2493,2494,2495],{"id":2323,"depth":485,"text":2324},{"id":2360,"depth":485,"text":2361},{"id":2423,"depth":485,"text":2424},{"id":2435,"depth":485,"text":2436},{"id":2468,"depth":485,"text":2469},[2497,2500,2503,2506,2509,2512,2515,2518],{"q":2498,"a":2499},"Берете сайти, зроблені не вами?","Так. Перші 2–4 години — аудит і знайомство з кодом, вони входять у перший місяць.",{"q":2501,"a":2502},"Що, якщо годин не вистачить?","Додаткові години — за ставкою пакета. Попереджаємо заздалегідь.",{"q":2504,"a":2505},"Невикористані години згоряють?","У Бізнес і Про — переносяться на наступний місяць.",{"q":2507,"a":2508},"Можна скасувати?","Так, з попередженням за 2 тижні. Без штрафів.",{"q":2510,"a":2511},"Скільки коштує технічна підтримка сайту?","Підтримка починається від 8 000 грн на місяць (пакет Базовий). Бізнес коштує 16 000 грн, Про — 32 000 грн. Пакет визначає швидкість реакції, кількість перевірок і набір послуг, тож вибір залежить від того, наскільки критичний ваш сайт.",{"q":2513,"a":2514},"Скільки часу потрібно, щоб почати підтримку?","Орієнтовно до трьох днів. У перші два дні ми оглядаємо код, сервер і бекапи, на третій налаштовуємо моніторинг, Sentry та доступи. Далі працюємо зі списком ваших задач і проводимо регрес перед релізами, а перший звіт отримуєте наприкінці місяця.",{"q":2516,"a":2517},"Чим підтримка відрізняється від разової доробки?","Підтримка — це щомісячний пакет із гарантованою реакцією, моніторингом і регресом, а разова доробка закриває одну задачу. Якщо сайт приносить замовлення, пакет надійніший, бо ви не шукаєте виконавця щоразу після збою, а години можна планувати наперед.",{"q":2519,"a":2520},"Що потрібно від мене, щоб взяти сайт на підтримку?","Надайте посилання на сайт і доступи до коду, сервера та хостингу. Також корисно розповісти про відомі проблеми й плани на найближчий місяць. Аудит і налаштування моніторингу ми робимо самі, і вони входять у перший місяць.","Підтримка сайту: години розробки, регрес і моніторинг","lifebuoy",[2261,2262,2263,2266,2267,2268,2272,2273,2274,2208,952,2210],{},12,[2527,2533,2539],{"name":2528,"price":2529,"features":2530,"featured":536},"Базовий","8 000 грн \u002F міс",[2531,2194,2532],"Моніторинг 24\u002F7","Бекапи і оновлення безпеки",{"name":1776,"price":2534,"features":2535,"featured":525},"16 000 грн \u002F міс",[2536,1364,2537,2538],"Усе з Базового","Реакція до 4 годин","Невикористані години — на наступний місяць",{"name":2540,"price":2541,"features":2542,"featured":536},"Про","32 000 грн \u002F міс",[2543,2544,2545,2546],"Усе з Бізнес","Реакція на збій до 1 години","Автотести в CI","Щомісячна зустріч","\u002Fuk\u002Fservices\u002Fpidtrymka",8000,"month",[956,558,557],[562,961,959],{"title":2206,"description":14},"Години розробки, регрес перед релізами, моніторинг доступності. Підтримка сайту чи магазину від 8 000 грн на місяць.","Підтримка та розвиток сайту після запуску — Tochno.","uk\u002Fservices\u002Fpidtrymka","aJ6_3lMz8N5Y1U53yzvcFGf7f3Tei0ok7FlASFCMTVc",{"id":2558,"title":431,"artifacts":2559,"audience":2560,"benefit":141,"blocks":2565,"body":2740,"currency":494,"description":14,"duration":2571,"extension":495,"faq":2932,"h1":431,"icon":2957,"includes":2958,"key":141,"meta":2959,"navigation":525,"order":2960,"packages":2961,"path":2983,"priceFrom":2984,"priceLabel":2572,"priceUnit":554,"related":2985,"relatedPosts":2986,"seo":2988,"seoDescription":2989,"seoTitle":2990,"slug":955,"stem":2991,"tag":2567,"template":2992,"updated":141,"__hash__":2993},"services_uk\u002Fuk\u002Fservices\u002Fqa-audyt-internet-mahazynu.md",[],[2561,2562,2563,2564],"Запускаєте новий магазин","Втрачаєте замовлення на checkout","Після редизайну чи переїзду","Прийняли сайт від підрядника",{"answer":2566,"eyebrow":2567,"lead":2568,"cta":146,"leadNeed":30,"term":2569,"fitsTitle":2585,"fits":2586,"scopeTitle":2598,"scopeLead":2599,"scope":2600,"pkgTitle":2636,"hourly":2637,"art":2642,"stepsTitle":2711,"steps":2712,"caseStudy":2725,"ctaTitle":2738,"ctaLead":2739,"urlLabel":688,"urlPh":689},"QA-аудит інтернет-магазину — це разова глибока перевірка магазину за чек-листом на 150+ пунктів: від каталогу до оплати й мобільної версії. Підходить власникам, які запускають сайт, втрачають замовлення або приймають роботу від підрядника. Коштує від 6 000 грн (орієнтовно до 15 000 грн), триває 3–5 днів.","QA · ФЛАГМАНСЬКА ПОСЛУГА","Знаходимо баги, через які ви втрачаєте замовлення, — до того, як їх знайдуть покупці. Кожна проблема з відео, кроками відтворення і пріоритетом.",{"cmd":2570,"time":2571,"price":2572,"lines":2573},"$ tochno audit shop.ua","3–5 днів","від 6 000 грн",[2574,2575,2577,2579,2581,2583],{"mark":161,"text":1772},{"mark":161,"text":2576},"Пошук, кошик",{"mark":153,"text":2578},"Checkout · iOS Safari",{"mark":156,"text":2580},"LCP мобільний 4,8 с",{"mark":161,"text":2582},"Оплата, Нова Пошта",{"mark":153,"text":2584},"Форма відгуку без валідації","Коли тестування окупається найшвидше",[2587,2589,2592,2595],{"icon":2241,"title":2561,"text":2588},"Перевіряємо все до реклами, щоб перші гроші не пішли на поламаний checkout.",{"icon":2590,"title":2562,"text":2591},"shopping-cart-x","Трафік є, кошики наповнюються, а оплат мало. Шукаємо, де саме обривається шлях.",{"icon":2593,"title":2563,"text":2594},"git-merge","Нова платформа, нова тема, нові інтеграції — і старі сценарії, які ніхто не перевірив.",{"icon":2596,"title":2564,"text":2597},"user-question","Незалежна перевірка перед фінальною оплатою: чи зроблено те, за що ви платите.","150+ перевірок за чек-листом","Проходимо магазин так, як це робить покупець: з телефона, з повільним інтернетом, з помилкою в номері картки. Потім — так, як це робить Google.",[2601,2607,2612,2618,2624,2630],{"title":2602,"items":2603},"Шлях покупця",[2604,2605,2606],"Каталог, фільтри, сортування, пошук","Картка товару, варіанти, наявність","Кошик, промокоди, гостьове замовлення",{"title":2608,"items":2609},"Оплата і доставка",[2610,1444,2611],"LiqPay, WayForPay, Monobank, Apple Pay","Листи і SMS після замовлення",{"title":2613,"items":2614},"Мобільна версія",[2615,2616,2617],"Реальні iPhone і Android, не емулятор","Клавіатура, автозаповнення, жести","Розмір кнопок і читабельність",{"title":2619,"items":2620},"Швидкість",[2621,2622,2623],"Core Web Vitals: LCP, INP, CLS","Вага зображень і скриптів","Поведінка на повільному 3G",{"title":2625,"items":2626},"SEO-техніка",[2627,2628,2629],"Title, description, canonical, hreflang","Sitemap, robots, 404 і редіректи","Мікророзмітка Product і Breadcrumb",{"title":2631,"items":2632},"Форми і безпека",[2633,2634,2635],"Валідація і повідомлення про помилки","HTTPS, змішаний контент, cookies","Базова перевірка XSS і доступів","Три формати — від швидкого до глибокого",{"title":2638,"text":2639,"price":2640,"unit":2641},"QA-інженер погодинно","Регрес перед релізами, тест-кейси, кросбраузерність. Звіт після кожної сесії. Мінімум — 1 день (8 годин).","$20–25","\u002F год",{"tabs":2643,"bug":2647,"case":2660,"audit":2686,"caption":2705,"points":2706,"pdfLabel":2710},[2644,2645,2646],"Баг-репорт","Тест-кейс","Звіт аудиту",{"id":2648,"severity":218,"context":2649,"video":2650,"title":2651,"steps":2652,"actual":2657,"expected":2658,"impact":2659},"BUG-017","Checkout · iOS Safari 17","відео 0:42","Кнопка «Оплатити» неактивна після зміни способу доставки на «Нова Пошта — поштомат»",[2653,2654,2655,2656],"Додати товар у кошик, перейти до оформлення","Обрати «Нова Пошта — відділення», заповнити дані","Змінити доставку на «Нова Пошта — поштомат»","Обрати поштомат зі списку","Кнопка сіра, помилки немає. Замовлення неможливо оформити.","Кнопка активна після вибору поштомату.","~18% мобільних замовлень з доставкою в поштомат. Рекомендація: виправити до наступного релізу.",{"id":2661,"context":2662,"rows":2663},"TC-042","Checkout · гостьове замовлення",[2664,2669,2673,2678,2682],{"n":2665,"act":2666,"exp":2667,"status":2668},"1","Додати товар у кошик без реєстрації","Лічильник кошика = 1","PASS",{"n":2670,"act":2671,"exp":2672,"status":2668},"2","Ввести телефон без +380","Маска підставляє код країни",{"n":2674,"act":2675,"exp":2676,"status":2677},"3","Залишити email порожнім","Замовлення без email дозволене","FAIL",{"n":2679,"act":2680,"exp":2681,"status":2668},"4","Обрати оплату карткою","Редирект на LiqPay \u003C 2 с",{"n":2683,"act":2684,"exp":2685,"status":2677},"5","Повернутися кнопкою «Назад»","Кошик збережено",{"label":2687,"stats":2688,"top":2701},"SUMMARY · стор. 1 з 14",[2689,2692,2695,2698],{"n":2690,"k":2691},"47","усього",{"n":2693,"k":2694},"6","critical",{"n":2696,"k":2697},"15","major",{"n":2699,"k":2700},"26","minor",[2702,2703,2704],"Оплата недоступна для поштоматів на iOS (BUG-017)","LCP мобільної картки товару — 4,8 с при нормі 2,5 с","Фільтр «Розмір» скидає сортування","Звіт пишемо для двох читачів: власник бачить, що болить і скільки це коштує, розробник — як відтворити і що виправити. Без «сайт працює некоректно».",[2707,2708,2709],"Відео або скрін на кожен баг","Пріоритет за впливом на гроші","Експорт у Jira, Linear, Trello","Зразок звіту, PDF · 1,2 МБ","Від заявки до звіту — 5 днів",[2713,2715,2718,2721],{"when":246,"title":1909,"text":2714},"Посилання, цілі, ключові сценарії. Фіксуємо ціну і терміни.",{"when":2716,"title":123,"text":2717},"дні 1–3","Проходимо чек-лист на реальних пристроях, записуємо відео.",{"when":2719,"title":259,"text":2720},"день 4","Баг-репорти з пріоритетами, PDF і експорт у ваш трекер.",{"when":2722,"title":2723,"text":2724},"день 5","Розбір","Дзвінок 30 хв: що виправити першим і скільки це займе.",{"badges":2726,"title":2729,"text":2730,"stats":2731,"to":46,"ctaLabel":2737},[2727,2728],"АУДИТ","ДЕМО","Магазин одягу: 47 багів, 6 критичних — усі в checkout","Демонстраційний аудит відкритого магазину. Показуємо методику і формат звіту на реальному сайті — без даних клієнта.",[2732,2734],{"value":2690,"label":2733},"багів",{"value":2735,"label":2736},"4 дні","робота","Читати кейс","Надішліть посилання на сайт","Відповімо за 2 робочі години. Експрес-чек — безкоштовно, за 48 годин.",{"type":265,"value":2741,"toc":2924},[2742,2746,2749,2752,2772,2777,2781,2784,2787,2801,2808,2812,2815,2867,2872,2874,2877,2880,2884,2887,2909,2911,2914],[268,2743,2745],{"id":2744},"що-перевіряємо-під-час-аудиту-інтернет-магазину","Що перевіряємо під час аудиту інтернет-магазину",[273,2747,2748],{},"Тестування інтернет-магазину ми будуємо навколо шляху покупця, бо саме там втрачаються гроші. Проходимо сайт так, як це робить клієнт: з телефона, з повільним інтернетом, з помилкою в номері картки. Потім перевіряємо його так, як це робить Google.",[273,2750,2751],{},"Чек-лист поділено на шість блоків:",[283,2753,2754,2757,2760,2763,2766,2769],{},[286,2755,2756],{},"шлях покупця: каталог, фільтри, пошук, картка товару, кошик, промокоди, гостьове замовлення;",[286,2758,2759],{},"оплата і доставка: LiqPay, WayForPay, Monobank, Apple Pay, Нова Пошта, Укрпошта, самовивіз, листи й SMS після замовлення;",[286,2761,2762],{},"мобільна версія: реальні iPhone і Android, клавіатура, автозаповнення, розмір кнопок;",[286,2764,2765],{},"швидкість: Core Web Vitals (LCP, INP, CLS), вага зображень і скриптів, поведінка на повільному 3G;",[286,2767,2768],{},"SEO-техніка: title, description, canonical, hreflang, sitemap, robots, редіректи, мікророзмітка Product;",[286,2770,2771],{},"форми та безпека: валідація, HTTPS, змішаний контент, базова перевірка XSS і доступів.",[273,2773,2774,2775,306],{},"Перелік типових помилок, які виявляються на checkout, ми розбирали в статті ",[302,2776,722],{"href":721},[268,2778,2780],{"id":2779},"що-ви-отримуєте-після-аудиту","Що ви отримуєте після аудиту",[273,2782,2783],{},"Результат аудиту — не загальні враження, а робочий документ. Кожна знахідка подається окремим баг-репортом із відео або скріном, кроками відтворення та пріоритетом за впливом на гроші.",[273,2785,2786],{},"Комплект передачі:",[283,2788,2789,2792,2795,2798],{},[286,2790,2791],{},"PDF-звіт, який зрозуміє і власник, і розробник;",[286,2793,2794],{},"експорт багів у Jira, Linear або Trello;",[286,2796,2797],{},"дзвінок-розбір на 30 хвилин: що виправити першим і скільки це займе;",[286,2799,2800],{},"за потреби повторна перевірка після виправлень.",[273,2802,2803,2804,306],{},"Приклад того, як виглядає баг-репорт і тест-кейс, показано в статті ",[302,2805,2807],{"href":2806},"\u002Fblog\u002Fyak-my-testuiemo-bah-report-i-test-keis","як ми тестуємо: баг-репорт і тест-кейс",[268,2809,2811],{"id":2810},"скільки-коштує-qa-аудит-інтернет-магазину-і-від-чого-залежить-ціна","Скільки коштує QA-аудит інтернет-магазину і від чого залежить ціна",[273,2813,2814],{},"QA-аудит інтернет-магазину коштує від 6 000 грн, а для великих каталогів з кількома інтеграціями ціна може зростати до 15 000 грн. Остаточну суму фіксуємо до старту, і від кількості знайдених багів вона не залежить.",[342,2816,2817,2825],{},[345,2818,2819],{},[348,2820,2821,2823],{},[351,2822,353],{},[351,2824,356],{},[358,2826,2827,2835,2843,2851,2859],{},[348,2828,2829,2832],{},[363,2830,2831],{},"Розмір і складність каталогу",[363,2833,2834],{},"Багато варіантів товару та фільтрів потребує більше сценаріїв",[348,2836,2837,2840],{},[363,2838,2839],{},"Кількість платіжних систем і способів доставки",[363,2841,2842],{},"Кожна інтеграція перевіряється окремо",[348,2844,2845,2848],{},[363,2846,2847],{},"Мобільна версія та пристрої",[363,2849,2850],{},"Ширша матриця пристроїв додає годин",[348,2852,2853,2856],{},[363,2854,2855],{},"Мови та валюти",[363,2857,2858],{},"Друга мова додає окремі перевірки",[348,2860,2861,2864],{},[363,2862,2863],{},"Доступ до staging або тестового акаунта",[363,2865,2866],{},"Дає змогу глибше перевірити замовлення й оплату",[273,2868,2869,2870,306],{},"Орієнтовні формати такі: безкоштовний експрес-чек за 48 годин, QA-аудит від 6 000 грн і пакет «аудит + автотести» від 18 000 грн. Усі ціни зібрано на сторінці ",[302,2871,406],{"href":77},[268,2873,410],{"id":409},[273,2875,2876],{},"Робота займає орієнтовно п'ять днів. У нульовий день ми отримуємо посилання, цілі й ключові сценарії та фіксуємо ціну. Протягом трьох наступних днів проходимо чек-лист на реальних пристроях і записуємо відео. На четвертий день передаємо звіт із пріоритетами, а на п'ятий проводимо розбір.",[273,2878,2879],{},"Для базового аудиту достатньо публічного сайту. Для перевірки замовлень і оплат просимо тестовий акаунт або staging, а доступи надаємо під NDA. Якщо знайдено мало проблем, ви все одно отримуєте підтвердження готовності та список ризиків на майбутнє. Старт зазвичай у межах одного-двох робочих днів після оплати.",[268,2881,2883],{"id":2882},"коли-qa-аудит-не-потрібен","Коли QA-аудит не потрібен",[273,2885,2886],{},"Аудит магазину — не відповідь на кожне питання. Є ситуації, де краще інший формат:",[283,2888,2889,2895,2901,2906],{},[286,2890,2891,2892,2894],{},"Вам потрібна перевірка перед кожним релізом, а не раз. Тоді обирайте ",[302,2893,852],{"href":438},": воно працює з кожним оновленням і від $20 за годину.",[286,2896,2897,2898,2900],{},"Критичні сценарії повторюються щотижня. Для них підійде ",[302,2899,1663],{"href":443}," на Playwright.",[286,2902,2903,2904,306],{},"Проблема, схоже, у коді: повільні запити, застарілий фреймворк, дірки в безпеці. Тоді потрібен ",[302,2905,866],{"href":865},[286,2907,2908],{},"Ви хочете лише побачити, чи все нормально на поверхні. Почніть з безкоштовного експрес-чеку.",[268,2910,469],{"id":468},[273,2912,2913],{},"Ми не покладаємося на емулятори: магазин відкривається на реальних iPhone і Android. Кожен баг має відео та пріоритет за впливом на гроші, а не лише технічну серйозність. Чек-лист на 150+ пунктів ми використовуємо щоразу, тому результат можна порівняти між аудитами.",[273,2915,2916,2917,2921,2922,306],{},"Якщо хочете перевірити самостійно, візьміть наш ",[302,2918,2920],{"href":2919},"\u002Fblog\u002Fchek-lyst-testuvannia-internet-mahazynu","чек-лист тестування інтернет-магазину на 60 пунктів",". А якщо хочете, щоб це зробили ми, надішліть посилання на сайт через ",[302,2923,482],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":2925},[2926,2927,2928,2929,2930,2931],{"id":2744,"depth":485,"text":2745},{"id":2779,"depth":485,"text":2780},{"id":2810,"depth":485,"text":2811},{"id":409,"depth":485,"text":410},{"id":2882,"depth":485,"text":2883},{"id":468,"depth":485,"text":469},[2933,2936,2939,2942,2945,2948,2951,2954],{"q":2934,"a":2935},"Чим аудит відрізняється від того, що ми тестуємо самі?","Ви знаєте, як сайт має працювати, тому неусвідомлено обходите проблемні місця. Ми проходимо його як новий покупець — на різних пристроях, з помилками введення і повільним інтернетом — за чек-листом на 150+ пунктів.",{"q":2937,"a":2938},"Потрібен доступ до адмінки чи коду?","Для базового аудиту — ні, достатньо публічного сайту. Для перевірки замовлень і оплат просимо тестовий акаунт або staging. Доступи — під NDA.",{"q":2940,"a":2941},"Ви самі виправите знайдені баги?","Можемо. Після аудиту пропонуємо фікс-пакет за ставкою $20–35\u002Fгод. Або передаєте звіт своєму розробнику — він написаний так, щоб його можна було взяти в роботу без нас.",{"q":2943,"a":2944},"Що, якщо багів майже не знайдеться?","Так буває рідко, але тоді ви отримаєте підтвердження, що сайт готовий, і список ризиків на майбутнє. Ціна аудиту фіксується до старту і від кількості багів не залежить.",{"q":2946,"a":2947},"Ви тестуєте сайти на Shopify, Horoshop, WooCommerce?","Так. Аудит не залежить від платформи: перевіряємо те, що бачить покупець. Для Laravel і Nuxt додатково можемо подивитися код.",{"q":2949,"a":2950},"Як швидко можна почати?","Зазвичай протягом 1–2 робочих днів після оплати. Експрес-чек стартує в день заявки.",{"q":2952,"a":2953},"Скільки коштує QA-аудит інтернет-магазину?","QA-аудит інтернет-магазину коштує від 6 000 грн, а для великих каталогів із багатьма платіжними системами та способами доставки орієнтовно до 15 000 грн. Ціну фіксуємо до старту, і вона не залежить від кількості знайдених багів. Експрес-чек із 10–15 ключових проблем безкоштовний.",{"q":2955,"a":2956},"Скільки часу триває аудит інтернет-магазину?","Повний QA-аудит триває 3–5 днів: спершу бриф і фіксація ціни, далі тестування на реальних пристроях, потім звіт з пріоритетами та дзвінок-розбір на 30 хвилин. Безкоштовний експрес-чек готуємо за 48 годин, а старт аудиту зазвичай у межах 1–2 робочих днів після оплати.","shield-check",[2604,2605,2606,2610,1444,2611,2615,2616,2617,2621,2622,2623,2627,2628,2629,2633,2634,2635],{},6,[2962,2970,2976],{"name":2963,"price":2964,"features":2965,"featured":536},"Експрес-чек","безкоштовно",[2966,2967,2968,2969],"10–15 ключових проблем","Мобільна версія і checkout","Швидкість головної і картки","PDF на 2–3 сторінки",{"name":30,"price":2572,"features":2971,"featured":525},[2972,2973,2974,2975],"Чек-лист 150+ пунктів","Баг-репорти з відео","Пріоритизація за впливом","Дзвінок-розбір 30 хв",{"name":2977,"price":539,"features":2978,"featured":536},"Аудит + автотести",[2979,2980,2981,2982],"Усе з QA-аудиту","Playwright-сценарії checkout","Запуск у CI перед деплоєм","Повторна перевірка після фіксів","\u002Fuk\u002Fservices\u002Fqa-audyt-internet-mahazynu",6000,[557,558,566,957],[2987,961,960],"chek-lyst-testuvannia-internet-mahazynu",{"title":431,"description":14},"Чек-лист 150+ пунктів, баг-репорти з відео, пріоритизація за впливом на гроші. Безкоштовний експрес-чек за 48 годин. Аудит — від 6 000 грн.","QA-аудит інтернет-магазину за 3–5 днів — Tochno.","uk\u002Fservices\u002Fqa-audyt-internet-mahazynu","flagship","o6zXsEmWXlEzLaYKz6vX0IODIqJxGIbmuN57WYvUucs",{"id":2995,"title":24,"artifacts":2996,"audience":3000,"benefit":141,"blocks":3005,"body":3106,"currency":494,"description":14,"duration":3012,"extension":495,"faq":3336,"h1":3361,"icon":3362,"includes":3363,"key":141,"meta":3364,"navigation":525,"order":3365,"packages":3366,"path":3389,"priceFrom":3390,"priceLabel":3013,"priceUnit":554,"related":3391,"relatedPosts":3392,"seo":3394,"seoDescription":3395,"seoTitle":3396,"slug":3397,"stem":3398,"tag":3007,"template":568,"updated":141,"__hash__":3399},"services_uk\u002Fuk\u002Fservices\u002Frozrobka-saitiv.md",[2997,2998,2999],"Staging-версія з першого тижня","Код і доступи — на вашому акаунті","30 днів гарантії після запуску",[3001,3002,3003,3004],"Новий бізнес","Старий сайт гальмує","Компанія росте","Кілька мов",{"answer":3006,"crumb":24,"eyebrow":3007,"lead":3008,"cta":3009,"leadNeed":122,"term":3010,"fitsTitle":1413,"fits":3027,"scopeTitle":3037,"scopeLead":3038,"stack":3039,"scope":3043,"pkgTitle":3064,"art":3065,"stepsTitle":3089,"steps":3090,"ctaTitle":2318,"urlLabel":3104,"urlPh":3105},"Розробка сайтів у Tochno — це створення сайту під ключ на Nuxt: структура, дизайн у Figma, розробка, адмінка, SEO-база і запуск за одним договором. Підходить новому бізнесу, компаніям із застарілим сайтом і тим, кому потрібен корпоративний сайт з блогом. Лендінг — від 25 000 грн за 2–3 тижні, корпоративний сайт — від 60 000 грн за 5–7 тижнів.","РОЗРОБКА · NUXT","Лендінги й корпоративні сайти на Nuxt: від структури і текстів до запуску та аналітики. Адмінка, в якій ви самі змінюєте контент, і Lighthouse 90+ на мобільному.","Обговорити сайт",{"cmd":3011,"time":3012,"price":3013,"lines":3014},"$ tochno build --type=corp","5–7 тиж.","від 25 000 грн",[3015,3017,3019,3021,3023,3025],{"mark":161,"text":3016},"Lighthouse mobile · 94",{"mark":161,"text":3018},"Адаптив 375 \u002F 768 \u002F 1440",{"mark":161,"text":3020},"Форми → Telegram + CRM",{"mark":161,"text":3022},"GA4 · події заявок",{"mark":161,"text":3024},"SEO: meta, sitemap, schema",{"mark":166,"text":3026},"Адмінка · 12 типів блоків",[3028,3030,3032,3034],{"icon":2241,"title":3001,"text":3029},"Потрібен сайт, який пояснює послугу і збирає заявки з першого тижня реклами.",{"icon":1014,"title":3002,"text":3031},"Конструктор або WordPress з десятком плагінів, який страшно оновлювати.",{"icon":1008,"title":3003,"text":3033},"Кілька послуг, філії, вакансії, блог — потрібна структура, а не одна сторінка.",{"icon":3035,"title":3004,"text":3036},"language","Українська + англійська з окремими URL для SEO.","Що входить у сайт під ключ","Від першого дзвінка до запуску — одна команда і один договір. Ви отримуєте код, доступи і інструкцію.",[1020,3040,3041,1023,3042],"Laravel \u002F Strapi","Figma","GA4",[3044,3050,3055,3060],{"title":3045,"items":3046},"Структура і дизайн",[3047,3048,3049],"Карта сторінок і прототип","Дизайн у Figma: 375 \u002F 768 \u002F 1440","Тексти або редактура ваших",{"title":1493,"items":3051},[3052,3053,3054],"Nuxt 3 з SSR для SEO","Адмінка для контенту","Форми з інтеграцією в Telegram \u002F CRM",{"title":1044,"items":3056},[3057,3058,3059],"Домен, SSL, хостинг","GA4, Search Console, пікселі після згоди","Редиректи зі старого сайту",{"title":2212,"items":3061},[1359,3062,3063],"Навчання роботі з адмінкою","Підтримка за бажанням","Три формати сайту",{"title":3066,"file":3067,"badge":3068,"lines":3069,"caption":3087,"points":3088},"Так виглядає звіт перед запуском","launch-check.md","READY",[3070,3071,3073,3075,3077,3079,3081,3083,3085],{"mark":221,"text":2619},{"mark":161,"text":3072},"LCP 1.6 с · CLS 0.01 · mobile",{"mark":221,"text":3074},"SEO",{"mark":161,"text":3076},"sitemap.xml, robots, canonical",{"mark":161,"text":3078},"301 з 48 старих URL",{"mark":221,"text":3080},"Заявки",{"mark":161,"text":3082},"Форма → Telegram за \u003C 3 с",{"mark":161,"text":3084},"GA4: generate_lead",{"mark":996,"text":3086},"Клієнт: фото команди","Перед запуском проходимо чек-лист із 60 пунктів і показуємо результат вам — не «все готово», а що саме перевірено.",[2997,2998,2999],"Від брифу до запуску",[3091,3095,3098,3101],{"when":3092,"title":3093,"text":3094},"тиждень 1","Структура","Бриф, карта сторінок, прототип головної.",{"when":3096,"title":124,"text":3097},"тижні 2–3","Макети для трьох ширин, два раунди правок.",{"when":3099,"title":1493,"text":3100},"тижні 3–6","Staging, демо щоп'ятниці, наповнення.",{"when":3102,"title":1044,"text":3103},"тиждень 7","Перевірка, домен, аналітика, навчання.","Поточний сайт (якщо є)","company.ua",{"type":265,"value":3107,"toc":3328},[3108,3112,3115,3135,3138,3142,3145,3202,3208,3212,3217,3231,3234,3238,3241,3262,3265,3269,3272,3289,3292,3294,3312,3322],[268,3109,3111],{"id":3110},"що-ви-отримуєте-за-створення-сайту-під-ключ","Що ви отримуєте за створення сайту під ключ",[273,3113,3114],{},"Ми не здаємо «макет і архів». Ви отримуєте працюючий сайт на своєму домені, код і доступи на вашому акаунті та людину, яка пояснить, як усім користуватися.",[283,3116,3117,3120,3123,3126,3129,3132],{},[286,3118,3119],{},"карта сторінок і прототип, дизайн у Figma для ширин 375, 768 і 1440;",[286,3121,3122],{},"тексти від нас або редактура ваших, структура під пошукові запити;",[286,3124,3125],{},"Nuxt із SSR, щоб сторінки відкривалися швидко й добре індексувалися;",[286,3127,3128],{},"адмінка, у якій ви самі змінюєте тексти, фото, послуги й статті;",[286,3130,3131],{},"форми із заявками в Telegram або CRM, аналітика GA4 і Search Console після згоди на cookies;",[286,3133,3134],{},"редиректи зі старого сайту, щоб не втратити позиції в Google.",[273,3136,3137],{},"Повний перелік дивіться вище на сторінці, у блоці «Що входить у сайт під ключ».",[268,3139,3141],{"id":3140},"скільки-коштує-розробка-сайту-і-від-чого-залежить-ціна","Скільки коштує розробка сайту і від чого залежить ціна",[273,3143,3144],{},"Питання «розробка сайту ціна» не має однієї відповіді, тому ми показуємо чесний мінімум і пояснюємо, що його змінює. Точну суму фіксуємо в договорі після брифу, оцінку даємо за 1 робочий день.",[342,3146,3147,3155],{},[345,3148,3149],{},[348,3150,3151,3153],{},[351,3152,353],{},[351,3154,356],{},[358,3156,3157,3165,3173,3180,3187,3195],{},[348,3158,3159,3162],{},[363,3160,3161],{},"Тип сайту",[363,3163,3164],{},"Лендінг від 25 000 грн, корпоративний сайт від 60 000 грн",[348,3166,3167,3170],{},[363,3168,3169],{},"Кількість сторінок і блоків",[363,3171,3172],{},"Чим більше шаблонів сторінок, тим більше дизайну, верстки й тестування",[348,3174,3175,3177],{},[363,3176,124],{},[363,3178,3179],{},"З нуля коштує більше, ніж за готовим брендбуком чи макетом",[348,3181,3182,3184],{},[363,3183,1589],{},[363,3185,3186],{},"CRM, оплата, 1С додають розробку й перевірку",[348,3188,3189,3192],{},[363,3190,3191],{},"Мови",[363,3193,3194],{},"Друга мова потребує окремих URL, перекладів і перевірки SEO",[348,3196,3197,3199],{},[363,3198,1189],{},[363,3200,3201],{},"Термінові проєкти дорожчі: команді доводиться працювати паралельно",[273,3203,3204,3205,3207],{},"Усі стартові ціни зібрані на сторінці ",[302,3206,406],{"href":77},", там є й калькулятор-орієнтир.",[268,3209,3211],{"id":3210},"як-проходить-робота-над-сайтом","Як проходить робота над сайтом",[273,3213,3214,3215,306],{},"Процес однаковий для лендінгу й великого сайту, відрізняється лише масштаб. Детальніше він описаний на сторінці ",[302,3216,1226],{"href":43},[1207,3218,3219,3222,3225,3228],{},[286,3220,3221],{},"Бриф і структура: збираємо цілі, карту сторінок і прототип головної.",[286,3223,3224],{},"Дизайн: макети для трьох ширин, два раунди правок.",[286,3226,3227],{},"Розробка: спринти по 2 тижні, staging-версія з першого тижня й демо наприкінці кожного спринту.",[286,3229,3230],{},"Запуск: перевірка, домен, аналітика, навчання роботі з адмінкою.",[273,3232,3233],{},"Щоп'ятниці надсилаємо короткий звіт: що зроблено, що в роботі, що потрібно від вас. Оплата йде етапами 30 \u002F 40 \u002F 30, тож ви платите за те, що вже бачили. Після запуску діє 30 днів гарантії: помилки з нашої вини виправляємо безкоштовно.",[268,3235,3237],{"id":3236},"коли-такий-сайт-вам-не-підходить","Коли такий сайт вам не підходить",[273,3239,3240],{},"Чесно: нова розробка потрібна не завжди.",[283,3242,3243,3249,3256,3259],{},[286,3244,3245,3246,306],{},"Якщо потрібен інтернет-магазин із каталогом, оплатою й доставкою, дивіться окрему послугу ",[302,3247,3248],{"href":28},"розробка інтернет-магазину",[286,3250,3251,3252,3255],{},"Якщо сайт уже є, але його не любить дизайн чи UX, можливо, достатньо ",[302,3253,3254],{"href":1248},"UI\u002FUX дизайну"," без повного перепису.",[286,3257,3258],{},"Якщо бюджет менший за 25 000 грн, ми не беремося за «сайт за тиждень»: якісно це не зробити.",[286,3260,3261],{},"Якщо вам потрібен лише самописний мінімум на конструкторі, наш формат буде надлишковим.",[273,3263,3264],{},"Не впевнені, що обрати? Почніть із безкоштовного експрес-чеку поточного сайту або з консультації тех-ліда.",[268,3266,3268],{"id":3267},"як-підготуватися-до-старту","Як підготуватися до старту",[273,3270,3271],{},"Швидкість проєкту часто залежить не від розробників, а від матеріалів. Щоб корпоративний сайт вийшов у строк, зберіть заздалегідь:",[283,3273,3274,3277,3280,3283,3286],{},[286,3275,3276],{},"перелік послуг із короткими описами та цінами або вилками;",[286,3278,3279],{},"логотип, фірмові кольори й шрифти, якщо вони є;",[286,3281,3282],{},"фото команди, об'єктів чи продуктів, які ви готові показувати;",[286,3284,3285],{},"доступи до поточного домену, хостингу й аналітики;",[286,3287,3288],{},"приклади сайтів, які вам подобаються, і конкурентів, яких хочете перевершити.",[273,3290,3291],{},"Якщо чогось немає, це не зупиняє проєкт: тексти допоможемо підготувати, а домен і хостинг оформимо на вас. Хостинг зазвичай обходиться орієнтовно в $0–20 на місяць.",[268,3293,1282],{"id":1281},[283,3295,3296,3299,3302,3305],{},[286,3297,3298],{},"Тестування входить у кожен спринт, а не додається в кінці. Перед запуском проходимо чек-лист і показуємо результат вам.",[286,3300,3301],{},"Тех-лід працює над проєктом особисто, а не лише на етапі продажу.",[286,3303,3304],{},"Ціни відкриті, а код і доступи належать вам з першого дня.",[286,3306,3307,3308,3311],{},"Для підтримки після запуску є окрема послуга ",[302,3309,3310],{"href":889},"підтримка"," від 8 000 грн на місяць, але вона за бажанням.",[273,3313,3314,3315,3319,3320,306],{},"Як обрати виконавця й не пошкодувати, ми розбирали в статті ",[302,3316,3318],{"href":3317},"\u002Fblog\u002Fyak-obraty-pidriadnyka-na-rozrobku-saitu","як обрати підрядника на розробку сайту",". Чому ми обираємо Nuxt для маркетингових сайтів, читайте в матеріалі ",[302,3321,1265],{"href":1264},[273,3323,3324,3325,3327],{},"Готові обговорити свій проєкт? Заповніть ",[302,3326,482],{"href":17},": відповімо протягом 2 робочих годин і дамо оцінку за 1 робочий день.",{"title":14,"searchDepth":485,"depth":486,"links":3329},[3330,3331,3332,3333,3334,3335],{"id":3110,"depth":485,"text":3111},{"id":3140,"depth":485,"text":3141},{"id":3210,"depth":485,"text":3211},{"id":3236,"depth":485,"text":3237},{"id":3267,"depth":485,"text":3268},{"id":1281,"depth":485,"text":1282},[3337,3340,3343,3346,3349,3352,3355,3358],{"q":3338,"a":3339},"Чи працюєте з WordPress?","Ні. Робимо на Nuxt з окремою адмінкою — швидше, безпечніше і без плагінів, які ламаються після оновлень.",{"q":3341,"a":3342},"Хто пише тексти?","Можемо ми, можете ви. Якщо ваші — зробимо редактуру і підкажемо структуру.",{"q":3344,"a":3345},"Чи зможу я сам змінювати сайт?","Так: тексти, фото, послуги, кейси і статті — через адмінку. Покажемо на навчанні.",{"q":3347,"a":3348},"Скільки коштує хостинг?","Зазвичай $0–20 на місяць. Реєструємо на ваш акаунт.",{"q":3350,"a":3351},"Скільки коштує розробка сайту під ключ?","Лендінг — від 25 000 грн, корпоративний сайт — від 60 000 грн. «Від» — чесний мінімум; точну суму фіксуємо в договорі після брифу. Оцінку даємо за 1 робочий день, без зобов'язань. Усе, що не входить у суму, ми перелічуємо в договорі.",{"q":3353,"a":3354},"Скільки часу триває створення сайту?","Лендінг робимо орієнтовно за 2–3 тижні, корпоративний сайт — за 5–7 тижнів. Термін залежить від кількості сторінок, швидкості погоджень і того, чи готові тексти й матеріали. Staging бачите з першого тижня. Точніший строк називаємо після брифу.",{"q":3356,"a":3357},"Чи можна замовити тільки дизайн або тільки розробку?","Так. Якщо у вас є макет у Figma, ми зробимо розробку за ним, і це зазвичай дешевше. Дизайн окремо — це послуга UI\u002FUX з погодинною оплатою від $20 за годину. Обсяг узгоджуємо письмово до старту.",{"q":3359,"a":3360},"Що потрібно від мене, щоб почати розробку сайту?","Заповнений бриф: цілі сайту, приклади сайтів, які подобаються, і список послуг. Далі потрібні логотип, фото й тексти або згода, щоб ми їх підготували. Домен і хостинг оформляємо на ваш акаунт разом. Якщо чогось бракує, підкажемо, де знайти.","Сайт, який швидко відкривається і приводить заявки","browser",[3047,3048,3049,3052,3053,3054,3057,3058,3059,1359,3062,3063],{},1,[3367,3374,3381],{"name":3368,"price":3013,"features":3369,"featured":536},"Лендінг",[3370,3371,3372,3373],"До 8 блоків","Дизайн і адаптив","Форма + Telegram","Базове SEO і GA4",{"name":3375,"price":3376,"features":3377,"featured":525},"Корпоративний","від 60 000 грн",[3378,3053,3379,3380],"До 15 шаблонів сторінок","Блог і кейси","Інтеграція з CRM",{"name":3382,"price":3383,"features":3384,"featured":536},"Під ключ + підтримка","від 60 000 + 8 000 \u002F міс",[3385,3386,3387,3388],"Усе з «Корпоративного»","10 годин розробки на місяць","Регрес перед змінами","Моніторинг доступності","\u002Fuk\u002Fservices\u002Frozrobka-saitiv",25000,[1370,955,957],[3393,1372,562],"yak-obraty-pidriadnyka-na-rozrobku-saitu",{"title":24,"description":14},"Лендінги та корпоративні сайти на Nuxt: дизайн, розробка, SEO і Lighthouse 90+ на мобільному. Офіційний договір, код належить вам. Від 25 000 грн.","Розробка сайтів на Nuxt під ключ — Tochno.","rozrobka-saitiv","uk\u002Fservices\u002Frozrobka-saitiv","L2g9CCZzwx9efR2WAMDPadRbw6Ni1RGBEm42wBb2t8U",{"id":3401,"title":3402,"artifacts":3403,"audience":3407,"benefit":141,"blocks":3411,"body":3520,"currency":494,"description":14,"duration":3418,"extension":495,"faq":3710,"h1":3735,"icon":3736,"includes":3737,"key":141,"meta":3738,"navigation":525,"order":3739,"packages":3740,"path":3762,"priceFrom":3763,"priceLabel":3419,"priceUnit":554,"related":3764,"relatedPosts":3766,"seo":3767,"seoDescription":3768,"seoTitle":3769,"slug":556,"stem":3770,"tag":3413,"template":568,"updated":141,"__hash__":3771},"services_uk\u002Fuk\u002Fservices\u002Ftech-lead.md","Tech Lead (PHP)",[3404,3405,3406],"Аргументи і альтернативи","Ціна і ризики кожного варіанту","Історія рішень у репозиторії",[3408,3409,3410,1390],"Нетехнічний засновник","Вибір підрядника","Код-рев'ю",{"answer":3412,"crumb":3402,"eyebrow":3413,"lead":3414,"cta":3415,"leadNeed":33,"term":3416,"fitsTitle":3433,"fits":3434,"scopeTitle":3447,"scopeLead":3448,"stack":3449,"scope":3452,"pkgTitle":3476,"art":3477,"stepsTitle":3503,"steps":3504,"ctaTitle":3518,"urlLabel":3519,"urlPh":263},"Тех-лід на аутсорс — це досвідчений технічний керівник, який бере на себе архітектуру, код-рев'ю та оцінку підрядників, не вступаючи до вашого штату. Підходить нетехнічним засновникам і командам без сильного лідера. Разова консультація на 90 хвилин коштує 3 000–4 000 грн залежно від обсягу, постійний супровід — від $1 200 на місяць.","ТЕХ-ЛІДСТВО","Архітектура, вибір стеку, код-рев'ю, оцінка підрядника. 11 років у PHP\u002FLaravel — щоб технічні рішення приймались до того, як стануть дорогими.","Записатися на консультацію",{"cmd":3417,"time":3418,"price":3419,"lines":3420},"$ tochno consult --90min","90 хв","від 3 000 грн",[3421,3423,3425,3427,3429,3431],{"mark":166,"text":3422},"Ваші питання — заздалегідь",{"mark":161,"text":3424},"Огляд архітектури",{"mark":156,"text":3426},"Ризик: монолітна БД",{"mark":161,"text":3428},"Рекомендації по стеку",{"mark":996,"text":3430},"План на 3 місяці",{"mark":166,"text":3432},"Запис + резюме в PDF","З чим приходять до тех-ліда",[3435,3438,3441,3444],{"icon":3436,"title":3408,"text":3437},"help-hexagon","Потрібна людина, яка перекладе бізнес на мову розробників і назад.",{"icon":3439,"title":3409,"text":3440},"scale","Три кошториси з різницею вп'ятеро — хто правий?",{"icon":3442,"title":3410,"text":3443},"git-pull-request","Команда пише код, але ніхто не перевіряє архітектуру.",{"icon":3445,"title":1390,"text":3446},"building-skyscraper","Сайт росте, а рішення з першої версії вже тиснуть.","Технічні рішення без здогадок","Кожна рекомендація — з аргументами, альтернативами і ціною помилки.",[1019,1022,1853,3450,3451],"Docker","AWS \u002F VPS",[3453,3458,3464,3470],{"title":203,"items":3454},[3455,3456,3457],"Схема системи і даних","Вибір стеку і хостингу","Архітектурні рішення (ADR)",{"title":3459,"items":3460},"Команда",[3461,3462,3463],"Код-рев'ю pull request'ів","Технічні співбесіди","Процеси: git flow, CI, релізи",{"title":3465,"items":3466},"Підрядники",[3467,3468,3469],"Оцінка кошторисів і ТЗ","Приймання роботи","Технічна частина договору",{"title":3471,"items":3472},"Планування",[3473,3474,3475],"Декомпозиція і оцінка задач","Технічний борг і пріоритети","Роадмап на квартал","Разово, на проєкт або щомісяця",{"title":3478,"file":3479,"badge":3480,"lines":3481,"caption":3501,"points":3502},"Так виглядає архітектурне рішення (ADR)","adr-007-queues.md","ACCEPTED",[3482,3484,3486,3488,3490,3492,3495,3497,3499],{"mark":221,"text":3483},"Контекст",{"mark":14,"text":3485},"Синхронізація з 1С блокує checkout на 3–8 с",{"mark":221,"text":3487},"Рішення",{"mark":234,"text":3489},"Винести синхронізацію в чергу Redis + Horizon",{"mark":221,"text":3491},"Альтернативи",{"mark":3493,"text":3494},"✕","Cron кожні 5 хв — залишки неактуальні",{"mark":3493,"text":3496},"Окремий мікросервіс — дорого для команди з 2 людей",{"mark":221,"text":3498},"Наслідки",{"mark":239,"text":3500},"checkout \u003C 1 с · +4 год на налаштування","Рішення записуються з контекстом і альтернативами. Через рік нова людина в команді зрозуміє, чому зроблено саме так.",[3404,3405,3406],"Як починаємо",[3505,3508,3511,3514],{"when":246,"title":3506,"text":3507},"Питання","Ви надсилаєте контекст і питання.",{"when":1912,"title":3509,"text":3510},"Підготовка","Вивчаю код, ТЗ або кошторис.",{"when":3512,"title":2723,"text":3513},"зустріч","90 хвилин по суті.",{"when":3515,"title":3516,"text":3517},"день 2","Резюме","Письмові рекомендації і план.","Задайте питання","Сайт, репозиторій або кошторис",{"type":265,"value":3521,"toc":3704},[3522,3526,3529,3555,3562,3566,3569,3589,3592,3595,3601,3605,3610,3660,3663,3666,3680,3683,3687,3693,3696],[268,3523,3525],{"id":3524},"що-входить-у-роботу-тех-ліда-на-аутсорсі","Що входить у роботу тех-ліда на аутсорсі",[273,3527,3528],{},"Це не абстрактне «менторство», а конкретні результати, які ви можете перевірити:",[283,3530,3531,3537,3543,3549],{},[286,3532,3533,3536],{},[2333,3534,3535],{},"Архітектура."," Схема системи і даних, вибір стеку та хостингу, архітектурні рішення, записані як ADR: що вирішили, чому і які були альтернативи.",[286,3538,3539,3542],{},[2333,3540,3541],{},"Код-рев'ю."," Перевірка pull request'ів на коректність, безпеку й відповідність домовленостям, плюс налаштування git flow, CI і релізів.",[286,3544,3545,3548],{},[2333,3546,3547],{},"Підрядники."," Оцінка кошторисів і ТЗ, приймання роботи, технічна частина договору.",[286,3550,3551,3554],{},[2333,3552,3553],{},"Планування."," Декомпозиція задач, пріоритети технічного боргу, роадмап на квартал.",[273,3556,3557,3558,3561],{},"Окремо від цього є ",[302,3559,3560],{"href":865},"технічний аудит Laravel-проєкту",": там ви отримуєте детальний звіт про стан коду, а тех-лід допомагає ухвалювати рішення далі.",[268,3563,3565],{"id":3564},"формати-і-як-проходить-перша-співпраця","Формати і як проходить перша співпраця",[273,3567,3568],{},"Ми пропонуємо три формати, і почати можна з найменшого.",[283,3570,3571,3577,3583],{},[286,3572,3573,3576],{},[2333,3574,3575],{},"Консультація."," 90 хвилин, ви надсилаєте питання заздалегідь, отримуєте запис зустрічі та письмове резюме з рекомендаціями. Ціна — 3 000 грн.",[286,3578,3579,3582],{},[2333,3580,3581],{},"Фракційний тех-лід."," Частина робочого часу досвідченого фахівця за частину ціни: код-рев'ю, архітектура, участь у плануванні, співбесіди розробників. Від $1 200 на місяць.",[286,3584,3585,3588],{},[2333,3586,3587],{},"Оцінка підрядника."," Аналіз ТЗ і кошторису, ризики та питання до виконавця, письмовий висновок. Від 6 000 грн.",[273,3590,3591],{},"Різниця між форматами в глибині залучення. Консультація дає відповіді на конкретні питання тут і зараз, фракційний тех-лід стає постійною частиною процесу ухвалення рішень. Оцінка підрядника потрібна перед підписанням договору, коли помилка ще коштує недорого.",[273,3593,3594],{},"Якщо ви думаєте, як найняти тех-ліда в штат, а бюджет чи потреба ще не виправдовують повну ставку, фракційний формат часто виявляється розумним першим кроком.",[273,3596,3597,3598,306],{},"Фракційний формат зазвичай обирають команди, яким ще рано наймати тех-ліда на повну ставку. Про те, як зрозуміти, що ви саме в такій ситуації, розповідаємо в статті ",[302,3599,3600],{"href":464},"коли потрібен тех-лід, а коли достатньо розробника",[268,3602,3604],{"id":3603},"скільки-коштує-тех-лід-на-аутсорс-і-від-чого-залежить-ціна","Скільки коштує тех-лід на аутсорс і від чого залежить ціна",[273,3606,3607,3608,306],{},"Базові орієнтири ви бачите вище, а підсумок залежить від обсягу й терміновості. Актуальні діапазони по всіх послугах зібрані на сторінці ",[302,3609,406],{"href":77},[342,3611,3612,3620],{},[345,3613,3614],{},[348,3615,3616,3618],{},[351,3617,353],{},[351,3619,356],{},[358,3621,3622,3629,3637,3645,3653],{},[348,3623,3624,3626],{},[363,3625,1977],{},[363,3627,3628],{},"Разова консультація дешевша за щомісячний супровід, бо не потребує постійної доступності",[348,3630,3631,3634],{},[363,3632,3633],{},"Обсяг коду і документів",[363,3635,3636],{},"Чим більше репозиторіїв, кошторисів чи ТЗ потрібно вивчити заздалегідь, тим більше підготовки",[348,3638,3639,3642],{},[363,3640,3641],{},"Кількість регулярних зустрічей",[363,3643,3644],{},"Планування, співбесіди й рев'ю додають години на місяць",[348,3646,3647,3650],{},[363,3648,3649],{},"Складність системи",[363,3651,3652],{},"Інтеграції, черги, кілька сервісів і застарілий код вимагають глибшого занурення",[348,3654,3655,3657],{},[363,3656,2017],{},[363,3658,3659],{},"Робота «на завтра» планується окремо від звичайного графіка",[273,3661,3662],{},"Точну суму називаємо після короткого опису ситуації, до початку роботи.",[273,3664,3665],{},"Перша співпраця проходить так:",[1207,3667,3668,3671,3674,3677],{},[286,3669,3670],{},"Ви надсилаєте контекст і питання: репозиторій, ТЗ або кошторис.",[286,3672,3673],{},"Я вивчаю матеріали до зустрічі, щоб не витрачати ваш час на ознайомлення.",[286,3675,3676],{},"Проводимо 90 хвилин розбору по суті, із записом.",[286,3678,3679],{},"Наступного дня ви отримуєте письмові рекомендації та план дій.",[273,3681,3682],{},"До обговорення деталей підписуємо NDA. Якщо після консультації вам потрібне постійне посилення команди, формат можна змінити без втрати зробленого.",[268,3684,3686],{"id":3685},"коли-тех-лід-на-аутсорс-не-підійде-і-чим-відрізняється-tochno","Коли тех-лід на аутсорс не підійде і чим відрізняється Tochno",[273,3688,3689,3690,3692],{},"Тех-лід — це людина, що приймає рішення й перевіряє їх, а не додаткові руки. Якщо вам потрібно просто швидко закрити чергу задач, краще взяти ",[302,3691,2480],{"href":2479},": розробника чи QA у вашу команду. Якщо питання лише «що не так із нашим кодом», почніть з технічного аудиту. Для фронтенду й мобільних застосунків ми даємо загальну оцінку архітектури, але глибока експертиза в нас — PHP, Laravel, PostgreSQL та інфраструктура.",[273,3694,3695],{},"Практична порада: готуйте не лише питання, а й обмеження. Бюджет, терміни, склад команди та вже ухвалені рішення дозволяють отримати рекомендації, які реально виконати, а не ідеальну схему на папері. Чим точніше контекст, тим коротша підготовка і тим більше з 90 хвилин лишається на суть.",[273,3697,3698,3699,3701,3702,306],{},"Рекомендації дає людина з 11 роками в PHP\u002FLaravel, і кожна з них приходить з аргументами, альтернативами та ціною помилки. Рішення фіксуються письмово, тож через рік нова людина в команді розуміє, чому все зроблено саме так. Якщо ви обираєте виконавця на розробку, прочитайте ",[302,3700,3318],{"href":3317},", а коли будете готові описати задачу, заповніть ",[302,3703,482],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":3705},[3706,3707,3708,3709],{"id":3524,"depth":485,"text":3525},{"id":3564,"depth":485,"text":3565},{"id":3603,"depth":485,"text":3604},{"id":3685,"depth":485,"text":3686},[3711,3714,3717,3720,3723,3726,3729,3732],{"q":3712,"a":3713},"Ви тільки по PHP?","Глибоко — PHP\u002FLaravel, PostgreSQL, інфраструктура. Для фронтенду і мобільних даю загальну оцінку архітектури.",{"q":3715,"a":3716},"Можна консультацію англійською?","Так.",{"q":3718,"a":3719},"Що таке фракційний тех-лід?","Частина робочого часу досвідченого тех-ліда за частину ціни. Для команд, яким ще рано наймати на повну ставку.",{"q":3721,"a":3722},"Підпишете NDA?","Так, до обговорення деталей.",{"q":3724,"a":3725},"Скільки коштує консультація тех-ліда?","Консультація на 90 хвилин коштує від 3 000 грн, за потреби до 4 000 грн залежно від обсягу матеріалів. У вартість входять підготовка до зустрічі, запис розмови та письмове резюме з рекомендаціями. Точну суму називаємо після короткого опису вашої ситуації.",{"q":3727,"a":3728},"Скільки часу займає оцінка підрядника?","Орієнтовно кілька робочих днів від отримання ТЗ і кошторису. Спершу я вивчаю документи, потім готую письмовий висновок із ризиками та питаннями до виконавця. Вартість — від 6 000 грн, а терміни залежать від обсягу матеріалів і вашої терміновості.",{"q":3730,"a":3731},"Чим тех-лід відрізняється від senior-розробника?","Senior швидко й надійно пише складний код, а тех-лід відповідає за рішення: архітектуру, стандарти, код-рев'ю та оцінку ризиків. Він також пояснює бізнесу технічні компроміси. Часто це різні ролі, хоча в маленьких командах їх поєднує одна людина.",{"q":3733,"a":3734},"Що потрібно від мене для консультації?","Надішліть питання заздалегідь і додайте контекст: сайт, репозиторій, ТЗ або кошторис залежно від теми. Також напишіть про обмеження, як-от бюджет, терміни та склад команди. Що точніше контекст, то більше користі принесуть саме ці 90 хвилин розмови.","Тех-лід на годину, на проєкт або на місяць","sitemap",[3455,3456,3457,3461,3462,3463,3467,3468,3469,3473,3474,3475],{},8,[3741,3748,3756],{"name":3742,"price":3743,"features":3744,"featured":536},"Консультація","3 000 грн",[3745,3746,3747],"Питання заздалегідь","Запис зустрічі","Резюме з рекомендаціями",{"name":3749,"price":3750,"features":3751,"featured":525},"Фракційний тех-лід","від $1 200 \u002F міс",[3752,3753,3754,3755],"Код-рев'ю і архітектура","Участь у плануванні","Співбесіди розробників","Telegram на зв'язку",{"name":3757,"price":2572,"features":3758,"featured":536},"Оцінка підрядника",[3759,3760,3761],"Аналіз ТЗ і кошторису","Ризики і питання до підрядника","Письмовий висновок","\u002Fuk\u002Fservices\u002Ftech-lead",3000,[566,557,3765],"vydilenyi-spetsialist",[561,560,3393],{"title":3402,"description":14},"Фракційний тех-лід для команди: архітектура, код-рев’ю, оцінка підрядників. Консультація 90 хв або постійний супровід. Від 3 000 грн.","Tech Lead на аутсорс — архітектура, код-рев’ю — Tochno.","uk\u002Fservices\u002Ftech-lead","sCIq7uTzi4xm7Qag-dKYEYAPYUFocXKIFqVvvcfGn1s",{"id":130,"title":131,"artifacts":3773,"audience":3774,"benefit":141,"blocks":3775,"body":3816,"currency":494,"description":14,"duration":149,"extension":495,"faq":3960,"h1":521,"icon":522,"includes":3969,"key":141,"meta":3970,"navigation":525,"order":526,"packages":3971,"path":552,"priceFrom":553,"priceLabel":150,"priceUnit":554,"related":3978,"relatedPosts":3979,"seo":3980,"seoDescription":564,"seoTitle":565,"slug":566,"stem":567,"tag":144,"template":568,"updated":141,"__hash__":569},[133,134,135],[137,138,139,140],{"answer":143,"crumb":131,"eyebrow":144,"lead":145,"cta":146,"leadNeed":30,"term":3776,"fitsTitle":168,"fits":3784,"scopeTitle":182,"scopeLead":183,"stack":3789,"scope":3790,"pkgTitle":214,"art":3799,"stepsTitle":243,"steps":3811,"ctaTitle":261,"urlLabel":262,"urlPh":263},{"cmd":148,"time":149,"price":150,"lines":3777},[3778,3779,3780,3781,3782,3783],{"mark":153,"text":154},{"mark":156,"text":157},{"mark":153,"text":159},{"mark":161,"text":162},{"mark":156,"text":164},{"mark":166,"text":167},[3785,3786,3787,3788],{"icon":171,"title":137,"text":172},{"icon":174,"title":138,"text":175},{"icon":177,"title":139,"text":178},{"icon":180,"title":140,"text":181},[185,186,187,188],[3791,3793,3795,3797],{"title":191,"items":3792},[193,194,195],{"title":197,"items":3794},[199,200,201],{"title":203,"items":3796},[205,206,207],{"title":209,"items":3798},[211,212,213],{"title":216,"file":217,"badge":218,"lines":3800,"caption":241,"points":3810},[3801,3802,3803,3804,3805,3806,3807,3808,3809],{"mark":221,"text":222},{"mark":14,"text":224},{"mark":221,"text":226},{"mark":153,"text":228},{"mark":14,"text":230},{"mark":221,"text":232},{"mark":234,"text":235},{"mark":221,"text":237},{"mark":239,"text":240},[133,134,135],[3812,3813,3814,3815],{"when":246,"title":247,"text":248},{"when":250,"title":251,"text":252},{"when":254,"title":255,"text":256},{"when":258,"title":259,"text":260},{"type":265,"value":3817,"toc":3952},[3818,3820,3822,3824,3826,3836,3840,3842,3844,3846,3856,3858,3860,3862,3904,3908,3910,3912,3914,3916,3918,3938,3942,3944,3948],[268,3819,271],{"id":270},[273,3821,275],{},[273,3823,278],{},[273,3825,281],{},[283,3827,3828,3830,3832,3834],{},[286,3829,288],{},[286,3831,291],{},[286,3833,294],{},[286,3835,297],{},[273,3837,300,3838,306],{},[302,3839,305],{"href":304},[268,3841,310],{"id":309},[273,3843,313],{},[273,3845,316],{},[283,3847,3848,3850,3852,3854],{},[286,3849,321],{},[286,3851,324],{},[286,3853,327],{},[286,3855,330],{},[273,3857,333],{},[268,3859,337],{"id":336},[273,3861,340],{},[342,3863,3864,3872],{},[345,3865,3866],{},[348,3867,3868,3870],{},[351,3869,353],{},[351,3871,356],{},[358,3873,3874,3880,3886,3892,3898],{},[348,3875,3876,3878],{},[363,3877,365],{},[363,3879,368],{},[348,3881,3882,3884],{},[363,3883,373],{},[363,3885,376],{},[348,3887,3888,3890],{},[363,3889,381],{},[363,3891,384],{},[348,3893,3894,3896],{},[363,3895,389],{},[363,3897,392],{},[348,3899,3900,3902],{},[363,3901,397],{},[363,3903,400],{},[273,3905,403,3906,306],{},[302,3907,406],{"href":77},[268,3909,410],{"id":409},[273,3911,413],{},[273,3913,416],{},[268,3915,420],{"id":419},[273,3917,423],{},[283,3919,3920,3924,3930,3934],{},[286,3921,428,3922,432],{},[302,3923,431],{"href":31},[286,3925,435,3926,440,3928,306],{},[302,3927,439],{"href":438},[302,3929,444],{"href":443},[286,3931,447,3932,451],{},[302,3933,450],{"href":34},[286,3935,454,3936,306],{},[302,3937,458],{"href":457},[273,3939,461,3940,306],{},[302,3941,465],{"href":464},[268,3943,469],{"id":468},[273,3945,472,3946,306],{},[302,3947,476],{"href":475},[273,3949,479,3950,483],{},[302,3951,482],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":3953},[3954,3955,3956,3957,3958,3959],{"id":270,"depth":485,"text":271},{"id":309,"depth":485,"text":310},{"id":336,"depth":485,"text":337},{"id":409,"depth":485,"text":410},{"id":419,"depth":485,"text":420},{"id":468,"depth":485,"text":469},[3961,3962,3963,3964,3965,3966,3967,3968],{"q":498,"a":499},{"q":501,"a":502},{"q":504,"a":505},{"q":507,"a":508},{"q":510,"a":511},{"q":513,"a":514},{"q":516,"a":517},{"q":519,"a":520},[193,194,195,199,200,201,205,206,207,211,212,213],{},[3972,3974,3976],{"name":529,"price":530,"features":3973,"featured":536},[532,533,534,535],{"name":538,"price":539,"features":3975,"featured":525},[541,542,543,544],{"name":546,"price":547,"features":3977,"featured":536},[549,550,551],[556,557,558],[560,561,562],{"title":131,"description":14},{"id":3982,"title":3983,"artifacts":3984,"audience":3988,"benefit":141,"blocks":3992,"body":4096,"currency":1313,"description":14,"duration":3999,"extension":495,"faq":4276,"h1":4301,"icon":4302,"includes":4303,"key":141,"meta":4304,"navigation":525,"order":4305,"packages":4306,"path":4323,"priceFrom":4324,"priceLabel":4000,"priceUnit":1368,"related":4325,"relatedPosts":4326,"seo":4327,"seoDescription":4328,"seoTitle":4329,"slug":956,"stem":4330,"tag":3994,"template":568,"updated":141,"__hash__":4331},"services_uk\u002Fuk\u002Fservices\u002Ftestuvannia-saitiv.md","Ручне тестування",[3985,3986,3987],"Рішення go \u002F no-go","Пріоритет за впливом на клієнтів","Повторна перевірка після фіксу",[3989,3990,3991,3468],"Регулярні релізи","Немає QA в команді","Мобільний трафік",{"answer":3993,"crumb":3983,"eyebrow":3994,"lead":3995,"cta":3996,"leadNeed":123,"term":3997,"fitsTitle":4014,"fits":4015,"scopeTitle":4027,"scopeLead":4028,"stack":4029,"scope":4035,"pkgTitle":4055,"art":4056,"stepsTitle":4080,"steps":4081,"ctaTitle":687,"urlLabel":4095,"urlPh":689},"Тестування сайтів — це ручна перевірка сайту або магазину живим QA-інженером перед кожним релізом: за тест-кейсами, на реальних iPhone і Android, з баг-репортами та рішенням go \u002F no-go. Підходить командам без власного QA. Вартість — від $20 за годину, разовий регрес — від 4 000 грн, перший день пробний.","QA · MANUAL","Тест-кейси, регрес, перевірка на реальних iPhone і Android. QA-інженер працює у вашому трекері і знаходить баги до того, як їх знайдуть клієнти.","Забронювати QA",{"cmd":3998,"time":3999,"price":4000,"lines":4001},"$ regression --release=2.14","1 день","від $20 \u002F год",[4002,4004,4006,4008,4010,4012],{"mark":161,"text":4003},"Авторизація · 8 кейсів",{"mark":161,"text":4005},"Каталог · 14 кейсів",{"mark":153,"text":4007},"Кошик · промокод iOS",{"mark":161,"text":4009},"Оплата · 6 кейсів",{"mark":156,"text":4011},"Android 10 · шрифти",{"mark":166,"text":4013},"41\u002F43 пройдено","Коли потрібен QA-інженер",[4016,4018,4021,4024],{"icon":2593,"title":3989,"text":4017},"Кожне оновлення ламає щось старе — потрібен регрес за чек-листом.",{"icon":4019,"title":3990,"text":4020},"users-minus","Розробники тестують самі і пропускають очевидне.",{"icon":4022,"title":3991,"text":4023},"device-mobile","Більшість клієнтів з телефона, а перевіряють на десктопі.",{"icon":4025,"title":3468,"text":4026},"file-check","Незалежна перевірка перед оплатою підряднику.","Тестування, яке можна повторити","Все фіксуємо в тест-кейсах — наступний регрес займає години, а не дні.",[4030,4031,4032,4033,4034],"TestRail","Jira","Linear","BrowserStack","Charles",[4036,4041,4045,4049],{"title":938,"items":4037},[4038,4039,4040],"Тест-кейси і чек-листи","Матриця пристроїв і браузерів","Оновлення після кожного релізу",{"title":123,"items":4042},[4043,4044,2267],"Функціональне і регресійне","Кросбраузерне і мобільне",{"title":640,"items":4046},[2973,4047,4048],"Звіт по релізу: go \u002F no-go","Метрики: знайдено, виправлено",{"title":4050,"items":4051},"Пристрої",[4052,4053,4054],"iPhone 12–15, iOS 16–18","Samsung, Xiaomi, Pixel","Safari, Chrome, Firefox, Edge","Разово або на постійній основі",{"title":4057,"file":4058,"badge":4059,"lines":4060,"caption":4078,"points":4079},"Так виглядає звіт по релізу","release-2.14.report","NO-GO",[4061,4063,4065,4067,4069,4071,4073,4075,4076],{"mark":221,"text":4062},"Реліз 2.14 · 43 кейси",{"mark":161,"text":4064},"41 пройдено",{"mark":153,"text":4066},"BUG-208 Critical: промокод скидається на iOS",{"mark":153,"text":4068},"BUG-209 Minor: обрізаний текст на Android 10",{"mark":221,"text":4070},"Рекомендація",{"mark":234,"text":4072},"Виправити BUG-208 до релізу",{"mark":234,"text":4074},"BUG-209 — у наступний спринт",{"mark":221,"text":551},{"mark":239,"text":4077},"після фіксу · ~2 год","Замість «ми потестили, наче все ок» — чітке рішення: випускати чи ні, і що саме заважає.",[3985,3986,3987],"Як підключаємось до команди",[4082,4085,4089,4092],{"when":1912,"title":4083,"text":4084},"Знайомство","Доступи, трекер, огляд продукту.",{"when":4086,"title":4087,"text":4088},"дні 2–3","Тест-кейси","Описуємо ключові сценарії.",{"when":1918,"title":4090,"text":4091},"Регрес","Прогін кейсів, баг-репорти.",{"when":4093,"title":259,"text":4094},"щотижня","Метрики якості і ризики.","Посилання на сайт або застосунок",{"type":265,"value":4097,"toc":4268},[4098,4102,4105,4108,4125,4128,4131,4133,4136,4139,4142,4146,4149,4199,4209,4213,4219,4222,4226,4229,4247,4251,4256,4259,4265],[268,4099,4101],{"id":4100},"що-входить-у-ручне-тестування","Що входить у ручне тестування",[273,4103,4104],{},"Ручне тестування — це регулярна робота з вашим продуктом, а не одноразова перевірка. QA-інженер підключається до вашого трекера, описує ключові сценарії у тест-кейсах і прогонює їх перед кожним випуском.",[273,4106,4107],{},"Що ви отримуєте на практиці:",[283,4109,4110,4113,4116,4119,4122],{},[286,4111,4112],{},"тест-кейси і чек-листи, які оновлюються після кожного релізу;",[286,4114,4115],{},"функціональне та регресійне тестування, а також смоук-перевірку після деплою;",[286,4117,4118],{},"кросбраузерну і мобільну перевірку: Safari, Chrome, Firefox, Edge, iPhone 12–15, Samsung, Xiaomi, Pixel;",[286,4120,4121],{},"баг-репорти з відео, кроками відтворення і пріоритетом за впливом на клієнтів;",[286,4123,4124],{},"звіт по релізу з чітким рішенням: випускати чи ні.",[273,4126,4127],{},"Така послуга найкраще працює, коли розробники тестують самі й пропускають очевидне, коли більшість клієнтів приходить з телефона або коли треба незалежно прийняти роботу підрядника перед оплатою.",[273,4129,4130],{},"Реальні пристрої ми доповнюємо BrowserStack лише для рідкісних комбінацій. Так ви бачите те, що бачить покупець, а не те, що показує емулятор.",[268,4132,831],{"id":830},[273,4134,4135],{},"Старт зазвичай займає два робочі дні. У перший день ми отримуємо доступи, знайомимося з продуктом і трекером. Наступні два дні описуємо найважливіші сценарії: вхід, пошук, кошик, оплату, форми.",[273,4137,4138],{},"Далі кожен реліз проходить один і той самий цикл: регрес за кейсами, баг-репорти, повторна перевірка після виправлень, короткий звіт. Щотижня ви отримуєте підсумок: що знайдено, що виправлено, які ризики лишилися.",[273,4140,4141],{},"Якщо ви не певні, чи вам це потрібно, почніть із пробного дня. Оплата — тільки якщо ми продовжуємо.",[268,4143,4145],{"id":4144},"скільки-коштує-тестування-сайту-і-від-чого-залежить-ціна","Скільки коштує тестування сайту і від чого залежить ціна",[273,4147,4148],{},"Тестування сайту коштує від $20 за годину. Разовий регрес за чек-листом — від 4 000 грн, QA на місяць — від $800. Підсумок залежить від обсягу продукту та частоти релізів.",[342,4150,4151,4159],{},[345,4152,4153],{},[348,4154,4155,4157],{},[351,4156,353],{},[351,4158,356],{},[358,4160,4161,4168,4176,4184,4191],{},[348,4162,4163,4165],{},[363,4164,776],{},[363,4166,4167],{},"Більше кейсів — довший перший регрес, але повторні прогони дешевші",[348,4169,4170,4173],{},[363,4171,4172],{},"Частота релізів",[363,4174,4175],{},"Щотижневі релізи вигідніше закривати місячним пакетом, ніж погодинно",[348,4177,4178,4181],{},[363,4179,4180],{},"Пристрої та браузери",[363,4182,4183],{},"Ширша матриця означає більше годин на кросбраузерну перевірку",[348,4185,4186,4188],{},[363,4187,792],{},[363,4189,4190],{},"Оплата, доставка, CRM потребують окремих кейсів",[348,4192,4193,4196],{},[363,4194,4195],{},"Наявність документації",[363,4197,4198],{},"Готові вимоги скорочують час на знайомство з продуктом",[273,4200,4201,4202,4204,4205,4208],{},"Погодинна оплата підходить для разових задач: мінімальне замовлення — один день, тобто 8 годин. Актуальні ставки по ролях є на сторінці ",[302,4203,406],{"href":77},". Точну оцінку ми даємо після ",[302,4206,4207],{"href":17},"брифу",", зазвичай за один робочий день.",[268,4210,4212],{"id":4211},"ручне-тестування-чи-qa-аудит-магазину","Ручне тестування чи QA-аудит магазину",[273,4214,4215,4216,4218],{},"Це дві різні послуги. Ручне тестування — постійна робота з кожним релізом вашого сайту чи застосунку. Якщо ж вам потрібна одноразова глибока перевірка саме інтернет-магазину за чек-листом на 150+ пунктів, обирайте ",[302,4217,431],{"href":31},": від 6 000 грн за 3–5 днів. Він і дешевший на старті, і дає повну картину проблем до запуску реклами.",[273,4220,4221],{},"Часто ці формати поєднують: спершу аудит, потім регулярне тестування на кожен реліз.",[268,4223,4225],{"id":4224},"коли-ручне-тестування-не-підійде","Коли ручне тестування не підійде",[273,4227,4228],{},"Ручне тестування не завжди найкращий вибір. Ось кілька ситуацій і кращі альтернативи:",[283,4230,4231,4239,4244],{},[286,4232,4233,4234,4236,4237,306],{},"Одні й ті самі сценарії повторюються щотижня, а ручний регрес забирає багато годин. Тут краще ",[302,4235,1663],{"href":443}," на Playwright. Різницю детально розбираємо у статті ",[302,4238,873],{"href":872},[286,4240,4241,4242,306],{},"Баги, схоже, живуть у самому коді: повільні запити, слабка архітектура. Тоді потрібен ",[302,4243,866],{"href":865},[286,4245,4246],{},"Сайт простий, і ви хочете лише швидко зрозуміти, чи є явні проблеми. Почніть із безкоштовного експрес-чеку за 48 годин.",[268,4248,4250],{"id":4249},"чим-тестування-у-tochno-відрізняється","Чим тестування у Tochno відрізняється",[273,4252,4253,4254,306],{},"Ми не обмежуємося фразою «все працює». Кожен баг приходить із відео, кроками і пріоритетом, який відображає вплив на клієнтів, а не абстрактну критичність. Приклад такого репорту та тест-кейсу описано в статті ",[302,4255,2807],{"href":2806},[273,4257,4258],{},"Працюємо у вашому трекері: Jira, Linear, Trello, ClickUp, YouTrack. Після виправлень перевіряємо повторно. А наприкінці кожного релізу ви отримуєте не гадання, а рішення go \u002F no-go з переліком того, що заважає запуску.",[273,4260,4261,4262,306],{},"Якщо потрібна постійна підтримка поряд із розробкою, дивіться також ",[302,4263,4264],{"href":889},"підтримку сайту з QA",[273,4266,4267],{},"Якщо хочете оцінити обсяг робіт заздалегідь, надішліть посилання на сайт або застосунок, і ми підкажемо, з чого почати.",{"title":14,"searchDepth":485,"depth":486,"links":4269},[4270,4271,4272,4273,4274,4275],{"id":4100,"depth":485,"text":4101},{"id":830,"depth":485,"text":831},{"id":4144,"depth":485,"text":4145},{"id":4211,"depth":485,"text":4212},{"id":4224,"depth":485,"text":4225},{"id":4249,"depth":485,"text":4250},[4277,4280,4283,4286,4289,4292,4295,4298],{"q":4278,"a":4279},"Чим відрізняється від QA-аудиту?","Аудит — разова глибока перевірка. Ручне тестування — регулярна робота з кожним релізом.",{"q":4281,"a":4282},"Працюєте у нашому трекері?","Так: Jira, Linear, Trello, ClickUp, YouTrack.",{"q":4284,"a":4285},"Які пристрої маєте?","Реальні iPhone і Android плюс BrowserStack для рідкісних комбінацій.",{"q":4287,"a":4288},"Можна почати з тесту?","Так, перший день — пробний, оплата тільки якщо продовжуємо.",{"q":4290,"a":4291},"Скільки коштує тестування сайту?","Тестування сайту коштує від $20 за годину, разовий регрес за чек-листом — від 4 000 грн, QA на місяць — від $800. Остаточна сума залежить від кількості сценаріїв, частоти релізів і ширини матриці пристроїв. Оцінку даємо після брифу.",{"q":4293,"a":4294},"Скільки часу займає ручне тестування?","Старт займає близько двох робочих днів: доступи, знайомство з продуктом і перші тест-кейси. Перший день можна використати як пробний. Один регрес перед релізом зазвичай займає від кількох годин до одного дня, залежно від кількості сценаріїв і пристроїв.",{"q":4296,"a":4297},"Чим ручне тестування відрізняється від автоматизованого?","Ручне тестування виконує людина, і воно гнучке: добре ловить проблеми UX, незвичні сценарії і нові функції, які ще не мають тестів. Автотести швидко повторюють стабільні сценарії. Для більшості малих проєктів починати краще з ручного QA, а автотести додавати згодом.",{"q":4299,"a":4300},"Що потрібно від мене, щоб почати тестування?","Потрібне посилання на сайт чи застосунок, доступ до тестового середовища та вашого трекера (Jira, Linear, Trello чи іншого), а також короткий опис ключових сценаріїв. Якщо документації немає, не страшно: тест-кейси ми допишемо самі за перші два-три дні.","Ручне тестування перед кожним релізом","test-pipe",[4038,4039,4040,4043,4044,2267,2973,4047,4048,4052,4053,4054],{},5,[4307,4312,4319],{"name":4308,"price":4309,"features":4310,"featured":536},"Разовий регрес","від 4 000 грн",[4311,2973,3985],"Чек-лист або тест-кейси",{"name":4313,"price":4314,"features":4315,"featured":525},"QA на місяць","від $800 \u002F міс",[4316,2266,4317,4318],"Тест-кейси і їх підтримка","Робота у вашому трекері","Щотижневий звіт",{"name":2190,"price":4000,"features":4320,"featured":536},[4321,4322],"Старт за 2 робочі дні","Звіт після кожної сесії","\u002Fuk\u002Fservices\u002Ftestuvannia-saitiv",20,[955,558,957],[959,960,2987],{"title":3983,"description":14},"Ручне QA-тестування перед релізом: регрес, кросбраузерність, мобільна версія. Звіт з відео і пріоритетами багів. Від $20 за годину.","Тестування сайтів та інтернет-магазинів — Tochno.","uk\u002Fservices\u002Ftestuvannia-saitiv","EeGx4RBNaKqw-nHGiStfjlj1RLiR_B2YEmbw9obs8pA",{"id":4333,"title":4334,"artifacts":4335,"audience":4339,"benefit":141,"blocks":4344,"body":4447,"currency":1313,"description":14,"duration":4351,"extension":495,"faq":4636,"h1":4661,"icon":4662,"includes":4663,"key":141,"meta":4664,"navigation":525,"order":4665,"packages":4666,"path":4681,"priceFrom":4324,"priceLabel":4000,"priceUnit":1368,"related":4682,"relatedPosts":4683,"seo":4684,"seoDescription":4685,"seoTitle":4686,"slug":1370,"stem":4687,"tag":4346,"template":568,"updated":141,"__hash__":4688},"services_uk\u002Fuk\u002Fservices\u002Fui-ux-dyzain.md","UI\u002FUX дизайн",[4336,4337,4338],"Всі стани компонентів","Токени, а не «на око»","Перевірка контрасту WCAG",[4340,4341,4342,4343],"Сайт на шаблоні","Макети без станів","Слабкий мобільний UX","Хаос у інтерфейсі",{"answer":4345,"crumb":4334,"eyebrow":4346,"lead":4347,"cta":4348,"leadNeed":124,"term":4349,"fitsTitle":4365,"fits":4366,"scopeTitle":4378,"scopeLead":4379,"stack":4380,"scope":4384,"pkgTitle":4407,"art":4408,"stepsTitle":4432,"steps":4433,"ctaTitle":261,"urlLabel":4446,"urlPh":3105},"UI\u002FUX дизайн сайту — це прототип, візуальний дизайн сторінок і UI-кіт у Figma, які розробник реалізує без здогадок. Підходить власникам сайтів і магазинів, яким потрібен власний стиль, адаптив і чіткі стани інтерфейсу. Прототип коштує від 8 000 грн, дизайн сайту — від 30 000 грн, погодинно — від $20, а перші результати з'являються від 1 тижня.","ДИЗАЙН · FIGMA","Прототипи, дизайн сторінок і UI-кіт у Figma — з усіма станами, адаптивом і відступами. Ніяких «а як це має виглядати на мобільному?» посеред розробки.","Обговорити дизайн",{"cmd":4350,"time":4351,"price":4000,"lines":4352},"$ figma handoff --check","від 1 тиж.",[4353,4355,4357,4359,4361,4363],{"mark":161,"text":4354},"Desktop · 1440",{"mark":161,"text":4356},"Mobile · 375",{"mark":161,"text":4358},"Стани: hover, error, empty",{"mark":161,"text":4360},"Токени кольорів і типографіки",{"mark":156,"text":4362},"Контраст сірого 3.9:1",{"mark":166,"text":4364},"42 компоненти в UI-кіті","Коли потрібен дизайнер",[4367,4370,4373,4375],{"icon":4368,"title":4340,"text":4369},"template","Виглядає як у всіх — потрібен власний візуальний стиль.",{"icon":4371,"title":4341,"text":4372},"arrows-diff","Розробник вгадує, як виглядає помилка чи порожній список.",{"icon":4022,"title":4342,"text":4374},"Більшість трафіку з телефона, а дизайн — під десктоп.",{"icon":4376,"title":4343,"text":4377},"components","П'ять видів кнопок — потрібна дизайн-система.","Від структури до UI-кіту","Спочатку — прототип і структура, де зміни дешеві. Потім — візуал, коли логіка вже погоджена.",[3041,4381,4382,4383],"FigJam","Variables","Auto layout",[4385,4390,4396,4402],{"title":4386,"items":4387},"UX",[4388,4389,1349],"Карта сайту і користувацькі сценарії","Wireframes ключових сторінок",{"title":4391,"items":4392},"UI",[4393,4394,4395],"Дизайн-концепт у 1–2 варіантах","Всі сторінки desktop + mobile","Іконки, ілюстрації, фото-стиль",{"title":4397,"items":4398},"Дизайн-система",[4399,4400,4401],"Кольори, типографіка, сітка","Компоненти з усіма станами","Токени для розробки",{"title":646,"items":4403},[4404,4405,4406],"Специфікація відступів і поведінки","Експорт графіки","Супровід розробки","Прототип, дизайн або система",{"title":4409,"file":4410,"badge":3068,"lines":4411,"caption":4430,"points":4431},"Так виглядає специфікація компонента","Button \u002F Primary",[4412,4414,4416,4418,4420,4422,4424,4426,4428],{"mark":221,"text":4413},"Розміри",{"mark":14,"text":4415},"sm 36 · md 44 · lg 52 px · radius 10",{"mark":221,"text":4417},"Стани",{"mark":161,"text":4419},"default · hover · active · focus · disabled · loading",{"mark":221,"text":4421},"Кольори",{"mark":14,"text":4423},"bg accent\u002F500 → hover accent\u002F600",{"mark":14,"text":4425},"text ink\u002F900 · контраст 5.8:1",{"mark":221,"text":4427},"Поведінка",{"mark":234,"text":4429},"loading: спінер, ширина не змінюється","Кожен компонент описаний так, що розробнику не треба питати. Економія — десятки годин на уточненнях.",[4336,4337,4338],"Від брифу до передачі",[4434,4437,4440,4443],{"when":676,"title":4435,"text":4436},"Дослідження","Бриф, конкуренти, сценарії.",{"when":679,"title":4438,"text":4439},"Прототип","Структура і логіка сторінок.",{"when":4441,"title":124,"text":4442},"тиж. 2–3","Концепти, погодження, всі екрани.",{"when":4444,"title":646,"text":4445},"тиж. 4","UI-кіт, специфікації, супровід.","Поточний сайт або приклад",{"type":265,"value":4448,"toc":4629},[4449,4453,4456,4482,4485,4489,4494,4553,4557,4563,4566,4568,4594,4597,4600,4604,4618,4621],[268,4450,4452],{"id":4451},"що-входить-у-дизайн","Що входить у дизайн",[273,4454,4455],{},"Робота йде від структури до візуалу, бо зміни в логіці дешевші на ранніх етапах:",[283,4457,4458,4464,4470,4476],{},[286,4459,4460,4463],{},[2333,4461,4462],{},"UX."," Карта сайту, користувацькі сценарії, wireframes ключових сторінок, клікабельний прототип.",[286,4465,4466,4469],{},[2333,4467,4468],{},"UI."," Дизайн-концепт у 1–2 варіантах, усі сторінки для desktop і mobile, іконки, ілюстрації та фото-стиль.",[286,4471,4472,4475],{},[2333,4473,4474],{},"Дизайн-система."," Кольори, типографіка, сітка, компоненти з усіма станами, токени для розробки.",[286,4477,4478,4481],{},[2333,4479,4480],{},"Передача."," Специфікація відступів і поведінки, експорт графіки, супровід розробки.",[273,4483,4484],{},"Файл Figma передаємо у ваш акаунт, і макетами володієте ви. Логотипи та брендинг ми не робимо, лише інтерфейси.",[268,4486,4488],{"id":4487},"скільки-коштує-веб-дизайн-і-від-чого-залежить-ціна","Скільки коштує веб-дизайн і від чого залежить ціна",[273,4490,4491,4492,306],{},"Веб-дизайн ціна якого залежить насамперед від кількості унікальних екранів і глибини опрацювання. У пакетах діапазони такі: прототип від 8 000 грн, дизайн сайту від 30 000 грн, погодинна робота від $20. Усі проєктні орієнтири зібрані на сторінці ",[302,4493,406],{"href":77},[342,4495,4496,4504],{},[345,4497,4498],{},[348,4499,4500,4502],{},[351,4501,353],{},[351,4503,356],{},[358,4505,4506,4514,4522,4530,4537,4545],{},[348,4507,4508,4511],{},[363,4509,4510],{},"Кількість сторінок і шаблонів",[363,4512,4513],{},"Кожен унікальний шаблон потребує окремого макета для desktop і mobile",[348,4515,4516,4519],{},[363,4517,4518],{},"Концепти",[363,4520,4521],{},"Два варіанти концепту вимагають більше часу, ніж один",[348,4523,4524,4527],{},[363,4525,4526],{},"Складність інтерфейсів",[363,4528,4529],{},"Кошик, фільтри, особистий кабінет мають багато станів",[348,4531,4532,4534],{},[363,4533,4397],{},[363,4535,4536],{},"UI-кіт із компонентами та токенами додає обсяг, але економить час розробки",[348,4538,4539,4542],{},[363,4540,4541],{},"Наявні матеріали",[363,4543,4544],{},"Готовий бриф, референси та контент прискорюють роботу",[348,4546,4547,4550],{},[363,4548,4549],{},"Правки",[363,4551,4552],{},"Два раунди на кожному етапі входять у ціну, додаткові рахуються погодинно",[268,4554,4556],{"id":4555},"дизайн-інтернет-магазину-на-чому-ми-робимо-акцент","Дизайн інтернет-магазину: на чому ми робимо акцент",[273,4558,4559,4560,4562],{},"Для магазину важливі сторінки, де приймається рішення про покупку: каталог із фільтрами, картка товару, кошик і оформлення замовлення. Тут легко втратити замовлення через дрібниці. Про типові причини, чому покупці кидають кошик, є стаття ",[302,4561,722],{"href":721},". Окремо опрацьовуємо мобільну версію, бо значна частина відвідувачів приходить із телефона.",[273,4564,4565],{},"Для магазину також варто заздалегідь погодити, як виглядатимуть порожній кошик, помилка оплати, відсутність товару та довгі назви в картках. Такі екрани рідко малюють «з першого разу», але саме вони найчастіше ламають враження від сайту після запуску.",[268,4567,831],{"id":830},[1207,4569,4570,4576,4582,4588],{},[286,4571,4572,4575],{},[2333,4573,4574],{},"Тиждень 1."," Дослідження: бриф, конкуренти, сценарії.",[286,4577,4578,4581],{},[2333,4579,4580],{},"Тижні 1–2."," Прототип: структура й логіка сторінок.",[286,4583,4584,4587],{},[2333,4585,4586],{},"Тижні 2–3."," Дизайн: концепти, погодження, усі екрани.",[286,4589,4590,4593],{},[2333,4591,4592],{},"Тиждень 4."," Передача: UI-кіт, специфікації, супровід.",[273,4595,4596],{},"Прототип дає змогу побачити логіку сайту ще до того, як намальовано перший екран. На ньому легко виявити зайві кроки, неочевидну навігацію та забуті сценарії, а виправлення на цьому етапі займає години, а не дні.",[273,4598,4599],{},"Терміни орієнтовні й залежать від кількості сторінок. Після погодження ви отримуєте не лише картинки, а й структурований файл, у якому легко орієнтуватися: сторінки, компоненти та стилі названі зрозуміло, тож будь-який розробник швидко знайде потрібне. Спочатку ви погоджуєте прототип, і лише потім ми переходимо до візуалу.",[268,4601,4603],{"id":4602},"коли-дизайнер-не-потрібен-і-чим-відрізняється-наш-підхід","Коли дизайнер не потрібен і чим відрізняється наш підхід",[273,4605,4606,4607,440,4610,4613,4614,4617],{},"Якщо вам потрібна лише реалізація вже готових макетів, то замовляйте ",[302,4608,4609],{"href":25},"розробку сайту",[302,4611,4612],{"href":2065},"full-stack на Nuxt",". Для сайту, який уже працює і потребує лише перевірки якості інтерфейсу, почніть із ",[302,4615,4616],{"href":31},"QA-аудиту інтернет-магазину",". А якщо вас цікавить логотип чи фірмовий стиль, це не наш профіль, і ми порадимо брендингову студію.",[273,4619,4620],{},"Практичний результат такий: розробник отримує макети з усіма станами, зокрема помилкою, порожнім списком і завантаженням, і не вгадує, як має виглядати екран. Менше уточнень посеред розробки означає менше переробок.",[273,4622,4623,4624,4626,4627,306],{},"Кожен компонент описаний так, що розробнику не потрібно перепитувати: розміри, стани, кольори та поведінка. Ми перевіряємо контраст за WCAG і використовуємо токени замість значень «на око». Дизайном займається команда, що сама ж пише код, тож макети враховують можливості реалізації. Оцінити, як це виглядає в практиці, допоможе стаття ",[302,4625,3318],{"href":3317},". Для UI\u002FUX дизайну сайту корисно прийти з прикладами, які вам подобаються, і з тим, що не подобається в нинішньому варіанті. Це скорочує етап дослідження та допомагає швидше потрапити в очікуваний стиль. Коли будете готові, опишіть задачу в ",[302,4628,1731],{"href":17},{"title":14,"searchDepth":485,"depth":486,"links":4630},[4631,4632,4633,4634,4635],{"id":4451,"depth":485,"text":4452},{"id":4487,"depth":485,"text":4488},{"id":4555,"depth":485,"text":4556},{"id":830,"depth":485,"text":831},{"id":4602,"depth":485,"text":4603},[4637,4640,4643,4646,4649,4652,4655,4658],{"q":4638,"a":4639},"Скільки раундів правок?","Два на кожному етапі входять у ціну. Зазвичай цього достатньо.",{"q":4641,"a":4642},"Можна дизайн без розробки?","Так. Макети будуть готові для будь-якого розробника.",{"q":4644,"a":4645},"Робите логотипи і брендинг?","Ні, тільки інтерфейси. Порадимо брендингову студію.",{"q":4647,"a":4648},"Хто володіє макетами?","Ви. Файл Figma передаємо у ваш акаунт.",{"q":4650,"a":4651},"Скільки коштує дизайн сайту?","Прототип коштує від 8 000 грн, повний дизайн сайту — від 30 000 грн, а погодинна робота — від $20. Остаточна сума залежить від кількості сторінок, складності інтерфейсів і кількості концептів. Точну вартість називаємо після опису проєкту.",{"q":4653,"a":4654},"Скільки часу займає UI\u002FUX дизайн сайту?","Орієнтовно від 1 тижня для простого прототипу і близько 4 тижнів для повного циклу: дослідження, прототип, дизайн і передача розробнику. Терміни залежать від кількості сторінок і швидкості погоджень з вашого боку. Точніший графік складаємо після брифу.",{"q":4656,"a":4657},"Чим UX відрізняється від UI дизайну?","UX відповідає за структуру: сценарії, навігацію та логіку сторінок, а UI — за візуальну частину: кольори, типографіку й компоненти. Ми починаємо з прототипу, де зміни дешеві, і лише після погодження логіки переходимо до візуалу, щоб правки коштували менше.",{"q":4659,"a":4660},"Що потрібно від мене для початку роботи над дизайном?","Заповніть бриф і додайте посилання на поточний сайт, якщо він є, та приклади, які вам подобаються. Корисні також опис аудиторії, список потрібних сторінок і тексти. Якщо чогось немає, ми допоможемо скласти це на етапі дослідження.","Дизайн, який розробник реалізує без здогадок","layout-grid",[4388,4389,1349,4393,4394,4395,4399,4400,4401,4404,4405,4406],{},10,[4667,4671,4677],{"name":4438,"price":2175,"features":4668,"featured":536},[4669,4670,1349],"Карта сайту","Wireframes 5–8 сторінок",{"name":4672,"price":4673,"features":4674,"featured":525},"Дизайн сайту","від 30 000 грн",[4675,4394,4676,4406],"Прототип + 2 концепти","UI-кіт",{"name":2190,"price":4000,"features":4678,"featured":536},[4679,4680],"Нові сторінки і компоненти","Правки існуючого дизайну","\u002Fuk\u002Fservices\u002Fui-ux-dyzain",[3397,1377,955],[961,3393,562],{"title":4334,"description":14},"Прототипи, UI-кіт і дизайн у Figma для сайтів і магазинів. Адаптив 375\u002F768\u002F1440 і передача розробнику. Від $20 за годину.","UI\u002FUX дизайн сайту та інтернет-магазину — Tochno.","uk\u002Fservices\u002Fui-ux-dyzain","QowS6toaaaGbExIODPdRybh92heMiiEuIGSidZby5g8",{"id":4690,"title":4691,"artifacts":4692,"audience":4696,"benefit":141,"blocks":4701,"body":4798,"currency":1313,"description":14,"duration":4708,"extension":495,"faq":4989,"h1":5014,"icon":5015,"includes":5016,"key":141,"meta":5017,"navigation":525,"order":5018,"packages":5019,"path":5035,"priceFrom":5036,"priceLabel":4709,"priceUnit":2549,"related":5037,"relatedPosts":5038,"seo":5039,"seoDescription":5040,"seoTitle":5041,"slug":3765,"stem":5042,"tag":4703,"template":568,"updated":141,"__hash__":5043},"services_uk\u002Fuk\u002Fservices\u002Fvydilenyi-spetsialist.md","Виділений спеціаліст",[4693,4694,4695],"Години по задачах","Блокери — одразу","Фідбек від тех-ліда",[4697,4698,4699,4700],"Потрібно швидко","На обмежений час","Не вмієте оцінити","Ризик звільнення",{"answer":4702,"crumb":4691,"eyebrow":4703,"lead":4704,"cta":4705,"leadNeed":125,"term":4706,"fitsTitle":4721,"fits":4722,"scopeTitle":726,"scopeLead":4734,"stack":4735,"scope":4738,"pkgTitle":4760,"art":4761,"stepsTitle":4783,"steps":4784,"ctaTitle":4796,"urlLabel":4797,"urlPh":3105},"Аутстаф PHP розробника, QA чи тех-ліда — це коли спеціаліст працює у вашій команді, трекері та процесах, а договір, заміну й контроль якості бере на себе Tochno. Підходить, коли потрібно швидко посилити команду без найму. Вартість — від $1 800 на місяць, старт орієнтовно за 5 днів, мінімальний термін — 1 місяць.","КОМАНДА · OUTSTAFF","Людина працює у ваших процесах і трекері, part- або full-time. Без найму, податків і пошуку — старт за тиждень, заміна за наш рахунок.","Підібрати спеціаліста",{"cmd":4707,"time":4708,"price":4709,"lines":4710},"$ tochno assign --role=qa","старт 5 днів","від $1 800 \u002F міс",[4711,4713,4715,4717,4718,4719],{"mark":161,"text":4712},"Співбесіда з вами",{"mark":161,"text":4714},"Доступи і онбординг",{"mark":161,"text":4716},"Щоденні стендапи",{"mark":166,"text":2187},{"mark":161,"text":2188},{"mark":166,"text":4720},"Заміна за 5 днів","Коли це вигідніше за найм",[4723,4726,4729,4731],{"icon":4724,"title":4697,"text":4725},"hourglass","Найм займає 1–2 місяці, а задачі вже горять.",{"icon":4727,"title":4698,"text":4728},"calendar-time","Проєкт на 3–6 місяців — немає сенсу наймати в штат.",{"icon":2596,"title":4699,"text":4730},"Складно перевірити технічний рівень кандидата.",{"icon":4732,"title":4700,"text":4733},"shield-half","Людина пішла — знання пішли. У нас є заміна.","Спеціаліст працює як частина вашої команди, а ми відповідаємо за якість і заміну.",[4736,1019,4737,33],"QA","Vue \u002F Nuxt",[4739,4745,4749,4754],{"title":4740,"items":4741},"Ролі",[4742,4743,4744],"QA-інженер (manual \u002F automation)","Middle \u002F Senior Laravel-розробник","Тех-лід part-time",{"title":2313,"items":4746},[4747,4748,4318],"Ваш трекер, чати і стендапи","Години у вашому часовому поясі",{"title":1452,"items":4750},[4751,4752,4753],"Код-рев'ю нашим тех-лідом","Щомісячний фідбек від вас","Заміна за 5 робочих днів",{"title":4755,"items":4756},"Умови",[4757,4758,4759],"Договір, рахунок щомісяця","NDA і передача прав","Мінімум — 1 місяць","Part-time або full-time",{"title":4762,"file":4763,"badge":4764,"lines":4765,"caption":4781,"points":4782},"Так виглядає щотижневий звіт спеціаліста","weekly · тиждень 12","38 год",[4766,4767,4769,4771,4773,4775,4777,4779],{"mark":221,"text":2284},{"mark":161,"text":4768},"SHOP-412 Фільтри каталогу · 12 год",{"mark":161,"text":4770},"SHOP-418 Інтеграція з KeyCRM · 16 год",{"mark":161,"text":4772},"Код-рев'ю 6 PR · 4 год",{"mark":221,"text":4774},"В роботі",{"mark":996,"text":4776},"SHOP-421 Експорт замовлень",{"mark":221,"text":4778},"Блокери",{"mark":156,"text":4780},"Немає доступу до staging CRM з понеділка","Ви бачите, на що пішли години, і де потрібна ваша допомога — без мікроменеджменту.",[4693,4694,4695],"Від запиту до першого дня",[4785,4788,4791,4794],{"when":1912,"title":4786,"text":4787},"Запит","Роль, стек, обсяг, задачі.",{"when":4086,"title":4789,"text":4790},"Підбір","Пропонуємо 1–2 кандидатів.",{"when":2719,"title":4792,"text":4793},"Співбесіда","Ви спілкуєтесь і обираєте.",{"when":2722,"title":934,"text":4795},"Доступи, онбординг, перші задачі.","Кого шукаєте","Сайт компанії або вакансія",{"type":265,"value":4799,"toc":4982},[4800,4804,4807,4826,4831,4835,4840,4892,4895,4899,4902,4928,4931,4937,4940,4943,4947,4950,4969,4973,4976],[268,4801,4803],{"id":4802},"які-ролі-можна-підключити","Які ролі можна підключити",[273,4805,4806],{},"Спеціаліст працює як частина вашої команди: ваш трекер, чати, стендапи й години у вашому часовому поясі. Ролі такі:",[283,4808,4809,4815,4821],{},[286,4810,4811,4814],{},[2333,4812,4813],{},"QA-інженер"," (manual або automation): тестування релізів, тест-кейси, звіти. Від $1 800 на місяць у форматі part-time.",[286,4816,4817,4820],{},[2333,4818,4819],{},"Middle або Senior Laravel-розробник",": повна інтеграція в команду, код-рев'ю нашого тех-ліда. Від $3 800 на місяць у форматі full-time.",[286,4822,4823,4825],{},[2333,4824,4744],{},": код-рев'ю, планування й архітектура, співбесіди. Від $1 200 на місяць.",[273,4827,4828,4829,306],{},"Для більшості команд найвигідніше починати з однієї ролі та за потреби додавати інші: так простіше оцінити результат. Про те, яку з ролей брати першою, читайте в статті ",[302,4830,3600],{"href":464},[268,4832,4834],{"id":4833},"скільки-коштує-аутстаф-і-від-чого-залежить-ціна","Скільки коштує аутстаф і від чого залежить ціна",[273,4836,4837,4838,306],{},"Ціни на сторінці наведені як «від». Остаточна ставка залежить від вашої конкретної задачі. Загальні орієнтири по всіх послугах — на сторінці ",[302,4839,406],{"href":77},[342,4841,4842,4850],{},[345,4843,4844],{},[348,4845,4846,4848],{},[351,4847,353],{},[351,4849,356],{},[358,4851,4852,4860,4868,4876,4884],{},[348,4853,4854,4857],{},[363,4855,4856],{},"Роль",[363,4858,4859],{},"QA, розробник і тех-лід мають різні ставки",[348,4861,4862,4865],{},[363,4863,4864],{},"Зайнятість",[363,4866,4867],{},"Part-time дешевший за full-time, бо оплачується менше годин",[348,4869,4870,4873],{},[363,4871,4872],{},"Рівень",[363,4874,4875],{},"Middle і Senior відрізняються за вартістю та за самостійністю",[348,4877,4878,4881],{},[363,4879,4880],{},"Стек",[363,4882,4883],{},"Laravel з Vue чи Nuxt потребує ширшого профілю, ніж чистий backend",[348,4885,4886,4889],{},[363,4887,4888],{},"Термін",[363,4890,4891],{},"Договір від 1 місяця, а довший горизонт планування дає стабільнішу команду",[273,4893,4894],{},"Рахунок виставляємо щомісяця, а години ви бачите в щотижневому звіті по задачах.",[268,4896,4898],{"id":4897},"як-відбувається-підбір-і-на-що-звернути-увагу","Як відбувається підбір і на що звернути увагу",[273,4900,4901],{},"Від запиту до першого робочого дня минає близько п'яти днів:",[1207,4903,4904,4910,4916,4922],{},[286,4905,4906,4909],{},[2333,4907,4908],{},"День 1."," Ви описуєте роль, стек, обсяг і задачі.",[286,4911,4912,4915],{},[2333,4913,4914],{},"Дні 2–3."," Ми пропонуємо одного-двох кандидатів.",[286,4917,4918,4921],{},[2333,4919,4920],{},"День 4."," Співбесіда з вами, і ви самі обираєте.",[286,4923,4924,4927],{},[2333,4925,4926],{},"День 5."," Доступи, онбординг, перші задачі.",[273,4929,4930],{},"Далі працюємо помісячно, з попередженням про завершення за 2 тижні. Щомісяця ви даєте нам відгук, і ми реагуємо на нього.",[273,4932,4933,4934,4936],{},"Для QA на аутсорс і PHP розробника на проєкт підбір починається з чіткого опису. Якщо ви шукаєте QA на аутсорс, уточніть, що саме треба: ручне тестування релізів чи автоматизовані сценарії. Це різні навички. Про вибір підходу є стаття ",[302,4935,873],{"href":872},". Для PHP розробника на проєкт чітко опишіть стек, процес релізів і хто ставить задачі. Що детальніше бриф, то швидше ми знайдемо відповідну людину.",[273,4938,4939],{},"Щотижня ви отримуєте звіт: що зроблено, що в роботі, які є блокери та скільки годин пішло на кожну задачу. Це дозволяє керувати спеціалістом без мікроменеджменту і вчасно бачити, де потрібна ваша допомога, наприклад доступ до staging чи рішення від продакта.",[273,4941,4942],{},"Перед стартом корисно визначити, що саме вважатимете успіхом через місяць: закриту чергу задач, стабільні релізи чи зменшену кількість багів у продакшені. Це простіше зробити, коли критерій записаний у перший день, і тоді щомісячний відгук від вас стає конкретним, а не загальним. Якщо щось не працює, ви кажете про це одразу, і ми коригуємо підхід або пропонуємо заміну.",[268,4944,4946],{"id":4945},"коли-аутстаф-не-підходить","Коли аутстаф не підходить",[273,4948,4949],{},"Виділений спеціаліст — не найкращий вибір у таких випадках:",[283,4951,4952,4959,4966],{},[286,4953,4954,4955,4958],{},"Потрібен готовий продукт під ключ без вашої участі в управлінні. Тоді краще ",[302,4956,4957],{"href":25},"розробка сайту або магазину"," як проєкт.",[286,4960,4961,4962,4965],{},"Задача разова й невелика. Для неї вистачить ",[302,4963,4964],{"href":34},"консультації тех-ліда"," або окремого аудиту.",[286,4967,4968],{},"У команді ніхто не ставить задачі та не приймає результат. Спеціалісту потрібен хтось, хто формулює пріоритети.",[268,4970,4972],{"id":4971},"чим-це-відрізняється-від-фрилансера","Чим це відрізняється від фрилансера",[273,4974,4975],{},"Нам важливо, щоб ви не залежали від однієї людини. Ми відповідаємо за якість і заміну. Якщо людина захворіла або не підійшла, нова з'являється за 5 робочих днів без доплат. Код спеціаліста перевіряє наш тех-лід, а укладаємо договір з NDA та передачею прав. Через 6 місяців співпраці ви можете найняти спеціаліста напряму без компенсації.",[273,4977,4978,4979,4981],{},"Знання про ваш проєкт залишаються в документації та трекері, а не лише в голові однієї людини, тож зміна виконавця не зупиняє роботу. Хочете підібрати людину під вашу задачу? Заповніть ",[302,4980,482],{"href":17},", і ми запропонуємо кандидатів.",{"title":14,"searchDepth":485,"depth":486,"links":4983},[4984,4985,4986,4987,4988],{"id":4802,"depth":485,"text":4803},{"id":4833,"depth":485,"text":4834},{"id":4897,"depth":485,"text":4898},{"id":4945,"depth":485,"text":4946},{"id":4971,"depth":485,"text":4972},[4990,4993,4996,4999,5002,5005,5008,5011],{"q":4991,"a":4992},"Чим відрізняється від фрилансера?","Ми відповідаємо за якість і заміну. Якщо людина захворіла чи не підійшла — нова за 5 днів, без доплат.",{"q":4994,"a":4995},"Можна потім найняти спеціаліста напряму?","Так, після 6 місяців співпраці — без компенсації.",{"q":4997,"a":4998},"Який мінімальний термін?","1 місяць. Далі — помісячно, з попередженням за 2 тижні.",{"q":5000,"a":5001},"Спеціаліст працює тільки на нас?","Full-time — так. Part-time — може мати інший проєкт, це обговорюємо відкрито.",{"q":5003,"a":5004},"Скільки коштує аутстаф PHP розробника?","Розробник на full-time коштує від $3 800 на місяць, QA на part-time — від $1 800, тех-лід part-time — від $1 200. Остаточна сума залежить від рівня, стеку та зайнятості. Рахунок виставляємо щомісяця, а години видно у звіті.",{"q":5006,"a":5007},"Скільки часу потрібно, щоб спеціаліст почав працювати?","Старт орієнтовно за 5 робочих днів. Протягом перших двох-трьох днів ми пропонуємо одного-двох кандидатів, на четвертий ви проводите співбесіду, а на п'ятий спеціаліст отримує доступи й перші задачі. Далі працюємо помісячно, мінімальний термін співпраці — один місяць.",{"q":5009,"a":5010},"Чим аутстаф відрізняється від аутсорсингу?","При аутстафі спеціаліст працює у вашій команді, у вашому трекері й за вашими пріоритетами, а ви керуєте задачами. При аутсорсингу ми беремо проєкт повністю й відповідаємо за результат. Перший варіант підходить, коли процеси вже є, другий — коли команди немає.",{"q":5012,"a":5013},"Що потрібно від мене, щоб підібрати QA на аутсорс?","Опишіть роль, стек, приблизний обсяг і задачі, а також дайте доступ до трекера й середовища для тестування. Корисно вказати, що потрібно: ручне чи автоматизоване тестування. Решту, включно з пропозицією кандидатів і організацією співбесіди, ми беремо на себе.","QA, Laravel-розробник або тех-лід у вашу команду","user-plus",[4742,4743,4744,4747,4748,4318,4751,4752,4753,4757,4758,4759],{},11,[5020,5025,5031],{"name":5021,"price":4709,"features":5022,"featured":536},"QA part-time",[5023,5024,4317],"Тестування релізів","Тест-кейси і звіти",{"name":5026,"price":5027,"features":5028,"featured":525},"Розробник full-time","від $3 800 \u002F міс",[5029,2188,5030,2187],"Повна інтеграція в команду","Заміна без доплат",{"name":4744,"price":3750,"features":5032,"featured":536},[3410,5033,5034],"Планування і архітектура","Співбесіди","\u002Fuk\u002Fservices\u002Fvydilenyi-spetsialist",1800,[556,956,557],[561,3393,959],{"title":4691,"description":14},"Спеціаліст у вашу команду part-time або full-time: QA, Laravel-розробник, тех-лід. Заміна за 5 днів. Від $1 800 на місяць.","Аутстаф: виділений QA чи Laravel-розробник — Tochno.","uk\u002Fservices\u002Fvydilenyi-spetsialist","K-Ouu9IQyzi1tb1xSCyzcNr9E5qVMN9U7BTMDGlWCyc",[5045,5134,5210,5285,5356,5428],{"id":5046,"title":5047,"body":5048,"client":141,"cover":5052,"coverItems":5053,"coverKind":5059,"date":5060,"description":14,"duration":5061,"extension":495,"gallery":5062,"industry":5066,"key":141,"kpis":5067,"kpisNote":5084,"lead":5085,"lessons":5086,"limits":5090,"liveUrl":141,"meta":5095,"navigation":525,"note":5096,"path":5097,"problem":5098,"repoUrl":141,"results":5099,"seo":5100,"seoDescription":5101,"seoTitle":5102,"service":1800,"serviceLabel":5103,"slug":5104,"solution":5105,"solutions":5106,"stack":5120,"stem":5129,"tag":5130,"team":5131,"type":5132,"__hash__":5133},"cases_uk\u002Fuk\u002Fcases\u002Fdemo-internet-mahazyn-laravel-nuxt.md","Інтернет-магазин на Laravel + Nuxt",{"type":265,"value":5049,"toc":5050},[],{"title":14,"searchDepth":485,"depth":486,"links":5051},[],"Ілюстрація: каталог демо-магазину в браузері і мобільний checkout",[5054,5055,5056,5057,5058],"demo-shop.tochnodev.com","1 290 грн","Оформлення","НП · відділення №12","Оплатити LiqPay","shop","2026-09-01","6 тижнів",[5063,5064,5065],"головний скрін: каталог на desktop + mobile","скрін: мобільний checkout","скрін: адмінка замовлень","E-commerce",[5068,5072,5076,5080],{"label":5069,"value":5070,"note":5071},"LIGHTHOUSE MOBILE","96","[PASS] ціль 90+",{"label":5073,"value":5074,"note":5075},"LCP","1,4 с","[PASS] норма 2,5 с",{"label":5077,"value":5078,"note":5079},"CLS","0,01","[PASS] норма 0,1",{"label":5081,"value":5082,"note":5083},"АВТОТЕСТИ","24","[PASS] 24 \u002F 24","Замір: PageSpeed Insights, мобільний профіль, медіана 5 запусків. Дата: 09.2026.","Показуємо, як ми будуємо магазин під ключ: від каталогу на 2 000 товарів до оплати й доставки — з тестами на кожен ключовий сценарій.",[5087,5088,5089],"Раніше підключили б реальну Нову Пошту замість мока — інтеграція забрала на 3 дні більше, ніж планували.","Писали б автотести checkout з першого спринту, а не з третього: два регреси можна було не пропустити.","Менше кастомних компонентів в адмінці — готові рішення Filament покрили б 80% потреб.",[5091,5092,5093,5094],"Бюджет часу — 6 тижнів, як у реального малого магазину","Мобільний трафік 75%+: checkout спершу для телефона","Хостинг — звичайний VPS за $10\u002Fміс, без CDN-магії","Адмінку має вести людина без технічної освіти",{},"Це демо-проєкт: ми зробили його самі, щоб показати підхід і якість коду. Клієнта і продажів немає — метрики виміряні на тестових даних.","\u002Fuk\u002Fcases\u002Fdemo-internet-mahazyn-laravel-nuxt","Зібрати магазин, на якому потенційний клієнт може сам перевірити, як ми працюємо: швидкість, мобільний checkout, адмінку і якість коду. Сценарій — магазин товарів для дому з каталогом на 2 000 позицій.",[],{"title":5047,"description":14},"Відкритий демо-магазин: каталог на 2 000 товарів, LiqPay, Нова Пошта, адмінка. Lighthouse mobile 96, LCP 1,4 с.","Демо-магазин на Laravel + Nuxt — Tochno.","Магазин під ключ","demo-internet-mahazyn-laravel-nuxt","Розділили магазин на Nuxt-фронтенд зі статичною генерацією каталогу і Laravel API для кошика, замовлень і адмінки. Кешуємо фільтри на рівні бази, а не фронтенду.",[5107,5111,5115,5118],{"icon":5108,"title":5109,"text":5110},"bolt","Статичний каталог","Nuxt генерує сторінки товарів, оновлення — через вебхук з адмінки.",{"icon":5112,"title":5113,"text":5114},"filter","Фільтри без затримки","Агрегати в PostgreSQL, відповідь API до 80 мс на 2 000 товарів.",{"icon":611,"title":5116,"text":5117},"Checkout в 1 екран","LiqPay і Нова Пошта з автопідказкою відділень.",{"icon":4302,"title":2545,"text":5119},"24 Playwright-сценарії запускаються перед кожним деплоєм.",[5121,5122,5123,5124,5125,5126,5127,5128],"Laravel 11 — API, адмінка","Nuxt 3 — фронтенд","PostgreSQL — дані","Redis — черги, кеш","Playwright — автотести","GitHub Actions — CI","Figma — дизайн","VPS — хостинг","uk\u002Fcases\u002Fdemo-internet-mahazyn-laravel-nuxt","E-COMMERCE","Тех-лід, QA, дизайнер","demo","cXH_9_nF9dlZkt820DzreLhvMB8v21wfz-EOBT4YvmA",{"id":5135,"title":5136,"body":5137,"client":141,"cover":5141,"coverItems":5142,"coverKind":5151,"date":5152,"description":14,"duration":2735,"extension":495,"gallery":5153,"industry":5154,"key":141,"kpis":5155,"kpisNote":5166,"lead":5167,"lessons":5168,"limits":5172,"liveUrl":141,"meta":5176,"navigation":525,"note":5177,"path":5178,"problem":5179,"repoUrl":141,"results":5180,"seo":5181,"seoDescription":5182,"seoTitle":5183,"service":955,"serviceLabel":431,"slug":5184,"solution":5185,"solutions":5186,"stack":5200,"stem":5206,"tag":4736,"team":5207,"type":5208,"__hash__":5209},"cases_uk\u002Fuk\u002Fcases\u002Fqa-audyt-mahazynu-odiahu.md","Магазин одягу: 47 багів, 6 критичних",{"type":265,"value":5138,"toc":5139},[],{"title":14,"searchDepth":485,"depth":486,"links":5140},[],"Ілюстрація: сторінка звіту QA-аудиту з багами за пріоритетами",[5143,5144,5145,5146,5147,5148,5149,5150],"QA-аудит · магазин одягу","47 багів · 4 дні","CRIT|iOS Safari: «Оплатити» не реагує після зміни доставки","CRIT|iOS: кошик очищується після повернення з оплати","MAJOR|Фільтр розміру скидається при пагінації","MAJOR|Промокод приймається двічі","MINOR|Обрізаний текст кнопки на 320 px","PASS|Пошук і картка товару — без критичних","qa-report","2026-08-01",[],"Мода та одяг",[5156,5158,5161,5164],{"label":5157,"value":2690},"БАГІВ",{"label":5159,"value":2693,"note":5160},"КРИТИЧНИХ","усі — checkout на iOS",{"label":5162,"value":5163},"ПУНКТІВ ЧЕК-ЛИСТА","150+",{"label":5165,"value":2735},"РОБОТА","Пріоритети — за впливом на замовлення: критичний баг блокує покупку або оплату.","Демонстраційний QA-аудит відкритого магазину. Усі критичні — в checkout на iOS.",[5169,5170,5171],"Починали б одразу з checkout на iOS — там був увесь критичний ризик, а ми дійшли туди на другий день.","Записували б відео для кожного критичного бага, а не лише скріншоти: так розробнику швидше відтворити.","Додали б короткий повторний прогін після виправлень — без нього власник не бачить, що баги справді закриті.",[5173,5174,5175],"Тільки публічна частина сайту, без доступу до адмінки і коду","Без реальних оплат — checkout перевіряли до кроку платежу","4 робочі дні на весь аудит і звіт",{},"Демонстраційний аудит: магазин не був нашим клієнтом, назву не публікуємо. Перевіряли лише те, що бачить звичайний покупець, — без пошуку вразливостей.","\u002Fuk\u002Fcases\u002Fqa-audyt-mahazynu-odiahu","Перевірити відкритий інтернет-магазин одягу на баги: від каталогу до оплати, з акцентом на мобільні сценарії. Саме на телефоні покупці магазинів одягу найчастіше оформлюють замовлення — і найчастіше кидають кошик.",[],{"title":5136,"description":14},"Демонстраційний QA-аудит відкритого магазину одягу. Усі критичні баги — в checkout на iOS. Звіт за 4 дні.","QA-аудит магазину одягу: 47 багів — Tochno.","qa-audyt-mahazynu-odiahu","Провели QA-аудит за чек-листом 150+ пунктів: знайшли 47 багів, 6 із них критичні — усі в checkout на iOS. Кожен баг — з кроками відтворення, очікуваним і фактичним результатом, пристроєм і пріоритетом.",[5187,5190,5193,5196],{"icon":5188,"title":2972,"text":5189},"list-check","Каталог, фільтри, картка товару, кошик, checkout, форми, пошта.",{"icon":4022,"title":5191,"text":5192},"Реальні пристрої","iPhone і Android у живих браузерах, а не лише емулятор у DevTools.",{"icon":177,"title":5194,"text":5195},"Баг-репорти з пріоритетами","Критичні, значні та дрібні — що виправляти першим, а що можна відкласти.",{"icon":5197,"title":5198,"text":5199},"file-text","Звіт для власника","Короткий підсумок мовою бізнесу і детальна таблиця для розробників.",[5201,5202,5203,5204,5205],"Чек-лист 150+ — каталог, кошик, checkout","iOS Safari, Android Chrome — реальні пристрої","Playwright — повтор сценаріїв","Lighthouse — швидкість і доступність","Jira-формат — баг-репорти","uk\u002Fcases\u002Fqa-audyt-mahazynu-odiahu","QA-інженер, тех-лід (рев'ю звіту)","audit","ZjcLmctsg8NkHAav6j8cWU6-wYTguQo-U1QmW55RikU",{"id":5211,"title":5212,"body":5213,"client":5217,"cover":5218,"coverItems":5219,"coverKind":5227,"date":5228,"description":14,"duration":5229,"extension":495,"gallery":5230,"industry":5066,"key":141,"kpis":5231,"kpisNote":5240,"lead":5241,"lessons":5242,"limits":5246,"liveUrl":141,"meta":5251,"navigation":525,"note":5252,"path":5253,"problem":5254,"repoUrl":141,"results":5255,"seo":5256,"seoDescription":5257,"seoTitle":5258,"service":557,"serviceLabel":1805,"slug":5259,"solution":5260,"solutions":5261,"stack":5274,"stem":5281,"tag":5130,"team":5282,"type":5283,"__hash__":5284},"cases_uk\u002Fuk\u002Fcases\u002Fintehratsiia-1s-nova-poshta.md","Інтеграція магазину з 1С і Новою Поштою",{"type":265,"value":5214,"toc":5215},[],{"title":14,"searchDepth":485,"depth":486,"links":5216},[],"Під NDA","Схема інтеграції: магазин, черга, 1С і Нова Пошта (без даних клієнта)",[5220,5221,5222,5223,5224,5225,5226],"Laravel-магазин","Черга · Redis","1С","Нова Пошта","замовлення","залишки","ТТН і статуси","integration","2026-07-01","3 тижні",[],[5232,5236],{"label":5233,"value":5234,"note":5235},"ЕКОНОМІЯ ЧАСУ","−6 год \u002F тиж.","[PASS] ручний експорт прибрано",{"label":5237,"value":5238,"note":5239},"РОЗБІЖНОСТЕЙ ЗАЛИШКІВ","0","[PASS] після запуску","Дані клієнта: оцінка часу менеджерів до і після запуску, звірка залишків за перший місяць.","Клієнт під NDA. Синхронізація залишків і статусів замовлень замість ручного експорту.",[5243,5244,5245],"Почали б із журналу синхронізацій — він найбільше допоміг розбирати спірні випадки з менеджерами.","Раніше домовилися б про тестову копію 1С: частину сценаріїв перевіряли на робочій базі вночі.","Додали б сповіщення в Telegram про збої синхронізації з першого релізу, а не з другого.",[5247,5248,5249,5250],"1С залишається головною системою обліку — її логіку не змінюємо","Магазин працює без простою під час впровадження","API 1С відповідає повільно і буває недоступним","Менеджери мають бачити, що і коли синхронізувалося",{},"Реальний проєкт, клієнт під NDA: без назви, скріншотів і даних клієнта. Схема на обкладинці — узагальнена.","\u002Fuk\u002Fcases\u002Fintehratsiia-1s-nova-poshta","Клієнт вручну вивантажував залишки і статуси замовлень між магазином і 1С — це забирало години щотижня і призводило до розбіжностей: товар продавався, коли його вже не було на складі, а статуси доставки менеджери оновлювали з кабінету Нової Пошти вручну.",[],{"title":5212,"description":14},"Реальний проєкт (клієнт під NDA): синхронізація залишків і статусів замовлень замість ручного експорту.","Інтеграція магазину з 1С і Новою Поштою — Tochno.","intehratsiia-1s-nova-poshta","Побудували чергову синхронізацію залишків і статусів замовлень між Laravel-магазином і 1С через API, без ручного експорту. Кожна операція — окрема задача в черзі з повторами, а статуси доставки підтягуються з API Нової Пошти автоматично.",[5262,5265,5268,5271],{"icon":1014,"title":5263,"text":5264},"Залишки за розкладом","Фонова задача забирає зміни залишків з 1С і оновлює лише змінені товари.",{"icon":180,"title":5266,"text":5267},"Статуси в обидва боки","Нове замовлення одразу йде в 1С, зміна статусу в 1С повертається в магазин.",{"icon":5269,"title":5223,"text":5270},"truck-delivery","ТТН створюється із замовлення, статус доставки оновлюється без участі менеджера.",{"icon":5188,"title":5272,"text":5273},"Журнал і повтори","Кожна синхронізація в журналі; збій API — повтор, а не втрачене замовлення.",[5275,5276,5277,5278,5279,5280],"Laravel — магазин, API інтеграції","Queues — фонові задачі, повтори","Redis — черги","1С — облік і залишки","Нова Пошта API — ТТН і статуси","PostgreSQL — журнал синхронізацій","uk\u002Fcases\u002Fintehratsiia-1s-nova-poshta","Тех-лід, backend-розробник, QA","real","OwoJy2MJHZduaARlBpcfDryIB9TVJ0Un3hjsW_9G-H8",{"id":5286,"title":5287,"body":5288,"client":141,"cover":5292,"coverItems":5293,"coverKind":5301,"date":5302,"description":14,"duration":5303,"extension":495,"gallery":5304,"industry":5305,"key":141,"kpis":5306,"kpisNote":5311,"lead":5312,"lessons":5313,"limits":5317,"liveUrl":141,"meta":5322,"navigation":525,"note":5323,"path":5324,"problem":5325,"repoUrl":141,"results":5326,"seo":5327,"seoDescription":5328,"seoTitle":5329,"service":1370,"serviceLabel":4334,"slug":5330,"solution":5331,"solutions":5332,"stack":5347,"stem":5352,"tag":5353,"team":5354,"type":5301,"__hash__":5355},"cases_uk\u002Fuk\u002Fcases\u002Fredyzain-saitu-stomatolohii.md","Редизайн сайту стоматологічної клініки",{"type":265,"value":5289,"toc":5290},[],{"title":14,"searchDepth":485,"depth":486,"links":5291},[],"Ілюстрація: концепт головної сторінки клініки і форми запису на телефоні",[5294,5295,5296,5297,5298,5299,5300],"Dentaline","Лікування без болю — запис онлайн","Записатися","1 · Послуга: гігієна","2 · Лікар і час","3 · Контакти","Підтвердити запис","concept","2026-06-01","2 тижні",[],"Медицина \u002F стоматологія",[5307,5309],{"label":5308,"value":2674},"КРОКИ ДО ЗАПИСУ",{"label":5310,"value":2670},"ЕКРАНИ","Це параметри концепту, а не виміряні результати: конверсію можна оцінити лише на реальному сайті.","Концепт першого екрана і запису на прийом. Не замовлення — ініціативна робота.",[5314,5315,5316],"Протестували б прототип на 5 реальних пацієнтах до фінального UI — це дешевше, ніж переробляти макети.","Раніше продумали б сценарій «немає вільного часу» — у першій версії він вів у глухий кут.","Збирали б UI-кіт паралельно з макетами, а не після них.",[5318,5319,5320,5321],"Ініціативна робота — без доступу до реальної аналітики клініки","Мобільний сценарій першим: більшість пацієнтів шукає клініку з телефона","Форма запису — максимум 3 кроки","Кольори і контраст за WCAG AA для людей старшого віку",{},"Дизайн-концепт, не на замовлення: ми зробили його самі, щоб показати підхід до UX. Назва клініки і тексти — вигадані для прикладу.","\u002Fuk\u002Fcases\u002Fredyzain-saitu-stomatolohii","Показати, як спростити запис на прийом на сайті стоматологічної клініки: менше кроків, зрозуміліше на мобільному. На типових сайтах клінік запис — це довга форма або лише номер телефону, і пацієнт іде до конкурента, який дозволяє записатися онлайн.",[],{"title":5287,"description":14},"Концепт першого екрана і запису на прийом стоматологічної клініки. Ініціативна робота, не замовлення клієнта.","Концепт сайту стоматологічної клініки — Tochno.","redyzain-saitu-stomatolohii","Розробили концепт головної сторінки і форми запису в 3 кроки на 2 екранах — ініціативна робота поза замовленням. На першому екрані — послуги з цінами «від» і кнопка запису, далі пацієнт обирає послугу, лікаря та час.",[5333,5337,5341,5345],{"icon":5334,"title":5335,"text":5336},"layout","Перший екран","Що лікуємо, ціни «від», адреса і кнопка запису — без прокрутки на телефоні.",{"icon":5338,"title":5339,"text":5340},"calendar","Запис у 3 кроки","Послуга → лікар → вільний час. Телефон — лише на останньому кроці.",{"icon":5342,"title":5343,"text":5344},"accessible","Доступність","Великі цілі для дотику, контраст AA, зрозумілі стани помилок.",{"icon":4376,"title":4676,"text":5346},"Кнопки, поля, картки лікарів — готові до передачі в розробку.",[5348,5349,5350,5351],"Figma — макети і прототип","Auto layout — адаптив 360–1440 px","UI-кіт — кнопки, форми, стани","WCAG 2.2 AA — контраст і розміри","uk\u002Fcases\u002Fredyzain-saitu-stomatolohii","UI\u002FUX","UI\u002FUX-дизайнер, тех-лід","yLeTrpVqxXFTdogY_ElHQus9tMPBW0VhCAbDCYqZuYw",{"id":5357,"title":5358,"body":5359,"client":141,"cover":5363,"coverItems":5364,"coverKind":5374,"date":5375,"description":14,"duration":5303,"extension":495,"gallery":5376,"industry":5377,"key":141,"kpis":5378,"kpisNote":5385,"lead":5386,"lessons":5387,"limits":5391,"liveUrl":141,"meta":5395,"navigation":525,"note":5396,"path":5397,"problem":5398,"repoUrl":141,"results":5399,"seo":5400,"seoDescription":5401,"seoTitle":5402,"service":566,"serviceLabel":131,"slug":5403,"solution":5404,"solutions":5405,"stack":5418,"stem":5424,"tag":5425,"team":5426,"type":5208,"__hash__":5427},"cases_uk\u002Fuk\u002Fcases\u002Ftekhnichnyi-audyt-laravel-b2b.md","Технічний аудит Laravel-проєкту B2B",{"type":265,"value":5360,"toc":5361},[],{"title":14,"searchDepth":485,"depth":486,"links":5362},[],"Ілюстрація: фрагмент коду з N+1-запитом із технічного аудиту",[5365,5366,5367,5368,5369,5370,5371,5372,5373],"app\u002FHttp\u002FControllers\u002FReportController.php","public function index()","{","    $orders = Order::latest()->get();","!    foreach ($orders as $order) {","!        $order->customer->name; \u002F\u002F N+1","    }","    \u002F\u002F fix: Order::with('customer')","}","code-audit","2026-05-01",[],"B2B \u002F SaaS",[5379,5382],{"label":5380,"value":5381},"N+1 ЗАПИТІВ","312",{"label":5383,"value":5384},"РЕКОМЕНДАЦІЙ","14","N+1 — кількість зайвих однотипних запитів, знайдених профілюванням ключових сторінок.","Оцінка коду від підрядника перед продовженням контракту: архітектура, безпека, запити.",[5388,5389,5390],"Попросили б доступ до логів продакшну з першого дня — частину повільних сценаріїв видно лише на реальних даних.","Зустрічалися б з підрядником на початку аудиту, а не в кінці: частина рішень мала історичні причини.","Давали б оцінку рекомендацій у вилці годин одразу в першій версії звіту.",[5392,5393,5394],"Доступ лише до репозиторію і копії бази, без продакшн-серверів","Висновок потрібен до дати продовження контракту","Звіт читатиме не технічний власник — потрібен підсумок без жаргону",{},"Аудит під NDA: назву клієнта, код і скріншоти не публікуємо. Фрагмент коду на обкладинці — ілюстрація типової проблеми, не код клієнта.","\u002Fuk\u002Fcases\u002Ftekhnichnyi-audyt-laravel-b2b","Клієнту потрібно було вирішити, чи продовжувати контракт із підрядником — для цього оцінили якість Laravel-коду B2B-проєкту. Скарги були типові: сторінки звітів відкривалися повільно, нові функції ламали старі, а оцінки підрядника постійно зростали.",[],{"title":5358,"description":14},"Оцінка коду підрядника перед продовженням контракту: архітектура, безпека, 312 N+1-запитів, 14 рекомендацій.","Технічний аудит Laravel-проєкту B2B — Tochno.","tekhnichnyi-audyt-laravel-b2b","Провели технічний аудит: перевірили архітектуру, безпеку і продуктивність запитів, знайшли 312 N+1-запитів і дали 14 рекомендацій. Кожна рекомендація — з пріоритетом, оцінкою годин і ризиком, якщо її не виконати.",[5406,5408,5411,5415],{"icon":3736,"title":203,"text":5407},"Структура модулів, бізнес-логіка в контролерах, дублювання, покриття тестами.",{"icon":5409,"title":191,"text":5410},"shield-lock","Авторизація, валідація введення, масове присвоєння, вразливі залежності.",{"icon":5412,"title":5413,"text":5414},"database","Запити до бази","Профілювання ключових сторінок: N+1, відсутні індекси, важкі звіти.",{"icon":5197,"title":5416,"text":5417},"Звіт для рішення","Підсумок для власника і 14 рекомендацій з пріоритетами для розробників.",[5419,5420,5421,5422,5423],"Laravel — код проєкту","PostgreSQL — запити й індекси","Laravel Debugbar, Telescope — профілювання","PHPStan — статичний аналіз","composer audit — вразливі залежності","uk\u002Fcases\u002Ftekhnichnyi-audyt-laravel-b2b","CODE AUDIT","Тех-лід (PHP), QA","k2LFrWrG-XEE7DYaXtVWhNKp_tBbRJbWul38jnvF0AM",{"id":5429,"title":5430,"body":5431,"client":141,"cover":5435,"coverItems":5436,"coverKind":5445,"date":5446,"description":14,"duration":5447,"extension":495,"gallery":5448,"industry":5449,"key":141,"kpis":5450,"kpisNote":5457,"lead":5458,"lessons":5459,"limits":5463,"liveUrl":141,"meta":5468,"navigation":525,"note":5469,"path":5470,"problem":5471,"repoUrl":141,"results":5472,"seo":5473,"seoDescription":5474,"seoTitle":5475,"service":3397,"serviceLabel":24,"slug":5476,"solution":5477,"solutions":5478,"stack":5493,"stem":5500,"tag":5501,"team":5502,"type":5132,"__hash__":5503},"cases_uk\u002Fuk\u002Fcases\u002Fdemo-lendinh-telegram-crm.md","Лендінг з формою в Telegram і CRM",{"type":265,"value":5432,"toc":5433},[],{"title":14,"searchDepth":485,"depth":486,"links":5434},[],"Ілюстрація: лендінг із формою заявки і повідомлення в Telegram-боті",[5437,5438,5439,5440,5441,5442,5443,5444],"landing.tochnodev.com","Ремонт квартир під ключ","Ваше ім'я","Телефон або Telegram","Отримати розрахунок","tochno_leads_bot","Нова заявка з лендінгу","Олена · +380… · utm_source=google","landing","2026-04-01","1 тиждень",[],"Лендінги",[5451,5455],{"label":5452,"value":5453,"note":5454},"ACCESSIBILITY","100","[PASS] ціль 95+",{"label":5073,"value":5456,"note":5075},"0,9 с","Замір: Lighthouse, мобільний профіль, тестове розгортання на Vercel.","Шаблон лендінгу на Nuxt: форма з валідацією, заявки в Telegram-бот і CRM.",[5460,5461,5462],"Одразу закладали б відправку в CRM через чергу з повторами, а не прямим запитом із форми.","Додали б резервний канал (email) із першого дня — Telegram-бот теж буває недоступним.","Підключали б аналітику подій форми до запуску реклами, а не після перших заявок.",[5464,5465,5466,5467],"Запуск за тиждень — як під реальну рекламну кампанію","Без платних конструкторів і сторонніх віджетів форми","Заявка не має губитися, навіть якщо CRM тимчасово недоступна","Захист від спаму без капчі, яка знижує конверсію",{},"Це демо-проєкт: ми зібрали його самі як шаблон для рекламних лендінгів. Клієнта немає — метрики виміряні на тестовому розгортанні.","\u002Fuk\u002Fcases\u002Fdemo-lendinh-telegram-crm","Показати, як швидко можна зібрати лендінг під рекламу з формою, яка одразу шле заявки в Telegram і CRM. Типова біль малого бізнесу: заявки з форми падають на пошту, їх бачать через пів дня, а частина губиться в спамі.",[],{"title":5430,"description":14},"Шаблон лендінгу на Nuxt: форма з валідацією, заявки в Telegram-бот і CRM. Accessibility 100, LCP 0,9 с.","Демо-лендінг на Nuxt з формою в Telegram — Tochno.","demo-lendinh-telegram-crm","Зібрали статичний лендінг на Nuxt і один серверний роут для форми. Ті самі правила валідації працюють у браузері й на сервері, заявка паралельно йде в Telegram-бот і CRM — збій одного каналу не блокує інший.",[5479,5482,5486,5490],{"icon":5108,"title":5480,"text":5481},"Статичний лендінг","Сторінка генерується під час збірки — перший екран без очікування сервера.",{"icon":5483,"title":5484,"text":5485},"forms","Одна схема валідації","Zod-схема спільна для браузера і сервера: помилки біля кожного поля.",{"icon":5487,"title":5488,"text":5489},"brand-telegram","Заявка за секунди","Повідомлення в Telegram з контактом, текстом і UTM-мітками джерела.",{"icon":2957,"title":5491,"text":5492},"Антиспам без капчі","Honeypot-поле, time-trap і ліміт запитів з однієї IP-адреси.",[5494,5495,5496,5497,5498,5499],"Nuxt — SSG-лендінг","Nitro — серверний роут форми","Zod — валідація на клієнті й сервері","Telegram Bot API — сповіщення","CRM API — запис ліда","Vercel — хостинг","uk\u002Fcases\u002Fdemo-lendinh-telegram-crm","ЛЕНДІНГ","Розробник, дизайнер, QA","ezQXEWV0t0rCteSZgMpo9X2iOLAWvkmICVzde8kB31o",[5505,6044,6584,7329,8088,9318,9872,10423,11196,11947,12919,13483,14233],{"id":5506,"title":5507,"author":5508,"body":5509,"cover":141,"coverFile":6009,"coverLines":6010,"coverStat":6019,"date":6020,"description":5513,"excerpt":141,"extension":495,"faq":6021,"featured":536,"key":141,"meta":6034,"navigation":525,"path":6035,"readingTime":526,"seo":6036,"seoDescription":6037,"seoTitle":6038,"slug":6039,"stem":6040,"tags":6041,"updated":141,"__hash__":6043},"blog_uk\u002Fuk\u002Fblog\u002Fhoroshop-prom-opencart-chy-kastom.md","Хорошоп, Prom, OpenCart чи кастом: що обрати для магазину у 2026","Євгеній",{"type":265,"value":5510,"toc":5993},[5511,5514,5517,5521,5524,5550,5557,5561,5564,5567,5581,5584,5587,5592,5595,5598,5602,5785,5788,5792,5798,5806,5809,5818,5824,5836,5840,5843,5875,5881,5885,5888,5892,5906,5909,5913,5924,5927,5931,5942,5946,5963,5966,5970,5973,5982],[273,5512,5513],{},"Для невеликого магазину з каталогом до кількох тисяч товарів і стандартним оформленням замовлення найчастіше найкраще працює SaaS-конструктор на кшталт Хорошопа: низька абонплата, швидкий старт і нуль комісії з продажів. Prom потрібен, якщо вам важливий готовий трафік маркетплейсу. OpenCart лишається варіантом, коли є власний розробник. Кастомну розробку варто замовляти тоді, коли ліміти платформи вже коштують вам грошей.",[273,5515,5516],{},"Нижче розбираємо чотири шляхи очима власника: що ви платите щомісяця, які є комісії та ліміти, наскільки ви контролюєте SEO, як працюють Нова Пошта, LiqPay та 1С і що буде, коли захочете піти. Автор, Євгеній, 11 років пише на PHP\u002FLaravel і тестує магазини, тож ми продаємо кастом і маємо очевидну упередженість. Тому прямо кажемо, де він не потрібен.",[268,5518,5520],{"id":5519},"чотири-шляхи-а-не-один-вибір","Чотири шляхи, а не один вибір",[273,5522,5523],{},"Ці варіанти часто порівнюють так, ніби вони однакові, а це різні моделі.",[283,5525,5526,5532,5538,5544],{},[286,5527,5528,5531],{},[2333,5529,5530],{},"SaaS-конструктор (Хорошоп та аналоги)."," Ви орендуєте готовий магазин: хостинг, адмінка, оновлення входять в абонплату. Код платформи вам не належить, змінюєте теми й налаштування.",[286,5533,5534,5537],{},[2333,5535,5536],{},"Маркетплейс (Prom)."," Ви продаєте у чужому каталозі з готовим трафіком і платите за пакет та комісію з замовлень. У Prom є й режим окремого сайту, але торгова логіка залишається платформною.",[286,5539,5540,5543],{},[2333,5541,5542],{},"Самостійна CMS (OpenCart)."," Вільне ПЗ: ви самі обираєте хостинг, модулі й розробника та відповідаєте за оновлення й безпеку.",[286,5545,5546,5549],{},[2333,5547,5548],{},"Кастом (Laravel, Nuxt та інше)."," Магазин пишеться під ваші процеси. Код і дані ваші, але старт довший і дорожчий.",[273,5551,5552,5553,5556],{},"Тож питання не «що краще», а «хто несе який ризик і за які гроші». Відповідь залежить від каталогу, бюджету та того, чи є в команді людина, яка відповідає за технічну частину. Про самостійні CMS ми писали окремо в порівнянні ",[302,5554,5555],{"href":1537},"Laravel, OpenCart і WordPress",", тут не повторюємося, а фокусуємося на SaaS і маркетплейсі.",[268,5558,5560],{"id":5559},"гроші-абонплата-комісії-та-приховані-витрати","Гроші: абонплата, комісії та приховані витрати",[273,5562,5563],{},"У Хорошопа фіксована щомісячна абонплата, яка залежить від кількості товарів і функцій (API, оптові ціни, B2B): орієнтовно від кількох сотень до близько двох тисяч гривень на місяць за річної оплати. Комісії з продажів платформа не бере, хостинг і SSL входять у вартість. Тарифи змінюються, тож перед рішенням звірте актуальні ціни на офіційному сайті horoshop.ua.",[273,5565,5566],{},"Але абонплата не вся вартість. Додайте:",[283,5568,5569,5572,5575,5578],{},[286,5570,5571],{},"налаштування й дизайн (шаблон або робота студії);",[286,5573,5574],{},"платні інтеграції та сервіси, яких немає в базовому пакеті;",[286,5576,5577],{},"комісії платіжних систем: LiqPay та інші еквайринги беруть свій відсоток незалежно від платформи;",[286,5579,5580],{},"контент: фото, описи, імпорт.",[273,5582,5583],{},"Prom працює інакше. За даними support.prom.ua, продавець платить за пакет на рік або базову підписку, а також комісію з виконаних замовлень, і її розмір залежить від категорії та умов пакета. Для сайту з власним доменом існують окремі правила комісії. Точні відсотки Prom змінювалися кілька разів за останні роки, а публічні джерела розходяться між собою, тому конкретних цифр не називаємо: перед стартом порахуйте комісію саме для вашої категорії в кабінеті продавця.",[273,5585,5586],{},"OpenCart безкоштовний як програма, але не як проєкт: потрібні хостинг, платні модулі та теми, робота розробника і регулярні оновлення. Типовий сценарій: перший рік дешево, потім витрати на доробки й виправлення ростуть. Кастом найдорожчий на старті: магазин у Tochno коштує від 150 000 грн і робиться 10–14 тижнів, але далі ви не платите оренду платформі.",[5588,5589,5591],"h3",{"id":5590},"як-порахувати-вартість-на-три-роки","Як порахувати вартість на три роки",[273,5593,5594],{},"Порівнюйте не місяць, а три роки: саме стільки зазвичай живе перша версія магазину. Припустімо, абонплата становить 800 грн на місяць: за 36 місяців це близько 29 000 грн. Додайте налаштування й дизайн, наприклад ще кілька десятків тисяч гривень, і отримаєте орієнтовно 50–70 тисяч гривень за три роки без комісії платформи. Це умовний приклад нашої арифметики, а не тариф чи пропозиція конкретної студії, тому підставте свої дані.",[273,5596,5597],{},"З кастомом рахунок інший: від 150 000 грн на старті, далі хостинг і підтримка (у нас підтримка від 8 000 грн на місяць, якщо вона вам потрібна). Тобто на горизонті трьох років кастом майже завжди дорожчий за конструктор. Він виграє не ціною, а відсутністю лімітів: коли каталог виріс, потрібні свої правила цін або конструктор змушує вас платити за обхідні шляхи. Якщо ви не можете назвати конкретний ліміт, який вас зупиняє, кастом ще зарано.",[268,5599,5601],{"id":5600},"порівняння-за-критеріями-власника","Порівняння за критеріями власника",[342,5603,5604,5623],{},[345,5605,5606],{},[348,5607,5608,5611,5614,5617,5620],{},[351,5609,5610],{},"Критерій",[351,5612,5613],{},"Хорошоп (SaaS)",[351,5615,5616],{},"Prom",[351,5618,5619],{},"OpenCart",[351,5621,5622],{},"Кастом",[358,5624,5625,5641,5658,5673,5688,5705,5722,5739,5755,5769],{},[348,5626,5627,5629,5632,5635,5638],{},[363,5628,934],{},[363,5630,5631],{},"Дні або тижні",[363,5633,5634],{},"Дні",[363,5636,5637],{},"Тижні",[363,5639,5640],{},"10–14 тижнів",[348,5642,5643,5646,5649,5652,5655],{},[363,5644,5645],{},"Щомісячні витрати",[363,5647,5648],{},"Фіксована абонплата",[363,5650,5651],{},"Пакет і комісія з замовлень",[363,5653,5654],{},"Хостинг, модулі, підтримка",[363,5656,5657],{},"Хостинг і підтримка",[348,5659,5660,5663,5666,5669,5671],{},[363,5661,5662],{},"Комісія з продажів",[363,5664,5665],{},"Немає",[363,5667,5668],{},"Є, залежить від категорії",[363,5670,5665],{},[363,5672,5665],{},[348,5674,5675,5678,5681,5684,5686],{},[363,5676,5677],{},"Власний бренд і база клієнтів",[363,5679,5680],{},"Так",[363,5682,5683],{},"Частково, клієнт у каталозі Prom",[363,5685,5680],{},[363,5687,5680],{},[348,5689,5690,5693,5696,5699,5702],{},[363,5691,5692],{},"SEO-контроль",[363,5694,5695],{},"Середній: стандартні налаштування",[363,5697,5698],{},"Обмежений",[363,5700,5701],{},"Високий, але залежить від налаштування",[363,5703,5704],{},"Повний",[348,5706,5707,5710,5713,5716,5719],{},[363,5708,5709],{},"Нестандартна логіка",[363,5711,5712],{},"Обмежена тарифом",[363,5714,5715],{},"Мінімальна",[363,5717,5718],{},"Через модулі",[363,5720,5721],{},"Без обмежень",[348,5723,5724,5727,5730,5733,5736],{},[363,5725,5726],{},"Нова Пошта, LiqPay",[363,5728,5729],{},"Готові модулі",[363,5731,5732],{},"Вбудовані сервіси Prom",[363,5734,5735],{},"Модулі від різних авторів",[363,5737,5738],{},"Пишемо під ваш процес",[348,5740,5741,5743,5746,5749,5752],{},[363,5742,1068],{},[363,5744,5745],{},"Типова, через обмін",[363,5747,5748],{},"Імпорт і API",[363,5750,5751],{},"Модулі, якість різна",[363,5753,5754],{},"Під вашу схему",[348,5756,5757,5760,5763,5765,5767],{},[363,5758,5759],{},"Володіння кодом",[363,5761,5762],{},"Ні",[363,5764,5762],{},[363,5766,5680],{},[363,5768,5680],{},[348,5770,5771,5774,5777,5780,5783],{},[363,5772,5773],{},"Вихід з платформи",[363,5775,5776],{},"Експорт даних, нові URL",[363,5778,5779],{},"Експорт, клієнт лишається у Prom",[363,5781,5782],{},"Простий",[363,5784,5782],{},[273,5786,5787],{},"Таблиця спрощена. Реальна відмінність залежить від конкретного тарифу, шаблону й виконавця, але напрямок вона показує вірно.",[268,5789,5791],{"id":5790},"ліміти-seo-і-інтеграції-де-болить-найчастіше","Ліміти, SEO і інтеграції: де болить найчастіше",[273,5793,5794,5797],{},[2333,5795,5796],{},"Ліміти каталогу й тарифу."," У конструкторах кількість товарів, доступ до API, оптові ціни, мультискладські функції прив'язані до тарифу. Поки ви в межах, це вигідно. Коли зростаєте, переходите на дорожчий пакет, і розрахунок змінюється.",[273,5799,5800,5803,5804,306],{},[2333,5801,5802],{},"SEO."," Конструктори вже вміють генерувати мета-теги, sitemap та базову розмітку. Для більшості малих магазинів цього досить. Проблеми з'являються, коли потрібні складні фільтри з індексованими сторінками, власні правила канонічних адрес, нестандартна розмітка або нормальна швидкість на мобільному. У кастомі ви контролюєте все: структуру URL, перелінкування, швидкість, розмітку. Більше про це в статті ",[302,5805,476],{"href":475},[273,5807,5808],{},"На Prom ви конкуруєте всередині чужого каталогу, і ваш сайт-візитка там не головне джерело покупців. Це нормально, але не варто чекати, що Prom вирощує ваш бренд у Google.",[273,5810,5811,5814,5815,306],{},[2333,5812,5813],{},"Інтеграції."," Нова Пошта та LiqPay є майже скрізь, але «є» і «працює без втрат замовлень» різні речі. Типові проблеми: розбіжність статусів ТТН, повторні списання, зависле замовлення після невдалої оплати. У готових модулях ви залежите від автора модуля, у кастомі від якості тестів. Детальніше про місця, де це ламається, в статті про ",[302,5816,5817],{"href":1724},"інтеграцію Нової Пошти та оплати",[273,5819,5820,5823],{},[2333,5821,5822],{},"1С та облік."," Якщо склад і ціни живуть в 1С, більшість платформ підтримують обмін файлами. Для складної логіки (кілька складів, спеціальні ціни для клієнтів, часткові відвантаження) конструктор часто стає тісним, і доводиться шукати обхідні шляхи.",[5825,5826,5827],"blockquote",{},[273,5828,5829,5832,5833,306],{},[2333,5830,5831],{},"Не впевнені, чи вам вистачить конструктора?"," Розкажіть про каталог, інтеграції та плани на рік, і ми чесно скажемо, чи потрібна кастомна розробка. Якщо не потрібна, так і напишемо. ",[302,5834,5835],{"href":17},"Заповнити бриф",[268,5837,5839],{"id":5838},"власність-і-міграція-що-буде-коли-захочете-піти","Власність і міграція: що буде, коли захочете піти",[273,5841,5842],{},"Це питання, про яке згадують запізно. Дані магазину (товари, категорії, клієнти) зазвичай можна вивантажити з будь-якої платформи, а ось усе навколо них переноситься гірше.",[283,5844,5845,5851,5857,5863,5869],{},[286,5846,5847,5850],{},[2333,5848,5849],{},"Адреси сторінок."," Нова платформа майже завжди має іншу структуру URL. Без 301-редиректів ви втратите позиції в пошуку, на відновлення яких іде місяці. Це головний ризик міграції.",[286,5852,5853,5856],{},[2333,5854,5855],{},"Історія замовлень і клієнти."," Переносяться окремою роботою, і не завжди повністю. Паролі клієнтів перенести не можна, їх доведеться скинути.",[286,5858,5859,5862],{},[2333,5860,5861],{},"Відгуки й контент."," Залежать від формату експорту. Інколи простіше забрати з сайту, ніж із системи.",[286,5864,5865,5868],{},[2333,5866,5867],{},"Дизайн."," Тема конструктора не переїжджає. Це новий дизайн або нова верстка.",[286,5870,5871,5874],{},[2333,5872,5873],{},"Клієнти Prom."," Покупці, які прийшли через маркетплейс, лишаються покупцями Prom. Базу для розсилок у вас буде лише з тих, хто оформлював замовлення на вашому сайті.",[273,5876,5877,5878,5880],{},"Тому, обираючи платформу, одразу питайте: що я зможу забрати і скільки це коштуватиме. Перед міграцією на нову платформу корисно зробити ",[302,5879,431],{"href":31}," старого й нового сайтів: перевірити редиректи, мета-теги, форму замовлення, оплату та доставку до перемикання, а не після першої скарги клієнта. Аудит у нас стартує від 6 000 грн.",[268,5882,5884],{"id":5883},"коли-що-обирати-правила-рішення","Коли що обирати: правила рішення",[273,5886,5887],{},"Ось прості правила. Вони не ідеальні, але працюють у більшості ситуацій.",[5588,5889,5891],{"id":5890},"обирайте-хорошоп-або-схожий-конструктор-якщо","Обирайте Хорошоп або схожий конструктор, якщо",[283,5893,5894,5897,5900,5903],{},[286,5895,5896],{},"каталог до кількох тисяч товарів і стандартні процеси: кошик, оплата, доставка Новою Поштою;",[286,5898,5899],{},"бюджет обмежений, а запуск потрібен за тижні, а не за місяці;",[286,5901,5902],{},"немає технічної людини, яка підтримуватиме сайт;",[286,5904,5905],{},"ви перевіряєте нішу і ще не знаєте, чи піде продаж.",[273,5907,5908],{},"У цьому випадку кастом за 150 000 грн і вище просто не окупиться, і ми не радимо його замовляти.",[5588,5910,5912],{"id":5911},"обирайте-prom-якщо","Обирайте Prom, якщо",[283,5914,5915,5918,5921],{},[286,5916,5917],{},"вам потрібні перші продажі без власного трафіку;",[286,5919,5920],{},"товар легко знаходять за категоріями маркетплейсу;",[286,5922,5923],{},"ви готові закласти комісію в ціну.",[273,5925,5926],{},"Prom добре поєднувати з власним сайтом: маркетплейс дає нових покупців, сайт вирощує повторні продажі без комісії.",[5588,5928,5930],{"id":5929},"обирайте-opencart-якщо","Обирайте OpenCart, якщо",[283,5932,5933,5936,5939],{},[286,5934,5935],{},"у вас є свій розробник або довгий контракт на підтримку;",[286,5937,5938],{},"потрібна більша свобода, ніж у конструкторі, але кастом поки зависокий за бюджетом;",[286,5940,5941],{},"ви готові слідкувати за оновленнями й безпекою.",[5588,5943,5945],{"id":5944},"обирайте-кастом-якщо","Обирайте кастом, якщо",[283,5947,5948,5951,5954,5957,5960],{},[286,5949,5950],{},"платформа вже обмежує вас: каталог, ціни для груп клієнтів, складна логіка знижок, B2B-кабінет;",[286,5952,5953],{},"потрібні нестандартні інтеграції з 1С, ERP або складом;",[286,5955,5956],{},"швидкість і SEO критичні, а шаблонні рішення не дають результату;",[286,5958,5959],{},"ви рахуєте не перший рік, а три-п'ять років і бачите, що оренда платформи плюс обхідні шляхи дорожчі за власний код;",[286,5961,5962],{},"потрібні автотести оформлення замовлення та контроль якості перед кожним релізом.",[273,5964,5965],{},"Три запитання допоможуть перевірити себе. Чи можу я описати свій процес продажу стандартними кроками? Чи вистачає мені можливостей тарифу вже зараз і через два роки? Чи є в мене людина, яка відповідає за сайт технічно? Якщо на всі три відповідь «так», беріть конструктор.",[268,5967,5969],{"id":5968},"висновок","Висновок",[273,5971,5972],{},"Найдорожче рішення рідко найкраще, а найдешевше часто лише відкладає витрати. Для малого магазину Хорошоп чи подібний конструктор у 2026 році зазвичай розумний вибір, Prom доповнює його трафіком, OpenCart потребує технічного власника, а кастом виграє, коли ліміти платформи вже відчутні в грошах. Перш ніж платити, порахуйте вартість на три роки і перевірте, що саме ви зможете забрати, якщо захочете піти.",[273,5974,5975,5976,5978,5979,306],{},"Орієнтири по вартості кастомної розробки ми розібрали в статті ",[302,5977,1549],{"href":1548},", а відкриті ціни Tochno зібрані на сторінці ",[302,5980,5981],{"href":77},"ціни",[5825,5983,5984],{},[273,5985,5986,5989,5990,306],{},[2333,5987,5988],{},"Обираєте платформу для магазину?"," Опишіть каталог, інтеграції та бюджет, і ми скажемо, що підійде: конструктор чи кастом. Якщо потрібна розробка, дивіться ",[302,5991,5992],{"href":28},"інтернет-магазин від 150 000 грн, 10–14 тижнів",{"title":14,"searchDepth":485,"depth":486,"links":5994},[5995,5996,5999,6000,6001,6002,6008],{"id":5519,"depth":485,"text":5520},{"id":5559,"depth":485,"text":5560,"children":5997},[5998],{"id":5590,"depth":486,"text":5591},{"id":5600,"depth":485,"text":5601},{"id":5790,"depth":485,"text":5791},{"id":5838,"depth":485,"text":5839},{"id":5883,"depth":485,"text":5884,"children":6003},[6004,6005,6006,6007],{"id":5890,"depth":486,"text":5891},{"id":5911,"depth":486,"text":5912},{"id":5929,"depth":486,"text":5930},{"id":5944,"depth":486,"text":5945},{"id":5968,"depth":485,"text":5969},"platform.choice",[6011,6013,6015,6017],{"marker":161,"text":6012},"Хорошоп: швидкий старт, нуль комісії",{"marker":156,"text":6014},"Prom: трафік є, але клієнт не ваш",{"marker":166,"text":6016},"OpenCart: свобода + самому підтримувати",{"marker":161,"text":6018},"Кастом: коли ліміти вже болять","4 шляхи","2026-10-30",[6022,6025,6028,6031],{"q":6023,"a":6024},"Що обрати для невеликого магазину у 2026: Хорошоп чи Prom?","Якщо хочете власний бренд, сайт у пошуку Google і клієнтську базу, обирайте Хорошоп або схожий конструктор: фіксована абонплата, без комісії з продажів. Prom підходить, коли потрібен готовий трафік маркетплейсу. Часто ці канали поєднують: сайт для постійних клієнтів, Prom для нових покупців.",{"q":6026,"a":6027},"Чи можна перейти з Хорошопа або Prom на власний сайт?","Так. Товари й категорії вивантажуються у файл, але є нюанси: адреси сторінок зміняться, тому потрібні 301-редиректи, а історію замовлень і відгуки доведеться переносити окремо. Правильна міграція займає кілька тижнів і потребує перевірки SEO та оформлення замовлення до перемикання.",{"q":6029,"a":6030},"Скільки коштує кастомний інтернет-магазин порівняно з конструктором?","Конструктор коштує від кількох сотень гривень на місяць плюс налаштування. Кастомний магазин у Tochno починається від 150 000 грн і триває 10–14 тижнів. Різниця окупається не на старті, а коли конструктор обмежує каталог, логіку цін, інтеграції або швидкість.",{"q":6032,"a":6033},"Чи підходить OpenCart у 2026 році?","Підходить для середнього каталогу, якщо у вас є розробник, який оновлює систему й перевіряє сумісність модулів. Сама платформа безкоштовна, але хостинг, безпека, оновлення та доробки лягають на вас. Без технічного супроводу магазин на OpenCart з часом стає повільним і вразливим.",{},"\u002Fuk\u002Fblog\u002Fhoroshop-prom-opencart-chy-kastom",{"title":5507,"description":5513},"Хорошоп, Prom, OpenCart чи кастомний магазин: порівняння за абонплатою, комісіями, SEO, інтеграціями та міграцією. Коли що обирати у 2026.","Хорошоп, Prom чи кастом для магазину у 2026 — Tochno.","horoshop-prom-opencart-chy-kastom","uk\u002Fblog\u002Fhoroshop-prom-opencart-chy-kastom",[6042],"ecom","1yFoGdQj8WDVwixstrdsNyaBPGZEhz4yX8QydhQiiP4",{"id":6045,"title":6046,"author":5508,"body":6047,"cover":141,"coverFile":6549,"coverLines":6550,"coverStat":6559,"date":6560,"description":6561,"excerpt":141,"extension":495,"faq":6562,"featured":525,"key":141,"meta":6575,"navigation":525,"path":6576,"readingTime":526,"seo":6577,"seoDescription":6578,"seoTitle":6579,"slug":2987,"stem":6580,"tags":6581,"updated":6020,"__hash__":6583},"blog_uk\u002Fuk\u002Fblog\u002Fchek-lyst-testuvannia-internet-mahazynu.md","Чек-лист тестування інтернет-магазину перед запуском: 60 пунктів",{"type":265,"value":6048,"toc":6537},[6049,6055,6058,6062,6065,6085,6091,6095,6098,6135,6138,6142,6145,6171,6175,6182,6240,6243,6247,6253,6286,6290,6311,6315,6318,6347,6351,6431,6442,6446,6449,6475,6478,6484,6488,6491,6523,6526],[273,6050,6051,6052,6054],{},"Чек-лист тестування інтернет-магазину потрібен власнику, який збирається запускати або оновлювати сайт і хоче впевнитись, що клієнт зможе знайти товар, покласти його в кошик і заплатити. Нижче 60 пунктів, згрупованих за етапами шляху покупця. Їх можна пройти самостійно за вечір або передати тестувальнику. Ми користуємось саме цим скелетом, коли готуємо ",[302,6053,431],{"href":31},", тільки на практиці пунктів значно більше: близько 150.",[273,6056,6057],{},"Головна ідея проста. Не все в магазині однаково важливе. Баг у футері коштує вам нерву, баг у кошику коштує вам грошей. Тому перевіряємо в порядку «від грошей»: спершу оплата й checkout, потім кошик і каталог, потім усе інше.",[268,6059,6061],{"id":6060},"як-користуватись-чек-листом","Як користуватись чек-листом",[273,6063,6064],{},"Перед стартом підготуйте три речі.",[283,6066,6067,6073,6079],{},[286,6068,6069,6072],{},[2333,6070,6071],{},"Тестове середовище"," (staging), яке максимально схоже на бойове: ті ж версії PHP і бази, ті ж інтеграції, але в режимі sandbox. Тестувати оплату реальною карткою на проді не потрібно.",[286,6074,6075,6078],{},[2333,6076,6077],{},"Набір тестових даних:"," кілька товарів з різними станами (є в наявності, закінчується, немає, з варіантами, зі знижкою), 2–3 акаунти, промокоди, тестові картки платіжки.",[286,6080,6081,6084],{},[2333,6082,6083],{},"Пристрої:"," мінімум один iPhone з Safari, один Android з Chrome, десктоп з Chrome і Firefox. Емуляція в DevTools корисна, але реальний Safari на iOS ламається інакше.",[273,6086,6087,6088,306],{},"Кожен пункт позначайте так: пройшов, не пройшов, не застосовується. Для кожного провалу фіксуйте кроки відтворення, очікуваний і фактичний результат, пристрій і скріншот чи відео. Приклад якісного опису ми розбирали в статті ",[302,6089,6090],{"href":2806},"Як ми тестуємо: приклад баг-репорту та тест-кейсу",[268,6092,6094],{"id":6093},"_1-каталог-і-пошук-10-пунктів","1. Каталог і пошук (10 пунктів)",[273,6096,6097],{},"Каталог формує перше враження і приводить трафік з пошуку, тому тут перевіряємо і функції, і дані.",[1207,6099,6100,6103,6106,6109,6112,6115,6123,6126,6129,6132],{},[286,6101,6102],{},"Усі категорії відкриваються, у списку немає порожніх сторінок і 500-х помилок.",[286,6104,6105],{},"Кількість товарів у лічильнику категорії збігається з кількістю на сторінці.",[286,6107,6108],{},"Фільтри працюють поодинці й у комбінації; після застосування змінюється URL, і за посиланням можна повернутись до того ж результату.",[286,6110,6111],{},"Скидання фільтрів повертає повний список, а не «нічого не знайдено».",[286,6113,6114],{},"Сортування за ціною справді сортує числа, а не рядки: 900 не стоїть після 10 000.",[286,6116,6117,6118,6122],{},"Пагінація: остання сторінка, сторінка поза діапазоном (",[6119,6120,6121],"code",{},"?page=999",") дають зрозумілу відповідь, а не помилку.",[286,6124,6125],{},"Пошук знаходить товар за назвою, артикулом і з помилкою в одну літеру; кирилиця й латиниця працюють однаково.",[286,6127,6128],{},"Порожній результат пошуку показує підказку і популярні категорії.",[286,6130,6131],{},"Картка товару: фото, ціна, опис, варіанти, наявність відображаються правильно; для товарів без фото є заглушка.",[286,6133,6134],{},"Товар «немає в наявності» не можна купити, але його можна знайти, і є кнопка «повідомити про появу» чи схожі товари.",[273,6136,6137],{},"Окремо перевірте ціни. Ціна в списку, на картці, у кошику й на checkout має бути однаковою до копійки, з урахуванням знижок і округлення.",[268,6139,6141],{"id":6140},"_2-кошик-8-пунктів","2. Кошик (8 пунктів)",[273,6143,6144],{},"Кошик виглядає простим, але в ньому живе найбільше логіки: ціни, залишки, купони.",[1207,6146,6147,6150,6153,6156,6159,6162,6165,6168],{"start":5018},[286,6148,6149],{},"Додавання товару з картки, зі списку й з «швидкого перегляду» працює однаково.",[286,6151,6152],{},"Зміна кількості перераховує суму миттєво; кількість 0 і від'ємна кількість не ламають кошик.",[286,6154,6155],{},"Не можна додати більше, ніж є на складі, і повідомлення про це зрозуміле.",[286,6157,6158],{},"Видалення товару і повернення «скасувати» не залишають «привидів» у лічильнику на іконці.",[286,6160,6161],{},"Кошик зберігається після оновлення сторінки, закриття вкладки й входу в акаунт (гостьовий кошик зливається з акаунтним).",[286,6163,6164],{},"Промокод: валідний, прострочений, використаний, регістр літер, комбінація з іншою знижкою, мінімальна сума. Помилка пояснює причину.",[286,6166,6167],{},"Безкоштовна доставка від суми: поріг відображається і спрацьовує, коли сума перетинає його і вгору, і вниз.",[286,6169,6170],{},"Якщо ціна або залишок змінились, поки товар лежав у кошику, користувач бачить повідомлення, а не дізнається про це на оплаті.",[268,6172,6174],{"id":6173},"_3-checkout-замовлення-без-реєстрації-12-пунктів","3. Checkout: замовлення без реєстрації (12 пунктів)",[273,6176,6177,6178,6181],{},"Саме тут губляться гроші. Про типові баги цього етапу детально в статті ",[302,6179,6180],{"href":721},"Чому губляться замовлення на checkout: 7 типових багів",", а тут базовий перелік.",[1207,6183,6185,6188,6191,6205,6208,6219,6222,6225,6228,6231,6234,6237],{"start":6184},19,[286,6186,6187],{},"Замовлення можна оформити як гість, без обов'язкової реєстрації.",[286,6189,6190],{},"Валідація полів показується біля поля, а не одним повідомленням угорі; введені дані не зникають після помилки.",[286,6192,6193,6194,6197,6198,6197,6201,6204],{},"Телефон приймає формати ",[6119,6195,6196],{},"+380…",", ",[6119,6199,6200],{},"380…",[6119,6202,6203],{},"0…",", з пробілами й дужками і зберігається в єдиному вигляді.",[286,6206,6207],{},"Email із пробілом наприкінці (типовий результат автозаповнення на телефоні) обробляється, а не відхиляється.",[286,6209,6210,6211,6214,6215,6218],{},"Кирилиця, апострофи й лапки в імені та адресі не ламають замовлення (спробуйте ",[6119,6212,6213],{},"О'Коннор"," і ",[6119,6216,6217],{},"Ґанок",").",[286,6220,6221],{},"Вибір доставки змінює вартість і підсумок одразу, без перезавантаження.",[286,6223,6224],{},"Самовивіз показує адресу та години роботи.",[286,6226,6227],{},"Адреса: для кур'єрської доставки обов'язкові потрібні поля, для відділення вони приховані й не блокують відправку.",[286,6229,6230],{},"Подвійне натискання на «Підтвердити замовлення» створює одне замовлення, а не два.",[286,6232,6233],{},"Кнопка «Назад» у браузері не скидає форму і не дублює замовлення.",[286,6235,6236],{},"Після успішного замовлення клієнт бачить сторінку подяки з номером замовлення; оновлення сторінки не створює нового замовлення.",[286,6238,6239],{},"Якщо сесія закінчилась посеред оформлення, користувач не втрачає кошик.",[273,6241,6242],{},"Додайте сюди тест «повільний інтернет»: у DevTools увімкніть Slow 3G і оформіть замовлення. Саме тут вилазять кнопки без індикатора завантаження і подвійні кліки.",[268,6244,6246],{"id":6245},"_4-оплата-й-нова-пошта-10-пунктів","4. Оплата й Нова Пошта (10 пунктів)",[273,6248,6249,6250,306],{},"Інтеграції ламаються на стику систем, тому тестуємо і успіх, і всі види відмов. Окремий розбір цієї теми: ",[302,6251,6252],{"href":1724},"Інтеграція Нової Пошти та оплати: де найчастіше ламається",[1207,6254,6256,6259,6262,6265,6268,6271,6274,6277,6280,6283],{"start":6255},31,[286,6257,6258],{},"Успішна оплата карткою в sandbox: замовлення отримує статус «оплачено», клієнт отримує лист.",[286,6260,6261],{},"Відхилена картка: замовлення залишається «очікує оплати», клієнт бачить зрозуміле повідомлення і може спробувати знову.",[286,6263,6264],{},"Клієнт закрив вкладку на сторінці банку: замовлення не зависає, а є механізм повторної оплати за посиланням.",[286,6266,6267],{},"Платіжка надіслала callback двічі: замовлення не оплачується двічі й не дублюються листи (ідемпотентність).",[286,6269,6270],{},"Callback прийшов раніше, ніж клієнт повернувся на сайт: статус все одно правильний.",[286,6272,6273],{},"Оплата при отриманні і накладений платіж мають окремі правила (ліміти, комісія) і правильно відображаються в замовленні.",[286,6275,6276],{},"Нова Пошта: пошук міста за частиною назви, однойменні населені пункти в різних областях розрізняються.",[286,6278,6279],{},"Відділення і поштомати завантажуються, пошук за номером працює, закрите відділення не пропонується.",[286,6281,6282],{},"Вартість доставки і строки відповідають тарифу перевізника, а ТТН створюється з правильними габаритами й вагою.",[286,6284,6285],{},"Помилка API перевізника не блокує замовлення: менеджер бачить, що ТТН не створилась, і може повторити.",[268,6287,6289],{"id":6288},"_5-акаунт-і-листи-6-пунктів","5. Акаунт і листи (6 пунктів)",[1207,6291,6293,6296,6299,6302,6305,6308],{"start":6292},41,[286,6294,6295],{},"Реєстрація, вхід, відновлення пароля: лист приходить, посилання працює один раз і має термін дії.",[286,6297,6298],{},"Не можна зареєструвати той самий email двічі, навіть в іншому регістрі.",[286,6300,6301],{},"Історія замовлень показує правильні статуси й суми.",[286,6303,6304],{},"Транзакційні листи (підтвердження, оплата, відправлення) приходять не в спам, коректно виглядають у Gmail на телефоні і містять правильні дані.",[286,6306,6307],{},"Підписка на розсилку і форма зворотного зв'язку працюють, є згода на обробку даних.",[286,6309,6310],{},"У листах для адміністратора немає особистих даних, яким там не місце, а повідомлення в Telegram чи CRM приходять з усіма полями замовлення.",[268,6312,6314],{"id":6313},"_6-мобільна-версія-й-сумісність-6-пунктів","6. Мобільна версія й сумісність (6 пунктів)",[273,6316,6317],{},"Для більшості магазинів понад половина трафіку мобільна, тому це не «додатково».",[1207,6319,6321,6324,6335,6338,6341,6344],{"start":6320},47,[286,6322,6323],{},"Перевірте ширини 375, 768 і 1440 пікселів: немає горизонтального скролу і обрізаного тексту.",[286,6325,6326,6327,6330,6331,6334],{},"Кнопки й поля зручні для пальця (орієнтовно від 44 пікселів), поля мають правильний тип клавіатури: ",[6119,6328,6329],{},"tel"," для телефону, ",[6119,6332,6333],{},"email"," для пошти.",[286,6336,6337],{},"Липка шапка чи банер не перекриває кнопку «Купити» і поле вводу, коли відкрита клавіатура.",[286,6339,6340],{},"Safari на iOS: оформлення, оплата, фільтри, випадаючі списки.",[286,6342,6343],{},"Chrome на Android, Firefox та Edge на десктопі: головний сценарій покупки.",[286,6345,6346],{},"Модальні вікна закриваються, фокус не втікає за них, а сторінка під ними не прокручується.",[268,6348,6350],{"id":6349},"_7-швидкість-seo-і-безпека-8-пунктів","7. Швидкість, SEO і безпека (8 пунктів)",[1207,6352,6354,6359,6376,6388,6398,6408,6411,6418],{"start":6353},53,[286,6355,6356,6357,306],{},"Lighthouse на мобільному для головної, категорії й картки товару. Орієнтир: LCP до 2,5 с, CLS до 0,1. Як читати ці метрики без розробника, пояснюємо в статті ",[302,6358,476],{"href":475},[286,6360,6361,6362,6197,6365,6368,6369,6214,6372,6375],{},"У кожного товару й категорії унікальні ",[6119,6363,6364],{},"title",[6119,6366,6367],{},"description",", один ",[6119,6370,6371],{},"h1",[6119,6373,6374],{},"canonical","; фільтровані сторінки не створюють нескінченних дублікатів.",[286,6377,6378,6214,6381,6384,6385,6218],{},[6119,6379,6380],{},"robots.txt",[6119,6382,6383],{},"sitemap.xml"," на місці, а тестове середовище закрите від індексації (і це не переїхало на продакшн разом із ",[6119,6386,6387],{},"noindex",[286,6389,6390,6391,6214,6394,6397],{},"Є мікророзмітка ",[6119,6392,6393],{},"Product",[6119,6395,6396],{},"BreadcrumbList"," з правильними ціною та наявністю.",[286,6399,6400,6401,6214,6404,6407],{},"Сайт працює по HTTPS без попереджень про змішаний вміст; ",[6119,6402,6403],{},"http",[6119,6405,6406],{},"www"," перенаправляються на єдину версію.",[286,6409,6410],{},"Сторінка 404 корисна, а старі адреси мають 301-редиректи.",[286,6412,6413,6414,6417],{},"Базова безпека: пароль не передається в URL, адмінка закрита і не лежить за адресою ",[6119,6415,6416],{},"\u002Fadmin"," без захисту, форми захищені від спаму.",[286,6419,6420,6421,6197,6424,6197,6427,6430],{},"Аналітика: події ",[6119,6422,6423],{},"purchase",[6119,6425,6426],{},"add_to_cart",[6119,6428,6429],{},"begin_checkout"," доходять, а трекінг не спрацьовує до згоди в cookie-банері.",[5825,6432,6433],{},[273,6434,6435,6438,6439,6441],{},[2333,6436,6437],{},"Не хочете проходити 60 пунктів самі?"," Ми зробимо безкоштовний експрес-чек за 48 годин: 10–15 ключових проблем з відео і пріоритетами. А повний ",[302,6440,431],{"href":31}," коштує від 6 000 грн.",[268,6443,6445],{"id":6444},"що-робити-з-результатами","Що робити з результатами",[273,6447,6448],{},"Після проходу чек-листа у вас буде список проблем. Не намагайтесь виправити все одразу, а розкладіть за впливом.",[283,6450,6451,6457,6463,6469],{},[286,6452,6453,6456],{},[2333,6454,6455],{},"Блокери:"," клієнт не може купити або оплатити. Виправляємо до запуску, без винятків.",[286,6458,6459,6462],{},[2333,6460,6461],{},"Критичні:"," є обхідний шлях, але частина клієнтів піде (баг лише в Safari, не працює промокод).",[286,6464,6465,6468],{},[2333,6466,6467],{},"Значущі:"," псують враження чи SEO, але гроші не втрачаються.",[286,6470,6471,6474],{},[2333,6472,6473],{},"Косметичні:"," виправляємо, коли є час.",[273,6476,6477],{},"Хороше правило для запуску: нуль блокерів і нуль критичних у шляху «товар → кошик → оплата». Решту можна запускати зі списком відомих проблем і планом виправлення.",[273,6479,6480,6481,306],{},"Ще одна практична порада: після кожного релізу повторюйте хоча б 12–15 ключових пунктів (розділи 2–4). Це називається регресійне тестування. Якщо воно щоразу забирає години ручної роботи, варто подумати про автоматизацію найважливіших сценаріїв. Коли це виправдано, а коли ні, ми розписали в статті ",[302,6482,6483],{"href":872},"Ручне vs автоматизоване тестування",[268,6485,6487],{"id":6486},"типові-помилки-тих-хто-тестує-сам","Типові помилки тих, хто тестує сам",[273,6489,6490],{},"З нашого досвіду, власники й розробники, які перевіряють свій магазин, роблять одні й ті самі помилки.",[283,6492,6493,6499,6505,6511,6517],{},[286,6494,6495,6498],{},[2333,6496,6497],{},"Тестують «щасливий шлях»."," Клієнти ж роблять усе навпаки: вводять зайві пробіли, тиснуть «Назад», закривають вкладку посеред оплати.",[286,6500,6501,6504],{},[2333,6502,6503],{},"Тестують на своєму комп'ютері."," Розробник працює на швидкому ноутбуці з широким екраном, а покупець сидить на старому Android у метро.",[286,6506,6507,6510],{},[2333,6508,6509],{},"Не фіксують кроки."," Баг, який не вдається відтворити, ніхто не виправить. Записуйте екран.",[286,6512,6513,6516],{},[2333,6514,6515],{},"Не перевіряють після виправлення."," Виправлення одного ламає сусідній функціонал, тому після кожного фікса пройдіть пов'язані пункти.",[286,6518,6519,6522],{},[2333,6520,6521],{},"Пропускають листи й повідомлення."," Замовлення створилось, але лист не прийшов, і клієнт вважає, що його проігнорували.",[273,6524,6525],{},"Якщо у вас є розробник, попросіть його додати сторінку-«пісочницю» з усіма станами товару, а ще краще: налаштуйте автоматичні тести на кошик і checkout. Це найдешевша страховка від повторення старих помилок.",[5825,6527,6528],{},[273,6529,6530,6533,6534,6536],{},[2333,6531,6532],{},"Потрібна друга пара очей перед запуском?"," Опишіть магазин у ",[302,6535,1731],{"href":17},", і ми скажемо, скільки часу й коштів піде на перевірку саме вашого проєкту.",{"title":14,"searchDepth":485,"depth":486,"links":6538},[6539,6540,6541,6542,6543,6544,6545,6546,6547,6548],{"id":6060,"depth":485,"text":6061},{"id":6093,"depth":485,"text":6094},{"id":6140,"depth":485,"text":6141},{"id":6173,"depth":485,"text":6174},{"id":6245,"depth":485,"text":6246},{"id":6288,"depth":485,"text":6289},{"id":6313,"depth":485,"text":6314},{"id":6349,"depth":485,"text":6350},{"id":6444,"depth":485,"text":6445},{"id":6486,"depth":485,"text":6487},"checkout.checklist",[6551,6553,6555,6557],{"marker":161,"text":6552},"каталог і фільтри",{"marker":161,"text":6554},"кошик і промокоди",{"marker":156,"text":6556},"оплата: повторний callback",{"marker":153,"text":6558},"Нова Пошта: порожнє відділення","60 пунктів","2026-10-02","Чек-лист тестування інтернет-магазину потрібен власнику, який збирається запускати або оновлювати сайт і хоче впевнитись, що клієнт зможе знайти товар, покласти його в кошик і заплатити. Нижче 60 пунктів, згрупованих за етапами шляху покупця. Їх можна пройти самостійно за вечір або передати тестувальнику. Ми користуємось саме цим скелетом, коли готуємо QA-аудит інтернет-магазину, тільки на практиці пунктів значно більше: близько 150.",[6563,6566,6569,6572],{"q":6564,"a":6565},"Що тестувати в інтернет-магазині перед запуском?","Перевірте весь шлях покупця: каталог і пошук, кошик, checkout, оплату, доставку, листи й мобільну версію. Найбільше грошей втрачається на checkout і оплаті, тому починайте з них, а вже потім переходьте до другорядних сторінок, швидкості та дрібного оформлення.",{"q":6567,"a":6568},"Скільки часу займає тестування магазину перед запуском?","Самостійно за чек-листом це зазвичай кілька днів, залежно від розміру каталогу й кількості інтеграцій. Повний QA-аудит магазину в нашій студії займає 3–5 днів і коштує від 6 000 грн, а результатом стає звіт із пріоритетами виправлень.",{"q":6570,"a":6571},"Чи можна протестувати магазин самостійно, без QA-інженера?","Так, базові сценарії каталогу, кошика й замовлення можна пройти самому за чек-листом. Але власник знає сайт надто добре й бачить не те, що побачить новий покупець. Складніші випадки, як збої оплати чи різні браузери, краще віддати сторонньому погляду.",{"q":6573,"a":6574},"Які пристрої й браузери перевіряти перед запуском магазину?","Мінімум: актуальні Chrome і Safari на комп'ютері, iPhone із Safari та Android із Chrome. Окремо пройдіть checkout із телефону, бо саме там найчастіше не натискається кнопка чи ламається форма. Якщо є аналітика, орієнтуйтеся на пристрої ваших реальних відвідувачів.",{},"\u002Fuk\u002Fblog\u002Fchek-lyst-testuvannia-internet-mahazynu",{"title":6046,"description":6561},"Чек-лист тестування інтернет-магазину перед запуском: 60 пунктів по каталогу, кошику, checkout, оплаті, мобільній версії та SEO. Використовуйте як є.","Чек-лист тестування інтернет-магазину — Tochno.","uk\u002Fblog\u002Fchek-lyst-testuvannia-internet-mahazynu",[6582,6042],"qa","vD6qSKvB6pnoFL0UOoASFzvHCz1WzHvLJX5ocJrFKsA",{"id":6585,"title":6180,"author":5508,"body":6586,"cover":141,"coverFile":7297,"coverLines":7298,"coverStat":7307,"date":6560,"description":6590,"excerpt":141,"extension":495,"faq":7308,"featured":536,"key":141,"meta":7321,"navigation":525,"path":7322,"readingTime":526,"seo":7323,"seoDescription":7324,"seoTitle":7325,"slug":961,"stem":7326,"tags":7327,"updated":6020,"__hash__":7328},"blog_uk\u002Fuk\u002Fblog\u002Fchomu-hubliatsia-zamovlennia-na-checkout.md",{"type":265,"value":6587,"toc":7285},[6588,6591,6594,6598,6601,6604,6618,6625,6629,6635,6640,6654,6660,6666,6807,6818,6822,6827,6831,6842,6847,6851,6865,6870,6874,6879,6883,6894,6899,6903,6914,6918,6923,6928,6956,6961,6966,6970,6975,6979,6993,6998,7002,7016,7020,7025,7030,7047,7052,7057,7117,7120,7124,7129,7133,7147,7152,7167,7178,7182,7185,7191,7197,7203,7214,7225,7231,7235,7238,7261,7264,7267,7281],[273,6589,6590],{},"Замовлення на checkout губляться через невелику кількість повторюваних причин: подвійні кліки, втрачені відповіді платіжної системи, прострочена сесія, надто сувора валідація полів, збій у залежних сервісах, розбіжність цін і проблеми мобільної версії. Нижче сім типових багів, які ми знаходимо в інтернет-магазинах під час тестування, з кроками відтворення, причиною і способом виправлення. Матеріал корисний і власникам (щоб знати, що питати у розробника), і розробникам (щоб перевірити свій код).",[273,6592,6593],{},"Одразу уточнимо: ми не наводимо чужих кейсів і статистики. Усе нижче це типові сценарії, які легко відтворити на будь-якому магазині. Ми знаходимо їх у роботі як QA, і їх варто перевірити у вас до того, як їх виявить покупець.",[268,6595,6597],{"id":6596},"чому-checkout-це-зона-підвищеного-ризику","Чому checkout це зона підвищеного ризику",[273,6599,6600],{},"Checkout об'єднує найбільше рухомих частин за найменший час: форма з валідацією, розрахунок суми, вибір доставки, зовнішня платіжна система, створення замовлення в базі, листи й повідомлення. Кожна частина може вийти з ладу, а клієнт при цьому нічого не побачить: або отримає незрозумілу помилку, або заплатить і не отримає замовлення.",[273,6602,6603],{},"Особливо небезпечні дві ситуації:",[283,6605,6606,6612],{},[286,6607,6608,6611],{},[2333,6609,6610],{},"Клієнт заплатив, а замовлення немає."," Це найгірший сценарій: гроші списано, а магазин нічого не знає.",[286,6613,6614,6617],{},[2333,6615,6616],{},"Клієнт не зміг дійти до кінця й пішов."," Ви ніколи не дізнаєтесь про це: у базі нічого немає, а в аналітиці лише «відмова».",[273,6619,6620,6621,6624],{},"Тому тестування checkout потрібне не лише в усіх «щасливих» сценаріях, а й у ненормальних: повільна мережа, подвійні кліки, закрита вкладка, відмова банку. Базовий перелік перевірок ми зібрали в ",[302,6622,6623],{"href":2919},"чек-листі на 60 пунктів",", а тут розберемо найдорожчі помилки докладно.",[268,6626,6628],{"id":6627},"баг-1-подвійний-клік-створює-два-замовлення-або-жодного","Баг 1. Подвійний клік створює два замовлення (або жодного)",[273,6630,6631,6634],{},[2333,6632,6633],{},"Симптом."," Клієнт натискає «Підтвердити замовлення», сторінка думає кілька секунд. Він натискає ще раз. У системі з'являються два однакові замовлення або після другого кліку виникає помилка, і перше замовлення «зависає».",[273,6636,6637],{},[2333,6638,6639],{},"Кроки відтворення.",[1207,6641,6642,6645,6648,6651],{},[286,6643,6644],{},"Додайте товар у кошик і перейдіть на checkout.",[286,6646,6647],{},"У DevTools увімкніть Slow 3G.",[286,6649,6650],{},"Двічі швидко натисніть кнопку підтвердження.",[286,6652,6653],{},"Перевірте кількість замовлень у адмінці.",[273,6655,6656,6659],{},[2333,6657,6658],{},"Причина."," Кнопка не блокується після першого натискання, а сервер не перевіряє, чи це повторний запит.",[273,6661,6662,6665],{},[2333,6663,6664],{},"Виправлення."," Потрібні два шари захисту. На клієнті кнопка стає неактивною й показує індикатор. На сервері додається ключ ідемпотентності: клієнт генерує унікальний токен при відкритті форми й передає його із запитом, а сервер відхиляє повторний запит із тим самим токеном.",[6667,6668,6672],"pre",{"className":6669,"code":6670,"language":6671,"meta":14,"style":14},"language-php shiki shiki-themes github-dark-default","\u002F\u002F Laravel: захист від дубля замовлення за ключем ідемпотентності\n$order = Order::firstOrCreate(\n    ['idempotency_key' => $request->input('idempotency_key')],\n    $orderData\n);\n\nif (! $order->wasRecentlyCreated) {\n    return response()->json(['order_id' => $order->id]); \u002F\u002F той самий результат\n}\n","php",[6119,6673,6674,6682,6705,6734,6739,6744,6749,6768,6802],{"__ignoreMap":14},[6675,6676,6678],"span",{"class":6677,"line":3365},"line",[6675,6679,6681],{"class":6680},"sH3jZ","\u002F\u002F Laravel: захист від дубля замовлення за ключем ідемпотентності\n",[6675,6683,6684,6688,6691,6695,6698,6702],{"class":6677,"line":485},[6675,6685,6687],{"class":6686},"sZEs4","$order ",[6675,6689,239],{"class":6690},"suJrU",[6675,6692,6694],{"class":6693},"sFSAA"," Order",[6675,6696,6697],{"class":6690},"::",[6675,6699,6701],{"class":6700},"sc3cj","firstOrCreate",[6675,6703,6704],{"class":6686},"(\n",[6675,6706,6707,6710,6714,6717,6720,6723,6726,6729,6731],{"class":6677,"line":486},[6675,6708,6709],{"class":6686},"    [",[6675,6711,6713],{"class":6712},"s9uIt","'idempotency_key'",[6675,6715,6716],{"class":6690}," =>",[6675,6718,6719],{"class":6686}," $request",[6675,6721,6722],{"class":6690},"->",[6675,6724,6725],{"class":6700},"input",[6675,6727,6728],{"class":6686},"(",[6675,6730,6713],{"class":6712},[6675,6732,6733],{"class":6686},")],\n",[6675,6735,6736],{"class":6677,"line":1343},[6675,6737,6738],{"class":6686},"    $orderData\n",[6675,6740,6741],{"class":6677,"line":4305},[6675,6742,6743],{"class":6686},");\n",[6675,6745,6746],{"class":6677,"line":2960},[6675,6747,6748],{"emptyLinePlaceholder":525},"\n",[6675,6750,6751,6754,6757,6760,6763,6765],{"class":6677,"line":931},[6675,6752,6753],{"class":6690},"if",[6675,6755,6756],{"class":6686}," (",[6675,6758,6759],{"class":6690},"!",[6675,6761,6762],{"class":6686}," $order",[6675,6764,6722],{"class":6690},[6675,6766,6767],{"class":6686},"wasRecentlyCreated) {\n",[6675,6769,6770,6773,6776,6779,6781,6784,6787,6790,6792,6794,6796,6799],{"class":6677,"line":3739},[6675,6771,6772],{"class":6690},"    return",[6675,6774,6775],{"class":6700}," response",[6675,6777,6778],{"class":6686},"()",[6675,6780,6722],{"class":6690},[6675,6782,6783],{"class":6700},"json",[6675,6785,6786],{"class":6686},"([",[6675,6788,6789],{"class":6712},"'order_id'",[6675,6791,6716],{"class":6690},[6675,6793,6762],{"class":6686},[6675,6795,6722],{"class":6690},[6675,6797,6798],{"class":6686},"id]); ",[6675,6800,6801],{"class":6680},"\u002F\u002F той самий результат\n",[6675,6803,6804],{"class":6677,"line":526},[6675,6805,6806],{"class":6686},"}\n",[273,6808,6809,6810,6813,6814,6817],{},"Для цього в таблиці ",[6119,6811,6812],{},"orders"," потрібен унікальний індекс по ",[6119,6815,6816],{},"idempotency_key",", інакше при двох майже одночасних запитах гонка все одно створить дубль.",[268,6819,6821],{"id":6820},"баг-2-платіжна-система-повідомила-про-оплату-а-замовлення-не-оновилось","Баг 2. Платіжна система повідомила про оплату, а замовлення не оновилось",[273,6823,6824,6826],{},[2333,6825,6633],{}," Клієнт заплатив карткою, банк списав гроші, але замовлення залишилось у статусі «очікує оплати». Менеджер не відправляє товар, клієнт дзвонить розлючений.",[273,6828,6829],{},[2333,6830,6639],{},[1207,6832,6833,6836,6839],{},[286,6834,6835],{},"Оформіть замовлення з оплатою карткою в sandbox.",[286,6837,6838],{},"Закрийте вкладку відразу після оплати, не повертаючись на сайт.",[286,6840,6841],{},"Перевірте статус замовлення.",[273,6843,6844,6846],{},[2333,6845,6658],{}," Магазин оновлює статус лише тоді, коли клієнт повертається на сторінку «Дякуємо». Але клієнт може закрити вкладку або втратити зв'язок. Платіжка надсилає окреме серверне повідомлення (callback, або webhook), і саме воно має бути джерелом істини.",[273,6848,6849],{},[2333,6850,6664],{},[283,6852,6853,6856,6859,6862],{},[286,6854,6855],{},"Статус оплати змінюється тільки за серверним callback, перевіреним за підписом.",[286,6857,6858],{},"Повернення клієнта на сайт лише показує стан і не змінює його.",[286,6860,6861],{},"Callback має бути ідемпотентним: платіжка може надіслати його двічі, і друга обробка не має ні дублювати листи, ні змінювати статус назад.",[286,6863,6864],{},"Для замовлень, що довго «висять» в очікуванні, потрібне фонове завдання, яке запитує статус у платіжки напряму.",[273,6866,6867,6868,306],{},"Інтеграції платежів і доставки це окрема велика тема, її ми розбираємо в статті ",[302,6869,6252],{"href":1724},[268,6871,6873],{"id":6872},"баг-3-закінчилась-сесія-і-кошик-зник","Баг 3. Закінчилась сесія, і кошик зник",[273,6875,6876,6878],{},[2333,6877,6633],{}," Клієнт заповнює форму 15 хвилин, відволікається, натискає «Оформити», і замість замовлення бачить помилку «419 Page Expired» або порожній кошик.",[273,6880,6881],{},[2333,6882,6639],{},[1207,6884,6885,6888,6891],{},[286,6886,6887],{},"Додайте товар у кошик, відкрийте checkout.",[286,6889,6890],{},"Залиште сторінку на час, довший за час життя сесії.",[286,6892,6893],{},"Спробуйте відправити форму.",[273,6895,6896,6898],{},[2333,6897,6658],{}," Сесія (або CSRF-токен) прострочена, а сайт реагує сухою технічною помилкою й не зберігає введені дані. Особливо часто це трапляється на мобільних: вкладку вивантажує з пам'яті, поки клієнт переходить у банківський застосунок.",[273,6900,6901],{},[2333,6902,6664],{},[283,6904,6905,6908,6911],{},[286,6906,6907],{},"Кошик зберігається в базі (прив'язується до гостьового ідентифікатора в cookie), а не лише в сесії.",[286,6909,6910],{},"Токен захисту оновлюється автоматично, а при помилці користувач бачить зрозуміле повідомлення із збереженими даними форми.",[286,6912,6913],{},"Введені поля тимчасово зберігаються на клієнті (без паролів і даних картки) і відновлюються після перезавантаження.",[268,6915,6917],{"id":6916},"баг-4-валідація-відхиляє-нормальні-дані","Баг 4. Валідація відхиляє нормальні дані",[273,6919,6920,6922],{},[2333,6921,6633],{}," Клієнт вводить правильні дані, але форма каже «невірний формат» і не пускає далі. Він іде, а ви навіть не бачите, що така спроба була.",[273,6924,6925],{},[2333,6926,6927],{},"Типові випадки.",[283,6929,6930,6937,6940,6947,6950],{},[286,6931,6932,6933,6936],{},"Телефон у форматі ",[6119,6934,6935],{},"+38 (050) 123-45-67"," проти маски, яка очікує лише цифри.",[286,6938,6939],{},"Email із пробілом наприкінці, який додає автозаповнення смартфона.",[286,6941,6942,6943,6946],{},"Прізвище з апострофом (",[6119,6944,6945],{},"Дем'яненко",") або подвійне через дефіс.",[286,6948,6949],{},"Адреса з кирилицею й латинськими літерами в назві вулиці.",[286,6951,6952,6953,6218],{},"Індекс чи будинок із літерою (",[6119,6954,6955],{},"12\u002FА",[273,6957,6958,6960],{},[2333,6959,6639],{}," Створіть невеликий список проблемних значень і по черзі введіть їх у кожне поле. Окремо перевірте автозаповнення браузера на телефоні.",[273,6962,6963,6965],{},[2333,6964,6664],{}," Нормалізуйте введення, а не відхиляйте: видаляйте пробіли з email, зводьте телефон до єдиного формату на сервері, не обмежуйте символи в іменах. Правило: краще прийняти зайве й потім перевірити, ніж не пустити клієнта. Помилка має показуватись біля конкретного поля й пояснювати, що не так.",[268,6967,6969],{"id":6968},"баг-5-нова-пошта-порожній-чи-недоступний-вибір-відділення","Баг 5. Нова Пошта: порожній чи недоступний вибір відділення",[273,6971,6972,6974],{},[2333,6973,6633],{}," Клієнт вибирає «Нова Пошта», але список відділень не завантажується, або місто знайдено, а відділень немає, або вибране відділення зникає після зміни кількості товарів.",[273,6976,6977],{},[2333,6978,6639],{},[1207,6980,6981,6984,6987,6990],{},[286,6982,6983],{},"Виберіть доставку Новою Поштою.",[286,6985,6986],{},"Знайдіть місто за частиною назви, а також населений пункт, що має двійників в інших областях.",[286,6988,6989],{},"Виберіть відділення, потім змініть кількість товару й подивіться, чи не скинувся вибір.",[286,6991,6992],{},"Вимкніть мережу посеред вибору й спробуйте знову.",[273,6994,6995,6997],{},[2333,6996,6658],{}," Магазин залежить від зовнішнього API й не має запасного плану. Якщо API повільне чи недоступне, форма застигає. Інший варіант: список відділень кешується занадто довго, і клієнтові пропонують закрите відділення.",[273,6999,7000],{},[2333,7001,6664],{},[283,7003,7004,7007,7010,7013],{},[286,7005,7006],{},"Таймаут і повторні спроби для запитів до API, зрозуміле повідомлення при збої.",[286,7008,7009],{},"Кеш довідника міст і відділень із регулярним оновленням у фоні.",[286,7011,7012],{},"Збереження вибору при зміні кошика.",[286,7014,7015],{},"Запасний варіант: поле «адреса вручну» чи можливість оформити замовлення з уточненням доставки менеджером, щоб збій чужого API не блокував продаж.",[268,7017,7019],{"id":7018},"баг-6-ціна-на-checkout-відрізняється-від-ціни-в-каталозі","Баг 6. Ціна на checkout відрізняється від ціни в каталозі",[273,7021,7022,7024],{},[2333,7023,6633],{}," У каталозі товар коштує 1 200 грн, у кошику 1 250, на checkout 1 190. Клієнт губиться й іде, або ще гірше: купує за помилковою ціною, і ви працюєте в збиток.",[273,7026,7027],{},[2333,7028,7029],{},"Причини.",[283,7031,7032,7035,7038,7041,7044],{},[286,7033,7034],{},"Знижка рахується на різних етапах за різною формулою (до чи після доставки).",[286,7036,7037],{},"Округлення відбувається в різних місцях, і копійки розходяться.",[286,7039,7040],{},"Кеш каталогу показує стару ціну після зміни.",[286,7042,7043],{},"Промокод застосовується до товарів, які не мали б входити в акцію.",[286,7045,7046],{},"Валюта чи ПДВ рахуються не однаково на фронті й на бекенді.",[273,7048,7049,7051],{},[2333,7050,6639],{}," Візьміть 3–4 товари з різними знижками й порівняйте ціну в списку, картці, кошику, checkout, листі й адмінці. Виконайте це з промокодом і без. Кожен розрахунок звіряйте з калькулятором.",[273,7053,7054,7056],{},[2333,7055,6664],{}," Єдине місце, де рахується ціна. Фронтенд тільки показує те, що повернув сервер. Суму замовлення фіксують у момент створення (знімок цін), щоб подальші зміни каталогу не впливали на вже оформлені замовлення. Гроші зберігають у копійках цілим числом, а не числом із плаваючою комою:",[6667,7058,7060],{"className":6669,"code":7059,"language":6671,"meta":14,"style":14},"\u002F\u002F ризикований варіант: float\n$total = 19.99 * 3; \u002F\u002F 59.97, але 59.969999... у деяких випадках\n\n\u002F\u002F надійний варіант: копійки в цілих числах\n$totalMinor = 1999 * 3; \u002F\u002F 5997\n",[6119,7061,7062,7067,7089,7093,7098],{"__ignoreMap":14},[6675,7063,7064],{"class":6677,"line":3365},[6675,7065,7066],{"class":6680},"\u002F\u002F ризикований варіант: float\n",[6675,7068,7069,7072,7074,7077,7080,7083,7086],{"class":6677,"line":485},[6675,7070,7071],{"class":6686},"$total ",[6675,7073,239],{"class":6690},[6675,7075,7076],{"class":6693}," 19.99",[6675,7078,7079],{"class":6690}," *",[6675,7081,7082],{"class":6693}," 3",[6675,7084,7085],{"class":6686},"; ",[6675,7087,7088],{"class":6680},"\u002F\u002F 59.97, але 59.969999... у деяких випадках\n",[6675,7090,7091],{"class":6677,"line":486},[6675,7092,6748],{"emptyLinePlaceholder":525},[6675,7094,7095],{"class":6677,"line":1343},[6675,7096,7097],{"class":6680},"\u002F\u002F надійний варіант: копійки в цілих числах\n",[6675,7099,7100,7103,7105,7108,7110,7112,7114],{"class":6677,"line":4305},[6675,7101,7102],{"class":6686},"$totalMinor ",[6675,7104,239],{"class":6690},[6675,7106,7107],{"class":6693}," 1999",[6675,7109,7079],{"class":6690},[6675,7111,7082],{"class":6693},[6675,7113,7085],{"class":6686},[6675,7115,7116],{"class":6680},"\u002F\u002F 5997\n",[273,7118,7119],{},"Для магазину це особливо важливо, бо округлення накопичується на великих замовленнях і з'являється як «чомусь не сходиться з бухгалтерією».",[268,7121,7123],{"id":7122},"баг-7-мобільний-checkout-де-не-можна-натиснути-кнопку","Баг 7. Мобільний checkout, де не можна натиснути кнопку",[273,7125,7126,7128],{},[2333,7127,6633],{}," На iPhone чи Android клієнт не може завершити замовлення: кнопка перекрита липким банером, клавіатура закриває поле, випадаючий список не відкривається, форма «стрибає».",[273,7130,7131],{},[2333,7132,6639],{},[1207,7134,7135,7138,7141,7144],{},[286,7136,7137],{},"Відкрийте checkout на реальному телефоні (iPhone із Safari й Android із Chrome), а не лише в емуляторі.",[286,7139,7140],{},"Заповніть форму, перемикаючись між полями.",[286,7142,7143],{},"Подивіться, чи не перекриває щось кнопку підтвердження, коли відкрита клавіатура.",[286,7145,7146],{},"Спробуйте повернути екран і змінити масштаб тексту в системі.",[273,7148,7149,7151],{},[2333,7150,6658],{}," Верстку перевіряли на десктопі. Мобільні браузери по-різному обробляють висоту екрана, фіксовані елементи й автозуми в полях вводу. У Safari поле з розміром шрифту менше 16 пікселів автоматично збільшується при фокусі, що ламає макет.",[273,7153,7154,7156,7157,6197,7160,6197,7163,7166],{},[2333,7155,6664],{}," Шрифт полів від 16 пікселів, правильні типи полів (",[6119,7158,7159],{},"type=\"tel\"",[6119,7161,7162],{},"inputmode",[6119,7164,7165],{},"autocomplete","), кнопка завершення не фіксується там, де може бути закрита клавіатурою, а перевірка проводиться на реальних пристроях. Мобільний трафік у більшості магазинів складає більшу частину відвідувань, тож цей баг особливо дорогий.",[5825,7168,7169],{},[273,7170,7171,7174,7175,7177],{},[2333,7172,7173],{},"Хочете знати, де губляться замовлення саме у вашому магазині?"," Наш безкоштовний експрес-чек за 48 годин покаже 10–15 ключових проблем: перевіряємо checkout, мобільну версію й швидкість. Якщо проблем багато, ми запропонуємо ",[302,7176,431],{"href":31}," від 6 000 грн.",[268,7179,7181],{"id":7180},"як-знайти-такі-баги-до-клієнта","Як знайти такі баги до клієнта",[273,7183,7184],{},"Усі сім багів об'єднує одне: їх не видно на «щасливому шляху». Розробник пройшов checkout один раз, усе спрацювало, і задачу закрито. Щоб ловити такі проблеми системно, потрібен підхід.",[273,7186,7187,7190],{},[2333,7188,7189],{},"Тестуйте негативні сценарії."," Для кожного кроку питайте: «Що буде, якщо це не спрацює?». Помилка платіжки, відсутність мережі, подвійний клік, закінчення сесії, повторний запит.",[273,7192,7193,7196],{},[2333,7194,7195],{},"Використовуйте тестові середовища сервісів."," Усі популярні платіжки й Нова Пошта мають sandbox. Тестова картка з успішною оплатою, відхиленням і відмовою 3-D Secure це мінімум.",[273,7198,7199,7202],{},[2333,7200,7201],{},"Логуйте й моніторьте."," Якщо замовлення губляться, ви маєте про це знати до дзвінка клієнта. Налаштуйте:",[283,7204,7205,7208,7211],{},[286,7206,7207],{},"запис усіх callback платіжки з тілом і підписом;",[286,7209,7210],{},"сповіщення (у Telegram чи пошту) про замовлення, що «висять» в очікуванні понад 30 хвилин;",[286,7212,7213],{},"метрики воронки: скільки людей дійшло до checkout і скільки завершили. Різкий провал це сигнал.",[273,7215,7216,7219,7220,7222,7223,306],{},[2333,7217,7218],{},"Автоматизуйте критичний шлях."," Найважливіший сценарій «товар → кошик → оплата → замовлення» варто покрити автотестом, який запускається на кожен реліз. Ми використовуємо Playwright і запускаємо тести в CI; детальніше про ",[302,7221,444],{"href":443}," і про те, що автоматизувати спершу, у статті ",[302,7224,6483],{"href":872},[273,7226,7227,7230],{},[2333,7228,7229],{},"Повторюйте регрес після змін."," Кожне оновлення модуля, зміна ціноутворення чи нова доставка можуть зламати те, що працювало. Перед релізом проганяйте ключові пункти, а не лише нову функцію.",[268,7232,7234],{"id":7233},"короткий-підсумок","Короткий підсумок",[273,7236,7237],{},"Сім типових причин, чому губляться замовлення на checkout:",[1207,7239,7240,7243,7246,7249,7252,7255,7258],{},[286,7241,7242],{},"Подвійний клік без ідемпотентності.",[286,7244,7245],{},"Статус оплати залежить від повернення клієнта, а не від callback.",[286,7247,7248],{},"Сесія й токени закінчуються без збереження кошика.",[286,7250,7251],{},"Валідація відхиляє нормальні дані.",[286,7253,7254],{},"Залежність від API Нової Пошти без запасного плану.",[286,7256,7257],{},"Розбіжності цін між етапами.",[286,7259,7260],{},"Непридатний до використання мобільний checkout.",[273,7262,7263],{},"Жоден із цих багів не потребує складної технології для виправлення, лише уваги до негативних сценаріїв і тестування на реальних пристроях. Ціна ж їх у прямих втратах: кожне загублене замовлення це не лише втрачений продаж, а й втрачений клієнт.",[273,7265,7266],{},"Почніть із двох речей уже сьогодні. По-перше, самі пройдіть checkout на телефоні зі слабким інтернетом, двічі натискаючи кнопки. По-друге, переконайтесь, що у вас є сповіщення про замовлення, які не завершились оплатою. Це займе годину, а може врятувати тижні виручки.",[5825,7268,7269],{},[273,7270,7271,6533,7274,7276,7277,7280],{},[2333,7272,7273],{},"Потрібна перевірка checkout від людей, які це роблять щодня?",[302,7275,1731],{"href":17}," або подивіться, як проходить ",[302,7278,7279],{"href":438},"тестування сайтів і магазинів",": регрес, кросбраузерність, звіт із відео й пріоритетами.",[7282,7283,7284],"style",{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":14,"searchDepth":485,"depth":486,"links":7286},[7287,7288,7289,7290,7291,7292,7293,7294,7295,7296],{"id":6596,"depth":485,"text":6597},{"id":6627,"depth":485,"text":6628},{"id":6820,"depth":485,"text":6821},{"id":6872,"depth":485,"text":6873},{"id":6916,"depth":485,"text":6917},{"id":6968,"depth":485,"text":6969},{"id":7018,"depth":485,"text":7019},{"id":7122,"depth":485,"text":7123},{"id":7180,"depth":485,"text":7181},{"id":7233,"depth":485,"text":7234},"checkout.bugs",[7299,7301,7303,7305],{"marker":153,"text":7300},"подвійний клік: два замовлення",{"marker":153,"text":7302},"callback оплати втрачено",{"marker":156,"text":7304},"телефон з пробілами не проходить",{"marker":166,"text":7306},"перевірено на 12 пристроях","7 багів",[7309,7312,7315,7318],{"q":7310,"a":7311},"Чому клієнт оплатив, а замовлення в адмінці не з'явилось?","Найчастіше колбек від платіжної системи не дійшов або не був коректно опрацьований, тому статус замовлення не оновився. Перевірте логи колбеків і порівняйте їх із випискою платіжної системи. Обробка колбеків має бути надійною та стійкою до повторних викликів.",{"q":7313,"a":7314},"Як зрозуміти, що саме на checkout втрачаються замовлення?","Порівняйте в аналітиці кількість початих оформлень із завершеними й подивіться журнал помилок сервера. Різкий провал на одному кроці вказує на проблему. Корисно також самому пройти замовлення з різних пристроїв і способів оплати та опитати службу підтримки про скарги клієнтів.",{"q":7316,"a":7317},"Чому ціна на checkout може відрізнятися від ціни в каталозі?","Зазвичай через кеш цін, різне округлення або знижки й купони, які рахуються в різних місцях коду. Остаточну суму має обчислювати один серверний розрахунок. Перевірте акційні товари, купони та зміну кількості в кошику. Такі розбіжності підривають довіру й призводять до відмов саме перед оплатою.",{"q":7319,"a":7320},"Як часто потрібно тестувати checkout?","Після кожного релізу, що зачіпає кошик, оплату, доставку чи форми, а також після оновлення CMS і плагінів. Для критичного шляху покупки корисно мати короткий набір регресійних перевірок. Якщо проблем накопичилось багато, допоможе разовий QA-аудит від 6 000 грн.",{},"\u002Fuk\u002Fblog\u002Fchomu-hubliatsia-zamovlennia-na-checkout",{"title":6180,"description":6590},"Чому губляться замовлення на checkout: 7 типових багів інтернет-магазину з прикладами, кроками відтворення і способами виправлення та перевірки.","Чому губляться замовлення на checkout — Tochno.","uk\u002Fblog\u002Fchomu-hubliatsia-zamovlennia-na-checkout",[6042,6582],"Jj7DAVybK_mnYfmPcj46ovCAPuFoCyNGoxW55MV4-iY",{"id":7330,"title":7331,"author":5508,"body":7332,"cover":141,"coverFile":8054,"coverLines":8055,"coverStat":8064,"date":6560,"description":7336,"excerpt":141,"extension":495,"faq":8065,"featured":536,"key":141,"meta":8078,"navigation":525,"path":8079,"readingTime":4665,"seo":8080,"seoDescription":8081,"seoTitle":8082,"slug":562,"stem":8083,"tags":8084,"updated":8086,"__hash__":8087},"blog_uk\u002Fuk\u002Fblog\u002Fcore-web-vitals-dlia-vlasnyka-mahazynu.md","Core Web Vitals для власника магазину: що це і як перевірити самому",{"type":265,"value":7333,"toc":8032},[7334,7337,7340,7344,7347,7428,7438,7441,7466,7470,7473,7477,7480,7500,7503,7507,7510,7514,7517,7534,7537,7541,7544,7548,7551,7555,7558,7583,7587,7594,7655,7659,7666,7670,7677,7681,7684,7687,7713,7716,7730,7734,7737,7740,7772,7779,7849,7852,7856,7859,7902,7905,7915,7919,7922,7936,7942,7946,7952,7955,7969,7973,8005,8011,8015,8018,8029],[273,7335,7336],{},"Core Web Vitals — це три метрики Google, які показують, наскільки швидко інтернет-магазин завантажується, відгукується на дії та чи не «стрибає» під час читання: LCP, INP і CLS. Власнику магазину не потрібно вміти їх рахувати. Достатньо знати хороші значення, вміти за 15 хвилин перевірити сайт безкоштовними інструментами і розуміти, про що просити розробника.",[273,7338,7339],{},"Ми будуємо сайти з орієнтацією на ці метрики, тому нижче — практичний посібник без зайвої теорії: що вимірюється, де дивитися цифри, що найчастіше їх погіршує в магазинах і що з цим робити.",[268,7341,7343],{"id":7342},"що-таке-core-web-vitals-і-чому-це-важливо-для-магазину","Що таке Core Web Vitals і чому це важливо для магазину",[273,7345,7346],{},"Google вимірює «досвід сторінки» трьома показниками. Це не абстрактні оцінки, а відображення реальних відчуттів покупця: «довго нічого не з'являється», «кнопка не реагує», «я хотів натиснути одне, а натиснув інше».",[342,7348,7349,7368],{},[345,7350,7351],{},[348,7352,7353,7356,7359,7362,7365],{},[351,7354,7355],{},"Метрика",[351,7357,7358],{},"Що означає",[351,7360,7361],{},"Добре",[351,7363,7364],{},"Потребує покращення",[351,7366,7367],{},"Погано",[358,7369,7370,7389,7409],{},[348,7371,7372,7377,7380,7383,7386],{},[363,7373,7374,7376],{},[2333,7375,5073],{}," (Largest Contentful Paint)",[363,7378,7379],{},"Коли з'явився найбільший елемент на екрані: зазвичай головне фото або заголовок",[363,7381,7382],{},"до 2,5 с",[363,7384,7385],{},"2,5–4 с",[363,7387,7388],{},"понад 4 с",[348,7390,7391,7397,7400,7403,7406],{},[363,7392,7393,7396],{},[2333,7394,7395],{},"INP"," (Interaction to Next Paint)",[363,7398,7399],{},"Як швидко сторінка реагує на кліки, дотики, введення",[363,7401,7402],{},"до 200 мс",[363,7404,7405],{},"200–500 мс",[363,7407,7408],{},"понад 500 мс",[348,7410,7411,7416,7419,7422,7425],{},[363,7412,7413,7415],{},[2333,7414,5077],{}," (Cumulative Layout Shift)",[363,7417,7418],{},"Наскільки елементи зміщуються під час завантаження",[363,7420,7421],{},"до 0,1",[363,7423,7424],{},"0,1–0,25",[363,7426,7427],{},"понад 0,25",[273,7429,7430,7431,7437],{},"Це порогові значення, які ",[302,7432,7436],{"href":7433,"rel":7434},"https:\u002F\u002Fweb.dev\u002Farticles\u002Fvitals",[7435],"nofollow","публікує Google"," (перевірено в жовтні 2026). Оцінка вважається за 75-м перцентилем: тобто три чверті відвідувачів мають отримувати «добрий» результат.",[273,7439,7440],{},"Навіщо це вам як власнику:",[283,7442,7443,7449,7454,7460],{},[286,7444,7445,7448],{},[2333,7446,7447],{},"Гроші."," Повільна сторінка каталогу або картки товару втрачає покупців до того, як вони побачили асортимент. Точні цифри залежать від ніші, тому ми не обіцяємо «+20% конверсії», але напрямок очевидний.",[286,7450,7451,7453],{},[2333,7452,5802],{}," Core Web Vitals входять до сигналів «досвіду сторінки». Вони не замінюють корисний контент, але за рівної якості швидший сайт має перевагу.",[286,7455,7456,7459],{},[2333,7457,7458],{},"Реклама."," Якщо трафік платний, повільна посадкова сторінка робить кожен клік дорожчим.",[286,7461,7462,7465],{},[2333,7463,7464],{},"Мобільні користувачі."," Більша частина покупців відкриває магазин з телефона, часто через нестабільний мобільний інтернет.",[268,7467,7469],{"id":7468},"як-перевірити-core-web-vitals-самому-за-15-хвилин","Як перевірити Core Web Vitals самому за 15 хвилин",[273,7471,7472],{},"Вам знадобиться браузер і безкоштовні інструменти Google. Єдине правило: перевіряйте не лише головну, а й типові шаблони — каталог, картку товару, кошик.",[5588,7474,7476],{"id":7475},"крок-1-pagespeed-insights","Крок 1. PageSpeed Insights",[273,7478,7479],{},"Відкрийте сервіс PageSpeed Insights, вставте адресу сторінки й оберіть вкладку «Мобільні». Ви побачите два блоки.",[1207,7481,7482,7494],{},[286,7483,7484,7487,7488,7493],{},[2333,7485,7486],{},"Дані з реальних користувачів"," (field data) — вгорі. Це показники відвідувачів за останні 28 днів зі ",[302,7489,7492],{"href":7490,"rel":7491},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fcrux",[7435],"звіту CrUX",". Саме вони важливі для Google. Якщо трафіку мало, цього блоку може не бути.",[286,7495,7496,7499],{},[2333,7497,7498],{},"Діагностика"," (lab data) — внизу. Це симуляція завантаження на слабкому пристрої. Вона показує причини проблем, але не є «офіційною» оцінкою.",[273,7501,7502],{},"Не гоніться лише за загальним балом Lighthouse. Дивіться на LCP, INP (у lab-режимі замість нього показується TBT) і CLS окремо, а також на список порад «Можливості» й «Діагностика».",[5588,7504,7506],{"id":7505},"крок-2-звіт-у-google-search-console","Крок 2. Звіт у Google Search Console",[273,7508,7509],{},"Якщо сайт підключений до Search Console, відкрийте розділ «Основні веб-показники». Там сторінки згруповані за статусом: хороші, потребують покращення, погані. Групуються вони за типовими шаблонами, тож видно, що «усі картки товарів повільні», а не лише одна сторінка.",[5588,7511,7513],{"id":7512},"крок-3-перевірка-на-реальному-телефоні","Крок 3. Перевірка на реальному телефоні",[273,7515,7516],{},"Відкрийте магазин зі свого смартфона через мобільну мережу, не через домашній Wi-Fi. Дайте собі п'ять запитань:",[283,7518,7519,7522,7525,7528,7531],{},[286,7520,7521],{},"Через скільки секунд я бачу головне фото товару?",[286,7523,7524],{},"Чи не зсувається сторінка, коли підвантажуються банери та рекомендації?",[286,7526,7527],{},"Чи реагує кнопка «Купити» одразу, чи є затримка?",[286,7529,7530],{},"Чи відкривається фільтр у каталозі без «зависання»?",[286,7532,7533],{},"Чи не перекриває контент cookie-банер або чат?",[273,7535,7536],{},"Цей простий тест знаходить половину проблем без жодного інструмента.",[5588,7538,7540],{"id":7539},"крок-4-chrome-devtools-для-просунутих","Крок 4. Chrome DevTools (для просунутих)",[273,7542,7543],{},"У Chrome натисніть F12, відкрийте вкладку Performance або Lighthouse і запустіть аудит у режимі мобільного пристрою із сповільненням мережі. На вкладці Performance видно, які скрипти блокують основний потік. Якщо ви не розробник, можна просто зробити знімок і передати його підряднику як аргумент у розмові.",[268,7545,7547],{"id":7546},"lcp-чому-головний-елемент-зявляється-повільно","LCP: чому головний елемент з'являється повільно",[273,7549,7550],{},"У магазинах LCP — це майже завжди велика фотографія: банер на головній, фото товару на картці або перше зображення в каталозі. Причини повільності типові.",[5588,7552,7554],{"id":7553},"важкі-зображення","Важкі зображення",[273,7556,7557],{},"Фото на 2–3 МБ у форматі JPEG на мобільному завантажуються секундами. Що зробити:",[283,7559,7560,7563,7570,7573],{},[286,7561,7562],{},"віддавати сучасні формати (WebP, AVIF);",[286,7564,7565,7566,7569],{},"генерувати кілька розмірів і підставляти відповідний екрану через ",[6119,7567,7568],{},"srcset",";",[286,7571,7572],{},"стискати без помітної втрати якості;",[286,7574,7575,7576,6214,7579,7582],{},"задавати ",[6119,7577,7578],{},"width",[6119,7580,7581],{},"height",", щоб браузер зарезервував місце.",[5588,7584,7586],{"id":7585},"зображення-яке-лінується-не-тоді-коли-треба","Зображення, яке «лінується» не тоді, коли треба",[273,7588,7589,7590,7593],{},"Атрибут ",[6119,7591,7592],{},"loading=\"lazy\""," корисний для картинок нижче першого екрана. Але якщо його поставити на головне фото, браузер відкладе його завантаження. Для LCP-елемента потрібно навпаки:",[6667,7595,7599],{"className":7596,"code":7597,"language":7598,"meta":14,"style":14},"language-html shiki shiki-themes github-dark-default","\u003Cimg src=\"\u002Fimg\u002Fhero.avif\" width=\"1200\" height=\"600\"\n     fetchpriority=\"high\" alt=\"Нова колекція\">\n","html",[6119,7600,7601,7634],{"__ignoreMap":14},[6675,7602,7603,7606,7610,7613,7615,7618,7621,7623,7626,7629,7631],{"class":6677,"line":3365},[6675,7604,7605],{"class":6686},"\u003C",[6675,7607,7609],{"class":7608},"sPWt5","img",[6675,7611,7612],{"class":6693}," src",[6675,7614,239],{"class":6686},[6675,7616,7617],{"class":6712},"\"\u002Fimg\u002Fhero.avif\"",[6675,7619,7620],{"class":6693}," width",[6675,7622,239],{"class":6686},[6675,7624,7625],{"class":6712},"\"1200\"",[6675,7627,7628],{"class":6693}," height",[6675,7630,239],{"class":6686},[6675,7632,7633],{"class":6712},"\"600\"\n",[6675,7635,7636,7639,7641,7644,7647,7649,7652],{"class":6677,"line":485},[6675,7637,7638],{"class":6693},"     fetchpriority",[6675,7640,239],{"class":6686},[6675,7642,7643],{"class":6712},"\"high\"",[6675,7645,7646],{"class":6693}," alt",[6675,7648,239],{"class":6686},[6675,7650,7651],{"class":6712},"\"Нова колекція\"",[6675,7653,7654],{"class":6686},">\n",[5588,7656,7658],{"id":7657},"повільна-відповідь-сервера","Повільна відповідь сервера",[273,7660,7661,7662,7665],{},"Якщо сервер генерує сторінку по 1,5 секунди, жодні оптимізації картинок цього не виправлять. Для Laravel-магазинів причина часто в N+1 запитах до бази й відсутності кешу: про це ми писали в ",[302,7663,7664],{"href":304},"статті про технічний аудит коду",". Якщо сторінки можна віддавати зі статичного кешу чи prerender, виграш буває найбільшим.",[5588,7667,7669],{"id":7668},"блокуючі-шрифти-стилі-та-скрипти","Блокуючі шрифти, стилі та скрипти",[273,7671,7672,7673,7676],{},"Шрифти з зовнішнього CDN, багато CSS-файлів і скриптів у ",[6119,7674,7675],{},"\u003Chead>"," затримують перший показ. Рішення: розмістити шрифти на власному домені, підключати лише потрібні накреслення й мови, відкладати непотрібні скрипти.",[268,7678,7680],{"id":7679},"inp-чому-магазин-тупить-після-кліку","INP: чому магазин «тупить» після кліку",[273,7682,7683],{},"INP — найновіша метрика, яка замінила FID. Вона вимірює затримку між дією користувача і оновленням екрана протягом усього візиту, а не лише першого кліку.",[273,7685,7686],{},"Що її погіршує:",[283,7688,7689,7695,7701,7707],{},[286,7690,7691,7694],{},[2333,7692,7693],{},"Надлишок JavaScript."," Бібліотеки для слайдерів, віджети, чати, пікселі, A\u002FB-тести: кожен додає навантаження на основний потік.",[286,7696,7697,7700],{},[2333,7698,7699],{},"Сторонні скрипти аналітики та реклами."," Тег-менеджер із десятком тегів може сповільнити сторінку більше, ніж увесь код магазину.",[286,7702,7703,7706],{},[2333,7704,7705],{},"Важкі обробники подій."," Наприклад, фільтр, який на кожен клік перерисовує весь список із тисяч елементів.",[286,7708,7709,7712],{},[2333,7710,7711],{},"Гідратація великих сторінок"," у SPA-фреймворках, коли сторінка виглядає готовою, але ще не реагує.",[273,7714,7715],{},"Практичні кроки:",[1207,7717,7718,7721,7724,7727],{},[286,7719,7720],{},"Складіть список усіх сторонніх скриптів і для кожного запитайте: «Хто цим користується і яке рішення на основі цього приймає?» Те, чим ніхто не користується, видаліть.",[286,7722,7723],{},"Завантажуйте аналітику та маркетингові пікселі після згоди користувача й з відкладенням. Це ще й вимога конфіденційності.",[286,7725,7726],{},"Розбивайте довгі завдання: прокрутка, фільтри та кошик мають відповідати першими.",[286,7728,7729],{},"Для великих каталогів використовуйте пагінацію або віртуалізацію списків.",[268,7731,7733],{"id":7732},"cls-чому-контент-стрибає","CLS: чому контент «стрибає»",[273,7735,7736],{},"Зміщення макета дратує і шкодить конверсії: людина збирається натиснути «Додати в кошик», а блок рекомендацій з'являється й зсуває кнопку.",[273,7738,7739],{},"Типові винуватці:",[283,7741,7742,7748,7754,7760,7766],{},[286,7743,7744,7747],{},[2333,7745,7746],{},"Зображення без розмірів."," Браузер не знає висоти й підганяє її після завантаження.",[286,7749,7750,7753],{},[2333,7751,7752],{},"Банери, cookie-панелі та промо-смуги",", які з'являються зверху й виштовхують контент.",[286,7755,7756,7759],{},[2333,7757,7758],{},"Шрифти, що підміняються"," після завантаження і змінюють розміри тексту.",[286,7761,7762,7765],{},[2333,7763,7764],{},"Динамічні блоки:"," відгуки, «разом з цим купують», віджети доставки без зарезервованого місця.",[286,7767,7768,7771],{},[2333,7769,7770],{},"Вбудовування (iframe) без розмірів:"," відео, карти, віджети оплати.",[273,7773,7774,7775,7778],{},"Найпростіше правило: для будь-якого елемента, що завантажується пізніше, зарезервуйте місце заздалегідь. Це робиться задаванням розмірів чи ",[6119,7776,7777],{},"aspect-ratio",":",[6667,7780,7784],{"className":7781,"code":7782,"language":7783,"meta":14,"style":14},"language-css shiki shiki-themes github-dark-default",".product-card__image { aspect-ratio: 4 \u002F 5; width: 100%; height: auto; }\n.promo-bar { min-height: 40px; }\n","css",[6119,7785,7786,7829],{"__ignoreMap":14},[6675,7787,7788,7791,7794,7796,7799,7801,7804,7806,7808,7810,7812,7814,7817,7819,7821,7823,7826],{"class":6677,"line":3365},[6675,7789,7790],{"class":6693},".product-card__image",[6675,7792,7793],{"class":6686}," { ",[6675,7795,7777],{"class":6693},[6675,7797,7798],{"class":6686},": ",[6675,7800,2679],{"class":6693},[6675,7802,7803],{"class":6686}," \u002F ",[6675,7805,2683],{"class":6693},[6675,7807,7085],{"class":6686},[6675,7809,7578],{"class":6693},[6675,7811,7798],{"class":6686},[6675,7813,5453],{"class":6693},[6675,7815,7816],{"class":6690},"%",[6675,7818,7085],{"class":6686},[6675,7820,7581],{"class":6693},[6675,7822,7798],{"class":6686},[6675,7824,7825],{"class":6693},"auto",[6675,7827,7828],{"class":6686},"; }\n",[6675,7830,7831,7834,7836,7839,7841,7844,7847],{"class":6677,"line":485},[6675,7832,7833],{"class":6693},".promo-bar",[6675,7835,7793],{"class":6686},[6675,7837,7838],{"class":6693},"min-height",[6675,7840,7798],{"class":6686},[6675,7842,7843],{"class":6693},"40",[6675,7845,7846],{"class":6690},"px",[6675,7848,7828],{"class":6686},[273,7850,7851],{},"Для cookie-банера краще робити фіксовану панель знизу, яка не штовхає контент.",[268,7853,7855],{"id":7854},"що-виправляти-першим-порядок-дій","Що виправляти першим: порядок дій",[273,7857,7858],{},"Не варто одразу переписувати сайт. Дійте за принципом «найбільший ефект — найменша робота».",[1207,7860,7861,7870,7876,7882,7891,7897],{},[286,7862,7863,7866,7867,7869],{},[2333,7864,7865],{},"Зображення."," Формати, розміри, ",[6119,7868,7568],{},", правильне lazy-завантаження. Часто це дає найбільший приріст LCP.",[286,7871,7872,7875],{},[2333,7873,7874],{},"Сторонні скрипти."," Аудит і видалення зайвого, відкладене завантаження решти.",[286,7877,7878,7881],{},[2333,7879,7880],{},"Резервування місця"," під банери, зображення та віджети. Зазвичай виправляє CLS за кілька годин.",[286,7883,7884,7887,7888,306],{},[2333,7885,7886],{},"Шрифти."," Самостійний хостинг, мінімум накреслень, коректне ",[6119,7889,7890],{},"font-display",[286,7892,7893,7896],{},[2333,7894,7895],{},"Кешування й швидкість сервера."," Кеш сторінок, оптимізація запитів до бази, CDN.",[286,7898,7899,7901],{},[2333,7900,3535],{}," Якщо базові речі виправлені, а показники слабкі, час дивитися на платформу: кількість JavaScript, спосіб рендерингу.",[273,7903,7904],{},"Після кожної зміни перевіряйте результат у PageSpeed Insights. Field-дані оновлюються з затримкою до 28 днів, тому не панікуйте, якщо Search Console не показує покращення наступного ж дня: орієнтуйтеся на lab-вимірювання, а реальний ефект побачите пізніше.",[5825,7906,7907],{},[273,7908,7909,7912,7913,306],{},[2333,7910,7911],{},"Не знаєте, що саме гальмує ваш магазин?"," Ми проведемо експрес-перевірку швидкості та мобільної версії й покажемо 10–15 ключових проблем у PDF за 48 годин. Це безкоштовно, детальніше на сторінці ",[302,7914,4616],{"href":31},[268,7916,7918],{"id":7917},"які-цілі-ставити-розробникам","Які цілі ставити розробникам",[273,7920,7921],{},"Коли ви замовляєте новий сайт чи оптимізацію, прописуйте вимірювані цілі, а не загальне «щоб швидко». Наші внутрішні вимоги для сайтів, які ми будуємо:",[283,7923,7924,7927,7930,7933],{},[286,7925,7926],{},"Lighthouse на мобільному: Performance 95+ на ключових сторінках, SEO та Best Practices — 100;",[286,7928,7929],{},"LCP до 2,5 с, INP до 200 мс, CLS до 0,1 за польовими даними (75-й перцентиль);",[286,7931,7932],{},"мінімум JavaScript на головній сторінці, шрифти з власного домену, зображення в сучасних форматах;",[286,7934,7935],{},"сторонні скрипти лише після згоди користувача.",[273,7937,7938,7939,306],{},"Ці цифри — цілі, а не гарантії для будь-якого проєкту: на показники впливають хостинг, кількість інтеграцій і контент, який додаєте ви. Але домовитися про метод вимірювання й порогові значення можна до початку роботи. Це один із 12 пунктів, які ми радимо перевіряти, ",[302,7940,7941],{"href":3317},"обираючи підрядника на розробку сайту",[268,7943,7945],{"id":7944},"швидкість-і-дизайн-що-вирішується-ще-до-коду","Швидкість і дизайн: що вирішується ще до коду",[273,7947,7948,7949,7951],{},"Багато проблем із метриками закладаються на етапі макета. Слайдер із шести великих зображень на першому екрані, відео-фон, три шрифти з десятком накреслень, анімації при прокрутці: усе це гарантовано б'є по LCP та INP. Дизайн, який враховує продуктивність, — це ",[302,7950,4334],{"href":1248},", де кожен блок має «ціну» в мілісекундах і обґрунтування.",[273,7953,7954],{},"Практичні правила для дизайнера та замовника:",[283,7956,7957,7960,7963,7966],{},[286,7958,7959],{},"на першому екрані одне головне зображення чи заголовок, а не карусель;",[286,7961,7962],{},"обмежена кількість шрифтів і накреслень;",[286,7964,7965],{},"місце під динамічні блоки (відгуки, рекомендації) заплановане в макеті;",[286,7967,7968],{},"анімація там, де вона допомагає зрозуміти інтерфейс, а не просто прикрашає.",[268,7970,7972],{"id":7971},"типові-помилки-власників-магазинів","Типові помилки власників магазинів",[283,7974,7975,7981,7987,7993,7999],{},[286,7976,7977,7980],{},[2333,7978,7979],{},"Орієнтуватися лише на бал Lighthouse на комп'ютері."," Мобільні результати зазвичай гірші й важливіші.",[286,7982,7983,7986],{},[2333,7984,7985],{},"Перевіряти тільки головну."," Картка товару та каталог часто повільніші.",[286,7988,7989,7992],{},[2333,7990,7991],{},"Додавати плагіни без перевірки наслідків."," Кожен віджет має ціну в мілісекундах.",[286,7994,7995,7998],{},[2333,7996,7997],{},"Вимірювати один раз."," Метрики псуються поступово: нова акція, новий банер, новий піксель.",[286,8000,8001,8004],{},[2333,8002,8003],{},"Вважати швидкість «технічною справою»."," Це частина бізнес-результату, тому вона має бути в чек-листі приймання сайту.",[273,8006,8007,8008,306],{},"Для регулярного контролю достатньо раз на місяць пройтися за кроками 1–3 і зафіксувати цифри в таблиці. Якщо проєкт підтримується окремо, швидкість і регрес варто включити в пакет ",[302,8009,8010],{"href":889},"підтримки сайту",[268,8012,8014],{"id":8013},"підсумок","Підсумок",[273,8016,8017],{},"Core Web Vitals — це не про «бали в Google», а про те, чи комфортно покупцеві користуватися вашим магазином. Три метрики, три прості питання: швидко з'являється? швидко відгукується? не стрибає? Перевірити це можна безкоштовно за чверть години, а більшість проблем виправляється зображеннями, сторонніми скриптами та резервуванням місця.",[5825,8019,8020],{},[273,8021,8022,8025,8026,8028],{},[2333,8023,8024],{},"Хочете магазин, який швидко відкривається на телефонах?"," Ми будуємо сайти з цілями за Core Web Vitals із самого початку. Залиште ",[302,8027,482],{"href":17}," — оцінимо проєкт за 1 робочий день.",[7282,8030,8031],{},"html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sPWt5, html code.shiki .sPWt5{--shiki-default:#7EE787}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}",{"title":14,"searchDepth":485,"depth":486,"links":8033},[8034,8035,8041,8047,8048,8049,8050,8051,8052,8053],{"id":7342,"depth":485,"text":7343},{"id":7468,"depth":485,"text":7469,"children":8036},[8037,8038,8039,8040],{"id":7475,"depth":486,"text":7476},{"id":7505,"depth":486,"text":7506},{"id":7512,"depth":486,"text":7513},{"id":7539,"depth":486,"text":7540},{"id":7546,"depth":485,"text":7547,"children":8042},[8043,8044,8045,8046],{"id":7553,"depth":486,"text":7554},{"id":7585,"depth":486,"text":7586},{"id":7657,"depth":486,"text":7658},{"id":7668,"depth":486,"text":7669},{"id":7679,"depth":485,"text":7680},{"id":7732,"depth":485,"text":7733},{"id":7854,"depth":485,"text":7855},{"id":7917,"depth":485,"text":7918},{"id":7944,"depth":485,"text":7945},{"id":7971,"depth":485,"text":7972},{"id":8013,"depth":485,"text":8014},"web-vitals.report",[8056,8058,8060,8062],{"marker":161,"text":8057},"LCP ≤ 2,5 с",{"marker":161,"text":8059},"INP ≤ 200 мс",{"marker":156,"text":8061},"CLS 0,14 — банер зсуває контент",{"marker":166,"text":8063},"дані з реальних користувачів, 28 днів","3 метрики",[8066,8069,8072,8075],{"q":8067,"a":8068},"Що таке Core Web Vitals простими словами?","Це три метрики Google про досвід на сторінці: LCP показує, як швидко з'являється головний контент, INP — як швидко сторінка реагує на дії, CLS — чи не стрибає макет. Вони впливають на зручність покупки. Перевірити їх можна безкоштовно в PageSpeed Insights.",{"q":8070,"a":8071},"Де безкоштовно перевірити Core Web Vitals свого сайту?","Найпростіше в PageSpeed Insights: вставте адресу сторінки й дивіться польові дані. Також корисні звіт Core Web Vitals у Google Search Console та Lighthouse у Chrome. Перевіряйте не лише головну, а й категорію, картку товару та checkout, бо вони зазвичай важчі.",{"q":8073,"a":8074},"Які значення Core Web Vitals вважаються хорошими?","За орієнтирами Google, хороші значення: LCP до 2,5 с, INP до 200 мс і CLS до 0,1. Їх оцінюють за 75-м перцентилем реальних відвідувань. Тому лабораторний тест в одному браузері є лише підказкою, а не остаточною оцінкою.",{"q":8076,"a":8077},"Чи впливають Core Web Vitals на позиції в Google?","Так, але помірно: це один із сигналів сторінкового досвіду, і він не замінює релевантний контент. Водночас повільний або «стрибучий» магазин втрачає покупців незалежно від позицій. Тому швидкість варто виправляти насамперед заради конверсії, а SEO-ефект вважати бонусом.",{},"\u002Fuk\u002Fblog\u002Fcore-web-vitals-dlia-vlasnyka-mahazynu",{"title":7331,"description":7336},"Core Web Vitals простими словами: що таке LCP, INP і CLS, які значення вважаються хорошими, як перевірити магазин самому і що виправити першим.","Core Web Vitals для власника магазину — Tochno.","uk\u002Fblog\u002Fcore-web-vitals-dlia-vlasnyka-mahazynu",[6042,8085],"design","2026-10-31","CKMM9OsW3lRD4FKWF5HYQZlH1rCV7p8Iz6jSBXrbs3c",{"id":8089,"title":6252,"author":5508,"body":8090,"cover":141,"coverFile":9285,"coverLines":9286,"coverStat":9295,"date":6560,"description":8094,"excerpt":141,"extension":495,"faq":9296,"featured":536,"key":141,"meta":9309,"navigation":525,"path":9310,"readingTime":526,"seo":9311,"seoDescription":9312,"seoTitle":9313,"slug":1796,"stem":9314,"tags":9315,"updated":6020,"__hash__":9317},"blog_uk\u002Fuk\u002Fblog\u002Fintehratsiia-novoi-poshty-ta-oplaty.md",{"type":265,"value":8091,"toc":9263},[8092,8095,8098,8102,8105,8108,8115,8119,8123,8126,8129,8148,8152,8155,8158,8161,8165,8176,8179,8183,8187,8194,8197,8214,8217,8592,8599,8603,8606,8617,8620,8624,8627,8630,8645,8648,8652,8656,8663,8670,8674,8677,8680,9033,9040,9044,9051,9054,9100,9103,9107,9110,9113,9125,9129,9132,9176,9185,9195,9199,9202,9216,9219,9223,9226,9243,9250,9260],[273,8093,8094],{},"Інтеграція Нової Пошти та онлайн-оплати ламається не там, де її чекають. Сам виклик API зазвичай працює з першого разу. Проблеми починаються на межах: коли відділення зникло з довідника, колбек платіжки прийшов двічі, а ТТН створилася на неправильну вагу. Ця стаття для власників магазинів і розробників на Laravel: 10 найчастіших місць поломок і те, як ми їх перевіряємо.",[273,8096,8097],{},"Нижче все базується на практиці Laravel-проєктів з доставкою Новою Поштою і оплатою через LiqPay або схожі сервіси. Конкретні назви полів перевіряйте за актуальною документацією провайдера: API змінюються, а принципи ні.",[268,8099,8101],{"id":8100},"чому-саме-ці-інтеграції-створюють-найбільше-проблем","Чому саме ці інтеграції створюють найбільше проблем",[273,8103,8104],{},"Доставка й оплата живуть поза вашим кодом. Ви не контролюєте їхню доступність, формат відповідей і час реакції. До того ж обидві інтеграції стосуються грошей: помилка у відображенні банера не коштує нічого, а помилка в оплаті коштує замовлення і довіри клієнта.",[273,8106,8107],{},"Є ще одна причина. Ці інтеграції рідко тестують на повному шляху. Розробник перевіряє «happy path» у sandbox, замовник клікає один раз у тестовому режимі, і все виглядає добре. Реальні клієнти роблять інше: закривають вкладку під час 3-D Secure, обирають поштомат для посилки на 30 кг, вводять номер телефону з пробілами.",[273,8109,8110,8111,8114],{},"Якщо ви замовляєте ",[302,8112,8113],{"href":28},"розробку інтернет-магазину",", запитайте підрядника, як саме він перевіряє ці сценарії. Відповідь «ми тестували в sandbox» недостатня.",[268,8116,8118],{"id":8117},"нова-пошта-довідники-та-вибір-відділення","Нова Пошта: довідники та вибір відділення",[5588,8120,8122],{"id":8121},"_1-застарілі-довідники-міст-і-відділень","1. Застарілі довідники міст і відділень",[273,8124,8125],{},"Типова помилка: розробник один раз завантажує список відділень у базу і забуває про нього. Відділення відкриваються, закриваються, переїжджають, тимчасово не працюють. Клієнт обирає відділення, якого вже немає, а ТТН не створюється.",[273,8127,8128],{},"Що робити:",[283,8130,8131,8138,8145],{},[286,8132,8133,8134,8137],{},"Оновлюйте довідник за розкладом (",[6119,8135,8136],{},"php artisan schedule","), а не вручну. Для невеликого магазину достатньо раз на добу вночі.",[286,8139,8140,8141,8144],{},"Зберігайте в замовленні не лише ",[6119,8142,8143],{},"warehouse_ref",", а й текстовий знімок: місто, номер відділення, адресу. Через місяць відділення може змінитися, а менеджеру треба бачити, що вибрав клієнт.",[286,8146,8147],{},"Позначайте відділення, що зникли з довідника, а не видаляйте. Інакше старі замовлення втратять зв'язок.",[5588,8149,8151],{"id":8150},"_2-обмеження-за-вагою-та-габаритами","2. Обмеження за вагою та габаритами",[273,8153,8154],{},"Не кожне відділення приймає вантаж будь-якої ваги. Поштомати мають жорсткі обмеження за розміром і вагою посилки, а частина відділень не приймає великогабаритні вантажі. У довіднику відділень є поля з максимальною вагою і габаритами, і їх треба використовувати.",[273,8156,8157],{},"Класичний баг: у кошику важкий товар, у чекауті пропонуються всі відділення, клієнт обирає поштомат, а менеджер потім телефонує і просить змінити відділення. Це втрачений час і частина замовлень, які клієнт просто скасує.",[273,8159,8160],{},"Правильна поведінка: порахувати сумарну вагу кошика, відфільтрувати відділення за обмеженнями, а якщо жодне не підходить, показати зрозуміле повідомлення. Для цього в товарів мають бути заповнені вага й габарити. Це вимога до контенту, а не лише до коду.",[5588,8162,8164],{"id":8163},"_3-пошук-міста-та-населені-пункти-з-однаковою-назвою","3. Пошук міста та населені пункти з однаковою назвою",[273,8166,8167,8168,8171,8172,8175],{},"В Україні багато населених пунктів з однаковими назвами в різних областях. Пошук по тексту без уточнення області повертає не те село. Використовуйте метод пошуку населених пунктів (",[6119,8169,8170],{},"Address\u002FsearchSettlements",") і зберігайте ",[6119,8173,8174],{},"Ref",", а не назву. У випадаючому списку показуйте область і район, щоб клієнт бачив, яке саме «Лісове» він обирає.",[273,8177,8178],{},"Окремо перевіряйте введення з помилками: «Днепр» замість «Дніпро», зайві пробіли, апостроф у «Кам'янське» (є три різні символи апострофа). Автокомпліт має це переживати.",[268,8180,8182],{"id":8181},"створення-накладної-ттн","Створення накладної (ТТН)",[5588,8184,8186],{"id":8185},"_4-помилки-валідації-при-створенні-ттн","4. Помилки валідації при створенні ТТН",[273,8188,8189,8190,8193],{},"Накладна створюється методом ",[6119,8191,8192],{},"InternetDocument\u002Fsave",", і тут найбільше «дрібних» відмов: телефон отримувача у неправильному форматі, не заповнене прізвище, оголошена вартість нуль, вага менша за допустиму мінімальну. Якщо ваш код створює ТТН прямо в момент оформлення замовлення, клієнт бачить помилку, якої не розуміє.",[273,8195,8196],{},"Наша практика така:",[1207,8198,8199,8205,8208,8211],{},[286,8200,8201,8202,306],{},"Нормалізуйте телефон при введенні: приберіть пробіли, дужки, дефіси, приведіть до формату ",[6119,8203,8204],{},"380XXXXXXXXX",[286,8206,8207],{},"Створюйте ТТН не в HTTP-запиті клієнта, а у фоновому завданні (queue job).",[286,8209,8210],{},"Якщо API повернув помилку, зберігайте текст помилки в замовленні й показуйте менеджеру в адмінці. Не ковтайте виняток.",[286,8212,8213],{},"Додайте кнопку «Створити ТТН повторно» для менеджера.",[273,8215,8216],{},"Приклад каркаса завдання:",[6667,8218,8220],{"className":6669,"code":8219,"language":6671,"meta":14,"style":14},"class CreateShipmentJob implements ShouldQueue\n{\n    public int $tries = 5;\n    public array $backoff = [30, 120, 600, 1800];\n\n    public function __construct(public int $orderId) {}\n\n    public function handle(NovaPoshtaClient $np): void\n    {\n        $order = Order::findOrFail($this->orderId);\n\n        \u002F\u002F Idempotency: do not create a second waybill for the same order\n        if ($order->ttn_number) {\n            return;\n        }\n\n        $response = $np->createWaybill($order);\n\n        if (! $response['success']) {\n            $order->update(['shipment_error' => json_encode($response['errors'], JSON_UNESCAPED_UNICODE)]);\n            throw new ShipmentFailed($response['errors']);\n        }\n\n        $order->update([\n            'ttn_number' => $response['data'][0]['IntDocNumber'],\n            'shipment_error' => null,\n        ]);\n    }\n}\n",[6119,8221,8222,8237,8242,8261,8297,8301,8321,8325,8347,8352,8376,8380,8385,8399,8407,8413,8418,8437,8442,8459,8494,8513,8518,8523,8536,8561,8575,8581,8587],{"__ignoreMap":14},[6675,8223,8224,8227,8231,8234],{"class":6677,"line":3365},[6675,8225,8226],{"class":6690},"class",[6675,8228,8230],{"class":8229},"sQhOw"," CreateShipmentJob",[6675,8232,8233],{"class":6690}," implements",[6675,8235,8236],{"class":6693}," ShouldQueue\n",[6675,8238,8239],{"class":6677,"line":485},[6675,8240,8241],{"class":6686},"{\n",[6675,8243,8244,8247,8250,8253,8255,8258],{"class":6677,"line":486},[6675,8245,8246],{"class":6690},"    public",[6675,8248,8249],{"class":6690}," int",[6675,8251,8252],{"class":6686}," $tries ",[6675,8254,239],{"class":6690},[6675,8256,8257],{"class":6693}," 5",[6675,8259,8260],{"class":6686},";\n",[6675,8262,8263,8265,8268,8271,8273,8276,8279,8281,8284,8286,8289,8291,8294],{"class":6677,"line":1343},[6675,8264,8246],{"class":6690},[6675,8266,8267],{"class":6690}," array",[6675,8269,8270],{"class":6686}," $backoff ",[6675,8272,239],{"class":6690},[6675,8274,8275],{"class":6686}," [",[6675,8277,8278],{"class":6693},"30",[6675,8280,6197],{"class":6686},[6675,8282,8283],{"class":6693},"120",[6675,8285,6197],{"class":6686},[6675,8287,8288],{"class":6693},"600",[6675,8290,6197],{"class":6686},[6675,8292,8293],{"class":6693},"1800",[6675,8295,8296],{"class":6686},"];\n",[6675,8298,8299],{"class":6677,"line":4305},[6675,8300,6748],{"emptyLinePlaceholder":525},[6675,8302,8303,8305,8308,8311,8313,8316,8318],{"class":6677,"line":2960},[6675,8304,8246],{"class":6690},[6675,8306,8307],{"class":6690}," function",[6675,8309,8310],{"class":6693}," __construct",[6675,8312,6728],{"class":6686},[6675,8314,8315],{"class":6690},"public",[6675,8317,8249],{"class":6690},[6675,8319,8320],{"class":6686}," $orderId) {}\n",[6675,8322,8323],{"class":6677,"line":931},[6675,8324,6748],{"emptyLinePlaceholder":525},[6675,8326,8327,8329,8331,8334,8336,8339,8342,8344],{"class":6677,"line":3739},[6675,8328,8246],{"class":6690},[6675,8330,8307],{"class":6690},[6675,8332,8333],{"class":6700}," handle",[6675,8335,6728],{"class":6686},[6675,8337,8338],{"class":6693},"NovaPoshtaClient",[6675,8340,8341],{"class":6686}," $np)",[6675,8343,7778],{"class":6690},[6675,8345,8346],{"class":6690}," void\n",[6675,8348,8349],{"class":6677,"line":526},[6675,8350,8351],{"class":6686},"    {\n",[6675,8353,8354,8357,8359,8361,8363,8366,8368,8371,8373],{"class":6677,"line":4665},[6675,8355,8356],{"class":6686},"        $order ",[6675,8358,239],{"class":6690},[6675,8360,6694],{"class":6693},[6675,8362,6697],{"class":6690},[6675,8364,8365],{"class":6700},"findOrFail",[6675,8367,6728],{"class":6686},[6675,8369,8370],{"class":6693},"$this",[6675,8372,6722],{"class":6690},[6675,8374,8375],{"class":6686},"orderId);\n",[6675,8377,8378],{"class":6677,"line":5018},[6675,8379,6748],{"emptyLinePlaceholder":525},[6675,8381,8382],{"class":6677,"line":2525},[6675,8383,8384],{"class":6680},"        \u002F\u002F Idempotency: do not create a second waybill for the same order\n",[6675,8386,8388,8391,8394,8396],{"class":6677,"line":8387},13,[6675,8389,8390],{"class":6690},"        if",[6675,8392,8393],{"class":6686}," ($order",[6675,8395,6722],{"class":6690},[6675,8397,8398],{"class":6686},"ttn_number) {\n",[6675,8400,8402,8405],{"class":6677,"line":8401},14,[6675,8403,8404],{"class":6690},"            return",[6675,8406,8260],{"class":6686},[6675,8408,8410],{"class":6677,"line":8409},15,[6675,8411,8412],{"class":6686},"        }\n",[6675,8414,8416],{"class":6677,"line":8415},16,[6675,8417,6748],{"emptyLinePlaceholder":525},[6675,8419,8421,8424,8426,8429,8431,8434],{"class":6677,"line":8420},17,[6675,8422,8423],{"class":6686},"        $response ",[6675,8425,239],{"class":6690},[6675,8427,8428],{"class":6686}," $np",[6675,8430,6722],{"class":6690},[6675,8432,8433],{"class":6700},"createWaybill",[6675,8435,8436],{"class":6686},"($order);\n",[6675,8438,8440],{"class":6677,"line":8439},18,[6675,8441,6748],{"emptyLinePlaceholder":525},[6675,8443,8444,8446,8448,8450,8453,8456],{"class":6677,"line":6184},[6675,8445,8390],{"class":6690},[6675,8447,6756],{"class":6686},[6675,8449,6759],{"class":6690},[6675,8451,8452],{"class":6686}," $response[",[6675,8454,8455],{"class":6712},"'success'",[6675,8457,8458],{"class":6686},"]) {\n",[6675,8460,8461,8464,8466,8469,8471,8474,8476,8479,8482,8485,8488,8491],{"class":6677,"line":4324},[6675,8462,8463],{"class":6686},"            $order",[6675,8465,6722],{"class":6690},[6675,8467,8468],{"class":6700},"update",[6675,8470,6786],{"class":6686},[6675,8472,8473],{"class":6712},"'shipment_error'",[6675,8475,6716],{"class":6690},[6675,8477,8478],{"class":6693}," json_encode",[6675,8480,8481],{"class":6686},"($response[",[6675,8483,8484],{"class":6712},"'errors'",[6675,8486,8487],{"class":6686},"], ",[6675,8489,8490],{"class":6693},"JSON_UNESCAPED_UNICODE",[6675,8492,8493],{"class":6686},")]);\n",[6675,8495,8497,8500,8503,8506,8508,8510],{"class":6677,"line":8496},21,[6675,8498,8499],{"class":6690},"            throw",[6675,8501,8502],{"class":6690}," new",[6675,8504,8505],{"class":6693}," ShipmentFailed",[6675,8507,8481],{"class":6686},[6675,8509,8484],{"class":6712},[6675,8511,8512],{"class":6686},"]);\n",[6675,8514,8516],{"class":6677,"line":8515},22,[6675,8517,8412],{"class":6686},[6675,8519,8521],{"class":6677,"line":8520},23,[6675,8522,6748],{"emptyLinePlaceholder":525},[6675,8524,8526,8529,8531,8533],{"class":6677,"line":8525},24,[6675,8527,8528],{"class":6686},"        $order",[6675,8530,6722],{"class":6690},[6675,8532,8468],{"class":6700},[6675,8534,8535],{"class":6686},"([\n",[6675,8537,8538,8541,8543,8545,8548,8551,8553,8555,8558],{"class":6677,"line":2196},[6675,8539,8540],{"class":6712},"            'ttn_number'",[6675,8542,6716],{"class":6690},[6675,8544,8452],{"class":6686},[6675,8546,8547],{"class":6712},"'data'",[6675,8549,8550],{"class":6686},"][",[6675,8552,5238],{"class":6693},[6675,8554,8550],{"class":6686},[6675,8556,8557],{"class":6712},"'IntDocNumber'",[6675,8559,8560],{"class":6686},"],\n",[6675,8562,8564,8567,8569,8572],{"class":6677,"line":8563},26,[6675,8565,8566],{"class":6712},"            'shipment_error'",[6675,8568,6716],{"class":6690},[6675,8570,8571],{"class":6693}," null",[6675,8573,8574],{"class":6686},",\n",[6675,8576,8578],{"class":6677,"line":8577},27,[6675,8579,8580],{"class":6686},"        ]);\n",[6675,8582,8584],{"class":6677,"line":8583},28,[6675,8585,8586],{"class":6686},"    }\n",[6675,8588,8590],{"class":6677,"line":8589},29,[6675,8591,6806],{"class":6686},[273,8593,8594,8595,8598],{},"Ключове тут не синтаксис, а перевірка ",[6119,8596,8597],{},"ttn_number"," на початку. Без неї повторний запуск завдання створить другу накладну і ви заплатите за дві.",[5588,8600,8602],{"id":8601},"_5-накладений-платіж-і-зворотна-доставка-грошей","5. Накладений платіж і зворотна доставка грошей",[273,8604,8605],{},"Накладений платіж додає складність: сума зворотної доставки має збігатися із сумою замовлення мінус уже сплачена частина. Типові баги:",[283,8607,8608,8611,8614],{},[286,8609,8610],{},"клієнт оплатив частково (знижка, промокод, бонуси), а ТТН створена з повною сумою накладеного платежу;",[286,8612,8613],{},"сума округлена по-різному в магазині і в накладній, і виникає розбіжність у копійки, яку бухгалтерія потім шукає тижнями;",[286,8615,8616],{},"для замовлень, оплачених карткою, накладений платіж взагалі не має створюватися, але через умову в коді все одно створюється.",[273,8618,8619],{},"Тестуйте комбінації: передоплата повна, передоплата частина, накладений платіж, промокод плюс накладений платіж. Це десять хвилин ручної перевірки, яка рятує від скарг.",[5588,8621,8623],{"id":8622},"_6-недоступність-api-та-таймаути","6. Недоступність API та таймаути",[273,8625,8626],{},"API Нової Пошти буває повільним, іноді недоступним, іноді повертає помилку лише на певні запити. Якщо пошук відділень у чекауті йде прямо в API без кешу й обмеження часу очікування, повільна відповідь зависає всю форму.",[273,8628,8629],{},"Мінімум, який варто мати:",[283,8631,8632,8639,8642],{},[286,8633,8634,8635,8638],{},"явний таймаут HTTP-клієнта (у Laravel ",[6119,8636,8637],{},"Http::timeout(8)->retry(2, 200)",");",[286,8640,8641],{},"кеш довідників, щоб чекаут не залежав від API під час пошуку;",[286,8643,8644],{},"запасний сценарій: якщо довідник недоступний, дозволити ввести адресу вручну й передати замовлення менеджеру на уточнення.",[273,8646,8647],{},"Це рішення про бізнес, а не лише про код: що важливіше, не втратити замовлення чи отримати ідеальні дані. Для магазину майже завжди першим є замовлення.",[268,8649,8651],{"id":8650},"онлайн-оплата-колбеки-статуси-дублі","Онлайн-оплата: колбеки, статуси, дублі",[5588,8653,8655],{"id":8654},"_7-довіра-до-сторінки-повернення-замість-серверного-колбеку","7. Довіра до сторінки повернення замість серверного колбеку",[273,8657,8658,8659,8662],{},"Найнебезпечніша помилка в оплаті. Після платежу клієнт повертається на сторінку «Дякуємо за замовлення» (",[6119,8660,8661],{},"result_url","). Якщо ви позначаєте замовлення оплаченим саме тут, то ризикуєте двічі: клієнт може закрити вкладку до повернення, і оплата не зафіксується, а зловмисник може відкрити цю адресу вручну і вдати оплату.",[273,8664,8665,8666,8669],{},"Правильна схема така: статус замовлення змінює лише серверний колбек платіжної системи (",[6119,8667,8668],{},"server_url"," у LiqPay), а сторінка повернення тільки показує поточний статус і за потреби опитує його.",[5588,8671,8673],{"id":8672},"_8-непідтверджений-підпис-і-повторні-колбеки","8. Непідтверджений підпис і повторні колбеки",[273,8675,8676],{},"Платіжна система надсилає колбек із підписом. Якщо ви його не перевіряєте, будь-хто може надіслати POST-запит і позначити замовлення оплаченим. У LiqPay підпис розраховується від приватного ключа і даних запиту; формула є в документації, і її треба реалізувати та покрити тестом.",[273,8678,8679],{},"Платіжні системи також повторюють колбеки, якщо ваш сервер відповів не 200 або не відповів вчасно. Тому обробник має бути ідемпотентним: повторний колбек з тим самим статусом не повинен ні створювати друге замовлення, ні списувати двічі залишки, ні надсилати другого листа.",[6667,8681,8683],{"className":6669,"code":8682,"language":6671,"meta":14,"style":14},"public function handle(Request $request): Response\n{\n    $data = $request->input('data');\n    $signature = $request->input('signature');\n\n    if (! hash_equals($this->sign($data), $signature)) {\n        abort(403);\n    }\n\n    $payload = json_decode(base64_decode($data), true);\n\n    DB::transaction(function () use ($payload) {\n        $order = Order::where('public_id', $payload['order_id'])\n            ->lockForUpdate()\n            ->firstOrFail();\n\n        \u002F\u002F Terminal state reached already: ignore repeated callbacks\n        if ($order->payment_status === 'paid') {\n            return;\n        }\n\n        if ($payload['status'] === 'success' && (float) $payload['amount'] === (float) $order->total) {\n            $order->markPaid($payload['payment_id']);\n        }\n    });\n\n    return response('OK');\n}\n",[6119,8684,8685,8706,8710,8729,8749,8753,8777,8789,8793,8797,8820,8824,8848,8874,8885,8895,8899,8904,8924,8930,8934,8938,8986,9003,9007,9012,9016,9029],{"__ignoreMap":14},[6675,8686,8687,8689,8691,8693,8695,8698,8701,8703],{"class":6677,"line":3365},[6675,8688,8315],{"class":6690},[6675,8690,8307],{"class":6690},[6675,8692,8333],{"class":6700},[6675,8694,6728],{"class":6686},[6675,8696,8697],{"class":6693},"Request",[6675,8699,8700],{"class":6686}," $request)",[6675,8702,7778],{"class":6690},[6675,8704,8705],{"class":6693}," Response\n",[6675,8707,8708],{"class":6677,"line":485},[6675,8709,8241],{"class":6686},[6675,8711,8712,8715,8717,8719,8721,8723,8725,8727],{"class":6677,"line":486},[6675,8713,8714],{"class":6686},"    $data ",[6675,8716,239],{"class":6690},[6675,8718,6719],{"class":6686},[6675,8720,6722],{"class":6690},[6675,8722,6725],{"class":6700},[6675,8724,6728],{"class":6686},[6675,8726,8547],{"class":6712},[6675,8728,6743],{"class":6686},[6675,8730,8731,8734,8736,8738,8740,8742,8744,8747],{"class":6677,"line":1343},[6675,8732,8733],{"class":6686},"    $signature ",[6675,8735,239],{"class":6690},[6675,8737,6719],{"class":6686},[6675,8739,6722],{"class":6690},[6675,8741,6725],{"class":6700},[6675,8743,6728],{"class":6686},[6675,8745,8746],{"class":6712},"'signature'",[6675,8748,6743],{"class":6686},[6675,8750,8751],{"class":6677,"line":4305},[6675,8752,6748],{"emptyLinePlaceholder":525},[6675,8754,8755,8758,8760,8762,8765,8767,8769,8771,8774],{"class":6677,"line":2960},[6675,8756,8757],{"class":6690},"    if",[6675,8759,6756],{"class":6686},[6675,8761,6759],{"class":6690},[6675,8763,8764],{"class":6693}," hash_equals",[6675,8766,6728],{"class":6686},[6675,8768,8370],{"class":6693},[6675,8770,6722],{"class":6690},[6675,8772,8773],{"class":6700},"sign",[6675,8775,8776],{"class":6686},"($data), $signature)) {\n",[6675,8778,8779,8782,8784,8787],{"class":6677,"line":931},[6675,8780,8781],{"class":6700},"        abort",[6675,8783,6728],{"class":6686},[6675,8785,8786],{"class":6693},"403",[6675,8788,6743],{"class":6686},[6675,8790,8791],{"class":6677,"line":3739},[6675,8792,8586],{"class":6686},[6675,8794,8795],{"class":6677,"line":526},[6675,8796,6748],{"emptyLinePlaceholder":525},[6675,8798,8799,8802,8804,8807,8809,8812,8815,8818],{"class":6677,"line":4665},[6675,8800,8801],{"class":6686},"    $payload ",[6675,8803,239],{"class":6690},[6675,8805,8806],{"class":6693}," json_decode",[6675,8808,6728],{"class":6686},[6675,8810,8811],{"class":6693},"base64_decode",[6675,8813,8814],{"class":6686},"($data), ",[6675,8816,8817],{"class":6693},"true",[6675,8819,6743],{"class":6686},[6675,8821,8822],{"class":6677,"line":5018},[6675,8823,6748],{"emptyLinePlaceholder":525},[6675,8825,8826,8829,8831,8834,8836,8839,8842,8845],{"class":6677,"line":2525},[6675,8827,8828],{"class":6693},"    DB",[6675,8830,6697],{"class":6690},[6675,8832,8833],{"class":6700},"transaction",[6675,8835,6728],{"class":6686},[6675,8837,8838],{"class":6690},"function",[6675,8840,8841],{"class":6686}," () ",[6675,8843,8844],{"class":6690},"use",[6675,8846,8847],{"class":6686}," ($payload) {\n",[6675,8849,8850,8852,8854,8856,8858,8861,8863,8866,8869,8871],{"class":6677,"line":8387},[6675,8851,8356],{"class":6686},[6675,8853,239],{"class":6690},[6675,8855,6694],{"class":6693},[6675,8857,6697],{"class":6690},[6675,8859,8860],{"class":6700},"where",[6675,8862,6728],{"class":6686},[6675,8864,8865],{"class":6712},"'public_id'",[6675,8867,8868],{"class":6686},", $payload[",[6675,8870,6789],{"class":6712},[6675,8872,8873],{"class":6686},"])\n",[6675,8875,8876,8879,8882],{"class":6677,"line":8401},[6675,8877,8878],{"class":6690},"            ->",[6675,8880,8881],{"class":6700},"lockForUpdate",[6675,8883,8884],{"class":6686},"()\n",[6675,8886,8887,8889,8892],{"class":6677,"line":8409},[6675,8888,8878],{"class":6690},[6675,8890,8891],{"class":6700},"firstOrFail",[6675,8893,8894],{"class":6686},"();\n",[6675,8896,8897],{"class":6677,"line":8415},[6675,8898,6748],{"emptyLinePlaceholder":525},[6675,8900,8901],{"class":6677,"line":8420},[6675,8902,8903],{"class":6680},"        \u002F\u002F Terminal state reached already: ignore repeated callbacks\n",[6675,8905,8906,8908,8910,8912,8915,8918,8921],{"class":6677,"line":8439},[6675,8907,8390],{"class":6690},[6675,8909,8393],{"class":6686},[6675,8911,6722],{"class":6690},[6675,8913,8914],{"class":6686},"payment_status ",[6675,8916,8917],{"class":6690},"===",[6675,8919,8920],{"class":6712}," 'paid'",[6675,8922,8923],{"class":6686},") {\n",[6675,8925,8926,8928],{"class":6677,"line":6184},[6675,8927,8404],{"class":6690},[6675,8929,8260],{"class":6686},[6675,8931,8932],{"class":6677,"line":4324},[6675,8933,8412],{"class":6686},[6675,8935,8936],{"class":6677,"line":8496},[6675,8937,6748],{"emptyLinePlaceholder":525},[6675,8939,8940,8942,8945,8948,8951,8953,8956,8959,8961,8964,8967,8970,8972,8974,8976,8978,8981,8983],{"class":6677,"line":8515},[6675,8941,8390],{"class":6690},[6675,8943,8944],{"class":6686}," ($payload[",[6675,8946,8947],{"class":6712},"'status'",[6675,8949,8950],{"class":6686},"] ",[6675,8952,8917],{"class":6690},[6675,8954,8955],{"class":6712}," 'success'",[6675,8957,8958],{"class":6690}," &&",[6675,8960,6756],{"class":6686},[6675,8962,8963],{"class":6690},"float",[6675,8965,8966],{"class":6686},") $payload[",[6675,8968,8969],{"class":6712},"'amount'",[6675,8971,8950],{"class":6686},[6675,8973,8917],{"class":6690},[6675,8975,6756],{"class":6686},[6675,8977,8963],{"class":6690},[6675,8979,8980],{"class":6686},") $order",[6675,8982,6722],{"class":6690},[6675,8984,8985],{"class":6686},"total) {\n",[6675,8987,8988,8990,8992,8995,8998,9001],{"class":6677,"line":8520},[6675,8989,8463],{"class":6686},[6675,8991,6722],{"class":6690},[6675,8993,8994],{"class":6700},"markPaid",[6675,8996,8997],{"class":6686},"($payload[",[6675,8999,9000],{"class":6712},"'payment_id'",[6675,9002,8512],{"class":6686},[6675,9004,9005],{"class":6677,"line":8525},[6675,9006,8412],{"class":6686},[6675,9008,9009],{"class":6677,"line":2196},[6675,9010,9011],{"class":6686},"    });\n",[6675,9013,9014],{"class":6677,"line":8563},[6675,9015,6748],{"emptyLinePlaceholder":525},[6675,9017,9018,9020,9022,9024,9027],{"class":6677,"line":8577},[6675,9019,6772],{"class":6690},[6675,9021,6775],{"class":6700},[6675,9023,6728],{"class":6686},[6675,9025,9026],{"class":6712},"'OK'",[6675,9028,6743],{"class":6686},[6675,9030,9031],{"class":6677,"line":8583},[6675,9032,6806],{"class":6686},[273,9034,9035,9036,9039],{},"Зверніть увагу на дві речі: ",[6119,9037,9038],{},"lockForUpdate()"," не дає двом одночасним колбекам обробити замовлення паралельно, а порівняння суми захищає від підміни. Про суму кажуть рідко, а марно: клієнт, який змінив параметри на стороні браузера, має отримати відмову.",[5588,9041,9043],{"id":9042},"_9-не-оброблені-проміжні-та-невдалі-статуси","9. Не оброблені проміжні та невдалі статуси",[273,9045,9046,9047,9050],{},"Платіж має більше станів, ніж «успіх» і «помилка». Є очікування підтвердження, 3-D Secure, обробка, повернення, відхилення банком. Якщо код знає лише ",[6119,9048,9049],{},"success",", то все інше зависає в невизначеності: клієнт заплатив, але замовлення «очікує оплати», або навпаки.",[273,9052,9053],{},"Для кожного статусу прийміть рішення і запишіть його в тест:",[342,9055,9056,9066],{},[345,9057,9058],{},[348,9059,9060,9063],{},[351,9061,9062],{},"Статус платежу",[351,9064,9065],{},"Що робимо із замовленням",[358,9067,9068,9076,9084,9092],{},[348,9069,9070,9073],{},[363,9071,9072],{},"успіх",[363,9074,9075],{},"позначаємо оплаченим, резервуємо товар, шлемо підтвердження",[348,9077,9078,9081],{},[363,9079,9080],{},"очікування \u002F обробка",[363,9082,9083],{},"залишаємо «в обробці», не скасовуємо за таймером занадто рано",[348,9085,9086,9089],{},[363,9087,9088],{},"відхилено \u002F помилка",[363,9090,9091],{},"даємо клієнту повторити оплату тим самим замовленням",[348,9093,9094,9097],{},[363,9095,9096],{},"повернення коштів",[363,9098,9099],{},"повертаємо залишки, оновлюємо статус, повідомляємо менеджера",[273,9101,9102],{},"Окремий випадок: клієнт заплатив, а колбек не дійшов. Нехай раз на кілька хвилин працює завдання, яке перевіряє «зависшим» замовленням статус у платіжній системі. Це дешевше, ніж розбиратися вручну за виписками.",[5588,9104,9106],{"id":9105},"_10-розбіжність-між-замовленням-і-платежем","10. Розбіжність між замовленням і платежем",[273,9108,9109],{},"Коли клієнт змінює кошик після відкриття сторінки оплати, або менеджер редагує замовлення вже після створення платежу, сума в платіжній системі й у магазині розходиться. Результат: оплачено 1 200, замовлення на 1 450, бухгалтерія в паніці.",[273,9111,9112],{},"Рішення: після створення платежу замовлення блокується для змін суми. Якщо зміна потрібна, створюйте новий платіж, а старий анулюйте. Також додайте звірку: щодня порівнюйте оплачені замовлення з реєстром платежів провайдера.",[5825,9114,9115],{},[273,9116,9117,9120,9121,9124],{},[2333,9118,9119],{},"Хочете, щоб інтеграції пройшли перевірку до запуску?"," Ми проганяємо checkout із доставкою й оплатою на реальних сценаріях і повертаємо баг-репорти з відео. ",[302,9122,9123],{"href":31},"Замовити QA-аудит інтернет-магазину",", від 6 000 грн.",[268,9126,9128],{"id":9127},"як-тестувати-такі-інтеграції","Як тестувати такі інтеграції",[273,9130,9131],{},"Окремий список, який ми використовуємо як мінімум перед запуском магазину:",[1207,9133,9134,9140,9146,9152,9158,9164,9170],{},[286,9135,9136,9139],{},[2333,9137,9138],{},"Sandbox-режим усіх провайдерів",": тестові картки, тестові ТТН. Перевірте, що тестовий режим не залишився увімкненим на проді (це трапляється частіше, ніж хочеться).",[286,9141,9142,9145],{},[2333,9143,9144],{},"Негативні сценарії",": відмова банку, закрита вкладка на 3-D Secure, недостатньо коштів, закінчений термін картки.",[286,9147,9148,9151],{},[2333,9149,9150],{},"Повторні колбеки",": надішліть той самий колбек двічі вручну (curl або Postman) і переконайтеся, що нічого не задвоїлося.",[286,9153,9154,9157],{},[2333,9155,9156],{},"Підроблений колбек",": змініть суму або підпис і переконайтеся, що отримали відмову.",[286,9159,9160,9163],{},[2333,9161,9162],{},"Недоступний API",": вимкніть мережу для API Нової Пошти в тесті й подивіться, що бачить клієнт.",[286,9165,9166,9169],{},[2333,9167,9168],{},"Різні пристрої",": оплата і вибір відділення на iOS Safari й Android Chrome. Рекламні вбудовані браузери (Instagram, Telegram) нерідко ведуть себе інакше.",[286,9171,9172,9175],{},[2333,9173,9174],{},"Автотести",": підпис колбеку, ідемпотентність і розрахунок накладеного платежу легко покрити тестами на Pest\u002FPHPUnit, а повний шлях checkout автоматизувати на Playwright.",[273,9177,9178,9179,9182,9183,306],{},"Для Laravel зручно фіксувати відповіді зовнішніх API через ",[6119,9180,9181],{},"Http::fake()",": тест стає швидким і не залежить від мережі, а ви перевіряєте саме вашу логіку, а не чужий сервер. Про автоматизацію ключових шляхів докладніше на сторінці ",[302,9184,2080],{"href":443},[273,9186,9187,9188,9191,9192,306],{},"Про те, чому замовлення губляться ще до оплати, ми писали окремо: ",[302,9189,9190],{"href":721},"7 типових багів checkout",". А повний перелік перевірок перед релізом зібраний у ",[302,9193,9194],{"href":2919},"чек-листі тестування інтернет-магазину",[268,9196,9198],{"id":9197},"моніторинг-після-запуску","Моніторинг після запуску",[273,9200,9201],{},"Інтеграція не закінчується релізом. Зовнішні API змінюються, ключі закінчуються, ліміти запитів вичерпуються. Мінімум, який варто налаштувати:",[283,9203,9204,9207,9210,9213],{},[286,9205,9206],{},"сповіщення в Telegram чи на пошту, коли завдання створення ТТН провалилося після всіх повторів;",[286,9208,9209],{},"щоденний звіт: кількість замовлень без ТТН і кількість оплат без підтвердженого колбеку;",[286,9211,9212],{},"логування запитів і відповідей до платіжки та Нової Пошти (без повних номерів карток і приватних ключів) із прив'язкою до номера замовлення;",[286,9214,9215],{},"нагадування про закінчення дії ключів і токенів.",[273,9217,9218],{},"Це дрібниці, але саме вони перетворюють «ми дізналися від клієнта» на «ми виправили до того, як клієнт помітив».",[268,9220,9222],{"id":9221},"підсумок-що-перевірити-сьогодні","Підсумок: що перевірити сьогодні",[273,9224,9225],{},"Якщо магазин уже працює, є п'ять швидких перевірок:",[283,9227,9228,9231,9234,9237,9240],{},[286,9229,9230],{},"Чи оновлюється довідник відділень автоматично, і коли востаннє?",[286,9232,9233],{},"Чи змінює статус оплати лише серверний колбек, і чи перевіряється підпис?",[286,9235,9236],{},"Що станеться, якщо той самий колбек прийде двічі?",[286,9238,9239],{},"Чи видно менеджеру помилку створення ТТН, чи вона лише в логах?",[286,9241,9242],{},"Чи збігається сума накладеного платежу із залишком до сплати при знижках?",[273,9244,9245,9246,9249],{},"Якщо хоча б на одне питання відповідь «не знаємо», це привід для перевірки. Саме такі місця ми розбираємо в ",[302,9247,9248],{"href":865},"технічному аудиті коду",", коли магазин уже живий і треба зрозуміти, де втрачаються гроші.",[5825,9251,9252],{},[273,9253,9254,9257,9258,306],{},[2333,9255,9256],{},"Магазин працює, а замовлення губляться?"," Опишіть проблему в брифі, і ми скажемо, з чого почати перевірку, безкоштовно й без зобов'язань. ",[302,9259,5835],{"href":17},[7282,9261,9262],{},"html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":14,"searchDepth":485,"depth":486,"links":9264},[9265,9266,9271,9276,9282,9283,9284],{"id":8100,"depth":485,"text":8101},{"id":8117,"depth":485,"text":8118,"children":9267},[9268,9269,9270],{"id":8121,"depth":486,"text":8122},{"id":8150,"depth":486,"text":8151},{"id":8163,"depth":486,"text":8164},{"id":8181,"depth":485,"text":8182,"children":9272},[9273,9274,9275],{"id":8185,"depth":486,"text":8186},{"id":8601,"depth":486,"text":8602},{"id":8622,"depth":486,"text":8623},{"id":8650,"depth":485,"text":8651,"children":9277},[9278,9279,9280,9281],{"id":8654,"depth":486,"text":8655},{"id":8672,"depth":486,"text":8673},{"id":9042,"depth":486,"text":9043},{"id":9105,"depth":486,"text":9106},{"id":9127,"depth":485,"text":9128},{"id":9197,"depth":485,"text":9198},{"id":9221,"depth":485,"text":9222},"integrations.log",[9287,9289,9291,9293],{"marker":161,"text":9288},"callback підпис перевірено",{"marker":156,"text":9290},"відділення закрито, адреса в замовленні",{"marker":153,"text":9292},"дубль замовлення після повторного колбеку",{"marker":166,"text":9294},"таймаут API 8 с, черга повторів","10 точок",[9297,9300,9303,9306],{"q":9298,"a":9299},"Чому на сайті не завантажуються відділення Нової Пошти?","Найчастіше довідник відділень не оновлюється або запит до API Нової Пошти падає без обробки помилки. Зберігайте локальну копію довідника й оновлюйте її за розкладом, а при збої API показуйте запасний варіант вибору. Також перевірте, чи чинний ключ API.",{"q":9301,"a":9302},"Чому оплата пройшла, а замовлення залишилось неоплаченим?","Платіжна система повідомляє про результат окремим запитом-колбеком, і якщо його не прийнято або не підтверджено підпис, статус не оновиться. Колбек має бути ідемпотентним: повторний виклик не повинен створювати дубль. Регулярно звіряйте замовлення з виписками платіжної системи.",{"q":9304,"a":9305},"Як уникнути дублів накладних ТТН у Новій Пошті?","Перед створенням накладної перевіряйте, чи вона вже існує для цього замовлення, і блокуйте повторні запити на сервері. Зберігайте номер ТТН і статус одразу після відповіді API. Так повторний клік чи повторне виконання завдання в черзі не створить другу накладну.",{"q":9307,"a":9308},"Як протестувати інтеграцію з оплатою без реальних грошей?","Використовуйте тестовий режим платіжної системи: більшість провайдерів дають тестові картки та sandbox для успішних і відхилених платежів. Окремо перевірте збій, затримку й повторний колбек. Перед запуском зробіть один реальний платіж на мінімальну суму. Так ви побачите, як сайт поводиться в реальних умовах.",{},"\u002Fuk\u002Fblog\u002Fintehratsiia-novoi-poshty-ta-oplaty",{"title":6252,"description":8094},"Інтеграція Нової Пошти та онлайн-оплати в інтернет-магазині на Laravel: 10 місць, де ламається, з прикладами коду, тестами й чек-листом перед запуском.","Інтеграція Нової Пошти та оплати: де ламається — Tochno.","uk\u002Fblog\u002Fintehratsiia-novoi-poshty-ta-oplaty",[6042,9316],"laravel","wIIbZocfGsE8DpqQQRHuAsmihf_id0R43Ii_vS_1Dv8",{"id":9319,"title":9320,"author":5508,"body":9321,"cover":141,"coverFile":9842,"coverLines":9843,"coverStat":9852,"date":6560,"description":9325,"excerpt":141,"extension":495,"faq":9853,"featured":536,"key":141,"meta":9864,"navigation":525,"path":9865,"readingTime":526,"seo":9866,"seoDescription":9867,"seoTitle":9868,"slug":561,"stem":9869,"tags":9870,"updated":6020,"__hash__":9871},"blog_uk\u002Fuk\u002Fblog\u002Fkoly-potriben-tekh-lid.md","Коли потрібен тех-лід, а коли достатньо розробника",{"type":265,"value":9322,"toc":9824},[9323,9326,9329,9333,9336,9406,9409,9412,9416,9419,9461,9465,9468,9518,9521,9525,9528,9545,9548,9552,9555,9559,9562,9566,9575,9579,9585,9589,9592,9596,9599,9603,9606,9664,9676,9679,9691,9695,9698,9718,9721,9725,9728,9766,9769,9773,9805,9807,9810,9813],[273,9324,9325],{},"Тех-лід потрібен, коли проблема проєкту вже не в окремих задачах, а в рішеннях: яка архітектура, хто відповідає за якість коду, як оцінювати й планувати, що робити з технічним боргом. Якщо ж задача зрозуміла, стек відомий, а команда працює без конфліктів, вистачить хорошого розробника. Нижче розбираємо різницю на практиці й даємо перелік ознак, за якими можна зрозуміти, що вам потрібен тех-лід, а не ще одна пара рук.",[273,9327,9328],{},"Це текст людини, яка 11 років пише на PHP та Laravel і знає обидві ролі зсередини, тому багато прикладів нижче типові для проєктів на Laravel, але логіка застосовна до будь-якого стеку.",[268,9330,9332],{"id":9331},"хто-такий-тех-лід-і-чим-він-відрізняється-від-розробника","Хто такий тех-лід і чим він відрізняється від розробника",[273,9334,9335],{},"Розробник вирішує задачу: зробити функцію, виправити баг, інтегрувати API. Тех-лід відповідає за те, щоб набір таких задач складався в працюючий, підтримуваний продукт.",[342,9337,9338,9350],{},[345,9339,9340],{},[348,9341,9342,9344,9347],{},[351,9343],{},[351,9345,9346],{},"Розробник",[351,9348,9349],{},"Тех-лід",[358,9351,9352,9363,9373,9384,9395],{},[348,9353,9354,9357,9360],{},[363,9355,9356],{},"Фокус",[363,9358,9359],{},"задача чи фіча",[363,9361,9362],{},"система й команда",[348,9364,9365,9367,9370],{},[363,9366,3506],{},[363,9368,9369],{},"«як це зробити?»",[363,9371,9372],{},"«чи треба це робити і як воно впишеться?»",[348,9374,9375,9378,9381],{},[363,9376,9377],{},"Результат",[363,9379,9380],{},"працюючий код",[363,9382,9383],{},"архітектурні рішення, стандарти, прогнозованість",[348,9385,9386,9389,9392],{},[363,9387,9388],{},"Відповідальність",[363,9390,9391],{},"якість свого коду",[363,9393,9394],{},"якість підсумкового продукту й узгодженість команди",[348,9396,9397,9400,9403],{},[363,9398,9399],{},"Комунікація",[363,9401,9402],{},"з тімлідом і колегами",[363,9404,9405],{},"з замовником, продактом, бізнесом, підрядниками",[273,9407,9408],{},"Не плутайте з senior-розробником. Senior пише складний код швидко й надійно. Тех-лід теж пише код, але витрачає значну частину часу на рев'ю, рішення, оцінку ризиків і пояснення замовнику, що можна зробити за ці гроші й терміни. Сильний senior не обов'язково хоче чи вміє бути тех-лідом, і це нормально.",[273,9410,9411],{},"Також тех-лід не те саме, що тімлід чи проєкт-менеджер. Тімлід відповідає за людей і процеси, PM за терміни й бюджет, тех-лід за технічні рішення. У малих командах ці ролі часто поєднуються в одній людині, але відповідальності різні.",[268,9413,9415],{"id":9414},"що-саме-робить-тех-лід","Що саме робить тех-лід",[273,9417,9418],{},"Конкретні задачі, а не загальні слова:",[283,9420,9421,9426,9431,9437,9443,9449,9455],{},[286,9422,9423,9425],{},[2333,9424,3535],{}," Вибір структури застосунку, меж модулів, способу зберігання даних, кешування, черг. Фіксація рішень у коротких документах (ADR): що вирішили, чому, які були альтернативи.",[286,9427,9428,9430],{},[2333,9429,3541],{}," Перевірка змін перед злиттям: коректність, безпека, продуктивність, відповідність домовленостям. Рев'ю також навчає команду.",[286,9432,9433,9436],{},[2333,9434,9435],{},"Стандарти й автоматизація."," Лінтери, статичний аналіз (наприклад, PHPStan або Larastan), правила гілок, CI з тестами. Це робиться раз і далі працює без нагадувань.",[286,9438,9439,9442],{},[2333,9440,9441],{},"Оцінка й планування."," Розбиття функціоналу на задачі, виявлення ризиків і залежностей, чесна оцінка термінів із вказанням невизначеності.",[286,9444,9445,9448],{},[2333,9446,9447],{},"Технічний борг."," Рішення, що виправляти зараз, а що лишити, з розрахунком вартості відкладення.",[286,9450,9451,9454],{},[2333,9452,9453],{},"Вибір і перевірка підрядників та технологій."," Оцінка чужих пропозицій, чужого коду, виявлення завищених кошторисів і ненадійних рішень.",[286,9456,9457,9460],{},[2333,9458,9459],{},"Міст до бізнесу."," Переклад із мови вимог на мову технічних компромісів і навпаки.",[268,9462,9464],{"id":9463},"ознаки-що-вам-потрібен-тех-лід","Ознаки, що вам потрібен тех-лід",[273,9466,9467],{},"Перелік не академічний, ми бачимо ці симптоми у реальних проєктах. Якщо збігається три і більше, варто задуматися.",[1207,9469,9470,9476,9482,9488,9494,9500,9506,9512],{},[286,9471,9472,9475],{},[2333,9473,9474],{},"Кожен реліз ламає щось сусіднє."," Це сигнал, що немає тестів і меж між модулями, і ніхто не відповідає за цілісність.",[286,9477,9478,9481],{},[2333,9479,9480],{},"Оцінки постійно зриваються."," Задачі «на два дні» тривають тиждень. Причина часто не в лінощах, а в прихованій складності, яку ніхто не розібрав заздалегідь.",[286,9483,9484,9487],{},[2333,9485,9486],{},"Нова людина входить у проєкт місяцями."," Немає документації, стандартів, зрозумілої структури, а все знає одна людина.",[286,9489,9490,9493],{},[2333,9491,9492],{},"Залежність від одного розробника."," Якщо він піде або захворіє, проєкт зупиниться. Це бізнес-ризик, а не лише технічний.",[286,9495,9496,9499],{},[2333,9497,9498],{},"Повільний сайт або падіння під навантаженням, а причини не знайдені."," Хтось гасить пожежі, ніхто не розбирається з системними причинами.",[286,9501,9502,9505],{},[2333,9503,9504],{},"Незрозуміло, скільки це має коштувати."," Підрядник називає суму, а ви не можете оцінити її адекватність.",[286,9507,9508,9511],{},[2333,9509,9510],{},"Рішення ухвалюються «як вийде»."," Різні частини системи написані в різних стилях, є три способи зробити те саме.",[286,9513,9514,9517],{},[2333,9515,9516],{},"Стратегічні питання без відповіді."," Переписувати чи латати, переходити на інший стек, робити мікросервіси чи лишити моноліт.",[273,9519,9520],{},"Перші сім пунктів, до речі, зазвичай не лікуються найманням ще одного розробника. Додаткова людина у нескерований процес додає хаосу.",[268,9522,9524],{"id":9523},"коли-достатньо-розробника","Коли достатньо розробника",[273,9526,9527],{},"Тех-лід не завжди потрібен, і не варто ним переплачувати. Розробника достатньо, якщо:",[283,9529,9530,9533,9536,9539,9542],{},[286,9531,9532],{},"проєкт невеликий (лендінг, корпоративний сайт, типовий інтернет-магазин на готовій основі) і стек стандартний;",[286,9534,9535],{},"задачі чітко сформульовані й оцінюються без великої невизначеності;",[286,9537,9538],{},"над проєктом працює одна-дві людини, яким довіряють;",[286,9540,9541],{},"вимоги стабільні, а архітектурних рішень майже немає;",[286,9543,9544],{},"вже є працюючі процеси: тести, рев'ю, CI, і ви бачите, що вони працюють.",[273,9546,9547],{},"Приклад: ви хочете додати на існуючий магазин новий спосіб доставки або блок рекомендацій. Задача локальна, її вирішує розробник за кілька днів. Тех-лід тут вартий хіба що на коротку консультацію.",[268,9549,9551],{"id":9550},"типові-сценарії-коли-тех-лід-рятує-проєкт","Типові сценарії, коли тех-лід рятує проєкт",[273,9553,9554],{},"Нижче узагальнені ситуації, з якими ми стикаємося. Це не конкретні клієнти, а патерни.",[5588,9556,9558],{"id":9557},"сценарій-1-старт-нового-проєкту","Сценарій 1. Старт нового проєкту",[273,9560,9561],{},"На етапі старту найдорожчі помилки: вибір стеку, структура даних, межі між модулями. Виправляти їх через рік коштує у рази більше. Тут достатньо тех-ліда на 5–10 годин у тиждень: він складає технічний план, ухвалює ключові рішення і налаштовує процеси, а реалізують розробники.",[5588,9563,9565],{"id":9564},"сценарій-2-успадкований-код","Сценарій 2. «Успадкований» код",[273,9567,9568,9569,9571,9572,306],{},"Проєкт залишився від попереднього підрядника. Код працює, але ніхто не знає, наскільки він надійний. Перш ніж вкладати гроші в розвиток, варто зробити ",[302,9570,866],{"href":865},": отримати оцінку архітектури, безпеки й продуктивності та план виправлень за пріоритетами. Про це докладніше в статті ",[302,9573,9574],{"href":304},"що таке технічний аудит і коли він потрібен",[5588,9576,9578],{"id":9577},"сценарій-3-вибір-і-контроль-підрядника","Сценарій 3. Вибір і контроль підрядника",[273,9580,9581,9582,306],{},"Ви наймаєте студію чи фрилансера, але не можете перевірити їхні оцінки й код. Тех-лід з вашого боку складає вимоги, оцінює пропозиції, рев'юїть результат на етапах. Це страхує від переплат і від проєкту, який «ніби готовий», але не підтримується. Питання, які варто поставити підряднику, ми зібрали окремо: ",[302,9583,9584],{"href":3317},"12 питань перед вибором підрядника",[5588,9586,9588],{"id":9587},"сценарій-4-команда-є-а-результат-непередбачуваний","Сценарій 4. Команда є, а результат непередбачуваний",[273,9590,9591],{},"Розробники хороші, але терміни зриваються, а якість нерівна. Часто тут не потрібно міняти людей, потрібні стандарти, рев'ю та тест-стратегія. Тех-лід вводить ці практики за кілька тижнів і далі лише підтримує.",[5588,9593,9595],{"id":9594},"сценарій-5-масштабування-і-повільна-робота","Сценарій 5. Масштабування і повільна робота",[273,9597,9598],{},"Сайт повільнішає, база росте, виникають блокування й повільні запити. Типова причина в Laravel-проєктах: N+1 запити, відсутні індекси, важкі синхронні операції, які варто виносити в черги. Тех-лід швидко знаходить вузькі місця за профілюванням і ставить задачі в порядку впливу.",[268,9600,9602],{"id":9601},"формати-співпраці-з-тех-лідом","Формати співпраці з тех-лідом",[273,9604,9605],{},"Тех-лід не обов'язково штатна одиниця на повний день. Для малого й середнього бізнесу найчастіше працює фракційний формат.",[342,9607,9608,9620],{},[345,9609,9610],{},[348,9611,9612,9614,9617],{},[351,9613,1977],{},[351,9615,9616],{},"Для чого",[351,9618,9619],{},"Орієнтир за ціною",[358,9621,9622,9633,9643,9654],{},[348,9623,9624,9627,9630],{},[363,9625,9626],{},"Разова консультація (90 хв)",[363,9628,9629],{},"оцінити архітектуру, стек, пропозицію підрядника",[363,9631,9632],{},"3 000–4 000 грн",[348,9634,9635,9638,9641],{},[363,9636,9637],{},"Технічний аудит",[363,9639,9640],{},"зрозуміти стан проєкту й отримати план виправлень",[363,9642,150],{},[348,9644,9645,9648,9651],{},[363,9646,9647],{},"Тех-лід на проєкт",[363,9649,9650],{},"план, рішення, рев'ю на період розробки",[363,9652,9653],{},"за погодинною ставкою, $32–35 \u002F год",[348,9655,9656,9659,9662],{},[363,9657,9658],{},"Виділений спеціаліст у вашій команді",[363,9660,9661],{},"постійна участь частину або весь день",[363,9663,4709],{},[273,9665,9666,9667,9670,9671,9673,9674,306],{},"Це наші орієнтири з цінової сторінки, точну вартість залежно від обсягу ми називаємо після брифу. Деталі формату ",[302,9668,9669],{"href":34},"тех-ліда на аутсорсі"," і умови ",[302,9672,2480],{"href":2479}," описані на окремих сторінках, а загальні ставки зібрані на сторінці ",[302,9675,406],{"href":77},[273,9677,9678],{},"Фракційний тех-лід ефективний тому, що більшість рішень не потребують присутності щодня: достатньо спланувати, зробити рев'ю, розв'язати складне питання й пояснити команді. Решту часу команда працює за узгодженими правилами.",[5825,9680,9681],{},[273,9682,9683,9686,9687,9690],{},[2333,9684,9685],{},"Не впевнені, що вам потрібно?"," Почніть із консультації тех-ліда на 90 хвилин: розберемо проєкт, ризики й скажемо, чи потрібен вам тех-лід постійно, чи вистачить розробника. ",[302,9688,9689],{"href":34},"Тех-лід на аутсорсі",", від 3 000 грн.",[268,9692,9694],{"id":9693},"скільки-часу-тех-ліду-потрібно-на-проєкт","Скільки часу тех-ліду потрібно на проєкт",[273,9696,9697],{},"Запитання, яке ставлять найчастіше: скільки годин на тиждень потрібно? Єдиної відповіді немає, але орієнтири з практики такі (оціночні, залежать від проєкту):",[283,9699,9700,9706,9712],{},[286,9701,9702,9705],{},[2333,9703,9704],{},"Старт проєкту, перші 2–4 тижні:"," 8–15 годин на тиждень. Це найінтенсивніший період: архітектура, налаштування CI, перші рев'ю, розбиття на задачі.",[286,9707,9708,9711],{},[2333,9709,9710],{},"Стабільна розробка командою з 2–3 людей:"," 4–8 годин на тиждень. Рев'ю, відповіді на технічні питання, планування наступних ітерацій.",[286,9713,9714,9717],{},[2333,9715,9716],{},"Підтримка вже запущеного продукту:"," 2–4 години на тиждень або за запитом: складні інциденти, оцінка нових фіч, контроль технічного боргу.",[273,9719,9720],{},"Якщо хтось пропонує «тех-ліда на 40 годин» для проєкту з однією людиною в команді, це швидше за все розробник із гучнішою назвою. Перевіряйте, що саме входить у роботу: рішення й рев'ю чи лише написання коду.",[268,9722,9724],{"id":9723},"як-зрозуміти-що-тех-лід-працює-добре","Як зрозуміти, що тех-лід працює добре",[273,9726,9727],{},"Якщо ви найняли тех-ліда, ось ознаки результату, які можна перевірити без глибоких технічних знань:",[283,9729,9730,9736,9742,9748,9754,9760],{},[286,9731,9732,9735],{},[2333,9733,9734],{},"з'явилися письмові рішення."," Хоча б короткі записи: що вибрали й чому;",[286,9737,9738,9741],{},[2333,9739,9740],{},"реліз став рутиною."," Деплой не вимагає героїзму й не ламає сусідніх функцій;",[286,9743,9744,9747],{},[2333,9745,9746],{},"оцінки стали точнішими."," Відхилення зменшуються, а ризики озвучуються заздалегідь;",[286,9749,9750,9753],{},[2333,9751,9752],{},"код-рев'ю проходять усі зміни."," І це не формальність: у коментарях видно змістовні зауваження;",[286,9755,9756,9759],{},[2333,9757,9758],{},"нова людина входить у проєкт за дні, а не за місяці."," Є README, інструкція запуску, угоди щодо стилю;",[286,9761,9762,9765],{},[2333,9763,9764],{},"ви розумієте, що відбувається."," Тех-лід пояснює технічні речі мовою бізнесу: що, навіщо, скільки.",[273,9767,9768],{},"Якщо ж після кількох місяців нічого з цього не змінилося, а тех-лід лише «багато пише коду», то вам, ймовірно, потрібен просто senior-розробник, і це нормально, тільки платити за іншу роль не варто.",[268,9770,9772],{"id":9771},"помилки-при-наймі-тех-ліда","Помилки при наймі тех-ліда",[283,9774,9775,9781,9787,9793,9799],{},[286,9776,9777,9780],{},[2333,9778,9779],{},"Шукати «героя», який усе зробить сам."," Тех-лід налаштовує систему, а не замінює її.",[286,9782,9783,9786],{},[2333,9784,9785],{},"Не давати повноважень."," Якщо тех-лід може лише радити, а рішення ухвалюються поза ним, користь мінімальна.",[286,9788,9789,9792],{},[2333,9790,9791],{},"Плутати з архітектором-теоретиком."," Хороший тех-лід регулярно пише код або хоча б читає його, інакше рішення відриваються від реальності.",[286,9794,9795,9798],{},[2333,9796,9797],{},"Наймати на повний день, коли вистачить частини."," Для проєкту на 2–3 розробників зазвичай достатньо кількох годин на тиждень.",[286,9800,9801,9804],{},[2333,9802,9803],{},"Не перевірити досвід на реальних проєктах."," Попросіть розповісти про конкретні рішення, їхні наслідки й помилки. Чесна розповідь про провали каже більше, ніж список технологій.",[268,9806,8014],{"id":8013},[273,9808,9809],{},"Коротко: розробник потрібен, щоб зробити задачу, тех-лід потрібен, щоб правильно вибирати задачі та рішення і щоб система не розсипалась зі зростанням. Якщо у вашому проєкті збігаються кілька ознак із переліку вище (зриви термінів, залежність від однієї людини, ламкі релізи, незрозуміла якість коду), почніть із невеликого кроку: консультації або аудиту. Це недорого й швидко покаже, чи потрібен вам тех-лід на постійній основі.",[273,9811,9812],{},"Якщо ж проєкт простий, а розробник працює без пожеж, переплачувати за тех-ліда не потрібно. Ми скажемо про це чесно, бо краще втратити замовлення, ніж продати зайве.",[5825,9814,9815],{},[273,9816,9817,9820,9821,306],{},[2333,9818,9819],{},"Хочете розібратися, яка роль потрібна вашому проєкту?"," Розкажіть про задачу, і ми підкажемо, достатньо розробника чи потрібен тех-лід, без зобов'язань. ",[302,9822,9823],{"href":83},"Написати нам",{"title":14,"searchDepth":485,"depth":486,"links":9825},[9826,9827,9828,9829,9830,9837,9838,9839,9840,9841],{"id":9331,"depth":485,"text":9332},{"id":9414,"depth":485,"text":9415},{"id":9463,"depth":485,"text":9464},{"id":9523,"depth":485,"text":9524},{"id":9550,"depth":485,"text":9551,"children":9831},[9832,9833,9834,9835,9836],{"id":9557,"depth":486,"text":9558},{"id":9564,"depth":486,"text":9565},{"id":9577,"depth":486,"text":9578},{"id":9587,"depth":486,"text":9588},{"id":9594,"depth":486,"text":9595},{"id":9601,"depth":485,"text":9602},{"id":9693,"depth":485,"text":9694},{"id":9723,"depth":485,"text":9724},{"id":9771,"depth":485,"text":9772},{"id":8013,"depth":485,"text":8014},"tech-lead.decision",[9844,9846,9848,9850],{"marker":156,"text":9845},"кожен реліз ламає сусідній модуль",{"marker":156,"text":9847},"оцінки зриваються, ніхто не знає чому",{"marker":166,"text":9849},"рішення: фракційний тех-лід",{"marker":161,"text":9851},"ADR, код-рев'ю, технічний план","5 ознак",[9854,9856,9858,9861],{"q":3730,"a":9855},"Розробник відповідає за якість свого коду, а тех-лід за технічні рішення проєкту загалом: архітектуру, стандарти, оцінки й ризики. Senior-розробник може виконувати цю роль, лише якщо має на це час і повноваження. Це різні відповідальності, а не просто рівні досвіду.",{"q":3724,"a":9857},"Наша консультація тех-ліда на 90 хвилин коштує 3 000–4 000 грн. За цей час ми розбираємо архітектуру чи план робіт і даємо конкретні рекомендації. Довший супровід проєкту обговорюємо окремо, бо обсяг залежить від команди та задач.",{"q":9859,"a":9860},"Чи потрібен тех-лід невеликому проєкту?","Зазвичай ні, якщо проєкт простий, задачі зрозумілі, а розробник досвідчений. Тех-лід потрібен, коли релізи ламають суміжні модулі, оцінки зриваються або в команді кілька розробників без спільних стандартів. Тоді навіть кілька годин на місяць можуть уберегти від дорогих помилок.",{"q":9862,"a":9863},"Чи може тех-лід працювати неповний робочий день?","Так, для невеликих компаній зручний фракційний формат: тех-лід займається проєктом кілька годин на тиждень чи місяць. Він ухвалює архітектурні рішення, проводить код-рев'ю та готує технічний план. Повна зайнятість виправдана здебільшого для великої команди. Це дешевше, ніж штатна посада, і дає потрібний контроль над якістю.",{},"\u002Fuk\u002Fblog\u002Fkoly-potriben-tekh-lid",{"title":9320,"description":9325},"Найняти тех-ліда чи достатньо розробника? Ознаки, що проєкту потрібен техлід, чим він відрізняється від senior, формати співпраці та орієнтири за ціною.","Коли потрібен тех-лід замість розробника — Tochno.","uk\u002Fblog\u002Fkoly-potriben-tekh-lid",[9316],"nUR38Gki3hZSj1iLbVRAdpX1vQdNk_cx397AJaksXjA",{"id":9873,"title":9874,"author":5508,"body":9875,"cover":141,"coverFile":10391,"coverLines":10392,"coverStat":10401,"date":6560,"description":9879,"excerpt":141,"extension":495,"faq":10402,"featured":536,"key":141,"meta":10415,"navigation":525,"path":10416,"readingTime":526,"seo":10417,"seoDescription":10418,"seoTitle":10419,"slug":1373,"stem":10420,"tags":10421,"updated":6020,"__hash__":10422},"blog_uk\u002Fuk\u002Fblog\u002Flaravel-chy-opencart-wordpress-dlia-mahazynu.md","Laravel чи OpenCart\u002FWordPress для магазину: чесне порівняння",{"type":265,"value":9876,"toc":10374},[9877,9880,9883,9887,9890,9908,9911,9915,10024,10027,10031,10034,10040,10046,10052,10058,10061,10065,10068,10071,10074,10088,10091,10095,10100,10103,10106,10109,10113,10116,10133,10136,10140,10143,10183,10187,10190,10223,10232,10236,10239,10271,10274,10300,10304,10307,10313,10343,10346,10348,10351,10354,10360],[273,9878,9879],{},"Інтернет-магазин на Laravel краще за OpenCart чи WordPress лише тоді, коли у вас нестандартна бізнес-логіка, складні інтеграції або плани на швидке зростання. Для невеликого каталогу зі стандартним кошиком готова CMS дешевша і швидша в запуску, і говорити інакше було б нечесно. Нижче порівнюємо платформи за критеріями, які впливають на гроші власника: вартість володіння, швидкість, безпека, гнучкість і ризики.",[273,9881,9882],{},"Ми працюємо з Laravel і Nuxt, тому в нас є очевидна упередженість. Щоб її компенсувати, ми прямо вказуємо, де наш вибір програє. Автор статті, Євгеній, 11 років пише на PHP\u002FLaravel і мав справу з міграціями магазинів з обох таборів: і на Laravel, і з нього.",[268,9884,9886],{"id":9885},"про-що-саме-порівнюємо","Про що саме порівнюємо",[273,9888,9889],{},"Спершу уточнимо терміни, бо їх часто плутають.",[283,9891,9892,9897,9903],{},[286,9893,9894,9896],{},[2333,9895,5619],{}," це готова PHP-платформа саме для інтернет-магазинів: каталог, кошик, замовлення, модулі оплати й доставки з коробки.",[286,9898,9899,9902],{},[2333,9900,9901],{},"WordPress + WooCommerce"," це система керування контентом з плагіном магазину. Сильна в контенті й блогу, а торгівля працює через плагін.",[286,9904,9905,9907],{},[2333,9906,1019],{}," це не CMS, а PHP-фреймворк. Магазин на ньому пишеться як програма під ваші процеси: ви отримуєте каркас (маршрути, база, черги, авторизація, тести), а все інше будуєте самі або підключаєте перевірені пакети.",[273,9909,9910],{},"Тобто порівнюємо готовий продукт з конструктором-каркасом. Це різні філософії: «налаштуй готове» проти «збудуй потрібне».",[268,9912,9914],{"id":9913},"швидкий-огляд-у-таблиці","Швидкий огляд у таблиці",[342,9916,9917,9931],{},[345,9918,9919],{},[348,9920,9921,9923,9925,9928],{},[351,9922,5610],{},[351,9924,5619],{},[351,9926,9927],{},"WooCommerce",[351,9929,9930],{},"Laravel (кастом)",[358,9932,9933,9946,9959,9972,9986,9998,10011],{},[348,9934,9935,9937,9940,9943],{},[363,9936,934],{},[363,9938,9939],{},"Швидко",[363,9941,9942],{},"Дуже швидко",[363,9944,9945],{},"Повільніше",[348,9947,9948,9951,9954,9956],{},[363,9949,9950],{},"Початковий бюджет",[363,9952,9953],{},"Низький",[363,9955,9953],{},[363,9957,9958],{},"Вищий",[348,9960,9961,9964,9966,9969],{},[363,9962,9963],{},"Гнучкість логіки",[363,9965,5718],{},[363,9967,9968],{},"Через плагіни",[363,9970,9971],{},"Необмежена",[348,9973,9974,9977,9980,9983],{},[363,9975,9976],{},"Швидкодія за замовчуванням",[363,9978,9979],{},"Середня",[363,9981,9982],{},"Залежить від плагінів",[363,9984,9985],{},"Контролюєте самі",[348,9987,9988,9990,9993,9995],{},[363,9989,191],{},[363,9991,9992],{},"Залежить від модулів",[363,9994,9982],{},[363,9996,9997],{},"Ваша відповідальність, але менше поверхні атаки",[348,9999,10000,10003,10006,10008],{},[363,10001,10002],{},"Тести й CI",[363,10004,10005],{},"Рідко",[363,10007,10005],{},[363,10009,10010],{},"Звичайна практика",[348,10012,10013,10016,10019,10021],{},[363,10014,10015],{},"Вартість змін через 2 роки",[363,10017,10018],{},"Зростає",[363,10020,10018],{},[363,10022,10023],{},"Стабільніша",[273,10025,10026],{},"Таблиця спрощена: хороший розробник зробить пристойний магазин на будь-якій платформі, а поганий зіпсує будь-яку. Але тенденції вона передає.",[268,10028,10030],{"id":10029},"де-готова-cms-виграє","Де готова CMS виграє",[273,10032,10033],{},"Почнемо з честного: у багатьох випадках OpenCart чи WooCommerce це правильний вибір.",[273,10035,10036,10039],{},[2333,10037,10038],{},"Швидкий старт і низький поріг."," Готова тема, модулі оплати, налаштований каталог: перший магазин можна запустити за кілька тижнів і за невеликі гроші. Для перевірки гіпотези «чи купуватимуть цей товар» це ідеально.",[273,10041,10042,10045],{},[2333,10043,10044],{},"Екосистема й спільнота."," Багато стандартних задач (знижки, купони, інтеграція з Новою Поштою, експорт у Google Merchant) вже вирішені. Є документація й тисячі розробників на ринку, тому знайти виконавця легко.",[273,10047,10048,10051],{},[2333,10049,10050],{},"Контент."," WordPress традиційно сильний в управлінні контентом: блог, статті, лендінги, редактор. Якщо магазин це лише частина контентного сайту, WooCommerce логічний вибір.",[273,10053,10054,10057],{},[2333,10055,10056],{},"Невеликий каталог зі стандартними процесами."," Якщо у вас 100–300 товарів, одна доставка, одна платіжка й стандартний кошик, кастом навряд чи окупиться.",[273,10059,10060],{},"Тому наше перше правило: якщо задача влізає в стандарт, не ускладнюйте. Ми справді іноді радимо клієнтам готове рішення.",[268,10062,10064],{"id":10063},"де-готова-cms-починає-коштувати-дорожче","Де готова CMS починає коштувати дорожче",[273,10066,10067],{},"Проблеми готових платформ рідко видно на старті. Вони з'являються через рік-два.",[5588,10069,5735],{"id":10070},"модулі-від-різних-авторів",[273,10072,10073],{},"Магазин на OpenCart чи WooCommerce збирається з десятка модулів: оплата, доставка, фільтри, SEO, програма лояльності. Кожен має свого автора, свій темп оновлень і свою якість коду. Типові наслідки:",[283,10075,10076,10079,10082,10085],{},[286,10077,10078],{},"Оновлення ядра ламає модуль, а автор модуля вже не відповідає.",[286,10080,10081],{},"Два модулі конфліктують, бо обидва змінюють одну й ту саму частину системи.",[286,10083,10084],{},"Модуль працює, але робить зайві запити до бази, і сторінка каталогу гальмує.",[286,10086,10087],{},"Для поправки потрібно лізти в чужий код, і наступне оновлення цю правку затирає.",[273,10089,10090],{},"Для сайту, який робить 10 замовлень на день, це дрібниці. Для магазину, де кожна хвилина простою це гроші, це реальний ризик.",[5588,10092,10094],{"id":10093},"швидкодія","Швидкодія",[273,10096,10097,10098,306],{},"Швидкість магазину залежить від того, скільки запитів до бази і скільки скриптів виконується на сторінці. У готових платформах за замовчуванням багато зайвого: десятки плагінів підключають свої стилі й скрипти на всіх сторінках. Налаштувати це можна, але потрібен досвід, і результат крихкий. Додатково на швидкість впливають метрики, які бачить пошуковик, про них ми писали в статті ",[302,10099,476],{"href":475},[273,10101,10102],{},"У кастомному рішенні ви контролюєте кожен запит: eager loading проти N+1, кеш, черги для важких операцій, окремий frontend на Nuxt з серверним рендерингом. Це не робить сайт швидким автоматично, але дає інструменти.",[5588,10104,191],{"id":10105},"безпека",[273,10107,10108],{},"Найпопулярніша платформа це й найчастіша мішень. Більшість зламів WordPress-сайтів відбувається через застарілі плагіни та слабкі паролі, а не через ядро. Кожен додатковий плагін розширює поверхню атаки. Це не означає, що Laravel «безпечний сам по собі»: помилки в коді трапляються скрізь. Різниця в тому, що в кастомному проєкті чужого коду менше, а ваш код проходить код-рев'ю.",[5588,10110,10112],{"id":10111},"складна-бізнес-логіка","Складна бізнес-логіка",[273,10114,10115],{},"Ось чим кастом виправдовується. Приклади логіки, яку важко втиснути в готову платформу без костилів:",[283,10117,10118,10121,10124,10127,10130],{},[286,10119,10120],{},"ціни залежать від групи клієнта, обсягу замовлення й контракту (B2B);",[286,10122,10123],{},"склад розподілений по кількох точках із різними правилами резервування;",[286,10125,10126],{},"замовлення проходить через погодження чи складається з кількох відправлень;",[286,10128,10129],{},"двостороння синхронізація з обліковою системою (1С чи іншою) в реальному часі;",[286,10131,10132],{},"комплекти, набори й залежності товарів із нестандартною формулою ціни.",[273,10134,10135],{},"На готовій CMS це реалізується серією модулів і правок. Кожна правка ускладнює оновлення, а разом вони перетворюються на «форк», який вже не оновлюється. На Laravel ця логіка просто частина вашого коду з тестами.",[268,10137,10139],{"id":10138},"де-кастом-на-laravel-виграє","Де кастом на Laravel виграє",[273,10141,10142],{},"Підсумуємо переваги кастомної розробки.",[1207,10144,10145,10151,10157,10165,10171,10177],{},[286,10146,10147,10150],{},[2333,10148,10149],{},"Код належить вам."," Немає залежності від чужих модулів і ліцензій. Договір фіксує права на код, і ви можете змінити підрядника.",[286,10152,10153,10156],{},[2333,10154,10155],{},"Архітектура під вас."," Модель даних описує ваш бізнес, а не абстрактний магазин.",[286,10158,10159,10162,10163,306],{},[2333,10160,10161],{},"Автотести."," На Laravel звичайна практика покривати тестами замовлення, ціни, знижки, оплату. Це дозволяє змінювати код без страху щось зламати. Про те, що саме варто автоматизувати, читайте в статті ",[302,10164,6483],{"href":872},[286,10166,10167,10170],{},[2333,10168,10169],{},"Передбачувана швидкість."," Профілювання, кеш, черги, окремий frontend: усе під контролем.",[286,10172,10173,10176],{},[2333,10174,10175],{},"Інтеграції без милиць."," API, вебхуки, черги повторів, ідемпотентність: усе, що потрібно для надійної роботи з платіжками й службами доставки.",[286,10178,10179,10182],{},[2333,10180,10181],{},"Нижча вартість змін у довгій перспективі."," Перший рік дорожчий, зате додавання нової функції через рік не вимагає боротьби з модулями.",[5588,10184,10186],{"id":10185},"нюанси-про-які-мовчать","Нюанси, про які мовчать",[273,10188,10189],{},"Кастом не безкоштовний і не безхмарний. Є мінуси, і про них важливо знати.",[283,10191,10192,10202,10211,10217],{},[286,10193,10194,10197,10198,10201],{},[2333,10195,10196],{},"Вищий вхід."," Те, що в OpenCart уже є (адмінка, купони, налаштування валют), доводиться будувати або підключати пакети. Тому наш мінімальний бюджет ",[302,10199,10200],{"href":28},"кастомного магазину"," стартує від 150 000 грн, тоді як шаблонний запуск може бути в рази дешевшим.",[286,10203,10204,10207,10208,306],{},[2333,10205,10206],{},"Залежність від команди."," Якщо розробник зник, а документації й тестів немає, вам так само важко, як і з готовою CMS. Тому ми вимагаємо документацію, доступи до репозиторію й код-рев'ю. Це частина ",[302,10209,10210],{"href":43},"процесу роботи",[286,10212,10213,10216],{},[2333,10214,10215],{},"Довший старт."," Орієнтовно 10–14 тижнів проти 3–5 для шаблонного рішення.",[286,10218,10219,10222],{},[2333,10220,10221],{},"Менше готових «фіч»."," Блог, SEO-плагіни, візуальний редактор: у Laravel їх доведеться підключати окремо. Для контентної частини ми зазвичай використовуємо Nuxt із файловим контентом.",[5825,10224,10225],{},[273,10226,10227,10229,10230,306],{},[2333,10228,9685],{}," Проведемо консультацію тех-ліда на 90 хвилин: подивимось ваш бізнес-процес і чесно скажемо, чи потрібен кастом, чи вистачить готової CMS. Деталі на сторінці ",[302,10231,33],{"href":34},[268,10233,10235],{"id":10234},"як-ми-вирішуємо-пять-питань","Як ми вирішуємо: п'ять питань",[273,10237,10238],{},"Ось питання, які ми ставимо клієнту перед тим, як рекомендувати платформу.",[1207,10240,10241,10247,10253,10259,10265],{},[286,10242,10243,10246],{},[2333,10244,10245],{},"Чи вкладається ваша логіка ціноутворення й замовлень у стандартний кошик?"," Якщо так, рухайтесь у бік готового рішення.",[286,10248,10249,10252],{},[2333,10250,10251],{},"Скільки інтеграцій потрібно, і наскільки вони критичні?"," Одна оплата й одна доставка це стандарт. П'ять систем із двосторонньою синхронізацією це кастом.",[286,10254,10255,10258],{},[2333,10256,10257],{},"Який обсяг каталогу і трафіку через рік-два?"," Від кількох тисяч товарів і значного трафіку питання швидкодії стає серйозним.",[286,10260,10261,10264],{},[2333,10262,10263],{},"Хто підтримуватиме сайт?"," Якщо в команді вже є WordPress-розробник, а бюджет обмежений, це вагомий аргумент.",[286,10266,10267,10270],{},[2333,10268,10269],{},"Яка вартість простою і помилки?"," Чим дорожча хвилина недоступності, тим більше сенсу вкладатись у тести, архітектуру й моніторинг.",[273,10272,10273],{},"Орієнтовний підсумок наших рекомендацій:",[283,10275,10276,10282,10288,10294],{},[286,10277,10278,10281],{},[2333,10279,10280],{},"Перевірка ідеї, малий каталог, стандартні процеси:"," готова CMS або конструктор.",[286,10283,10284,10287],{},[2333,10285,10286],{},"Контентний проєкт із вітриною:"," WordPress з WooCommerce.",[286,10289,10290,10293],{},[2333,10291,10292],{},"Магазин із нестандартною логікою, B2B, багатьма інтеграціями або планами на масштабування:"," Laravel.",[286,10295,10296,10299],{},[2333,10297,10298],{},"Існуючий магазин на OpenCart, який вже не витримує:"," спершу аудит, і лише потім рішення про міграцію.",[268,10301,10303],{"id":10302},"міграція-коли-перерости-готову-cms","Міграція: коли «перерости» готову CMS",[273,10305,10306],{},"Найчастіша історія з нашого досвіду: магазин запустили на OpenCart чи WooCommerce, він виріс, а модулів стало 30+. Сторінки відкриваються повільно, кожне оновлення це тиждень тестування, а нова фіча це доробка поверх доробки. Власник вирішує мігрувати.",[273,10308,10309,10310,10312],{},"Тут корисно не поспішати. Перед рішенням про міграцію ми радимо ",[302,10311,866],{"href":865},": іноді проблему вирішує чистка модулів, кеш і оптимізація запитів, а повна міграція не потрібна. Якщо ж аудит показує, що архітектура вичерпала себе, міграція планується поетапно:",[283,10314,10315,10321,10327,10333],{},[286,10316,10317,10320],{},[2333,10318,10319],{},"Спочатку дані."," Каталог, клієнти, історія замовлень переносяться з перевіркою цілісності.",[286,10322,10323,10326],{},[2333,10324,10325],{},"URL і SEO."," Старі адреси отримують 301-редиректи, інакше ви втратите позиції в пошуку.",[286,10328,10329,10332],{},[2333,10330,10331],{},"Паралельний запуск."," Нова версія тестується на копії реальних даних до перемикання.",[286,10334,10335,10338,10339,10342],{},[2333,10336,10337],{},"Тестування перед запуском."," Перевіряємо шлях покупця з ",[302,10340,10341],{"href":2919},"чек-листа на 60 пунктів"," і відкат на випадок проблем.",[273,10344,10345],{},"Міграція це завжди ризик, тому її планують на період низького трафіку, а не напередодні сезону розпродажів.",[268,10347,8014],{"id":8013},[273,10349,10350],{},"Не існує «найкращої платформи» взагалі, є платформа, яка підходить вашій задачі. Готова CMS дає швидкий і дешевий старт, але накопичує вартість змін. Laravel дає контроль і передбачуваність, але вимагає більших початкових вкладень і сильнішої команди.",[273,10352,10353],{},"Практичне правило: порівнюйте не вартість запуску, а вартість володіння на горизонті 2–3 роки. Включайте в неї оновлення, підтримку, швидкість, ризик простою й вартість нових функцій. Тоді картина часто змінюється на користь тієї платформи, яку ви спочатку відкидали.",[273,10355,10356,10357,306],{},"Коротко: стандартна вітрина без особливої логіки це OpenCart чи WooCommerce; ваш бізнес-процес визначає код, а не навпаки це Laravel. Якщо вагаєтесь, краще витратити годину на консультацію, ніж місяці на міграцію. Скільки це може коштувати, ми розбирали в статті ",[302,10358,10359],{"href":1548},"Скільки коштує розробка інтернет-магазину у 2026",[5825,10361,10362],{},[273,10363,10364,10366,10367,10369,10370,10373],{},[2333,10365,5988],{}," Розкажіть про свій проєкт у ",[302,10368,1731],{"href":17}," або подивіться, як ми підходимо до ",[302,10371,10372],{"href":457},"розробки на Laravel",". Дамо чесну рекомендацію, навіть якщо це буде не Laravel.",{"title":14,"searchDepth":485,"depth":486,"links":10375},[10376,10377,10378,10379,10385,10388,10389,10390],{"id":9885,"depth":485,"text":9886},{"id":9913,"depth":485,"text":9914},{"id":10029,"depth":485,"text":10030},{"id":10063,"depth":485,"text":10064,"children":10380},[10381,10382,10383,10384],{"id":10070,"depth":486,"text":5735},{"id":10093,"depth":486,"text":10094},{"id":10105,"depth":486,"text":191},{"id":10111,"depth":486,"text":10112},{"id":10138,"depth":485,"text":10139,"children":10386},[10387],{"id":10185,"depth":486,"text":10186},{"id":10234,"depth":485,"text":10235},{"id":10302,"depth":485,"text":10303},{"id":8013,"depth":485,"text":8014},"stack.compare",[10393,10395,10397,10399],{"marker":161,"text":10394},"WooCommerce: швидкий старт",{"marker":156,"text":10396},"OpenCart: модулі від різних авторів",{"marker":161,"text":10398},"Laravel: код і логіка ваші",{"marker":166,"text":10400},"вибір залежить від задачі","3 платформи",[10403,10406,10409,10412],{"q":10404,"a":10405},"Що краще для інтернет-магазину: Laravel чи OpenCart?","Для типового магазину зі стандартним каталогом і невеликим бюджетом готова CMS на кшталт OpenCart швидша й дешевша на старті. Laravel виграє там, де потрібні нестандартна логіка, глибокі інтеграції та масштабування. Рішення залежить від ваших процесів, а не від моди.",{"q":10407,"a":10408},"Скільки коштує магазин на Laravel порівняно з готовою CMS?","Кастомний магазин у нас стартує від 150 000 грн, зазвичай 10–14 тижнів. Готова CMS на старті дешевша, але витрати можуть зрости через платні модулі, доробки й обмеження. Тому порівнюйте не вартість запуску, а сукупні витрати за кілька років.",{"q":10410,"a":10411},"Коли варто переходити з OpenCart чи WordPress на кастомне рішення?","Коли ви платите за дедалі більше модулів, постійно обходите обмеження CMS і кожне оновлення ламає кастомізації. Інші ознаки: повільна робота та страх чіпати код. Міграцію краще планувати поетапно, зберігши адреси сторінок і SEO-позиції. Так ви не втратите трафік під час переїзду.",{"q":10413,"a":10414},"Чи можна зробити SEO-дружній магазин на Laravel?","Так, але те, що CMS дає з коробки, доведеться закласти самостійно: метатеги, canonical, sitemap, чисті URL і швидкість. Це частина кошторису, тому обговоріть її з розробником до старту й перевірте перед запуском. Тоді результат буде не гіршим, ніж у готовій CMS, а часто швидшим.",{},"\u002Fuk\u002Fblog\u002Flaravel-chy-opencart-wordpress-dlia-mahazynu",{"title":9874,"description":9879},"Інтернет-магазин на Laravel чи OpenCart\u002FWordPress: порівняння за ціною, швидкістю, безпекою і гнучкістю. Коли готова CMS краща, а коли ні.","Laravel чи OpenCart і WordPress для магазину — Tochno.","uk\u002Fblog\u002Flaravel-chy-opencart-wordpress-dlia-mahazynu",[9316,6042],"7YN7VSDGJgYmdUPKwFvbWAwRXQBy5Bw4jLAyCPVReqc",{"id":10424,"title":10425,"author":5508,"body":10426,"cover":141,"coverFile":11164,"coverLines":11165,"coverStat":11174,"date":6560,"description":10430,"excerpt":141,"extension":495,"faq":11175,"featured":536,"key":141,"meta":11188,"navigation":525,"path":11189,"readingTime":526,"seo":11190,"seoDescription":11191,"seoTitle":11192,"slug":1372,"stem":11193,"tags":11194,"updated":8086,"__hash__":11195},"blog_uk\u002Fuk\u002Fblog\u002Fnuxt-dlia-marketynhovoho-saitu.md","Nuxt для маркетингового сайту: SEO, швидкість, мультимовність",{"type":265,"value":10427,"toc":11140},[10428,10431,10434,10438,10451,10454,10504,10507,10598,10601,10605,10609,10619,10673,10685,10689,10699,10735,10738,10742,10757,10761,10764,10768,10771,10775,10785,10803,10807,10818,10822,10825,10846,10849,10853,10864,10876,10880,10883,10887,10901,10905,10916,10920,10923,10926,10940,10944,10947,10967,10970,10977,10981,10984,11010,11015,11019,11074,11078,11121,11127,11137],[273,10429,10430],{},"Nuxt розробка для маркетингового сайту виправдана, коли вам потрібні швидкі сторінки з повним HTML для пошуковиків, чіткий контроль над SEO і можливість додати інтерактив (калькулятор, форму, кабінет) без переписування сайту. Для сайту з п'яти статичних сторінок і редактором, що «просто хоче щось поправити», простіше інструменти не вигадаєш. Нижче розбираємо, що саме дає Nuxt, як це налаштувати, і де він зайвий.",[273,10432,10433],{},"Ми самі робимо власний сайт Tochno на Nuxt із генерацією статичних сторінок, тому розповідаємо про налаштування, з якими стикаємося щодня. Конкретні версії й імена модулів змінюються, тому перед впровадженням звіряйте з документацією.",[268,10435,10437],{"id":10436},"чому-маркетинговому-сайту-важливий-ssg-або-ssr","Чому маркетинговому сайту важливий SSG або SSR",[273,10439,10440,10441,10444,10445,10450],{},"Класичний SPA на Vue чи React віддає порожній ",[6119,10442,10443],{},"\u003Cdiv id=\"app\">",", а контент малює JavaScript у браузері. ",[302,10446,10449],{"href":10447,"rel":10448},"https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fjavascript\u002Fjavascript-seo-basics",[7435],"Google вміє виконувати JS",", але робить це у другій хвилі індексації, із затримкою і не завжди бездоганно. Інші пошукові системи і сервіси попереднього перегляду посилань (месенджери, соцмережі) JS не виконують зовсім.",[273,10452,10453],{},"Для маркетингового сайту це неприйнятно: його головна мета, щоб його знаходили й коректно показували в пошуку та в соцмережах. Тому потрібен HTML із повним текстом уже у відповіді сервера. Nuxt дає це з коробки в кількох режимах:",[342,10455,10456,10469],{},[345,10457,10458],{},[348,10459,10460,10463,10466],{},[351,10461,10462],{},"Режим",[351,10464,10465],{},"Як працює",[351,10467,10468],{},"Коли обирати",[358,10470,10471,10482,10493],{},[348,10472,10473,10476,10479],{},[363,10474,10475],{},"SSG (prerender)",[363,10477,10478],{},"усі сторінки збираються в HTML під час білда",[363,10480,10481],{},"лендінги, корпоративні сайти, блоги, документація",[348,10483,10484,10487,10490],{},[363,10485,10486],{},"SSR",[363,10488,10489],{},"HTML формується на сервері на кожен запит",[363,10491,10492],{},"персоналізовані сторінки, каталоги з частими змінами",[348,10494,10495,10498,10501],{},[363,10496,10497],{},"Гібрид (routeRules)",[363,10499,10500],{},"частина маршрутів пререндериться, частина рендериться на запит",[363,10502,10503],{},"сайт із блогом і кабінетом чи API",[273,10505,10506],{},"Гібрид у Nuxt налаштовується декларативно:",[6667,10508,10512],{"className":10509,"code":10510,"language":10511,"meta":14,"style":14},"language-ts shiki shiki-themes github-dark-default","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  routeRules: {\n    '\u002F**': { prerender: true },       \u002F\u002F marketing pages: static HTML\n    '\u002Fapi\u002F**': { prerender: false },  \u002F\u002F API stays dynamic\n    '\u002Fkabinet\u002F**': { ssr: false },    \u002F\u002F private area: SPA, no SEO needed\n  },\n})\n","ts",[6119,10513,10514,10519,10533,10538,10554,10570,10586,10593],{"__ignoreMap":14},[6675,10515,10516],{"class":6677,"line":3365},[6675,10517,10518],{"class":6680},"\u002F\u002F nuxt.config.ts\n",[6675,10520,10521,10524,10527,10530],{"class":6677,"line":485},[6675,10522,10523],{"class":6690},"export",[6675,10525,10526],{"class":6690}," default",[6675,10528,10529],{"class":6700}," defineNuxtConfig",[6675,10531,10532],{"class":8229},"({\n",[6675,10534,10535],{"class":6677,"line":486},[6675,10536,10537],{"class":6686},"  routeRules: {\n",[6675,10539,10540,10543,10546,10548,10551],{"class":6677,"line":1343},[6675,10541,10542],{"class":6712},"    '\u002F**'",[6675,10544,10545],{"class":6686},": { prerender: ",[6675,10547,8817],{"class":6693},[6675,10549,10550],{"class":6686}," },       ",[6675,10552,10553],{"class":6680},"\u002F\u002F marketing pages: static HTML\n",[6675,10555,10556,10559,10561,10564,10567],{"class":6677,"line":4305},[6675,10557,10558],{"class":6712},"    '\u002Fapi\u002F**'",[6675,10560,10545],{"class":6686},[6675,10562,10563],{"class":6693},"false",[6675,10565,10566],{"class":6686}," },  ",[6675,10568,10569],{"class":6680},"\u002F\u002F API stays dynamic\n",[6675,10571,10572,10575,10578,10580,10583],{"class":6677,"line":2960},[6675,10573,10574],{"class":6712},"    '\u002Fkabinet\u002F**'",[6675,10576,10577],{"class":6686},": { ssr: ",[6675,10579,10563],{"class":6693},[6675,10581,10582],{"class":6686}," },    ",[6675,10584,10585],{"class":6680},"\u002F\u002F private area: SPA, no SEO needed\n",[6675,10587,10588,10591],{"class":6677,"line":931},[6675,10589,10590],{"class":6686},"  }",[6675,10592,8574],{"class":8229},[6675,10594,10595],{"class":6677,"line":3739},[6675,10596,10597],{"class":8229},"})\n",[273,10599,10600],{},"Для сайту, що змінюється раз на тиждень, SSG майже завжди найкращий вибір: сторінки віддаються з CDN чи звичайного nginx без обчислень, а відповідь миттєва.",[268,10602,10604],{"id":10603},"seo-в-nuxt-що-налаштувати-а-що-вже-є","SEO в Nuxt: що налаштувати, а що вже є",[5588,10606,10608],{"id":10607},"мета-теги-і-канонічні-адреси","Мета-теги і канонічні адреси",[273,10610,10611,10612,6214,10615,10618],{},"Nuxt має вбудований ",[6119,10613,10614],{},"useSeoMeta",[6119,10616,10617],{},"useHead",". Усе, що ми описуємо в компоненті сторінки, потрапляє в готовий HTML:",[6667,10620,10622],{"className":10509,"code":10621,"language":10511,"meta":14,"style":14},"useSeoMeta({\n  title: 'Розробка сайтів на Nuxt під ключ',\n  description: 'Лендінги й корпоративні сайти: дизайн, розробка, SEO.',\n  ogTitle: 'Розробка сайтів на Nuxt під ключ',\n  ogImage: '\u002Fog\u002Frozrobka-saitiv.png',\n})\n",[6119,10623,10624,10630,10640,10650,10659,10669],{"__ignoreMap":14},[6675,10625,10626,10628],{"class":6677,"line":3365},[6675,10627,10614],{"class":6700},[6675,10629,10532],{"class":6686},[6675,10631,10632,10635,10638],{"class":6677,"line":485},[6675,10633,10634],{"class":6686},"  title: ",[6675,10636,10637],{"class":6712},"'Розробка сайтів на Nuxt під ключ'",[6675,10639,8574],{"class":6686},[6675,10641,10642,10645,10648],{"class":6677,"line":486},[6675,10643,10644],{"class":6686},"  description: ",[6675,10646,10647],{"class":6712},"'Лендінги й корпоративні сайти: дизайн, розробка, SEO.'",[6675,10649,8574],{"class":6686},[6675,10651,10652,10655,10657],{"class":6677,"line":1343},[6675,10653,10654],{"class":6686},"  ogTitle: ",[6675,10656,10637],{"class":6712},[6675,10658,8574],{"class":6686},[6675,10660,10661,10664,10667],{"class":6677,"line":4305},[6675,10662,10663],{"class":6686},"  ogImage: ",[6675,10665,10666],{"class":6712},"'\u002Fog\u002Frozrobka-saitiv.png'",[6675,10668,8574],{"class":6686},[6675,10670,10671],{"class":6677,"line":2960},[6675,10672,10597],{"class":6686},[273,10674,10675,10676,10678,10679,10681,10682,10684],{},"Правила, які ми дотримуємо: унікальний ",[6119,10677,6364],{}," до 60 символів і ",[6119,10680,6367],{}," до 155 для кожної сторінки, один ",[6119,10683,6371],{},", канонічна адреса в єдиному форматі (без кінцевого слеша, або навпаки, але завжди однаково). Дублі й розбіжності в канонічних адресах це одна з найчастіших причин «дивних» проблем в Search Console.",[5588,10686,10688],{"id":10687},"sitemap-robots-структуровані-дані","Sitemap, robots, структуровані дані",[273,10690,10691,10692,6197,10695,10698],{},"Для sitemap і robots є готові модулі (",[6119,10693,10694],{},"@nuxtjs\u002Fsitemap",[6119,10696,10697],{},"@nuxtjs\u002Frobots","), для schema.org окремі модулі чи власний composable, що додає JSON-LD. Для маркетингового сайту ми зазвичай додаємо:",[283,10700,10701,10710,10715,10723,10729],{},[286,10702,10703,6214,10706,10709],{},[6119,10704,10705],{},"Organization",[6119,10707,10708],{},"WebSite"," на всі сторінки;",[286,10711,10712,10714],{},[6119,10713,6396],{}," на внутрішні сторінки;",[286,10716,10717,440,10720,10722],{},[6119,10718,10719],{},"Service",[6119,10721,6393],{}," на сторінки послуг;",[286,10724,10725,10728],{},[6119,10726,10727],{},"FAQPage"," там, де на сторінці справді є блок питань;",[286,10730,10731,10734],{},[6119,10732,10733],{},"BlogPosting"," із автором для статей.",[273,10736,10737],{},"Важливо, щоб розмітка відповідала видимому контенту. Розмітка питань, яких на сторінці немає, порушує правила пошукових систем і шкодить більше, ніж допомагає.",[5588,10739,10741],{"id":10740},"внутрішні-посилання-та-хлібні-крихти","Внутрішні посилання та хлібні крихти",[273,10743,10744,10745,10748,10749,10752,10753,10756],{},"Nuxt-компонент ",[6119,10746,10747],{},"NuxtLink"," рендерить звичайний ",[6119,10750,10751],{},"\u003Ca href>",", тому пошукові системи бачать посилання. Простіше помилитися з кнопками, що навігують через ",[6119,10754,10755],{},"router.push"," без реальної адреси: такі переходи для краулера невидимі. Усі індексовані переходи мають бути реальними посиланнями.",[5588,10758,10760],{"id":10759},"перевірка-перед-релізом","Перевірка перед релізом",[273,10762,10763],{},"Після білда корисно мати автоматичну перевірку: чи є в кожного HTML унікальний title і description, один h1, канонічна адреса, чи немає битих внутрішніх посилань. Ми робимо це скриптом, який запускається в CI, і блокуємо реліз при порушеннях. Це дешевше, ніж шукати дублі в Search Console за місяць після запуску.",[268,10765,10767],{"id":10766},"швидкість-на-чому-виграє-nuxt-і-де-можна-програти","Швидкість: на чому виграє Nuxt, і де можна програти",[273,10769,10770],{},"Nuxt не робить сайт швидким автоматично. Він дає інструменти, а результат залежить від того, як ними користуватися.",[5588,10772,10774],{"id":10773},"зображення","Зображення",[273,10776,10777,10778,10781,10782,10784],{},"Модуль ",[6119,10779,10780],{},"@nuxt\u002Fimage"," перетворює картинки у сучасні формати (WebP, AVIF), підбирає розміри під екран і додає ",[6119,10783,7592],{},". Два правила, що дають найбільше:",[1207,10786,10787,10793],{},[286,10788,10789,10790,6218],{},"Зображення першого екрана (LCP-елемент) не лінивити, а навпаки, пріоритезувати (",[6119,10791,10792],{},"fetchpriority=\"high\"",[286,10794,10795,10796,6214,10798,10800,10801,306],{},"Завжди вказувати ",[6119,10797,7578],{},[6119,10799,7581],{},", щоб не було стрибків верстки (CLS). Про метрики докладно в статті ",[302,10802,476],{"href":475},[5588,10804,10806],{"id":10805},"шрифти","Шрифти",[273,10808,10809,10810,10813,10814,10817],{},"Шрифти найчастіше псують і LCP, і CLS. У Nuxt модуль ",[6119,10811,10812],{},"@nuxt\u002Ffonts"," завантажує шрифти зі сторонніх сервісів під час білда і віддає їх зі свого домену, підставляє запасні метрики для зменшення стрибків і додає ",[6119,10815,10816],{},"preload",". Вигода очевидна: менше запитів на сторонні домени й жодного блокуючого CSS від Google Fonts. Порада: обирайте не більше двох-трьох накреслень і підмножини (subsets) лише для потрібних мов.",[5588,10819,10821],{"id":10820},"розмір-javascript","Розмір JavaScript",[273,10823,10824],{},"Тут Nuxt програє «чистому» HTML. Навіть статична сторінка підвантажує Vue, роутер і ядро Nuxt, щоб гідратувати сторінку. Орієнтир: ядро з'їдає десятки кілобайт стисненого JS ще до вашого коду. Що ми робимо, щоб тримати бюджет:",[283,10826,10827,10837,10840,10843],{},[286,10828,10829,10830,10833,10834,7569],{},"ліниво гідратуємо важкі інтерактивні блоки (калькулятор, форма, cookie-банер) через ",[6119,10831,10832],{},"hydrate-on-visible"," та ",[6119,10835,10836],{},"hydrate-on-idle",[286,10838,10839],{},"підключаємо важкі бібліотеки (наприклад, валідацію форм) лише в момент потреби, динамічним імпортом;",[286,10841,10842],{},"не тягнемо UI-кіт цілком, а беремо лише компоненти, що використовуємо;",[286,10844,10845],{},"відстежуємо розмір бандлу в CI, щоб регресії були видно одразу.",[273,10847,10848],{},"Чесно: якщо вашому сайту треба один екран тексту й форма, ванільний HTML або Astro дадуть менший JS. Nuxt виграє, коли на сайті багато компонентів, інтерактиву й спільної логіки.",[5588,10850,10852],{"id":10851},"кешування-і-cdn","Кешування і CDN",[273,10854,10855,10856,10859,10860,10863],{},"Для SSG достатньо віддавати статичні файли з довгим ",[6119,10857,10858],{},"Cache-Control"," для хешованих ресурсів (",[6119,10861,10862],{},"\u002F_nuxt\u002F*",") і коротким для HTML. Це можна зробити на nginx, Vercel чи Cloudflare. Окремо перевірте, щоб стиснення (gzip або brotli) було ввімкнене: різниця в розмірі передачі помітна.",[5825,10865,10866],{},[273,10867,10868,10871,10872,10875],{},[2333,10869,10870],{},"Потрібен сайт, який швидко відкривається і приводить заявки?"," Робимо лендінги й корпоративні сайти на Nuxt: дизайн, розробка, SEO-основа та перевірка швидкості перед запуском. ",[302,10873,10874],{"href":25},"Розробка сайтів на Nuxt під ключ",", від 25 000 грн.",[268,10877,10879],{"id":10878},"мультимовність-без-дублів-і-плутанини","Мультимовність без дублів і плутанини",[273,10881,10882],{},"Для двомовного сайту (українська й англійська) важливо три речі: структура адрес, hreflang і переклади.",[5588,10884,10886],{"id":10885},"структура-адрес","Структура адрес",[273,10888,10889,10890,10892,10893,10896,10897,10900],{},"Найпрактичніша схема для українського ринку: основна мова без префікса, інші з префіксом. Тобто ",[6119,10891,71],{}," для української й ",[6119,10894,10895],{},"\u002Fen\u002Fservices"," для англійської. У модулях Nuxt-i18n це режим ",[6119,10898,10899],{},"prefix_except_default",". Слаги української версії транслітеруємо латиницею за офіційною транслітерацією, англійської робимо англійською. Так адреси читабельні й корисні для пошуку.",[5588,10902,10904],{"id":10903},"hreflang-і-canonical","hreflang і canonical",[273,10906,10907,10908,10911,10912,10915],{},"Кожна мовна версія посилається на всі інші та на себе (",[6119,10909,10910],{},"hreflang","), а канонічна адреса вказує на саму сторінку. Додається ",[6119,10913,10914],{},"x-default"," на основну мову. Важливий нюанс: якщо англійська версія ще не готова, не публікуйте порожніх сторінок і не віддавайте hreflang на неіснуючі адреси. Краще мова, вимкнена прапорцем, поки контент не готовий.",[5588,10917,10919],{"id":10918},"переклади-й-контент","Переклади й контент",[273,10921,10922],{},"Нестатичні тексти (кнопки, навігація, мітки форм) зручно тримати в JSON-файлах локалей. Контент сторінок і статей краще віддати в окремі Markdown- або YAML-файли за мовами, щоб редактор міг змінювати текст без правки компонентів. Тоді додавання нової мови зводиться до додавання файлів, а не до змін у шаблонах.",[273,10924,10925],{},"Типові помилки в мультимовності:",[283,10927,10928,10931,10934,10937],{},[286,10929,10930],{},"автоматичний редирект за мовою браузера, який заважає краулеру бачити всі версії (краще пропонувати перемикач, а не примусово перенаправляти);",[286,10932,10933],{},"переклад лише тексту, без перекладу мета-тегів і alt-атрибутів;",[286,10935,10936],{},"перемикач мови, що веде на головну, а не на ту саму сторінку іншою мовою;",[286,10938,10939],{},"різні формати дат і валют без урахування локалі.",[268,10941,10943],{"id":10942},"контент-де-його-зберігати","Контент: де його зберігати",[273,10945,10946],{},"Для маркетингового сайту є три підходи:",[1207,10948,10949,10955,10961],{},[286,10950,10951,10954],{},[2333,10952,10953],{},"Файли в репозиторії"," (Markdown\u002FYAML через Nuxt Content). Плюси: версіонування, швидкість, жодних зовнішніх залежностей, повний контроль. Мінус: правки йдуть через розробника або Git.",[286,10956,10957,10960],{},[2333,10958,10959],{},"Headless CMS"," (Strapi, Directus, Sanity та інші). Плюси: зручний редактор для нетехнічної людини. Мінуси: ще одна система для підтримки й додаткові витрати.",[286,10962,10963,10966],{},[2333,10964,10965],{},"Адмінка на Laravel."," Виправдана, коли контент тісно пов'язаний з бізнес-логікою (каталог, замовлення). Тоді Nuxt бере дані з API Laravel.",[273,10968,10969],{},"Для сайту, де контент змінюється кілька разів на місяць, перший варіант найекономніший: кожна зміна це коміт і автоматична пересборка. Якщо ж сайт редагують щодня кілька людей, без CMS не обійтися.",[273,10971,10972,10973,10976],{},"Зв'язку Nuxt і Laravel присвячена наша ",[302,10974,10975],{"href":2065},"розробка на Nuxt і Laravel",", коли потрібно більше, ніж статичний сайт: кабінет, замовлення, інтеграції.",[268,10978,10980],{"id":10979},"коли-nuxt-не-потрібен","Коли Nuxt не потрібен",[273,10982,10983],{},"Краще сказати прямо, коли ми не радимо Nuxt:",[283,10985,10986,10992,10998,11004],{},[286,10987,10988,10991],{},[2333,10989,10990],{},"Сайт на 3–5 сторінок без інтерактиву й без планів зростання."," Достатньо статичного HTML або простого генератора.",[286,10993,10994,10997],{},[2333,10995,10996],{},"Редактор самостійно щодня змінює контент і дизайн."," Тут буде кращим WordPress або конструктор, бо вигода від повного контролю над кодом не виправдає витрат на підтримку.",[286,10999,11000,11003],{},[2333,11001,11002],{},"Дуже малий бюджет і потреба «вчора»."," Конструктор запустить сайт швидше, а перейти на власний код можна пізніше, коли виникнуть обмеження.",[286,11005,11006,11009],{},[2333,11007,11008],{},"Команда без жодного досвіду з Vue."," Вартість підтримки зросте. Якщо ви плануєте самі розвивати сайт, врахуйте цей фактор.",[273,11011,11012,11013,306],{},"У решті випадків, коли потрібні швидкість, власний дизайн, SEO-контроль і запас на розвиток, Nuxt виправдовує себе. Порівняння з іншими підходами для магазинів ми розбирали в статті про ",[302,11014,5555],{"href":1537},[268,11016,11018],{"id":11017},"підводні-камені-з-якими-ми-стикалися","Підводні камені, з якими ми стикалися",[283,11020,11021,11042,11048,11060,11065],{},[286,11022,11023,11026,11027,11030,11031,11034,11035,440,11038,11041],{},[2333,11024,11025],{},"Гідратаційні помилки."," Якщо HTML із сервера не збігається з тим, що рендерить клієнт (випадкові значення, ",[6119,11028,11029],{},"Date.now()",", залежності від ",[6119,11032,11033],{},"window","), Vue видає попередження й може перемалювати сторінку. Дані, що залежать від браузера, виносимо в ",[6119,11036,11037],{},"onMounted",[6119,11039,11040],{},"\u003CClientOnly>",", але лише для неіндексованого контенту.",[286,11043,11044,11047],{},[2333,11045,11046],{},"Контент лише на клієнті."," Усе, що має індексуватися, повинно бути в HTML. Перевірка проста: відкрийте «Переглянути код сторінки» (не інспектор) і знайдіть свій текст.",[286,11049,11050,11053,11054,6214,11056,11059],{},[2333,11051,11052],{},"Кінцеві слеші та дублі адрес."," ",[6119,11055,71],{},[6119,11057,11058],{},"\u002Fposluhy\u002F"," для пошуковика різні адреси. Оберіть один формат, налаштуйте редирект на рівні сервера й канонічну адресу.",[286,11061,11062,11064],{},[2333,11063,7874],{}," Аналітика, чати й віджети можуть з'їсти весь виграш у швидкості. Підключайте їх після згоди користувача і відкладено.",[286,11066,11067,11070,11071,11073],{},[2333,11068,11069],{},"Прев'ю-середовища в індексі."," Закривайте тестові та preview-деплої від індексації (",[6119,11072,6387],{},"), інакше пошуковик знайде дублі вашого сайту.",[268,11075,11077],{"id":11076},"чек-лист-перед-запуском-nuxt-сайту","Чек-лист перед запуском Nuxt-сайту",[1207,11079,11080,11085,11093,11096,11103,11106,11109,11112,11115,11118],{},[286,11081,11082,11083,306],{},"Відкритий код сторінки містить повний текст і один ",[6119,11084,6371],{},[286,11086,11087,11088,6214,11090,11092],{},"Унікальні ",[6119,11089,6364],{},[6119,11091,6367],{}," на кожній сторінці.",[286,11094,11095],{},"Канонічні адреси в єдиному форматі, редирект зі слешів налаштований.",[286,11097,11098,6214,11100,11102],{},[6119,11099,6383],{},[6119,11101,6380],{}," працюють на проді та закривають тестові середовища.",[286,11104,11105],{},"Структуровані дані проходять Rich Results Test.",[286,11107,11108],{},"Зображення в сучасних форматах, першого екрана не лінивимо, розміри задані.",[286,11110,11111],{},"Шрифти віддаються з вашого домену, із запасними метриками.",[286,11113,11114],{},"Lighthouse на мобільному, а не на десктопі; реальні дані CWV додаємо після запуску з Search Console.",[286,11116,11117],{},"Форми й кнопки працюють без JS або мають запасний шлях (посилання на месенджер, mailto).",[286,11119,11120],{},"Мовні версії посилаються одна на одну, порожніх мов немає.",[273,11122,11123,11124,11126],{},"Якщо ви вже маєте сайт на Nuxt і сумніваєтесь у ньому, першим кроком буде ",[302,11125,866],{"href":865}," або експрес-перевірка швидкості й індексації.",[5825,11128,11129],{},[273,11130,11131,11134,11135,306],{},[2333,11132,11133],{},"Плануєте сайт або перепис на Nuxt?"," Опишіть задачу в брифі: ми скажемо, чи Nuxt справді вам потрібен, і дамо оцінку за 1 робочий день. ",[302,11136,5835],{"href":17},[7282,11138,11139],{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":14,"searchDepth":485,"depth":486,"links":11141},[11142,11143,11149,11155,11160,11161,11162,11163],{"id":10436,"depth":485,"text":10437},{"id":10603,"depth":485,"text":10604,"children":11144},[11145,11146,11147,11148],{"id":10607,"depth":486,"text":10608},{"id":10687,"depth":486,"text":10688},{"id":10740,"depth":486,"text":10741},{"id":10759,"depth":486,"text":10760},{"id":10766,"depth":485,"text":10767,"children":11150},[11151,11152,11153,11154],{"id":10773,"depth":486,"text":10774},{"id":10805,"depth":486,"text":10806},{"id":10820,"depth":486,"text":10821},{"id":10851,"depth":486,"text":10852},{"id":10878,"depth":485,"text":10879,"children":11156},[11157,11158,11159],{"id":10885,"depth":486,"text":10886},{"id":10903,"depth":486,"text":10904},{"id":10918,"depth":486,"text":10919},{"id":10942,"depth":485,"text":10943},{"id":10979,"depth":485,"text":10980},{"id":11017,"depth":485,"text":11018},{"id":11076,"depth":485,"text":11077},"nuxt.config.ts",[11166,11168,11170,11172],{"marker":161,"text":11167},"prerender: весь контент у HTML",{"marker":161,"text":11169},"canonical, hreflang, sitemap",{"marker":156,"text":11171},"JS-бюджет: стежимо за розміром",{"marker":166,"text":11173},"i18n: префікс мови без дублів","SSG",[11176,11179,11182,11185],{"q":11177,"a":11178},"Чи добре Nuxt підходить для SEO?","Так: Nuxt віддає готовий HTML через SSG або SSR, тож пошукові системи й AI-боти одразу бачать увесь контент. Метатеги, canonical, sitemap та hreflang потрібно налаштувати, але інструменти для цього є. Без налаштувань будь-який фреймворк дасть посередній результат.",{"q":11180,"a":11181},"Скільки коштує сайт на Nuxt?","Лендінг на Nuxt у нас стартує від 25 000 грн і робиться 2–3 тижні, корпоративний сайт від 60 000 грн, зазвичай 5–7 тижнів. Кінцева сума залежить від кількості сторінок, мов, інтеграцій і складності дизайну. Точну суму називаємо після короткого брифу.",{"q":11183,"a":11184},"Чим SSG відрізняється від SSR у Nuxt?","SSG генерує сторінки заздалегідь під час збирання, а SSR формує їх на сервері під кожен запит. Для маркетингового сайту з нечастими змінами SSG простіший, швидший і дешевший у хостингу. SSR доречний, коли контент часто змінюється або залежить від користувача.",{"q":11186,"a":11187},"Коли Nuxt не потрібен?","Якщо потрібна проста візитка чи сайт, який щодня редагують без розробника, практичнішими будуть WordPress або конструктор. Nuxt виправданий, коли важливі швидкість, SEO, мультимовність і контроль над кодом. Обирайте за реальними потребами, а не за технологічною модою.",{},"\u002Fuk\u002Fblog\u002Fnuxt-dlia-marketynhovoho-saitu",{"title":10425,"description":10430},"Nuxt розробка для маркетингового сайту: як SSG дає SEO та швидкість, як налаштувати мультимовність і де Nuxt не потрібен. Практика з прикладами конфігу.","Nuxt розробка маркетингового сайту: SEO, швидкість — Tochno.","uk\u002Fblog\u002Fnuxt-dlia-marketynhovoho-saitu",[8085],"dqP4aYzIRkRwZewVQVhMpPoSgzF0eZbDvpsDXQSHJm4",{"id":11197,"title":11198,"author":5508,"body":11199,"cover":141,"coverFile":11916,"coverLines":11917,"coverStat":590,"date":6560,"description":11203,"excerpt":141,"extension":495,"faq":11926,"featured":536,"key":141,"meta":11939,"navigation":525,"path":11940,"readingTime":526,"seo":11941,"seoDescription":11942,"seoTitle":11943,"slug":959,"stem":11944,"tags":11945,"updated":8086,"__hash__":11946},"blog_uk\u002Fuk\u002Fblog\u002Fruchne-chy-avtomatyzovane-testuvannia.md","Ручне vs автоматизоване тестування: що потрібно малому бізнесу",{"type":265,"value":11200,"toc":11895},[11201,11204,11207,11211,11216,11222,11311,11314,11318,11321,11353,11360,11369,11373,11380,11383,11406,11413,11663,11669,11672,11676,11679,11692,11695,11706,11710,11713,11717,11723,11727,11733,11737,11746,11750,11755,11759,11762,11786,11793,11797,11800,11804,11807,11811,11814,11818,11821,11825,11828,11831,11834,11838,11870,11876,11878,11881,11892],[273,11202,11203],{},"Малому бізнесу зазвичай не потрібно вибирати між ручним та автоматизованим тестуванням: потрібна правильна послідовність. Спочатку ручне тестування нового та нестабільного функціоналу, потім автотести для кількох критичних сценаріїв, які повторюються перед кожним релізом: реєстрація, кошик, оформлення замовлення, оплата. Така комбінація закриває основні ризики за помірні гроші.",[273,11205,11206],{},"Нижче розбираємо, у чому різниця, що кожен підхід ловить, скільки це коштує за порядком величини і як розпочати без зайвих витрат. Ми працюємо з обома підходами, тому не будемо стверджувати, що «автотести вирішують усе» або що «ручного вистачить».",[268,11208,11210],{"id":11209},"у-чому-різниця-між-ручним-та-автоматизованим-тестуванням","У чому різниця між ручним та автоматизованим тестуванням",[273,11212,11213,11215],{},[2333,11214,3983],{}," — це коли людина відкриває сайт і проходить сценарії очима користувача: додає товар у кошик, оформлює замовлення, перевіряє на різних пристроях, шукає нестандартні ситуації. Результат — знайдені баги з описом, скриншотами або відео.",[273,11217,11218,11221],{},[2333,11219,11220],{},"Автоматизоване тестування"," — це коли ті самі сценарії записані кодом, і програма виконує їх сама. Наприклад, скрипт на Playwright відкриває браузер, додає товар, проходить checkout і перевіряє, що замовлення створилося. Запускається за кілька хвилин і повторюється скільки завгодно разів.",[342,11223,11224,11236],{},[345,11225,11226],{},[348,11227,11228,11230,11233],{},[351,11229,5610],{},[351,11231,11232],{},"Ручне",[351,11234,11235],{},"Автоматизоване",[358,11237,11238,11248,11259,11270,11281,11290,11301],{},[348,11239,11240,11242,11245],{},[363,11241,934],{},[363,11243,11244],{},"Швидко, без підготовки",[363,11246,11247],{},"Потрібен час на написання й налаштування",[348,11249,11250,11253,11256],{},[363,11251,11252],{},"Вартість одного прогону",[363,11254,11255],{},"Щоразу оплачуються години",[363,11257,11258],{},"Майже нульова після створення",[348,11260,11261,11264,11267],{},[363,11262,11263],{},"Пошук нових, несподіваних проблем",[363,11265,11266],{},"Сильна сторона: людина помічає дивне",[363,11268,11269],{},"Слабка: перевіряє лише закладене",[348,11271,11272,11275,11278],{},[363,11273,11274],{},"Повторювані сценарії (регрес)",[363,11276,11277],{},"Нудно і дорого, людина помиляється",[363,11279,11280],{},"Сильна сторона: стабільно й швидко",[348,11282,11283,11286,11288],{},[363,11284,11285],{},"Оцінка зручності, дизайну, змісту",[363,11287,5680],{},[363,11289,5762],{},[348,11291,11292,11295,11298],{},[363,11293,11294],{},"Кросбраузерність і пристрої",[363,11296,11297],{},"Реальні пристрої, але повільно",[363,11299,11300],{},"Швидко в кількох браузерах, але лише емуляція",[348,11302,11303,11305,11308],{},[363,11304,126],{},[363,11306,11307],{},"Не потрібна",[363,11309,11310],{},"Тести ламаються разом із зміною інтерфейсу",[273,11312,11313],{},"Звідси проста логіка: людина шукає нове й дивне, машина захищає від повторення старого.",[268,11315,11317],{"id":11316},"що-саме-ловить-ручне-тестування","Що саме ловить ручне тестування",[273,11319,11320],{},"Людина здатна побачити те, що ніхто не передбачав у вимогах. На практиці ручне тестування виявляє:",[283,11322,11323,11329,11335,11341,11347],{},[286,11324,11325,11328],{},[2333,11326,11327],{},"Логічні помилки:"," знижка застосовується двічі, доставка рахується некоректно для певного міста.",[286,11330,11331,11334],{},[2333,11332,11333],{},"Проблеми зручності:"," кнопка під клавіатурою на мобільному, незрозуміле повідомлення про помилку, форма, що очищається після невдалої валідації.",[286,11336,11337,11340],{},[2333,11338,11339],{},"Візуальні дефекти:"," текст, що налізає, зображення, що розтягнулися, неправильний шрифт.",[286,11342,11343,11346],{},[2333,11344,11345],{},"Нестандартні шляхи:"," повернутися «назад» після оплати, відкрити кошик у двох вкладках, змінити кількість до нуля.",[286,11348,11349,11352],{},[2333,11350,11351],{},"Реальні пристрої:"," старий Android, Safari на iPhone, повільна мережа.",[273,11354,11355,11356,11359],{},"Типова ручна перевірка — це чек-лист із десятків пунктів. Ми показували, як він виглядає для магазину, у ",[302,11357,11358],{"href":2919},"чек-листі тестування інтернет-магазину перед запуском",". Якщо ви не знаєте, з чого розпочати, найкращий перший крок — один раз провести повне ручне тестування й зафіксувати результат у вигляді тест-кейсів. Їх згодом можна автоматизувати.",[273,11361,11362,11363,11366,11367,7177],{},"Ручне тестування потрібне перед запуском нового сайту, після великих змін, при додаванні складного функціоналу (оплата, інтеграція з доставкою, особистий кабінет). У нас це послуга ",[302,11364,11365],{"href":438},"ручного тестування сайтів"," від $20 за годину; для магазину є окремий ",[302,11368,30],{"href":31},[268,11370,11372],{"id":11371},"що-саме-ловить-автоматизоване-тестування","Що саме ловить автоматизоване тестування",[273,11374,11375,11376,11379],{},"Автотести найкраще працюють там, де сценарій стабільний і повторюється часто. Це класичний ",[2333,11377,11378],{},"регрес",": після кожної зміни коду треба переконатися, що старе не зламалося.",[273,11381,11382],{},"Кандидати на автоматизацію в магазині:",[1207,11384,11385,11388,11391,11394,11397,11400,11403],{},[286,11386,11387],{},"Реєстрація й вхід користувача.",[286,11389,11390],{},"Додавання товару в кошик, зміна кількості, видалення.",[286,11392,11393],{},"Оформлення замовлення гостем і зареєстрованим клієнтом.",[286,11395,11396],{},"Застосування промокоду.",[286,11398,11399],{},"Оплата в тестовому режимі платіжки.",[286,11401,11402],{},"Пошук і фільтри каталогу (базові випадки).",[286,11404,11405],{},"Форми заявок і зворотного зв'язку.",[273,11407,11408,11409,7778],{},"Приклад простого автотесту на ",[302,11410,622],{"href":11411,"rel":11412},"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fintro",[7435],[6667,11414,11416],{"className":10509,"code":11415,"language":10511,"meta":14,"style":14},"import { test, expect } from '@playwright\u002Ftest'\n\ntest('гість може оформити замовлення', async ({ page }) => {\n  await page.goto('\u002Fcatalog\u002Fkrosivky-run')\n  await page.getByRole('button', { name: 'Додати в кошик' }).click()\n  await page.goto('\u002Fcart')\n  await page.getByRole('link', { name: 'Оформити замовлення' }).click()\n\n  await page.getByLabel('Телефон').fill('+380501234567')\n  await page.getByLabel(\"Ім'я\").fill('Тест Тестович')\n  await page.getByRole('button', { name: 'Підтвердити' }).click()\n\n  await expect(page.getByText('Дякуємо за замовлення')).toBeVisible()\n})\n",[6119,11417,11418,11432,11436,11466,11485,11513,11528,11552,11556,11582,11606,11629,11633,11659],{"__ignoreMap":14},[6675,11419,11420,11423,11426,11429],{"class":6677,"line":3365},[6675,11421,11422],{"class":6690},"import",[6675,11424,11425],{"class":6686}," { test, expect } ",[6675,11427,11428],{"class":6690},"from",[6675,11430,11431],{"class":6712}," '@playwright\u002Ftest'\n",[6675,11433,11434],{"class":6677,"line":485},[6675,11435,6748],{"emptyLinePlaceholder":525},[6675,11437,11438,11441,11443,11446,11448,11451,11454,11457,11460,11463],{"class":6677,"line":486},[6675,11439,11440],{"class":6700},"test",[6675,11442,6728],{"class":6686},[6675,11444,11445],{"class":6712},"'гість може оформити замовлення'",[6675,11447,6197],{"class":6686},[6675,11449,11450],{"class":6690},"async",[6675,11452,11453],{"class":6686}," ({ ",[6675,11455,11456],{"class":8229},"page",[6675,11458,11459],{"class":6686}," }) ",[6675,11461,11462],{"class":6690},"=>",[6675,11464,11465],{"class":6686}," {\n",[6675,11467,11468,11471,11474,11477,11479,11482],{"class":6677,"line":1343},[6675,11469,11470],{"class":6690},"  await",[6675,11472,11473],{"class":6686}," page.",[6675,11475,11476],{"class":6700},"goto",[6675,11478,6728],{"class":6686},[6675,11480,11481],{"class":6712},"'\u002Fcatalog\u002Fkrosivky-run'",[6675,11483,11484],{"class":6686},")\n",[6675,11486,11487,11489,11491,11494,11496,11499,11502,11505,11508,11511],{"class":6677,"line":4305},[6675,11488,11470],{"class":6690},[6675,11490,11473],{"class":6686},[6675,11492,11493],{"class":6700},"getByRole",[6675,11495,6728],{"class":6686},[6675,11497,11498],{"class":6712},"'button'",[6675,11500,11501],{"class":6686},", { name: ",[6675,11503,11504],{"class":6712},"'Додати в кошик'",[6675,11506,11507],{"class":6686}," }).",[6675,11509,11510],{"class":6700},"click",[6675,11512,8884],{"class":6686},[6675,11514,11515,11517,11519,11521,11523,11526],{"class":6677,"line":2960},[6675,11516,11470],{"class":6690},[6675,11518,11473],{"class":6686},[6675,11520,11476],{"class":6700},[6675,11522,6728],{"class":6686},[6675,11524,11525],{"class":6712},"'\u002Fcart'",[6675,11527,11484],{"class":6686},[6675,11529,11530,11532,11534,11536,11538,11541,11543,11546,11548,11550],{"class":6677,"line":931},[6675,11531,11470],{"class":6690},[6675,11533,11473],{"class":6686},[6675,11535,11493],{"class":6700},[6675,11537,6728],{"class":6686},[6675,11539,11540],{"class":6712},"'link'",[6675,11542,11501],{"class":6686},[6675,11544,11545],{"class":6712},"'Оформити замовлення'",[6675,11547,11507],{"class":6686},[6675,11549,11510],{"class":6700},[6675,11551,8884],{"class":6686},[6675,11553,11554],{"class":6677,"line":3739},[6675,11555,6748],{"emptyLinePlaceholder":525},[6675,11557,11558,11560,11562,11565,11567,11570,11572,11575,11577,11580],{"class":6677,"line":526},[6675,11559,11470],{"class":6690},[6675,11561,11473],{"class":6686},[6675,11563,11564],{"class":6700},"getByLabel",[6675,11566,6728],{"class":6686},[6675,11568,11569],{"class":6712},"'Телефон'",[6675,11571,6218],{"class":6686},[6675,11573,11574],{"class":6700},"fill",[6675,11576,6728],{"class":6686},[6675,11578,11579],{"class":6712},"'+380501234567'",[6675,11581,11484],{"class":6686},[6675,11583,11584,11586,11588,11590,11592,11595,11597,11599,11601,11604],{"class":6677,"line":4665},[6675,11585,11470],{"class":6690},[6675,11587,11473],{"class":6686},[6675,11589,11564],{"class":6700},[6675,11591,6728],{"class":6686},[6675,11593,11594],{"class":6712},"\"Ім'я\"",[6675,11596,6218],{"class":6686},[6675,11598,11574],{"class":6700},[6675,11600,6728],{"class":6686},[6675,11602,11603],{"class":6712},"'Тест Тестович'",[6675,11605,11484],{"class":6686},[6675,11607,11608,11610,11612,11614,11616,11618,11620,11623,11625,11627],{"class":6677,"line":5018},[6675,11609,11470],{"class":6690},[6675,11611,11473],{"class":6686},[6675,11613,11493],{"class":6700},[6675,11615,6728],{"class":6686},[6675,11617,11498],{"class":6712},[6675,11619,11501],{"class":6686},[6675,11621,11622],{"class":6712},"'Підтвердити'",[6675,11624,11507],{"class":6686},[6675,11626,11510],{"class":6700},[6675,11628,8884],{"class":6686},[6675,11630,11631],{"class":6677,"line":2525},[6675,11632,6748],{"emptyLinePlaceholder":525},[6675,11634,11635,11637,11640,11643,11646,11648,11651,11654,11657],{"class":6677,"line":8387},[6675,11636,11470],{"class":6690},[6675,11638,11639],{"class":6700}," expect",[6675,11641,11642],{"class":6686},"(page.",[6675,11644,11645],{"class":6700},"getByText",[6675,11647,6728],{"class":6686},[6675,11649,11650],{"class":6712},"'Дякуємо за замовлення'",[6675,11652,11653],{"class":6686},")).",[6675,11655,11656],{"class":6700},"toBeVisible",[6675,11658,8884],{"class":6686},[6675,11660,11661],{"class":6677,"line":8401},[6675,11662,10597],{"class":6686},[273,11664,11665,11666,11668],{},"Такий тест виконується за кілька секунд і запускається автоматично при кожному оновленні коду. Якщо хтось зламав кнопку «Підтвердити», ви дізнаєтеся до релізу, а не зі скарги покупця. У нас є окрема послуга ",[302,11667,2080],{"href":443},": Playwright-сценарії ключових шляхів і запуск у CI, вартість визначається після аудиту.",[273,11670,11671],{},"Чого автотести не роблять: не оцінюють дизайн, не «відчувають» зручність, не знаходять проблем, про які ніхто не подумав. Тест перевіряє лише те, що в нього закладено.",[268,11673,11675],{"id":11674},"скільки-це-коштує-порівняння-за-порядком-величини","Скільки це коштує: порівняння за порядком величини",[273,11677,11678],{},"Точні суми залежать від проєкту, тому дамо орієнтири з нашого прайсу й логіку витрат.",[283,11680,11681,11686],{},[286,11682,11683,11685],{},[2333,11684,3983],{}," — погодинна оплата: ставка QA-інженера $20–25 за годину. Витрати повторюються при кожному релізі, але гнучко масштабуються: не треба нічого будувати наперед. Для магазину разовий QA-аудит із чек-листом 150+ пунктів стартує від 6 000 грн.",[286,11687,11688,11691],{},[2333,11689,11690],{},"Автоматизація"," — разова інвестиція в написання й налаштування плюс невелика підтримка. Перші сценарії готові приблизно за 1–2 тижні. Далі кожен прогін майже безкоштовний.",[273,11693,11694],{},"Правило окупності для малого бізнесу виглядає так: якщо ви випускаєте оновлення рідко (раз на кілька місяців), дешевше тестувати вручну. Якщо оновлення щотижня й кожне вимагає повного регресу, автотести окупаються швидко, бо щоразу заощаджують години ручної роботи. Точку беззбитковості не варто прораховувати на око: порахуйте, скільки годин займає ваш ручний регрес, і помножте на кількість релізів за рік.",[5825,11696,11697],{},[273,11698,11699,11702,11703,306],{},[2333,11700,11701],{},"Не впевнені, з чого почати?"," Ми зробимо безкоштовний експрес-чек вашого сайту за 48 годин і підкажемо, де достатньо ручної перевірки, а де вже час на автотести. Деталі — на сторінці ",[302,11704,11705],{"href":438},"ручного тестування",[268,11707,11709],{"id":11708},"як-вирішити-що-потрібно-саме-вам","Як вирішити, що потрібно саме вам",[273,11711,11712],{},"Замість абстрактних порад скористайтеся простою схемою рішень за ситуацією.",[5588,11714,11716],{"id":11715},"ви-запускаєте-новий-сайт-або-магазин","Ви запускаєте новий сайт або магазин",[273,11718,11719,11720,11722],{},"Потрібне ",[2333,11721,439],{}," перед запуском. Саме на цьому етапі найбільше нового коду й найбільше сюрпризів. Перевірте повний checkout, мобільну версію, форми, листи, інтеграції. Автотести на цьому етапі передчасні: інтерфейс ще змінюється, тести доведеться переписувати.",[5588,11724,11726],{"id":11725},"сайт-працює-оновлення-нечасті","Сайт працює, оновлення нечасті",[273,11728,11729,11732],{},[2333,11730,11731],{},"Ручний регрес"," перед кожним релізом за готовим чек-листом. Складіть із 20–30 пунктів найважливіше (оформлення замовлення, оплата, форми) і проходьте після змін. Це дешево й надійно.",[5588,11734,11736],{"id":11735},"оновлення-часті-а-помилки-у-checkout-уже-коштували-замовлень","Оновлення часті, а помилки у checkout уже коштували замовлень",[273,11738,11739,11740,11743,11744,306],{},"Час на ",[2333,11741,11742],{},"автотести"," критичних шляхів. Починайте з трьох-п'яти сценаріїв, що безпосередньо приносять гроші: кошик, checkout, оплата. Типові баги в цих місцях ми розбирали в статті ",[302,11745,722],{"href":721},[5588,11747,11749],{"id":11748},"розробка-ведеться-постійно-є-команда","Розробка ведеться постійно, є команда",[273,11751,11752,11753,306],{},"Поєднуйте обидва підходи: автотести в CI на кожен pull request, ручне тестування нових фіч перед випуском. Виділений QA в команді (part-time чи full-time) закриває це без наймання штатного співробітника, деталі — у форматі ",[302,11754,2480],{"href":2479},[268,11756,11758],{"id":11757},"з-чого-почати-покроковий-план-на-місяць","З чого почати: покроковий план на місяць",[273,11760,11761],{},"Реалістичний сценарій для малого магазину без тестування взагалі:",[1207,11763,11764,11769,11775,11781],{},[286,11765,11766,11768],{},[2333,11767,4574],{}," Ручний QA-аудит: проходимо весь сайт за чек-листом, фіксуємо баги з відео та пріоритетами. На виході — список проблем і набір тест-кейсів.",[286,11770,11771,11774],{},[2333,11772,11773],{},"Тиждень 2."," Виправлення критичних і серйозних багів. Повторна перевірка виправленого.",[286,11776,11777,11780],{},[2333,11778,11779],{},"Тиждень 3."," Вибираємо 3–5 найважливіших тест-кейсів для автоматизації: ті, що торкаються грошей. Пишемо Playwright-сценарії.",[286,11782,11783,11785],{},[2333,11784,4592],{}," Підключаємо запуск автотестів до процесу розгортання (CI). Домовляємося про правило: реліз не виходить, якщо автотести червоні.",[273,11787,11788,11789,11792],{},"Після цього ручне тестування займається новим функціоналом і дивними кейсами, автотести охороняють перевірене. Щомісячний регрес можна передати на ",[302,11790,11791],{"href":889},"підтримку сайту"," від 8 000 грн на місяць, де регрес перед релізами входить у формат.",[268,11794,11796],{"id":11795},"що-потрібно-щоб-автотести-справді-працювали","Що потрібно, щоб автотести справді працювали",[273,11798,11799],{},"Автотести — не «встановив і забув». Вони потребують трьох речей, без яких швидко перетворюються на джерело шуму.",[5588,11801,11803],{"id":11802},"стабільне-тестове-середовище","Стабільне тестове середовище",[273,11805,11806],{},"Тести мають запускатися на окремому стенді з тестовими даними, а не на живому магазині. Для оплати використовується тестовий режим платіжки, для Нової Пошти — тестовий ключ або заглушка. Це дозволяє безпечно створювати замовлення й не плутати їх зі справжніми. База даних перед прогоном скидається до відомого стану: інакше тест, що вчора проходив, сьогодні впаде через чужі дані.",[5588,11808,11810],{"id":11809},"стійкі-селектори-та-сценарії","Стійкі селектори та сценарії",[273,11812,11813],{},"Тест, прив'язаний до верстки («третій div у другому блоці»), ламається від будь-якої правки дизайну. Надійніше шукати елементи за роллю та підписом (кнопка «Підтвердити», поле «Телефон»), як у прикладі вище, або за спеціальними атрибутами для тестів. Тоді змінити колір чи відступ можна без ремонту тестів.",[5588,11815,11817],{"id":11816},"запуск-у-ci-і-правило-реакції","Запуск у CI і правило реакції",[273,11819,11820],{},"Автотест має сенс тільки тоді, коли його запускають автоматично й хтось реагує на червоний результат. Типова схема: тести стартують на кожен pull request і перед релізом, а звіт із відео та трасою падіння доступний усій команді. Домовтеся про просте правило: якщо тести червоні, реліз не виходить, поки причину не з'ясовано. Падіння може бути як реальним багом, так і застарілим тестом, але ігнорувати його не можна.",[268,11822,11824],{"id":11823},"приклад-розрахунку-окупності","Приклад розрахунку окупності",[273,11826,11827],{},"Візьмемо умовний приклад, щоб показати логіку, а не конкретні цифри для вашого бізнесу. Припустимо, повний ручний регрес ключових сценаріїв займає 3 години, а оновлення виходять раз на тиждень. За рік це близько 50 прогонів по 3 години, тобто 150 годин. За ставки QA-інженера $20–25 за годину це десятки тисяч гривень на рік тільки на повторення однієї й тієї самої перевірки.",[273,11829,11830],{},"Автоматизація тих самих сценаріїв — разові витрати на 1–2 тижні роботи й невелика щорічна підтримка тестів. Прогін автотестів займає хвилини, і людина потрібна лише для розбору падінь. У такому прикладі автоматизація окупається протягом першого-другого кварталу. Якщо ж релізи раз на квартал, тих самих чотирьох прогонів на рік не вистачить, щоб виправдати витрати, і дешевше лишити ручний регрес.",[273,11832,11833],{},"Важливе застереження: це орієнтовна модель. Реальні цифри залежать від складності сценаріїв, стабільності інтерфейсу та кількості інтеграцій. Тому ми завжди починаємо з оцінки на конкретному проєкті, а не з універсальних обіцянок.",[268,11835,11837],{"id":11836},"типові-помилки-малого-бізнесу","Типові помилки малого бізнесу",[283,11839,11840,11846,11852,11858,11864],{},[286,11841,11842,11845],{},[2333,11843,11844],{},"Автоматизувати все й одразу."," Великий набір крихких тестів — тягар: вони падають через дрібниці, і їх перестають слухати. Краще мало, але стабільно.",[286,11847,11848,11851],{},[2333,11849,11850],{},"Автоматизувати нестабільний інтерфейс."," Якщо дизайн змінюється щотижня, тести постійно ламаються.",[286,11853,11854,11857],{},[2333,11855,11856],{},"Покладатися лише на розробника."," Автор коду тестує так, як задумав, а не як вчинить покупець.",[286,11859,11860,11863],{},[2333,11861,11862],{},"Не фіксувати результати."," Без звіту неможливо порівняти реліз із попереднім і довести, що виправлене справді виправлене.",[286,11865,11866,11869],{},[2333,11867,11868],{},"Думати, що тестування — витрата, а не страховка."," Один пропущений баг в оплаті зазвичай коштує більше, ніж місяць регулярного регресу. Точну суму для вашого магазину порахуйте за кількістю замовлень на день і відсотком, що пройшов би checkout.",[273,11871,11872,11873,11875],{},"Якщо ви вже бачите, що проблеми в самому коді, а не в сценаріях, можливо, потрібен ",[302,11874,2073],{"href":304},", а не нові тести: автотести не лікують погану архітектуру, вони лише швидше її викривають.",[268,11877,8014],{"id":8013},[273,11879,11880],{},"Ручне тестування знаходить нове, дивне й незручне, автоматизоване захищає від повторення старих помилок. Малому бізнесу зазвичай достатньо починати з ручного тестування й чек-листа, а потім автоматизувати кілька критичних сценаріїв, коли релізи стають частими. Головне — не обирати між підходами, а розкласти ролі: людина досліджує, машина стереже.",[5825,11882,11883],{},[273,11884,11885,11888,11889,11891],{},[2333,11886,11887],{},"Потрібен реліз без неприємних сюрпризів?"," Опишіть свій проєкт у ",[302,11890,1731],{"href":17}," — запропонуємо схему тестування: що перевіряти вручну, що автоматизувати і скільки це коштуватиме.",[7282,11893,11894],{},"html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":14,"searchDepth":485,"depth":486,"links":11896},[11897,11898,11899,11900,11901,11907,11908,11913,11914,11915],{"id":11209,"depth":485,"text":11210},{"id":11316,"depth":485,"text":11317},{"id":11371,"depth":485,"text":11372},{"id":11674,"depth":485,"text":11675},{"id":11708,"depth":485,"text":11709,"children":11902},[11903,11904,11905,11906],{"id":11715,"depth":486,"text":11716},{"id":11725,"depth":486,"text":11726},{"id":11735,"depth":486,"text":11736},{"id":11748,"depth":486,"text":11749},{"id":11757,"depth":485,"text":11758},{"id":11795,"depth":485,"text":11796,"children":11909},[11910,11911,11912],{"id":11802,"depth":486,"text":11803},{"id":11809,"depth":486,"text":11810},{"id":11816,"depth":486,"text":11817},{"id":11823,"depth":485,"text":11824},{"id":11836,"depth":485,"text":11837},{"id":8013,"depth":485,"text":8014},"checkout.spec.ts",[11918,11920,11922,11924],{"marker":161,"text":11919},"додати товар у кошик",{"marker":161,"text":11921},"оформлення замовлення гостем",{"marker":156,"text":11923},"ручна перевірка: нова фіча",{"marker":166,"text":11925},"автотести запускаються на кожен реліз",[11927,11930,11933,11936],{"q":11928,"a":11929},"Що дешевше: ручне чи автоматизоване тестування?","На старті дешевше ручне: його можна замовити разово й погодинно, у нас ставка QA-інженера $20–25 за годину. Автотести потребують вкладень у написання й підтримку, але окупаються на повторюваних сценаріях. Малому бізнесу зазвичай варто почати з ручного й автоматизувати лише стабільне ядро.",{"q":11931,"a":11932},"Коли малому бізнесу потрібні автотести?","Коли однакові перевірки повторюються після кожного релізу, а ручна регресія забирає забагато часу. Типовий кандидат — шлях покупки в магазині. Якщо продукт часто змінюється, автотести ламатимуться, тому автоматизуйте лише стабільні сценарії. Інакше ви витрачатимете гроші на постійне виправлення самих тестів, а не на користь для бізнесу.",{"q":11934,"a":11935},"З чого почати тестування сайту, якщо його ніколи не тестували?","З ручного QA-аудиту критичних сценаріїв: замовлення, оплата, форми, мобільна версія. Для магазину це 3–5 днів і від 6 000 грн. За результатами аудиту стане видно, які перевірки варто автоматизувати, а які залишити людині. Це дає базу, від якої легко рухатися далі.",{"q":11937,"a":11938},"Чи можуть автотести повністю замінити ручного тестувальника?","Ні. Автотести добре ловлять регресію в уже відомих сценаріях, але не оцінюють зручність і не знаходять несподіваних проблем у новому функціоналі. Ручне й автоматизоване тестування доповнюють одне одного, а їхнє співвідношення залежить від продукту та бюджету.",{},"\u002Fuk\u002Fblog\u002Fruchne-chy-avtomatyzovane-testuvannia",{"title":11198,"description":11203},"Ручне чи автоматизоване тестування сайту: у чому різниця, що обрати малому бізнесу, з чого почати і коли автотести окупаються. Практичний розбір.","Ручне чи автоматизоване тестування: що обрати — Tochno.","uk\u002Fblog\u002Fruchne-chy-avtomatyzovane-testuvannia",[6582],"ibivK6OPfwtlrCQ4Pg_KFNubYX9XbJSYrJ1LkC7q_ck",{"id":11948,"title":11949,"author":5508,"body":11950,"cover":141,"coverFile":12888,"coverLines":12889,"coverStat":12898,"date":6560,"description":11954,"excerpt":141,"extension":495,"faq":12899,"featured":536,"key":141,"meta":12911,"navigation":525,"path":12912,"readingTime":526,"seo":12913,"seoDescription":12914,"seoTitle":12915,"slug":560,"stem":12916,"tags":12917,"updated":6020,"__hash__":12918},"blog_uk\u002Fuk\u002Fblog\u002Fshcho-take-tekhnichnyi-audyt-kodu.md","Що таке технічний аудит коду і коли він потрібен",{"type":265,"value":11951,"toc":12870},[11952,11955,11958,11962,11965,11968,11995,11998,12002,12005,12049,12052,12056,12060,12063,12066,12083,12086,12305,12308,12310,12313,12359,12362,12482,12485,12489,12492,12528,12531,12568,12571,12575,12585,12589,12592,12596,12613,12616,12620,12623,12685,12688,12691,12702,12706,12713,12716,12730,12737,12741,12744,12764,12767,12771,12774,12796,12802,12806,12809,12844,12847,12849,12852,12867],[273,11953,11954],{},"Технічний аудит коду — це незалежна перевірка вихідного коду, архітектури та інфраструктури проєкту, результатом якої є звіт: що працює добре, що небезпечно чи повільно, і в якому порядку це виправляти. Він потрібен, коли ви успадковуєте проєкт, змінюєте підрядника, готуєтеся до масштабування чи продажу бізнесу або просто не розумієте, чому кожна нова фіча коштує дорожче за попередню.",[273,11956,11957],{},"Нижче — що саме ми перевіряємо в Laravel-проєктах, як виглядає звіт, які сигнали вказують, що час замовляти аудит, і чого від нього не варто очікувати.",[268,11959,11961],{"id":11960},"що-таке-технічний-аудит-і-чим-він-не-є","Що таке технічний аудит і чим він не є",[273,11963,11964],{},"Аудит — це діагностика, а не лікування. Експерт читає код, запускає проєкт, дивиться на базу даних, залежності, конфігурацію, процес розгортання й складає документ із висновками. Виправлення — окремий етап, який ви можете віддати будь-якій команді, а не обов'язково тій, що проводила аудит.",[273,11966,11967],{},"Аудит коду відрізняється від суміжних послуг:",[283,11969,11970,11979,11984,11990],{},[286,11971,11972,11975,11976,11978],{},[2333,11973,11974],{},"QA-тестування"," перевіряє поведінку продукту очима користувача: чи працює кошик, форма, оплата. Це ",[302,11977,431],{"href":31},". Код при цьому не читається.",[286,11980,11981,11983],{},[2333,11982,3410],{}," оцінює конкретні зміни (pull request) в процесі розробки.",[286,11985,11986,11989],{},[2333,11987,11988],{},"Пентест"," — цілеспрямована спроба зламати систему. Ми проводимо перевірку безпеки на рівні коду й конфігурації, але не заявляємо про повний пентест.",[286,11991,11992,11994],{},[2333,11993,9637],{}," охоплює проєкт цілком: структуру, якість, безпеку, продуктивність, процеси.",[273,11996,11997],{},"Найкращий результат дають обидва підходи разом: QA знаходить симптоми, аудит коду — причини.",[268,11999,12001],{"id":12000},"сигнали-що-аудит-вам-потрібен","Сигнали, що аудит вам потрібен",[273,12003,12004],{},"Не кожен проєкт потребує аудиту щороку. Є ситуації, коли це особливо виправдано.",[1207,12006,12007,12013,12019,12025,12031,12037,12043],{},[286,12008,12009,12012],{},[2333,12010,12011],{},"Змінюється команда."," Новий підрядник чи тех-лід має швидко зрозуміти, що саме він отримує, перш ніж брати відповідальність.",[286,12014,12015,12018],{},[2333,12016,12017],{},"Нові фічі дорожчають і довго робляться."," Розробники кажуть «там усе переплетено» — це класичний симптом технічного боргу.",[286,12020,12021,12024],{},[2333,12022,12023],{},"Сайт повільний або падає під навантаженням."," Особливо в сезонні піки: акції, розпродажі.",[286,12026,12027,12030],{},[2333,12028,12029],{},"Після інциденту."," Витік даних, злам адмінки, втрата замовлень.",[286,12032,12033,12036],{},[2333,12034,12035],{},"Перед великими змінами."," Міграція на нову версію фреймворку, масштабування, інтеграція з CRM або 1С.",[286,12038,12039,12042],{},[2333,12040,12041],{},"Перед продажем або інвестиціями."," Покупець чи інвестор хоче бачити стан активу.",[286,12044,12045,12048],{},[2333,12046,12047],{},"Ви не довіряєте оцінкам підрядника."," Незалежна думка допоможе зрозуміти, чи справді «це треба переписати».",[273,12050,12051],{},"Якщо хоча б два пункти вам знайомі, аудит окупиться швидше, ніж ви витратите гроші на нову порцію виправлень «навмання».",[268,12053,12055],{"id":12054},"що-ми-перевіряємо-в-laravel-проєкті","Що ми перевіряємо в Laravel-проєкті",[5588,12057,12059],{"id":12058},"архітектура-і-якість-коду","Архітектура і якість коду",[273,12061,12062],{},"Перше, що ми дивимося, — де живе бізнес-логіка. У здоровому проєкті контролер тонкий: валідація, виклик сервісу, відповідь. У нездоровому — контролер на 600 рядків із розрахунком знижок, відправкою листів і роботою з платіжкою.",[273,12064,12065],{},"Ми перевіряємо:",[283,12067,12068,12071,12074,12077,12080],{},[286,12069,12070],{},"розподіл відповідальності: контролери, сервіси, Form Request, Policy, Job;",[286,12072,12073],{},"дублювання коду та «божественні» класи;",[286,12075,12076],{},"залежності між модулями й циклічні зв'язки;",[286,12078,12079],{},"відповідність фреймворку: чи не обходять його механізми власними велосипедами;",[286,12081,12082],{},"покриття тестами й відтворюваність: чи проходять тести, чи є CI.",[273,12084,12085],{},"Типовий приклад проблеми, яку ми описуємо у звіті:",[6667,12087,12089],{"className":6669,"code":12088,"language":6671,"meta":14,"style":14},"\u002F\u002F OrderController.php — логіка в контролері\npublic function store(Request $request)\n{\n    $total = 0;\n    foreach ($request->items as $item) {\n        $product = Product::find($item['id']);      \u002F\u002F запит у циклі\n        $total += $product->price * $item['qty'];\n    }\n    if ($request->promo === 'SALE10') {            \u002F\u002F «магічне» значення\n        $total *= 0.9;\n    }\n    $order = Order::create([...]);\n    Mail::to($request->email)->send(new OrderMail($order)); \u002F\u002F синхронна відправка\n}\n",[6119,12090,12091,12096,12112,12116,12128,12147,12174,12201,12205,12227,12239,12243,12264,12301],{"__ignoreMap":14},[6675,12092,12093],{"class":6677,"line":3365},[6675,12094,12095],{"class":6680},"\u002F\u002F OrderController.php — логіка в контролері\n",[6675,12097,12098,12100,12102,12105,12107,12109],{"class":6677,"line":485},[6675,12099,8315],{"class":6690},[6675,12101,8307],{"class":6690},[6675,12103,12104],{"class":6700}," store",[6675,12106,6728],{"class":6686},[6675,12108,8697],{"class":6693},[6675,12110,12111],{"class":6686}," $request)\n",[6675,12113,12114],{"class":6677,"line":486},[6675,12115,8241],{"class":6686},[6675,12117,12118,12121,12123,12126],{"class":6677,"line":1343},[6675,12119,12120],{"class":6686},"    $total ",[6675,12122,239],{"class":6690},[6675,12124,12125],{"class":6693}," 0",[6675,12127,8260],{"class":6686},[6675,12129,12130,12133,12136,12138,12141,12144],{"class":6677,"line":4305},[6675,12131,12132],{"class":6690},"    foreach",[6675,12134,12135],{"class":6686}," ($request",[6675,12137,6722],{"class":6690},[6675,12139,12140],{"class":6686},"items ",[6675,12142,12143],{"class":6690},"as",[6675,12145,12146],{"class":6686}," $item) {\n",[6675,12148,12149,12152,12154,12157,12159,12162,12165,12168,12171],{"class":6677,"line":2960},[6675,12150,12151],{"class":6686},"        $product ",[6675,12153,239],{"class":6690},[6675,12155,12156],{"class":6693}," Product",[6675,12158,6697],{"class":6690},[6675,12160,12161],{"class":6700},"find",[6675,12163,12164],{"class":6686},"($item[",[6675,12166,12167],{"class":6712},"'id'",[6675,12169,12170],{"class":6686},"]);      ",[6675,12172,12173],{"class":6680},"\u002F\u002F запит у циклі\n",[6675,12175,12176,12179,12182,12185,12187,12190,12193,12196,12199],{"class":6677,"line":931},[6675,12177,12178],{"class":6686},"        $total ",[6675,12180,12181],{"class":6690},"+=",[6675,12183,12184],{"class":6686}," $product",[6675,12186,6722],{"class":6690},[6675,12188,12189],{"class":6686},"price ",[6675,12191,12192],{"class":6690},"*",[6675,12194,12195],{"class":6686}," $item[",[6675,12197,12198],{"class":6712},"'qty'",[6675,12200,8296],{"class":6686},[6675,12202,12203],{"class":6677,"line":3739},[6675,12204,8586],{"class":6686},[6675,12206,12207,12209,12211,12213,12216,12218,12221,12224],{"class":6677,"line":526},[6675,12208,8757],{"class":6690},[6675,12210,12135],{"class":6686},[6675,12212,6722],{"class":6690},[6675,12214,12215],{"class":6686},"promo ",[6675,12217,8917],{"class":6690},[6675,12219,12220],{"class":6712}," 'SALE10'",[6675,12222,12223],{"class":6686},") {            ",[6675,12225,12226],{"class":6680},"\u002F\u002F «магічне» значення\n",[6675,12228,12229,12231,12234,12237],{"class":6677,"line":4665},[6675,12230,12178],{"class":6686},[6675,12232,12233],{"class":6690},"*=",[6675,12235,12236],{"class":6693}," 0.9",[6675,12238,8260],{"class":6686},[6675,12240,12241],{"class":6677,"line":5018},[6675,12242,8586],{"class":6686},[6675,12244,12245,12248,12250,12252,12254,12257,12259,12262],{"class":6677,"line":2525},[6675,12246,12247],{"class":6686},"    $order ",[6675,12249,239],{"class":6690},[6675,12251,6694],{"class":6693},[6675,12253,6697],{"class":6690},[6675,12255,12256],{"class":6700},"create",[6675,12258,6786],{"class":6686},[6675,12260,12261],{"class":6690},"...",[6675,12263,8512],{"class":6686},[6675,12265,12266,12269,12271,12274,12277,12279,12282,12284,12287,12289,12292,12295,12298],{"class":6677,"line":8387},[6675,12267,12268],{"class":6693},"    Mail",[6675,12270,6697],{"class":6690},[6675,12272,12273],{"class":6700},"to",[6675,12275,12276],{"class":6686},"($request",[6675,12278,6722],{"class":6690},[6675,12280,12281],{"class":6686},"email)",[6675,12283,6722],{"class":6690},[6675,12285,12286],{"class":6700},"send",[6675,12288,6728],{"class":6686},[6675,12290,12291],{"class":6690},"new",[6675,12293,12294],{"class":6693}," OrderMail",[6675,12296,12297],{"class":6686},"($order)); ",[6675,12299,12300],{"class":6680},"\u002F\u002F синхронна відправка\n",[6675,12302,12303],{"class":6677,"line":8401},[6675,12304,6806],{"class":6686},[273,12306,12307],{},"У звіті це перетворюється на конкретні пункти: винести розрахунок у сервіс, завантажувати товари одним запитом, промокоди зберігати в базі, лист відправляти через чергу.",[5588,12309,191],{"id":10105},[273,12311,12312],{},"Для Laravel ми перевіряємо базові, але критичні речі, які часто пропускають:",[283,12314,12315,12321,12328,12338,12344,12347,12350,12356],{},[286,12316,12317,12320],{},[6119,12318,12319],{},"APP_DEBUG=true"," на продакшені та витік змінних середовища;",[286,12322,12323,12324,12327],{},"масове присвоєння (",[6119,12325,12326],{},"$guarded = []",") і відсутність перевірки прав доступу в контролерах;",[286,12329,12330,12331,6197,12334,12337],{},"SQL-ін'єкції через сирі запити (",[6119,12332,12333],{},"DB::raw",[6119,12335,12336],{},"whereRaw"," з конкатенацією);",[286,12339,12340,12341,8638],{},"XSS через вивід неекранованих даних (",[6119,12342,12343],{},"{!! !!}",[286,12345,12346],{},"завантаження файлів без перевірки типу й розміру;",[286,12348,12349],{},"CSRF, налаштування cookie, заголовки безпеки;",[286,12351,12352,12353,8638],{},"застарілі пакети з відомими вразливостями (",[6119,12354,12355],{},"composer audit",[286,12357,12358],{},"зберігання секретів у репозиторії та історії git.",[273,12360,12361],{},"Небезпечний приклад, який трапляється частіше, ніж хотілося б:",[6667,12363,12365],{"className":6669,"code":12364,"language":6671,"meta":14,"style":14},"\u002F\u002F пошук у адмінці: ін'єкція через конкатенацію\n$orders = DB::select(\"SELECT * FROM orders WHERE email = '\" . $request->email . \"'\");\n\n\u002F\u002F правильно: прив'язка параметрів\n$orders = DB::select('SELECT * FROM orders WHERE email = ?', [$request->email]);\n",[6119,12366,12367,12372,12431,12435,12440],{"__ignoreMap":14},[6675,12368,12369],{"class":6677,"line":3365},[6675,12370,12371],{"class":6680},"\u002F\u002F пошук у адмінці: ін'єкція через конкатенацію\n",[6675,12373,12374,12377,12379,12382,12384,12387,12389,12392,12395,12397,12400,12403,12406,12409,12411,12414,12417,12419,12421,12424,12426,12429],{"class":6677,"line":485},[6675,12375,12376],{"class":6686},"$orders ",[6675,12378,239],{"class":6690},[6675,12380,12381],{"class":6693}," DB",[6675,12383,6697],{"class":6690},[6675,12385,12386],{"class":6700},"select",[6675,12388,6728],{"class":6686},[6675,12390,12391],{"class":6712},"\"",[6675,12393,12394],{"class":6690},"SELECT",[6675,12396,7079],{"class":6690},[6675,12398,12399],{"class":6690}," FROM",[6675,12401,12402],{"class":6712}," orders ",[6675,12404,12405],{"class":6690},"WHERE",[6675,12407,12408],{"class":6712}," email ",[6675,12410,239],{"class":6690},[6675,12412,12413],{"class":6712}," '\"",[6675,12415,12416],{"class":6690}," .",[6675,12418,6719],{"class":6686},[6675,12420,6722],{"class":6690},[6675,12422,12423],{"class":6686},"email ",[6675,12425,306],{"class":6690},[6675,12427,12428],{"class":6712}," \"'\"",[6675,12430,6743],{"class":6686},[6675,12432,12433],{"class":6677,"line":486},[6675,12434,6748],{"emptyLinePlaceholder":525},[6675,12436,12437],{"class":6677,"line":1343},[6675,12438,12439],{"class":6680},"\u002F\u002F правильно: прив'язка параметрів\n",[6675,12441,12442,12444,12446,12448,12450,12452,12454,12457,12459,12461,12463,12465,12467,12469,12471,12474,12477,12479],{"class":6677,"line":4305},[6675,12443,12376],{"class":6686},[6675,12445,239],{"class":6690},[6675,12447,12381],{"class":6693},[6675,12449,6697],{"class":6690},[6675,12451,12386],{"class":6700},[6675,12453,6728],{"class":6686},[6675,12455,12456],{"class":6712},"'",[6675,12458,12394],{"class":6690},[6675,12460,7079],{"class":6690},[6675,12462,12399],{"class":6690},[6675,12464,12402],{"class":6712},[6675,12466,12405],{"class":6690},[6675,12468,12408],{"class":6712},[6675,12470,239],{"class":6690},[6675,12472,12473],{"class":6712}," ?'",[6675,12475,12476],{"class":6686},", [$request",[6675,12478,6722],{"class":6690},[6675,12480,12481],{"class":6686},"email]);\n",[273,12483,12484],{},"Окремо дивимося на персональні дані покупців: що зберігається, хто має доступ, чи є резервні копії та журналювання. Це не юридичний висновок, а технічна оцінка ризиків.",[5588,12486,12488],{"id":12487},"продуктивність-і-база-даних","Продуктивність і база даних",[273,12490,12491],{},"Більшість повільних Laravel-сайтів страждають від кількох повторюваних проблем:",[283,12493,12494,12504,12510,12516,12522],{},[286,12495,12496,12499,12500,12503],{},[2333,12497,12498],{},"N+1 запити."," Список із 50 товарів породжує 150 запитів до бази, бо зв'язки підвантажуються по одному. Лікується ",[6119,12501,12502],{},"with()",", але спочатку це треба знайти.",[286,12505,12506,12509],{},[2333,12507,12508],{},"Відсутні індекси"," на колонках, за якими фільтрують і сортують.",[286,12511,12512,12515],{},[2333,12513,12514],{},"Важкі запити в кожному запиті сторінки:"," лічильники, підсумки, які можна кешувати.",[286,12517,12518,12521],{},[2333,12519,12520],{},"Синхронна робота з зовнішніми API"," в основному потоці: Нова Пошта, платіжка, листи.",[286,12523,12524,12527],{},[2333,12525,12526],{},"Відсутнє кешування"," конфігурації, маршрутів, результатів дорогих обчислень.",[273,12529,12530],{},"Ми вмикаємо журнал запитів на тестовому середовищі, проходимо ключові сценарії (каталог, картка товару, кошик, checkout) і фіксуємо кількість запитів та час відповіді. Для виявлення N+1 дуже допомагає заборона «лінивого» завантаження в нерелізному середовищі:",[6667,12532,12534],{"className":6669,"code":12533,"language":6671,"meta":14,"style":14},"\u002F\u002F AppServiceProvider::boot()\nModel::preventLazyLoading(! app()->isProduction());\n",[6119,12535,12536,12541],{"__ignoreMap":14},[6675,12537,12538],{"class":6677,"line":3365},[6675,12539,12540],{"class":6680},"\u002F\u002F AppServiceProvider::boot()\n",[6675,12542,12543,12546,12548,12551,12553,12555,12558,12560,12562,12565],{"class":6677,"line":485},[6675,12544,12545],{"class":6693},"Model",[6675,12547,6697],{"class":6690},[6675,12549,12550],{"class":6700},"preventLazyLoading",[6675,12552,6728],{"class":6686},[6675,12554,6759],{"class":6690},[6675,12556,12557],{"class":6700}," app",[6675,12559,6778],{"class":6686},[6675,12561,6722],{"class":6690},[6675,12563,12564],{"class":6700},"isProduction",[6675,12566,12567],{"class":6686},"());\n",[273,12569,12570],{},"Після цього будь-яка неоптимальна вибірка падає з помилкою ще на розробці. У звіті ми показуємо до\u002Fпісля в цифрах, а не загальні слова про «оптимізацію».",[5588,12572,12574],{"id":12573},"база-даних-і-дані","База даних і дані",[273,12576,12577,12578,12581,12582,12584],{},"Перевіряємо схему: чи відтворюється вона міграціями з нуля, чи є зовнішні ключі та обмеження унікальності, як зберігаються гроші (цілі числа в копійках або ",[6119,12579,12580],{},"decimal",", але не ",[6119,12583,8963],{},"), чи немає «сміттєвих» таблиць і дублікатів. Для магазину особливо важливі статуси замовлень, склад і ціни: тут помилки коштують грошей.",[5588,12586,12588],{"id":12587},"залежності-й-підтримуваність","Залежності й підтримуваність",[273,12590,12591],{},"Версія PHP, версія Laravel, статус підтримки, пакети без оновлень кілька років. Ми не радимо «оновити все одразу», а будуємо реалістичний план: що критично (вразливості), що бажано, що можна відкласти.",[5588,12593,12595],{"id":12594},"інфраструктура-й-процес-розгортання","Інфраструктура й процес розгортання",[283,12597,12598,12601,12604,12607,12610],{},[286,12599,12600],{},"Як проєкт розгортається: вручну по FTP чи автоматично з перевіркою тестів?",[286,12602,12603],{},"Чи є середовище стейджингу, відмінне від продакшену?",[286,12605,12606],{},"Резервні копії: чи їх хтось колись відновлював?",[286,12608,12609],{},"Моніторинг помилок і доступності: дізнаєтеся ви про збій від системи чи від клієнта?",[286,12611,12612],{},"Журнали та алерти.",[273,12614,12615],{},"Резервна копія, яку жодного разу не відновлювали, — гіпотеза, а не копія. Ми це перевіряємо в першу чергу.",[268,12617,12619],{"id":12618},"як-виглядає-результат-аудиту","Як виглядає результат аудиту",[273,12621,12622],{},"Хороший звіт відповідає на три питання: що не так, наскільки це критично і що робити першим. Ми структуруємо його так:",[342,12624,12625,12635],{},[345,12626,12627],{},[348,12628,12629,12632],{},[351,12630,12631],{},"Розділ",[351,12633,12634],{},"Зміст",[358,12636,12637,12645,12653,12661,12669,12677],{},[348,12638,12639,12642],{},[363,12640,12641],{},"Короткий висновок",[363,12643,12644],{},"1 сторінка для власника: загальний стан і головні ризики",[348,12646,12647,12650],{},[363,12648,12649],{},"Знахідки",[363,12651,12652],{},"Опис, де саме в коді, чому це проблема, як відтворити",[348,12654,12655,12658],{},[363,12656,12657],{},"Пріоритети",[363,12659,12660],{},"Критичне \u002F серйозне \u002F бажане, оцінка впливу на гроші й ризик",[348,12662,12663,12666],{},[363,12664,12665],{},"План виправлень",[363,12667,12668],{},"Послідовність робіт, орієнтовні трудозатрати, залежності",[348,12670,12671,12674],{},[363,12672,12673],{},"Швидкі перемоги",[363,12675,12676],{},"Що можна зробити за 1–2 дні з видимим ефектом",[348,12678,12679,12682],{},[363,12680,12681],{},"Рекомендації щодо процесу",[363,12683,12684],{},"Тести, CI, рев'ю, моніторинг",[273,12686,12687],{},"Ми не пишемо «код погано» чи «код добре». Кожна знахідка прив'язана до файлу чи сценарію, а пріоритет — до наслідків: «ця вразливість дозволяє переглядати чужі замовлення», «цей запит уповільнює каталог у п'ять разів».",[273,12689,12690],{},"Саме пріоритизація відрізняє корисний аудит від переліку зауважень на 80 сторінок. Власник бізнесу не зобов'язаний усе виправляти, але має знати, що саме горить, а що можна лишити.",[5825,12692,12693],{},[273,12694,12695,12698,12699,306],{},[2333,12696,12697],{},"Потрібен аудит вашого Laravel-проєкту?"," Ми перевіряємо архітектуру, безпеку й продуктивність і передаємо звіт із планом виправлень за 5–7 днів. Вартість — від 12 000 грн, деталі на сторінці ",[302,12700,12701],{"href":865},"технічного аудиту коду",[268,12703,12705],{"id":12704},"скільки-це-коштує-і-скільки-триває","Скільки це коштує і скільки триває",[273,12707,12708,12709,12712],{},"Вартість залежить від розміру кодової бази, кількості інтеграцій та глибини перевірки. На сторінці ",[302,12710,12711],{"href":77},"тарифів"," технічний аудит Laravel-проєкту коштує 12 000–25 000 грн залежно від обсягу, термін — 5–7 днів. Точну суму ми називаємо після короткого огляду проєкту: розміру репозиторію, кількості моделей і маршрутів, наявності тестів.",[273,12714,12715],{},"Чинники, що збільшують обсяг:",[283,12717,12718,12721,12724,12727],{},[286,12719,12720],{},"велика кількість інтеграцій (оплата, доставка, CRM, 1С);",[286,12722,12723],{},"відсутність документації та тестів, доводиться розбиратися «з нуля»;",[286,12725,12726],{},"кілька застосунків (бекенд, фронтенд на Nuxt, мобільний клієнт);",[286,12728,12729],{},"стара версія фреймворку з нестандартними патчами.",[273,12731,12732,12733,12736],{},"Для консультації без повного аудиту є формат ",[302,12734,12735],{"href":34},"Tech Lead на годину",": 90 хвилин розмови, огляд архітектури та відповіді на конкретні питання.",[268,12738,12740],{"id":12739},"що-потрібно-підготувати-для-аудиту","Що потрібно підготувати для аудиту",[273,12742,12743],{},"Щоб аудит пройшов швидко й без зайвих пауз, надайте:",[1207,12745,12746,12749,12752,12755,12758,12761],{},[286,12747,12748],{},"Доступ до репозиторію лише на читання (або архів коду).",[286,12750,12751],{},"Копію бази даних без персональних даних або доступ до тестового середовища.",[286,12753,12754],{},"Опис проєкту: що робить, хто користувачі, які сценарії найважливіші для бізнесу.",[286,12756,12757],{},"Перелік інтеграцій і зовнішніх сервісів.",[286,12759,12760],{},"Відомі проблеми: що повільно, що ламається, що лякає розробників.",[286,12762,12763],{},"Інформацію про інфраструктуру: хостинг, спосіб розгортання, моніторинг.",[273,12765,12766],{},"Секрети (ключі API, паролі) не потрібні: ми працюємо з знеособленими або тестовими значеннями. Підписати угоду про нерозголошення можна до отримання коду.",[268,12768,12770],{"id":12769},"що-робити-зі-звітом-далі","Що робити зі звітом далі",[273,12772,12773],{},"Після аудиту у вас є три шляхи:",[283,12775,12776,12782,12788],{},[286,12777,12778,12781],{},[2333,12779,12780],{},"Виправити власними силами або силами поточної команди."," Звіт слугує технічним завданням.",[286,12783,12784,12787],{},[2333,12785,12786],{},"Віддати виправлення нам."," Фікс-пакет рахується за ставками від $20–35 за годину за обсягом знайденого.",[286,12789,12790,12793,12794,306],{},[2333,12791,12792],{},"Використати звіт як аргумент у розмові з підрядником"," або при виборі нового. Про це читайте в статті ",[302,12795,3318],{"href":3317},[273,12797,12798,12799,306],{},"Поширена помилка — спробувати виправити все одразу. Краще піти за пріоритетами: спочатку безпека й втрата грошей, потім продуктивність, потім структура коду. І кожне виправлення супроводжувати тестом, щоб не зламати суміжне. Якщо проєкт критичний для бізнесу, корисно підключити автоматичні перевірки: докладніше в статті про ",[302,12800,12801],{"href":872},"ручне та автоматизоване тестування",[268,12803,12805],{"id":12804},"як-відрізнити-якісний-аудит-від-формального","Як відрізнити якісний аудит від формального",[273,12807,12808],{},"Ринок аудитів неоднорідний: від автоматичного звіту статичного аналізатора до глибокого розбору архітектури. Кілька ознак, що допоможуть оцінити пропозицію.",[283,12810,12811,12820,12826,12832,12838],{},[286,12812,12813,12816,12817,12819],{},[2333,12814,12815],{},"Ручна перевірка, а не лише інструменти."," Статичні аналізатори (PHPStan, Larastan) і ",[6119,12818,12355],{}," корисні, але вони не бачать бізнес-логіки. Якщо весь аудит — це роздрукований вивід інструментів, ви платите за те, що могли запустити самі.",[286,12821,12822,12825],{},[2333,12823,12824],{},"Знахідки з прикладами."," Кожне зауваження має файл, рядок і пояснення наслідків. «Рекомендуємо покращити безпеку» — не знахідка.",[286,12827,12828,12831],{},[2333,12829,12830],{},"Оцінка трудозатрат."," План виправлень без орієнтовних годин не допоможе запланувати бюджет.",[286,12833,12834,12837],{},[2333,12835,12836],{},"Розмова з вами, а не лише з кодом."," Аудитор має запитати, що для бізнесу найважливіше: швидкість каталогу, надійність оплати чи простота змін. Від цього залежать пріоритети.",[286,12839,12840,12843],{},[2333,12841,12842],{},"Чесні межі."," Хороший аудитор прямо каже, що не перевірялося: наприклад, навантажувальне тестування чи юридична відповідність обробки персональних даних.",[273,12845,12846],{},"Якщо аудит пропонують безкоштовно «в подарунок» до розробки, пам'ятайте про конфлікт інтересів: той, хто пише код, рідко об'єктивно оцінює власну роботу.",[268,12848,8014],{"id":8013},[273,12850,12851],{},"Технічний аудит коду — не про те, щоб «знайти винних». Це спосіб замінити відчуття «щось не так» на конкретний перелік проблем, ризиків і дій. Він потрібен, коли проєкт змінює власника чи команду, повільніє, дорожчає в розвитку або готується до зростання. Результат — звіт, який можна передати будь-якій команді й виконати поетапно.",[5825,12853,12854],{},[273,12855,12856,12859,12860,12862,12863,12866],{},[2333,12857,12858],{},"Хочете зрозуміти реальний стан вашого проєкту?"," Залиште ",[302,12861,482],{"href":17}," або напишіть нам на сторінці ",[302,12864,12865],{"href":83},"контактів",": подивимося на проєкт і скажемо, чи потрібен повний аудит, чи вистачить консультації.",[7282,12868,12869],{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":14,"searchDepth":485,"depth":486,"links":12871},[12872,12873,12874,12882,12883,12884,12885,12886,12887],{"id":11960,"depth":485,"text":11961},{"id":12000,"depth":485,"text":12001},{"id":12054,"depth":485,"text":12055,"children":12875},[12876,12877,12878,12879,12880,12881],{"id":12058,"depth":486,"text":12059},{"id":10105,"depth":486,"text":191},{"id":12487,"depth":486,"text":12488},{"id":12573,"depth":486,"text":12574},{"id":12587,"depth":486,"text":12588},{"id":12594,"depth":486,"text":12595},{"id":12618,"depth":485,"text":12619},{"id":12704,"depth":485,"text":12705},{"id":12739,"depth":485,"text":12740},{"id":12769,"depth":485,"text":12770},{"id":12804,"depth":485,"text":12805},{"id":8013,"depth":485,"text":8014},"audit.report.md",[12890,12892,12894,12896],{"marker":153,"text":12891},"SQL-запит у циклі: 1 200 запитів",{"marker":156,"text":12893},"бізнес-логіка в контролері",{"marker":156,"text":12895},"залежності не оновлювались",{"marker":161,"text":12897},"міграції відтворюють схему БД","5 днів",[12900,12903,12906,12908],{"q":12901,"a":12902},"Що перевіряють під час технічного аудиту коду?","Архітектуру, безпеку, продуктивність, якість коду, залежності, тести та спосіб розгортання. У Laravel-проєкті дивляться на запити до бази, валідацію, права доступу й обробку помилок. Результатом є звіт із пріоритетами, а не просто перелік зауважень. Власник бачить, що горить зараз, а що можна безпечно відкласти.",{"q":12904,"a":12905},"Скільки коштує аудит коду Laravel-проєкту?","Технічний аудит Laravel-проєкту коштує 12 000–25 000 грн залежно від обсягу кодової бази, кількості інтеграцій і глибини перевірки. Точну суму називаємо після короткого огляду проєкту. Виправлення знайденого оплачується окремо за ставкою $20–35 за годину. Фінальну вартість ми погоджуємо з вами до початку робіт.",{"q":513,"a":12907},"Зазвичай 5–7 днів до передачі звіту з планом виправлень. Термін збільшують численні інтеграції, відсутність документації та тестів, кілька застосунків або застаріла версія фреймворку. Орієнтовний строк називаємо після огляду проєкту. Власник отримує звіт, у якому знахідки впорядковані за наслідками для бізнесу, тож рішення про виправлення можна ухвалювати одразу.",{"q":12909,"a":12910},"Що потрібно підготувати для аудиту коду?","Доступ до репозиторію лише на читання, знеособлену копію бази або тестове середовище, опис проєкту та інтеграцій і перелік відомих проблем. Паролі та ключі API не потрібні: працюємо з тестовими значеннями. Угоду про нерозголошення можна підписати до отримання коду.",{},"\u002Fuk\u002Fblog\u002Fshcho-take-tekhnichnyi-audyt-kodu",{"title":11949,"description":11954},"Технічний аудит коду: що перевіряють (архітектура, безпека, продуктивність), як виглядає звіт, коли замовляти і скільки це коштує — від 12 000 грн.","Що таке технічний аудит коду і коли він потрібен — Tochno.","uk\u002Fblog\u002Fshcho-take-tekhnichnyi-audyt-kodu",[9316],"SVAn1nRZiDfKKbHfG_VQaDlF3q_aSW_vQsm5P8YvMjw",{"id":12920,"title":12921,"author":5508,"body":12922,"cover":141,"coverFile":13452,"coverLines":13453,"coverStat":13461,"date":6560,"description":12926,"excerpt":141,"extension":495,"faq":13462,"featured":536,"key":141,"meta":13475,"navigation":525,"path":13476,"readingTime":526,"seo":13477,"seoDescription":13478,"seoTitle":13479,"slug":1795,"stem":13480,"tags":13481,"updated":6020,"__hash__":13482},"blog_uk\u002Fuk\u002Fblog\u002Fskilky-koshtuie-rozrobka-internet-mahazynu.md","Скільки коштує розробка інтернет-магазину у 2026: розбір кошторису",{"type":265,"value":12923,"toc":13437},[12924,12927,12934,12938,12941,12973,12976,12980,12983,12989,12998,13008,13011,13015,13018,13110,13113,13116,13122,13125,13130,13133,13136,13140,13143,13204,13207,13212,13215,13229,13233,13236,13274,13277,13281,13284,13322,13325,13355,13359,13362,13368,13374,13377,13381,13384,13407,13413,13417,13420,13423],[273,12925,12926],{},"Розробка інтернет-магазину у 2026 році коштує від кількох тисяч гривень на конструкторі до кількох сотень тисяч на кастомному рішенні. Для кастомного магазину на Laravel з каталогом, оплатою, Новою Поштою й тестуванням наш орієнтир такий: від 150 000 грн і орієнтовно 10–14 тижнів роботи. Нижче розбираємо, з чого складається ця сума, що її збільшує і що можна прибрати без шкоди для продажів.",[273,12928,12929,12930,12933],{},"Усі цифри нижче взяті з нашої ",[302,12931,12932],{"href":77},"сторінки цін"," і калькулятора, а де ми даємо оцінку, ми прямо про це пишемо. Реальний кошторис завжди залежить від вашого проєкту, тому розглядайте текст як карту, а не як прайс-лист.",[268,12935,12937],{"id":12936},"чому-скільки-коштує-магазин-не-має-однієї-відповіді","Чому «скільки коштує магазин» не має однієї відповіді",[273,12939,12940],{},"Питання схоже на «скільки коштує авто». Є велосипед, є вживаний седан, є кросовер з повним приводом, і всі вони «їздять». З магазинами так само. Вартість визначають п'ять речей.",[283,12942,12943,12949,12955,12961,12967],{},[286,12944,12945,12948],{},[2333,12946,12947],{},"Платформа:"," конструктор, готова CMS, кастомна розробка.",[286,12950,12951,12954],{},[2333,12952,12953],{},"Обсяг каталогу і складність товарів:"," 50 товарів без варіантів чи 5 000 з комбінаціями розмірів і кольорів.",[286,12956,12957,12960],{},[2333,12958,12959],{},"Дизайн:"," шаблон, адаптація макета чи індивідуальний дизайн.",[286,12962,12963,12966],{},[2333,12964,12965],{},"Інтеграції:"," оплата, доставка, CRM, облікова система, маркетплейси.",[286,12968,12969,12972],{},[2333,12970,12971],{},"Якість і ризики:"," чи є тестування, автотести, моніторинг, гарантія.",[273,12974,12975],{},"Остання позиція найчастіше випадає з порівняння пропозицій. Дві пропозиції по 150 000 грн можуть відрізнятись так, що в одній магазин тестують на 12 пристроях, а в другій перший тест виконує ваш покупець.",[268,12977,12979],{"id":12978},"три-рівні-ціни-від-конструктора-до-кастому","Три рівні ціни: від конструктора до кастому",[273,12981,12982],{},"Спрощено ринок поділяється на три рівні. Підходи орієнтовні й не є чиїмось офіційним прайсом.",[273,12984,12985,12988],{},[2333,12986,12987],{},"Конструктор (Shopify, Prom, Horoshop тощо)."," Старт швидкий, а початкові витрати малі. Ви платите щомісячну підписку, комісії й за платні розширення. Обмеження з'являються, коли потрібна нестандартна логіка: складні знижки, особливий розрахунок доставки, інтеграція з вашою обліковою системою.",[273,12990,12991,12994,12995,306],{},[2333,12992,12993],{},"Готова CMS (OpenCart, WooCommerce, PrestaShop) із шаблоном."," Це середній шлях: ціна нижча за кастом, є екосистема модулів. Ціна прихована в доробках, оновленнях і підтримці модулів різних авторів. Детально це порівняння ми розбирали в статті ",[302,12996,12997],{"href":1537},"Laravel чи OpenCart\u002FWordPress для магазину",[273,12999,13000,13003,13004,13007],{},[2333,13001,13002],{},"Кастомна розробка (Laravel + Nuxt)."," Найвища початкова ціна й найбільша гнучкість: код належить вам, немає залежності від чужих модулів, легко додавати складну логіку. Це наш рівень: ",[302,13005,13006],{"href":28},"інтернет-магазин"," від 150 000 грн.",[273,13009,13010],{},"Правило вибору просте: якщо ваша бізнес-логіка вкладається в стандартні налаштування платформи, кастом це переплата. Якщо ви вже впираєтесь у обмеження або знаєте, що впретесь за рік, економія на старті обернеться дорожчою міграцією.",[268,13012,13014],{"id":13013},"з-чого-складається-кошторис-кастомного-магазину","З чого складається кошторис кастомного магазину",[273,13016,13017],{},"Нижче типовий розподіл бюджету. Відсотки наші орієнтовні, на конкретному проєкті вони зсуваються.",[342,13019,13020,13033],{},[345,13021,13022],{},[348,13023,13024,13027,13030],{},[351,13025,13026],{},"Стаття",[351,13028,13029],{},"Орієнтовна частка",[351,13031,13032],{},"Що входить",[358,13034,13035,13046,13056,13067,13078,13088,13099],{},[348,13036,13037,13040,13043],{},[363,13038,13039],{},"Аналітика й проєктування",[363,13041,13042],{},"8–12%",[363,13044,13045],{},"Бриф, структура каталогу, user flow, ТЗ",[348,13047,13048,13050,13053],{},[363,13049,4334],{},[363,13051,13052],{},"15–20%",[363,13054,13055],{},"Прототипи, дизайн ключових сторінок, адаптив 375\u002F768\u002F1440, UI-кіт",[348,13057,13058,13061,13064],{},[363,13059,13060],{},"Розробка frontend",[363,13062,13063],{},"20–25%",[363,13065,13066],{},"Каталог, картка, кошик, checkout, акаунт",[348,13068,13069,13072,13075],{},[363,13070,13071],{},"Розробка backend і адмінка",[363,13073,13074],{},"25–30%",[363,13076,13077],{},"Модель товарів, замовлення, ролі, API, адмінка",[348,13079,13080,13082,13085],{},[363,13081,1589],{},[363,13083,13084],{},"8–15%",[363,13086,13087],{},"Оплата, доставка, CRM, листи",[348,13089,13090,13093,13096],{},[363,13091,13092],{},"QA і виправлення",[363,13094,13095],{},"10–15%",[363,13097,13098],{},"Ручне тестування, автотести checkout, виправлення",[348,13100,13101,13104,13107],{},[363,13102,13103],{},"Запуск і гарантія",[363,13105,13106],{},"3–5%",[363,13108,13109],{},"Деплой, редиректи, налаштування аналітики, 30 днів гарантії",[273,13111,13112],{},"Зверніть увагу на QA. Якщо в кошторисі тестування немає зовсім, це не економія, а відкладений платіж: ви заплатите виправленнями вже після запуску, коли кожен баг коштує продажів.",[5588,13114,13039],{"id":13115},"аналітика-й-проєктування",[273,13117,13118,13119,13121],{},"Тут вирішується, що саме ми будуємо. Погана аналітика дає найдорожчі помилки, бо вони множаться на дизайн і код. На цьому етапі ми з'ясовуємо, скільки категорій, які атрибути у товарів, як рахуються знижки, які способи оплати й доставки потрібні, чи потрібен B2B-кабінет. Тому наш ",[302,13120,482],{"href":17}," докладний: він скорочує кількість сюрпризів у середині проєкту.",[5588,13123,124],{"id":13124},"дизайн",[273,13126,13127,13128,306],{},"Індивідуальний дизайн дорожчий, але добре зроблений дизайн магазину впливає на конверсію напряму: від зрозумілого checkout до читабельної картки товару. Якщо у вас вже є брендбук, дизайн дешевшає. За нашим калькулятором, наявний брендбук знижує вартість приблизно на 7%, а готовий макет приблизно на 18%. Деталі про процес дивіться на сторінці ",[302,13129,4334],{"href":1248},[5588,13131,1493],{"id":13132},"розробка",[273,13134,13135],{},"Це найбільша стаття. На неї впливають кількість сутностей (товари, варіанти, бренди, відгуки, акції), складність правил цін і кількість ролей в адмінці. Пошук і фільтри на каталозі від 2 000 товарів теж потребують окремого рішення (повнотекстовий пошук, кеш фасетів), а не «чарівної кнопки».",[268,13137,13139],{"id":13138},"що-збільшує-ціну-додаткові-модулі","Що збільшує ціну: додаткові модулі",[273,13141,13142],{},"У нашому калькуляторі додаткові опції рахуються як відсоток від базової суми. Це зручна модель для оцінки.",[342,13144,13145,13155],{},[345,13146,13147],{},[348,13148,13149,13152],{},[351,13150,13151],{},"Опція",[351,13153,13154],{},"Збільшення вартості",[358,13156,13157,13165,13172,13180,13188,13196],{},[348,13158,13159,13162],{},[363,13160,13161],{},"Онлайн-оплата",[363,13163,13164],{},"близько +6%",[348,13166,13167,13169],{},[363,13168,5223],{},[363,13170,13171],{},"близько +5%",[348,13173,13174,13177],{},[363,13175,13176],{},"CRM \u002F 1С",[363,13178,13179],{},"близько +12%",[348,13181,13182,13185],{},[363,13183,13184],{},"Друга мова",[363,13186,13187],{},"близько +10%",[348,13189,13190,13193],{},[363,13191,13192],{},"Автотести Playwright",[363,13194,13195],{},"близько +8%",[348,13197,13198,13201],{},[363,13199,13200],{},"Терміновий запуск",[363,13202,13203],{},"+25%",[273,13205,13206],{},"Приклад розрахунку. Беремо базу 150 000 грн. Додаємо оплату (+6%), Нову Пошту (+5%) і CRM (+12%): разом +23%, тобто приблизно 34 500 грн. Сума близько 184 500 грн. Це орієнтир, а не оферта: точну суму дає оцінка після брифу.",[273,13208,13209,13210,306],{},"Чому інтеграції дорогі? Тому, що вартість складається не лише з написання коду. Кожна зовнішня система додає документацію для вивчення, sandbox-середовище, обробку помилок (що робити, коли API не відповідає), повторні запити, логування й тестування в усіх станах. Проблемні місця таких інтеграцій ми описали в статті ",[302,13211,6252],{"href":1724},[273,13213,13214],{},"Терміновий запуск дорожчий через паралельну роботу кількох людей: потрібна додаткова координація, менше часу на перевірку й вища ціна помилки.",[5825,13216,13217],{},[273,13218,13219,13222,13223,13225,13226,13228],{},[2333,13220,13221],{},"Хочете побачити цифри для свого магазину?"," Скористайтесь калькулятором на сторінці ",[302,13224,406],{"href":77},": чотири питання, і ви отримаєте вилку. Точну оцінку ми готуємо за 1 робочий день після ",[302,13227,4207],{"href":17},", без зобов'язань.",[268,13230,13232],{"id":13231},"приховані-витрати-про-які-забувають","Приховані витрати, про які забувають",[273,13234,13235],{},"Окрім самої розробки, в бюджет магазину входять речі, яких немає в договорі розробника.",[283,13237,13238,13244,13250,13255,13263,13268],{},[286,13239,13240,13243],{},[2333,13241,13242],{},"Хостинг і домен."," Для магазину з помірним трафіком це не великі гроші, але потрібен нормальний сервер, а не найдешевший спільний хостинг. Домен і акаунти мають бути на вас.",[286,13245,13246,13249],{},[2333,13247,13248],{},"Платні сервіси:"," транзакційна пошта, SMS, CRM, пошукові сервіси. Комісії платіжних систем зазвичай у відсотках від обороту.",[286,13251,13252,13254],{},[2333,13253,10050],{}," Фотографії, описи, характеристики товарів. Наповнення каталогу з 1 000 позицій забирає більше часу, ніж люди очікують.",[286,13256,13257,13260,13261,306],{},[2333,13258,13259],{},"Підтримка."," Після запуску магазин живе: оновлення бібліотек, виправлення, нові акції, сезонні зміни. Наші пакети підтримки стартують від 8 000 грн на місяць, подробиці на сторінці ",[302,13262,890],{"href":889},[286,13264,13265,13267],{},[2333,13266,5802],{}," Технічна база входить у розробку, але просування (тексти, посилання, робота з пошуковими запитами) окрема стаття.",[286,13269,13270,13273],{},[2333,13271,13272],{},"Маркетинг."," Магазин без трафіку не продає. Бюджет реклами рахуйте окремо від розробки.",[273,13275,13276],{},"Безпечне правило: закладайте на перший рік 15–25% від вартості розробки на підтримку й доопрацювання. Це наша практична оцінка, а не стандарт.",[268,13278,13280],{"id":13279},"як-зменшити-бюджет-без-шкоди","Як зменшити бюджет без шкоди",[273,13282,13283],{},"Заощаджувати можна, і розумно. Ось що працює.",[1207,13285,13286,13292,13298,13304,13310,13316],{},[286,13287,13288,13291],{},[2333,13289,13290],{},"Почніть з MVP."," Запустіть з 3–4 ключовими сценаріями (каталог, кошик, оплата, доставка) і додавайте решту за даними. Складні модулі (програма лояльності, особистий кабінет з історією, B2B-ціни) чудово відкладаються на другий етап.",[286,13293,13294,13297],{},[2333,13295,13296],{},"Приготуйте матеріали наперед."," Брендбук, фото й тексти до старту скорочують і терміни, і вартість.",[286,13299,13300,13303],{},[2333,13301,13302],{},"Використайте стандартні рішення там, де вони достатні."," Не пишіть власну CRM, якщо вистачить існуючої з інтеграцією.",[286,13305,13306,13309],{},[2333,13307,13308],{},"Оберіть меншу кількість інтеграцій на старті."," Один спосіб оплати й одна служба доставки замість п'яти.",[286,13311,13312,13315],{},[2333,13313,13314],{},"Уникайте терміновості,"," якщо можливо: +25% це чутлива ціна за поспіх.",[286,13317,13318,13321],{},[2333,13319,13320],{},"Погодьте обсяг письмово."," Нечіткий обсяг веде до нескінченних доробок.",[273,13323,13324],{},"А ось де економити не варто:",[283,13326,13327,13337,13343,13349],{},[286,13328,13329,13332,13333,13336],{},[2333,13330,13331],{},"Тестування checkout і оплати."," Баг тут це втрачені гроші щодня. ",[302,13334,13335],{"href":2919},"Чек-лист з 60 пунктів"," допоможе проконтролювати результат, навіть якщо ви не технар.",[286,13338,13339,13342],{},[2333,13340,13341],{},"Резервні копії й безпека."," Магазин без бекапів це лотерея.",[286,13344,13345,13348],{},[2333,13346,13347],{},"Права на код."," Договір має чітко фіксувати, що код належить вам, а доступи до репозиторію й сервера у вас.",[286,13350,13351,13354],{},[2333,13352,13353],{},"Документація й передача."," Інакше ви стаєте заручником одного розробника.",[268,13356,13358],{"id":13357},"два-умовні-сценарії-для-порівняння","Два умовні сценарії для порівняння",[273,13360,13361],{},"Щоб цифри не були абстрактними, розглянемо два гіпотетичні магазини. Це ілюстрації розрахунку, а не реальні проєкти клієнтів.",[273,13363,13364,13367],{},[2333,13365,13366],{},"Сценарій А: невеликий магазин на старті."," До 100 товарів, індивідуальний дизайн, одна онлайн-оплата й Нова Пошта. База близько 150 000 грн, плюс оплата (+6%) і доставка (+5%): приблизно 166 500 грн. Термін: 8–10 тижнів. Це типовий вхід у кастомну розробку.",[273,13369,13370,13373],{},[2333,13371,13372],{},"Сценарій Б: магазин із каталогом на кілька тисяч позицій."," 2 000–10 000 товарів, є брендбук, оплата, Нова Пошта, інтеграція з CRM і автотести checkout. База вища, бо каталог більший (за калькулятором діапазон для магазину 150 000–220 000 грн), знижка за готовий брендбук (близько 7%), а націнка за опції складає +31% (6% + 5% + 12% + 8%). Підсумкова оцінка легко виходить за 220 000 грн, а терміни ближче до 12 тижнів.",[273,13375,13376],{},"Різниця між сценаріями показує головне: ціну визначають не «сторінки», а обсяг даних, інтеграції й вимоги до якості. Тому оцінку без брифу варто сприймати лише як вилку.",[268,13378,13380],{"id":13379},"як-перевірити-кошторис-підрядника","Як перевірити кошторис підрядника",[273,13382,13383],{},"Коли вам надсилають три пропозиції з різною ціною, порівнюйте не суму, а склад. Запитайте кожного:",[283,13385,13386,13389,13392,13395,13398,13401,13404],{},[286,13387,13388],{},"Що саме входить у ціну, а що ні (дизайн, тексти, тестування, інтеграції, хостинг)?",[286,13390,13391],{},"Які припущення закладено: кількість товарів, сторінок, ролей, мов?",[286,13393,13394],{},"Чи є тестування й хто його проводить? Чи будуть автотести?",[286,13396,13397],{},"Який порядок оплати? У нас типова схема 30 \u002F 40 \u002F 30 за етапами, і вона прив'язує гроші до результату.",[286,13399,13400],{},"Хто володіє кодом, дизайном і доступами після завершення?",[286,13402,13403],{},"Скільки триває гарантія й що вона покриває?",[286,13405,13406],{},"Яка ставка на доробки поза обсягом? У нас погодинна ставка розробника від $20 до $35, залежно від рівня.",[273,13408,13409,13410,306],{},"Підозріло низька ціна зазвичай означає одне з трьох: в обсязі чогось бракує, економиться на тестуванні або проєкт піде на доробках, які оплачуються окремо. Більше запитань для вибору виконавця ми зібрали в статті ",[302,13411,13412],{"href":3317},"Як обрати підрядника на розробку: 12 питань, які варто поставити",[268,13414,13416],{"id":13415},"підсумок-з-чим-іти-до-підрядника","Підсумок: з чим іти до підрядника",[273,13418,13419],{},"Реалістичний бюджет кастомного магазину у 2026 році починається від 150 000 грн, а з оплатою, Новою Поштою й CRM зазвичай виходить у діапазон 180 000–220 000 грн. Це наш орієнтир для проєкту середньої складності, а не гарантія на будь-який магазин.",[273,13421,13422],{},"Щоб отримати точну оцінку, підготуйте п'ять речей: приблизну кількість товарів, список інтеграцій, наявність дизайну чи брендбуку, бажаний термін і бюджетну межу. Із цим набором оцінка займає день, а не тиждень, і ви порівнюєте пропозиції на однакових умовах.",[5825,13424,13425],{},[273,13426,13427,13430,13431,13433,13434,13436],{},[2333,13428,13429],{},"Готові порахувати свій магазин?"," Заповніть ",[302,13432,482],{"href":17}," за 10–15 хвилин, і за 1 робочий день ми повернемось з вилкою цін, термінами й списком ризиків. Або перегляньте сторінку ",[302,13435,27],{"href":28},", щоб побачити, що входить у пакет.",{"title":14,"searchDepth":485,"depth":486,"links":13438},[13439,13440,13441,13446,13447,13448,13449,13450,13451],{"id":12936,"depth":485,"text":12937},{"id":12978,"depth":485,"text":12979},{"id":13013,"depth":485,"text":13014,"children":13442},[13443,13444,13445],{"id":13115,"depth":486,"text":13039},{"id":13124,"depth":486,"text":124},{"id":13132,"depth":486,"text":1493},{"id":13138,"depth":485,"text":13139},{"id":13231,"depth":485,"text":13232},{"id":13279,"depth":485,"text":13280},{"id":13357,"depth":485,"text":13358},{"id":13379,"depth":485,"text":13380},{"id":13415,"depth":485,"text":13416},"estimate.xlsx",[13454,13455,13457,13459],{"marker":166,"text":6552},{"marker":166,"text":13456},"оплата + Нова Пошта",{"marker":156,"text":13458},"CRM \u002F 1С: +12%",{"marker":161,"text":13460},"QA перед запуском","від 150 000 ₴",[13463,13466,13469,13472],{"q":13464,"a":13465},"Скільки коштує інтернет-магазин на замовлення у 2026 році?","Кастомний магазин у нас стартує від 150 000 грн і займає 10–14 тижнів. З оплатою, Новою Поштою та CRM сума зростає орієнтовно до 165 000–185 000 грн. Готові CMS і конструктори дешевші на старті, але мають обмеження.",{"q":13467,"a":13468},"Які приховані витрати є в розробці інтернет-магазину?","Хостинг і домен, ліцензії платних модулів, комісії платіжних систем, контент і фото, тестування, а також підтримка й оновлення після запуску. Їх варто закласти в бюджет заздалегідь. Підтримка у нас стартує від 8 000 грн на місяць.",{"q":13470,"a":13471},"Як зменшити бюджет магазину без шкоди для якості?","Запускайте з мінімальним набором функцій, відкладіть складні модулі та інтеграції на другий етап, використовуйте готові компоненти там, де вони не обмежують. Не економте на тестуванні й безпеці, бо виправляти їх після запуску дорожче. Так ви швидше вийдете на продажі й додаватимете функції вже на реальних даних.",{"q":13473,"a":13474},"Від чого залежить ціна розробки інтернет-магазину?","Від розміру каталогу, кількості інтеграцій (оплата, доставка, CRM, склад), складності дизайну, мов і термінів. Кожен додатковий модуль збільшує базу. Тому просіть детальний кошторис по етапах, а не одну загальну суму. Так легше порівнювати пропозиції різних підрядників між собою.",{},"\u002Fuk\u002Fblog\u002Fskilky-koshtuie-rozrobka-internet-mahazynu",{"title":12921,"description":12926},"Скільки коштує розробка інтернет-магазину у 2026: від 150 000 грн для кастомного рішення. З чого складається кошторис і де можна заощадити.","Скільки коштує розробка інтернет-магазину — Tochno.","uk\u002Fblog\u002Fskilky-koshtuie-rozrobka-internet-mahazynu",[6042],"vw3ojpEgu9xD-LYE812Gs-Sxn1TlyKKYLkf-IaTGNQA",{"id":13484,"title":6090,"author":5508,"body":13485,"cover":141,"coverFile":14202,"coverLines":14203,"coverStat":2648,"date":6560,"description":13489,"excerpt":141,"extension":495,"faq":14212,"featured":536,"key":141,"meta":14225,"navigation":525,"path":14226,"readingTime":526,"seo":14227,"seoDescription":14228,"seoTitle":14229,"slug":960,"stem":14230,"tags":14231,"updated":6020,"__hash__":14232},"blog_uk\u002Fuk\u002Fblog\u002Fyak-my-testuiemo-bah-report-i-test-keis.md",{"type":265,"value":13486,"toc":14179},[13487,13490,13493,13497,13500,13503,13523,13530,13534,13537,13541,13544,13552,13555,13559,13562,13579,13583,13586,13590,13593,13597,13600,13637,13640,13643,13669,13673,13676,13680,13683,13770,13773,13777,13809,13813,13816,13819,13900,13904,13950,13953,13957,13960,13987,13990,13994,14038,14043,14054,14058,14061,14075,14078,14082,14085,14117,14120,14124,14127,14148,14158,14160,14163,14168],[273,13488,13489],{},"Хороший баг-репорт дозволяє розробнику відтворити проблему за дві хвилини, не пишучи тестувальнику жодного уточнення. Хороший тест-кейс дозволяє будь-кому з команди пройти сценарій однаково і отримати порівнювану відповідь. Це дві базові речі, на яких тримається тестування сайтів, і саме за ними видно, чи працює QA, чи лише «клацає».",[273,13491,13492],{},"У цій статті ми показуємо наш підхід: структуру баг-репорту, структуру тест-кейсу, приклади на сценарії чекауту і те, як ми оцінюємо серйозність. Усі приклади нижче ілюстративні, складені для пояснення, і не належать конкретному клієнтові.",[268,13494,13496],{"id":13495},"навіщо-стандартизувати-баг-репорти","Навіщо стандартизувати баг-репорти",[273,13498,13499],{},"Погані баг-репорти коштують дорожче, ніж здається. Фраза «на мобільному не працює оплата» запускає ланцюжок: розробник питає, на якому пристрої, тестувальник відповідає наступного дня, розробник не може відтворити, ставить «не воспроизводится», тікет закривається, а баг лишається в продакшені.",[273,13501,13502],{},"Стандартний формат дає три речі:",[283,13504,13505,13511,13517],{},[286,13506,13507,13510],{},[2333,13508,13509],{},"швидкість",": розробник одразу бачить, що робити, і не витрачає ранок на допит;",[286,13512,13513,13516],{},[2333,13514,13515],{},"порівнянність",": десять багів у однаковій структурі легко відсортувати за впливом;",[286,13518,13519,13522],{},[2333,13520,13521],{},"пам'ять",": через пів року можна знайти, що вже ламалося, і додати регресійний тест.",[273,13524,13525,13526,13529],{},"Саме тому в нашому ",[302,13527,13528],{"href":438},"ручному тестуванні сайтів"," кожен баг у звіті має однакову форму і відео.",[268,13531,13533],{"id":13532},"анатомія-баг-репорту","Анатомія баг-репорту",[273,13535,13536],{},"Ось поля, які ми заповнюємо завжди.",[5588,13538,13540],{"id":13539},"заголовок","Заголовок",[273,13542,13543],{},"Заголовок відповідає на три питання: де, що, за яких умов. Порівняйте:",[283,13545,13546,13549],{},[286,13547,13548],{},"Погано: «Не працює кошик».",[286,13550,13551],{},"Добре: «Кошик: після видалення товару купон залишається, і знижка рахується від старої суми».",[273,13553,13554],{},"Заголовок має бути зрозумілим без відкриття тікета, бо в списку розробник бачить лише його.",[5588,13556,13558],{"id":13557},"середовище","Середовище",[273,13560,13561],{},"Без середовища баг може бути нерепродукованим. Фіксуємо:",[283,13563,13564,13567,13570,13573,13576],{},[286,13565,13566],{},"URL і версію збірки або дату деплою;",[286,13568,13569],{},"пристрій і ОС (iPhone 13, iOS 17.5; Windows 11);",[286,13571,13572],{},"браузер і версію;",[286,13574,13575],{},"роль користувача (гість, авторизований, адміністратор);",[286,13577,13578],{},"тестові дані (який товар, який купон, який метод оплати).",[5588,13580,13582],{"id":13581},"кроки-відтворення","Кроки відтворення",[273,13584,13585],{},"Нумерований список, кожен крок одна дія. Не «оформити замовлення», а конкретні кліки. Кроки мають бути такими, щоб незнайома людина відтворила баг, не вгадуючи.",[5588,13587,13589],{"id":13588},"очікуваний-і-фактичний-результат","Очікуваний і фактичний результат",[273,13591,13592],{},"Це два окремі рядки. Очікуваний результат спирається на вимоги або логіку («після видалення товару знижка перераховується»), фактичний описує те, що сталося. Так розробник одразу бачить розрив. Якщо очікувана поведінка суперечить документації, вказуйте джерело.",[5588,13594,13596],{"id":13595},"серйозність-і-пріоритет","Серйозність і пріоритет",[273,13598,13599],{},"Це різні поняття, і їх плутають найчастіше.",[342,13601,13602,13614],{},[345,13603,13604],{},[348,13605,13606,13609,13611],{},[351,13607,13608],{},"Параметр",[351,13610,7358],{},[351,13612,13613],{},"Хто визначає",[358,13615,13616,13626],{},[348,13617,13618,13621,13624],{},[363,13619,13620],{},"Серйозність (severity)",[363,13622,13623],{},"наскільки баг ламає продукт технічно",[363,13625,4736],{},[348,13627,13628,13631,13634],{},[363,13629,13630],{},"Пріоритет (priority)",[363,13632,13633],{},"як швидко це треба виправити з погляду бізнесу",[363,13635,13636],{},"замовник, продакт",[273,13638,13639],{},"Баг із друкарською помилкою в логотипі на головній має низьку серйозність, але може мати високий пріоритет. Баг, що ламається лише на Internet Explorer 11, може мати високу серйозність, але нульовий пріоритет, бо трафіку з цього браузера немає.",[273,13641,13642],{},"Наша шкала серйозності:",[283,13644,13645,13651,13657,13663],{},[286,13646,13647,13650],{},[2333,13648,13649],{},"S1 (критична)",": блокує основний сценарій, втрата грошей або даних. Приклад: оплата не проходить.",[286,13652,13653,13656],{},[2333,13654,13655],{},"S2 (висока)",": основний сценарій працює, але з помітним спотворенням. Приклад: неправильна сума знижки.",[286,13658,13659,13662],{},[2333,13660,13661],{},"S3 (середня)",": є обхідний шлях. Приклад: фільтр скидається при поверненні назад.",[286,13664,13665,13668],{},[2333,13666,13667],{},"S4 (низька)",": косметика, дрібниці UI.",[5588,13670,13672],{"id":13671},"докази","Докази",[273,13674,13675],{},"Скриншот із виділеною проблемою, відео запису екрана (для динамічних багів воно майже обов'язкове), логи консолі та мережі, якщо є. Відео економить десятки повідомлень у переписці. Для мобільних багів корисно, щоб на записі було видно індикатори пристрою.",[268,13677,13679],{"id":13678},"приклад-баг-репорту","Приклад баг-репорту",[273,13681,13682],{},"Нижче типовий баг, який ми знаходимо в магазинах. Продукт і числа вигадані для ілюстрації.",[5825,13684,13685,13690,13704,13710,13720,13725,13742,13748,13754,13764],{},[273,13686,13687],{},[2333,13688,13689],{},"BUG-017. Кошик: після видалення товару купон залишається, і знижка рахується від старої суми",[273,13691,13692,13695,13696,13699,13700,13703],{},[2333,13693,13694],{},"Серйозність:"," S2. ",[2333,13697,13698],{},"Пріоритет:"," P1. ",[2333,13701,13702],{},"Статус:"," новий.",[273,13705,13706,13709],{},[2333,13707,13708],{},"Середовище:"," staging, збірка від 2026-10-01, Chrome 129 \u002F Windows 11 і Safari \u002F iPhone 13 (iOS 17.5). Роль: гість.",[273,13711,13712,13715,13716,13719],{},[2333,13713,13714],{},"Передумови:"," у каталозі є товар A (1 000 грн) і товар B (500 грн). Діє купон ",[6119,13717,13718],{},"SALE10"," (знижка 10% на замовлення від 1 200 грн).",[273,13721,13722],{},[2333,13723,13724],{},"Кроки:",[1207,13726,13727,13730,13736,13739],{},[286,13728,13729],{},"Додати в кошик товар A і товар B (сума 1 500 грн).",[286,13731,13732,13733,13735],{},"Застосувати купон ",[6119,13734,13718],{},". Підсумок: 1 350 грн.",[286,13737,13738],{},"Видалити з кошика товар A.",[286,13740,13741],{},"Подивитися підсумок.",[273,13743,13744,13747],{},[2333,13745,13746],{},"Очікуваний результат:"," залишився товар B на 500 грн. Купон не діє (мінімум 1 200 грн), підсумок 500 грн, користувач бачить повідомлення, що купон скасовано.",[273,13749,13750,13753],{},[2333,13751,13752],{},"Фактичний результат:"," підсумок 450 грн, купон залишається застосованим. При оформленні замовлення сума 450 грн.",[273,13755,13756,13759,13760,13763],{},[2333,13757,13758],{},"Відтворюваність:"," 3 з 3 спроб. Докази: відео ",[6119,13761,13762],{},"bug-017.mp4",", скриншот кошика.",[273,13765,13766,13769],{},[2333,13767,13768],{},"Примітка:"," схожий баг можливий при зміні кількості товару через «мінус».",[273,13771,13772],{},"Зверніть увагу на деталі: передумови описані (інакше розробник не знайде потрібний купон), є примітка про сусідній сценарій, а відтворюваність вказана числом. Це не бюрократія, це економія часу двох людей.",[5588,13774,13776],{"id":13775},"типові-помилки-в-баг-репортах","Типові помилки в баг-репортах",[283,13778,13779,13785,13791,13797,13803],{},[286,13780,13781,13784],{},[2333,13782,13783],{},"Кілька багів в одному тікеті."," Розробник виправить один, а тікет закриє. Один баг, один тікет.",[286,13786,13787,13790],{},[2333,13788,13789],{},"Оцінка замість факту."," «Жахливо працює пошук». Факт: «пошук за словом \"куртка\" повертає 0 результатів, хоча товарів 14».",[286,13792,13793,13796],{},[2333,13794,13795],{},"Відсутність очікуваного результату."," Без нього тікет стає питанням смаку.",[286,13798,13799,13802],{},[2333,13800,13801],{},"Баг у чужому середовищі."," Перевірте, що проблема не в розширенні браузера й не в кеші, перш ніж писати репорт.",[286,13804,13805,13808],{},[2333,13806,13807],{},"Закритий тікет без перевірки."," «Виправлено» має означати «QA повторив кроки й підтвердив».",[268,13810,13812],{"id":13811},"анатомія-тест-кейсу","Анатомія тест-кейсу",[273,13814,13815],{},"Баг-репорт фіксує знайдену проблему, а тест-кейс описує, що саме ми перевіряємо, ще до знаходження будь-яких проблем. Це інструмент повторюваності: той самий сценарій можна пройти перед кожним релізом.",[273,13817,13818],{},"Поля тест-кейсу:",[342,13820,13821,13831],{},[345,13822,13823],{},[348,13824,13825,13828],{},[351,13826,13827],{},"Поле",[351,13829,13830],{},"Що пишемо",[358,13832,13833,13844,13852,13860,13868,13876,13884,13892],{},[348,13834,13835,13838],{},[363,13836,13837],{},"ID",[363,13839,13840,13841],{},"унікальний код, наприклад ",[6119,13842,13843],{},"CHK-004",[348,13845,13846,13849],{},[363,13847,13848],{},"Назва",[363,13850,13851],{},"коротко, що перевіряється",[348,13853,13854,13857],{},[363,13855,13856],{},"Передумови",[363,13858,13859],{},"стан системи, тестові дані, роль",[348,13861,13862,13865],{},[363,13863,13864],{},"Кроки",[363,13866,13867],{},"нумерований список дій",[348,13869,13870,13873],{},[363,13871,13872],{},"Очікуваний результат",[363,13874,13875],{},"для кожного кроку або для сценарію",[348,13877,13878,13881],{},[363,13879,13880],{},"Пріоритет",[363,13882,13883],{},"як часто і наскільки критично запускати",[348,13885,13886,13889],{},[363,13887,13888],{},"Тип",[363,13890,13891],{},"позитивний, негативний, граничний",[348,13893,13894,13897],{},[363,13895,13896],{},"Статус",[363,13898,13899],{},"pass \u002F fail \u002F blocked \u002F not run",[5588,13901,13903],{"id":13902},"приклад-тест-кейсу","Приклад тест-кейсу",[5825,13905,13906,13911,13916,13921,13925,13945],{},[273,13907,13908],{},[2333,13909,13910],{},"CHK-004. Оформлення замовлення гостем з оплатою карткою (позитивний сценарій)",[273,13912,13913,13915],{},[2333,13914,13698],{}," високий (входить у smoke-набір).",[273,13917,13918,13920],{},[2333,13919,13714],{}," товар у наявності, платіжний провайдер у sandbox-режимі, користувач не авторизований.",[273,13922,13923],{},[2333,13924,13724],{},[1207,13926,13927,13930,13933,13936,13939,13942],{},[286,13928,13929],{},"Відкрити картку товару, додати в кошик.",[286,13931,13932],{},"Перейти в кошик, натиснути «Оформити замовлення».",[286,13934,13935],{},"Заповнити контактні дані (ім'я, телефон, e-mail).",[286,13937,13938],{},"Обрати доставку Новою Поштою: місто, відділення.",[286,13940,13941],{},"Обрати оплату карткою, натиснути «Підтвердити».",[286,13943,13944],{},"Ввести тестову картку на сторінці платіжної системи.",[273,13946,13947,13949],{},[2333,13948,13746],{}," після кроку 6 відкривається сторінка «Дякуємо», номер замовлення збігається з листом підтвердження, статус замовлення в адмінці «оплачено», залишок товару зменшився на 1.",[273,13951,13952],{},"Саме такий кейс входить у наш smoke-набір: короткий список із десятка сценаріїв, які проходять після кожного деплою за 15–20 хвилин. Якщо хоч один падає, реліз зупиняється.",[5588,13954,13956],{"id":13955},"позитивні-негативні-та-граничні-кейси","Позитивні, негативні та граничні кейси",[273,13958,13959],{},"Для кожної функції ми складаємо мінімум три групи кейсів. Візьмемо поле «Телефон» у чекауті:",[283,13961,13962,13971,13981],{},[286,13963,13964,11053,13967,13970],{},[2333,13965,13966],{},"Позитивний:",[6119,13968,13969],{},"+380501234567"," приймається.",[286,13972,13973,13976,13977,13980],{},[2333,13974,13975],{},"Негативний:"," літери, порожнє поле, номер без коду країни, SQL-подібний рядок (",[6119,13978,13979],{},"' OR 1=1 --",") не ламають форму і не потрапляють у базу як код.",[286,13982,13983,13986],{},[2333,13984,13985],{},"Граничний:"," 9 цифр, 10, 13, 14; пробіли на початку; вставка номера із дужками й дефісами.",[273,13988,13989],{},"Більшість реальних багів живе саме в негативних і граничних сценаріях, бо розробник за замовчуванням перевіряє те, що має працювати.",[268,13991,13993],{"id":13992},"від-тест-кейсу-до-результату-як-виглядає-наш-процес","Від тест-кейсу до результату: як виглядає наш процес",[1207,13995,13996,14002,14008,14014,14020,14026,14032],{},[286,13997,13998,14001],{},[2333,13999,14000],{},"Аналіз вимог."," Читаємо ТЗ, макети й сам сайт, шукаємо неоднозначності. Питання до замовника на цьому етапі коштують дешевше за баги.",[286,14003,14004,14007],{},[2333,14005,14006],{},"Тест-план."," Фіксуємо, що тестуємо, що ні, на яких пристроях, яким браузером і за який час.",[286,14009,14010,14013],{},[2333,14011,14012],{},"Тест-кейси."," Пишемо їх або беремо з нашого чек-листа інтернет-магазину (150+ пунктів), адаптуємо під проєкт.",[286,14015,14016,14019],{},[2333,14017,14018],{},"Виконання."," Проходимо сценарії, фіксуємо результат. Паралельно проводимо дослідницьке тестування: вільні сценарії поза списком, де часто й знаходяться найцікавіші баги.",[286,14021,14022,14025],{},[2333,14023,14024],{},"Баг-репорти."," Кожен баг одразу оформлюємо за шаблоном із відео.",[286,14027,14028,14031],{},[2333,14029,14030],{},"Звіт."," Підсумок: що перевірено, що знайдено, розподіл за серйозністю, рекомендація «можна релізити чи ні».",[286,14033,14034,14037],{},[2333,14035,14036],{},"Ре-тест."," Після виправлень перевіряємо кожен виправлений баг і прогоняємо регрес навколо нього.",[273,14039,14040,14041,306],{},"Окремо про регрес. Виправлення одного бага часто ламає сусідній функціонал, тому ми не обмежуємося перевіркою самого фіксу. Якщо сценарій ключовий, його варто винести в автотест: про те, коли це виправдано, ми писали в статті про ",[302,14042,12801],{"href":872},[5825,14044,14045],{},[273,14046,14047,14050,14051,306],{},[2333,14048,14049],{},"Потрібен такий звіт для вашого сайту?"," Ми тестуємо вручну, фіксуємо кожен баг за шаблоном із відео й пріоритизуємо за впливом на гроші. ",[302,14052,14053],{"href":438},"Дізнатися про ручне тестування",[268,14055,14057],{"id":14056},"як-ми-пріоритизуємо-знайдене","Як ми пріоритизуємо знайдене",[273,14059,14060],{},"Після тестування у звіті опиняється десятки багів, а бюджет на виправлення обмежений. Тому ми сортуємо їх не за порядком знаходження, а за впливом на гроші та довіру. Простий підхід, який працює на практиці:",[1207,14062,14063,14066,14069,14072],{},[286,14064,14065],{},"Спочатку все, що блокує покупку: кошик, чекаут, оплата, доставка.",[286,14067,14068],{},"Далі баги, що псують дані: неправильні суми, дублі замовлень, втрачені листи.",[286,14070,14071],{},"Потім проблеми, що відштовхують клієнта: повільні сторінки, зламана мобільна версія, незрозумілі помилки форм.",[286,14073,14074],{},"В останню чергу косметика й дрібні неточності.",[273,14076,14077],{},"Так замовник одразу бачить, з чого почати, і може виправити 20% багів, які дають 80% проблем.",[268,14079,14081],{"id":14080},"інструменти-що-нам-потрібно-а-що-ні","Інструменти: що нам потрібно, а що ні",[273,14083,14084],{},"Не потрібна дорога система, щоб робити тестування якісно. Для малих команд достатньо:",[283,14086,14087,14093,14099,14105,14111],{},[286,14088,14089,14092],{},[2333,14090,14091],{},"Баг-трекер:"," Jira, Linear, GitHub Issues або навіть Trello. Головне, щоб шаблон тікета був однаковим.",[286,14094,14095,14098],{},[2333,14096,14097],{},"Тест-кейси:"," таблиця (Google Sheets) або TestRail-подібний інструмент. Для 30–60 кейсів таблиці вистачає.",[286,14100,14101,14104],{},[2333,14102,14103],{},"Запис екрана:"," вбудований запис у macOS та iOS, Android; для десктопу OBS або Loom.",[286,14106,14107,14110],{},[2333,14108,14109],{},"Інспектор:"," DevTools (вкладки Console і Network) для логів і запитів.",[286,14112,14113,14116],{},[2333,14114,14115],{},"Емулятори й реальні пристрої:"," емуляція в DevTools корисна, але мобільні баги з Safari та клавіатурою краще перевіряти на реальних iPhone й Android.",[273,14118,14119],{},"Корисна звичка: у шаблоні тікета зробіть обов'язковими поля «Середовище» і «Очікуваний результат». Вони відсікають приблизно половину поганих репортів ще до того, як ті потраплять до розробника.",[268,14121,14123],{"id":14122},"як-оцінити-якість-звіту-від-qa","Як оцінити якість звіту від QA",[273,14125,14126],{},"Якщо ви замовляєте тестування і хочете зрозуміти, чи вам віддали якісну роботу, перевірте:",[283,14128,14129,14132,14135,14138,14145],{},[286,14130,14131],{},"чи кожен баг має кроки, очікуваний і фактичний результат та докази;",[286,14133,14134],{},"чи є розподіл за серйозністю, а не просто довгий список;",[286,14136,14137],{},"чи вказані середовища (пристрої, браузери, версія збірки);",[286,14139,14140,14141,14144],{},"чи є список того, що ",[2333,14142,14143],{},"не"," перевірялося, і чому;",[286,14146,14147],{},"чи є висновок: готовий продукт до релізу чи ні.",[273,14149,14150,14151,14154,14155,306],{},"Звіт без останнього пункту неповний. Тестування існує, щоб допомогти ухвалити рішення, а не щоб створити кількість тікетів. Докладно про те, що саме перевіряємо в магазині, дивіться у ",[302,14152,14153],{"href":2919},"чек-листі з 60 пунктів",", а про одну з найболючіших груп багів у ",[302,14156,14157],{"href":721},"статті про втрату замовлень на checkout",[268,14159,8014],{"id":8013},[273,14161,14162],{},"Баг-репорт і тест-кейс це не формальність, а спосіб робити тестування передбачуваним. Баг-репорт має відповісти на запитання «що, де, як відтворити, наскільки це погано», а тест-кейс «що і як ми перевіряємо кожного релізу». Якщо у вас їх немає, почніть із двох речей: єдиного шаблону тікета і smoke-набору на 10 сценаріїв.",[273,14164,14165,14166,6441],{},"Якщо хочете побачити, як це виглядає на вашому проєкті, є безкоштовний експрес-чек за 48 годин, а повний ",[302,14167,431],{"href":31},[5825,14169,14170],{},[273,14171,14172,14175,14176,306],{},[2333,14173,14174],{},"Хочете почати з експрес-чека?"," Надішліть адресу сайту в брифі, і ми за 48 годин повернемо 10–15 ключових проблем з відео. ",[302,14177,14178],{"href":17},"Надіслати бриф",{"title":14,"searchDepth":485,"depth":486,"links":14180},[14181,14182,14190,14193,14197,14198,14199,14200,14201],{"id":13495,"depth":485,"text":13496},{"id":13532,"depth":485,"text":13533,"children":14183},[14184,14185,14186,14187,14188,14189],{"id":13539,"depth":486,"text":13540},{"id":13557,"depth":486,"text":13558},{"id":13581,"depth":486,"text":13582},{"id":13588,"depth":486,"text":13589},{"id":13595,"depth":486,"text":13596},{"id":13671,"depth":486,"text":13672},{"id":13678,"depth":485,"text":13679,"children":14191},[14192],{"id":13775,"depth":486,"text":13776},{"id":13811,"depth":485,"text":13812,"children":14194},[14195,14196],{"id":13902,"depth":486,"text":13903},{"id":13955,"depth":486,"text":13956},{"id":13992,"depth":485,"text":13993},{"id":14056,"depth":485,"text":14057},{"id":14080,"depth":485,"text":14081},{"id":14122,"depth":485,"text":14123},{"id":8013,"depth":485,"text":8014},"bug-report.template",[14204,14206,14208,14210],{"marker":153,"text":14205},"купон не знімається при видаленні товару",{"marker":166,"text":14207},"кроки, очікуваний і фактичний результат",{"marker":156,"text":14209},"серйозність S2, пріоритет P1",{"marker":161,"text":14211},"відтворюється у 3 з 3 спроб",[14213,14216,14219,14222],{"q":14214,"a":14215},"Що має бути в хорошому баг-репорті?","Короткий заголовок, середовище, чіткі кроки відтворення, очікуваний і фактичний результат, пріоритет та скриншот або відео. Розробник повинен відтворити помилку без додаткових уточнень. Чим точніші кроки, тим швидше виправлення. Такий звіт також допомагає пізніше перевірити, що виправлення справді спрацювало, і не повертатися до помилки знову.",{"q":14217,"a":14218},"Чим тест-кейс відрізняється від баг-репорту?","Тест-кейс описує, що й як перевірити, ще до тестування, а баг-репорт фіксує знайдену невідповідність. Тест-кейс містить передумови, кроки й очікуваний результат, а баг-репорт додає фактичний. Один тест-кейс може породити кілька баг-репортів. Разом вони складають основу прозорого процесу тестування.",{"q":14220,"a":14221},"Як пріоритизувати знайдені баги?","За впливом на гроші й довіру клієнтів: спершу те, що блокує покупку (кошик, checkout, оплата), потім баги, що псують дані, далі проблеми, які відштовхують клієнта, і наприкінці косметика. Так замовник одразу бачить, з чого почати.",{"q":14223,"a":14224},"Які інструменти потрібні для баг-трекінгу?","Для малої команди достатньо трекера (Jira, Linear, GitHub Issues чи навіть Trello) і таблиці для тест-кейсів. Головне, щоб шаблон тікета був однаковим, а поля «Середовище» й «Очікуваний результат» були обов'язковими. Дорога система не потрібна. Для тест-кейсів на кілька десятків сценаріїв зазвичай вистачає таблиці.",{},"\u002Fuk\u002Fblog\u002Fyak-my-testuiemo-bah-report-i-test-keis",{"title":6090,"description":13489},"Як виглядає хороший баг-репорт і тест-кейс при тестуванні сайтів: шаблони, приклад для чекауту, рівні серйозності й типові помилки. З готовими зразками.","Баг-репорт і тест-кейс: приклад із практики — Tochno.","uk\u002Fblog\u002Fyak-my-testuiemo-bah-report-i-test-keis",[6582],"Y-zME5w5zWucoxSXqAZ3KvR1p19B3CmKT5gG02ZZbw8",{"id":14234,"title":14235,"author":5508,"body":14236,"cover":141,"coverFile":14696,"coverLines":14697,"coverStat":14706,"date":6560,"description":14240,"excerpt":141,"extension":495,"faq":14707,"featured":536,"key":141,"meta":14720,"navigation":525,"path":14721,"readingTime":526,"seo":14722,"seoDescription":14723,"seoTitle":14724,"slug":3393,"stem":14725,"tags":14726,"updated":6020,"__hash__":14727},"blog_uk\u002Fuk\u002Fblog\u002Fyak-obraty-pidriadnyka-na-rozrobku-saitu.md","Як обрати підрядника на розробку сайту: 12 питань, які варто поставити",{"type":265,"value":14237,"toc":14669},[14238,14241,14244,14248,14251,14254,14280,14283,14287,14291,14294,14298,14304,14307,14311,14314,14317,14321,14324,14328,14332,14335,14338,14342,14349,14352,14356,14359,14363,14367,14370,14380,14384,14390,14394,14397,14407,14411,14415,14418,14424,14428,14431,14460,14463,14467,14470,14508,14512,14515,14610,14613,14617,14620,14651,14654,14656,14659],[273,14239,14240],{},"Щоб обрати підрядника на розробку сайту або інтернет-магазину, не потрібно розбиратися в коді. Достатньо поставити 12 питань про процес, право на код, тестування, ціну та підтримку й уважно послухати, наскільки конкретно вам відповідають. Надійна команда відповідає цифрами, прикладами й документами; ненадійна — загальними фразами про «індивідуальний підхід».",[273,14242,14243],{},"Нижче — питання, які ми самі радимо ставити клієнтам, у тому числі нам. Тех-лід з одинадцятирічним досвідом у PHP і Laravel бачив достатньо проєктів, що зависли на півдорозі, щоб знати: проблеми починаються не з коду, а з нечітких домовленостей на старті.",[268,14245,14247],{"id":14246},"чому-вибір-підрядника-це-управління-ризиком","Чому вибір підрядника — це управління ризиком",[273,14249,14250],{},"Сайт чи магазин — не річ, яку можна повернути в магазин. Якщо підрядник зникне через пів року, ви залишитеся з частково написаним кодом, чужими доступами та втраченим часом. Тому вибір треба робити як управління ризиком: що саме може піти не так і що ви можете перевірити вже зараз.",[273,14252,14253],{},"Основні ризики типові:",[283,14255,14256,14262,14268,14274],{},[286,14257,14258,14261],{},[2333,14259,14260],{},"Втрата контролю."," Код, домен, хостинг і сервіси оформлені на підрядника.",[286,14263,14264,14267],{},[2333,14265,14266],{},"Роздутий бюджет."," Ціна на старті занижена, а далі кожна зміна — «додаткова робота».",[286,14269,14270,14273],{},[2333,14271,14272],{},"Низька якість."," Сайт «працює на ноутбуці розробника», але ламається на телефонах або при оплаті.",[286,14275,14276,14279],{},[2333,14277,14278],{},"Залежність від однієї людини."," Нікого, хто міг би підхопити проєкт, коли розробник захворів чи пішов.",[273,14281,14282],{},"Дванадцять питань нижче згруповані за цими ризиками. Ставте їх письмово — відповіді в листі легше порівнювати й потім цитувати.",[268,14284,14286],{"id":14285},"питання-про-результат-і-ціну","Питання про результат і ціну",[5588,14288,14290],{"id":14289},"_1-що-саме-я-отримаю-на-кожному-етапі","1. Що саме я отримаю на кожному етапі?",[273,14292,14293],{},"Добра відповідь — список артефактів: структура сторінок, макети у Figma, робочий прототип, тестовий стенд, фінальний реліз. Погана — «спочатку дизайн, потім розробка». Кожен етап має закінчуватися чимось, що ви можете побачити й прийняти.",[5588,14295,14297],{"id":14296},"_2-з-чого-складається-ціна-і-що-в-неї-не-входить","2. З чого складається ціна і що в неї не входить?",[273,14299,14300,14301,14303],{},"Попросіть розбивку по етапах або по функціях, а не одну цифру. Ми публікуємо стартові ціни відкрито на сторінці ",[302,14302,12711],{"href":77},": лендінг від 25 000 грн, корпоративний сайт від 60 000 грн, магазин від 150 000 грн. Точна вартість залежить від обсягу, дизайну, інтеграцій і термінів, і вона має пояснюватися, а не «залежати».",[273,14305,14306],{},"Окремо запитайте про речі, які зазвичай лишаються поза кошторисом: тексти й фото, платні ліцензії та шрифти, хостинг, домен, сторонні сервіси. Якщо вони не названі, ви дізнаєтеся про них у кінці.",[5588,14308,14310],{"id":14309},"_3-як-рахуються-зміни-вимог","3. Як рахуються зміни вимог?",[273,14312,14313],{},"Зміни неминучі. Питання в тому, як із ними працюють: фіксована ціна з окремою оцінкою змін або погодинна робота з лімітом. Правильна відповідь — що кожна зміна спочатку оцінюється письмово, а ви погоджуєте її до початку роботи. Неправильна — «зробимо, потім розрахуємось».",[273,14315,14316],{},"Для порівняння: погодинні ставки в нашій команді відкриті — від $20 за годину для дизайнера до $32–35 для тех-ліда. Вам не обов'язково працювати погодинно, але ви маєте розуміти, з чого складається будь-яка цифра.",[5588,14318,14320],{"id":14319},"_4-скільки-це-триватиме-і-що-впливає-на-термін","4. Скільки це триватиме і що впливає на термін?",[273,14322,14323],{},"Реалістичні орієнтири: лендінг — 2–3 тижні, корпоративний сайт — 5–7 тижнів, магазин — 10–14 тижнів. Якщо підрядник обіцяє магазин із оплатою, доставкою та CRM за два тижні, або він не врахував тестування, або не уявляє складності інтеграцій. Додайте до цього ваш час: затвердження макетів і контенту часто затягує проєкти більше, ніж розробка.",[268,14325,14327],{"id":14326},"питання-про-код-доступи-і-право-власності","Питання про код, доступи і право власності",[5588,14329,14331],{"id":14330},"_5-кому-належить-код-і-чи-отримаю-я-доступ-до-репозиторію","5. Кому належить код і чи отримаю я доступ до репозиторію?",[273,14333,14334],{},"Єдина прийнятна відповідь: після оплати код і всі матеріали належать вам, а репозиторій від початку створений на вашому акаунті або передається вам. Якщо розробка йде в приватному репозиторії підрядника, а ви отримаєте «архів по завершенню» — це ризик: ви не бачите прогресу й не маєте гарантій.",[273,14336,14337],{},"Те саме стосується домену, хостингу, акаунтів у платіжних системах і аналітиці. Усе, що пов'язане з грошима й даними клієнтів, має бути зареєстроване на вас.",[5588,14339,14341],{"id":14340},"_6-на-чому-будуватиметься-сайт-і-чому-саме-на-цьому","6. На чому будуватиметься сайт і чому саме на цьому?",[273,14343,14344,14345,14348],{},"Не для того, щоб перевірити знання термінів, а щоб почути аргументацію. Для магазину з нестандартною логікою, інтеграціями та власною адмінкою розумно звучить Laravel — ми розбираємо це детальніше в ",[302,14346,14347],{"href":1537},"статті про вибір між Laravel, OpenCart і WordPress",". Для швидкого лендінгу або контентного сайту достатньо простіших рішень. Підозріло, якщо підрядник пропонує один і той самий стек для будь-якої задачі лише тому, що «ми так працюємо».",[273,14350,14351],{},"Окремо запитайте: чи легко буде іншій команді підхопити проєкт? Популярний стек, документація, структура коду за загальноприйнятими практиками — це страховка від залежності від одного виконавця.",[5588,14353,14355],{"id":14354},"_7-чи-є-документація-і-що-буде-якщо-ви-припините-співпрацю","7. Чи є документація, і що буде, якщо ви припините співпрацю?",[273,14357,14358],{},"Мінімум — інструкція з розгортання, опис змінних середовища, схема бази даних і перелік інтеграцій. Запитайте напряму: «Якщо за рік ми вирішимо працювати з іншою командою, що ви передасте і за який час?» Хороший підрядник не ображається на це питання — він має готову відповідь.",[268,14360,14362],{"id":14361},"питання-про-якість-і-тестування","Питання про якість і тестування",[5588,14364,14366],{"id":14365},"_8-хто-тестує-сайт-перед-запуском-і-як","8. Хто тестує сайт перед запуском і як?",[273,14368,14369],{},"Це питання відсіює найбільше. Типова відповідь слабкої команди: «розробники перевіряють самі». Розробник тестує те, що написав, так, як задумав. Незалежна перевірка шукає те, що ніхто не передбачив: порожній кошик, повторне натискання «Оформити», довге прізвище в формі, старий iPhone.",[273,14371,14372,14373,14375,14376,14379],{},"Просіть конкретику: чи є тест-план, які пристрої та браузери перевіряються, як фіксуються баги і скільки раундів виправлень включено в ціну. Для магазину перевірка checkout — окрема тема, ми описували типові помилки в ",[302,14374,14157],{"href":721},". Якщо підрядник не має власного QA, ви можете замовити незалежне ",[302,14377,14378],{"href":438},"тестування сайту"," окремо.",[5588,14381,14383],{"id":14382},"_9-які-метрики-швидкості-та-доступності-ви-гарантуєте","9. Які метрики швидкості та доступності ви гарантуєте?",[273,14385,14386,14387,306],{},"Не «швидкий сайт», а вимірювані порогові значення: наприклад, Lighthouse на мобільному та показники Core Web Vitals. Запитайте, де і як ці цифри вимірюватимуться, і чи входять оптимізації в ціну. Як перевірити швидкість самостійно, ми пояснюємо в ",[302,14388,14389],{"href":475},"статті про Core Web Vitals для власника магазину",[5588,14391,14393],{"id":14392},"_10-як-ви-працюєте-з-seo-на-етапі-розробки","10. Як ви працюєте з SEO на етапі розробки?",[273,14395,14396],{},"SEO, додане «після запуску», майже завжди означає переробку. Запитайте, чи будуть унікальні title і description для кожної сторінки, canonical, структуровані дані, карта сайту, коректні редіректи зі старого сайту. Якщо у вас вже є сайт і ви мігруєте — редіректи зі старих адрес окреме питання, яке має бути в плані до початку розробки, а не після падіння трафіку.",[5825,14398,14399],{},[273,14400,14401,14404,14405,306],{},[2333,14402,14403],{},"Не впевнені у відповідях підрядника?"," За 90 хвилин консультації тех-лід розбере комерційну пропозицію й технічне завдання та скаже, які ризики бачить. Вартість — від 3 000 грн, деталі на сторінці ",[302,14406,33],{"href":34},[268,14408,14410],{"id":14409},"питання-про-процес-договір-і-підтримку","Питання про процес, договір і підтримку",[5588,14412,14414],{"id":14413},"_11-як-виглядає-комунікація-і-хто-мій-контакт","11. Як виглядає комунікація, і хто мій контакт?",[273,14416,14417],{},"З'ясуйте до початку роботи: хто керує проєктом, як часто будуть звіти, де фіксуються завдання, як швидко відповідають на питання. Добра практика — регулярний короткий звіт (що зроблено, що в роботі, що блокує) і доступ до трекера завдань. Погана ознака — спілкування лише через менеджера, який передає питання «розробникам» і повертається за тиждень.",[273,14419,14420,14421,306],{},"Запитайте також, хто конкретно писатиме код. У студіях трапляється підміна: продає один спеціаліст, а працює інший, молодший. Ми працюємо відкрито: ви знаєте, хто тех-лід, хто QA і хто верстає, а процес описаний на сторінці ",[302,14422,14423],{"href":43},"«Процес»",[5588,14425,14427],{"id":14426},"_12-що-в-договорі-оплаті-та-підтримці-після-запуску","12. Що в договорі, оплаті та підтримці після запуску?",[273,14429,14430],{},"Перевірте чотири пункти:",[1207,14432,14433,14439,14445,14451],{},[286,14434,14435,14438],{},[2333,14436,14437],{},"Офіційний договір"," із предметом, термінами, етапами і відповідальністю сторін.",[286,14440,14441,14444],{},[2333,14442,14443],{},"Оплата етапами",", прив'язаними до приймання, а не до календаря. Наша схема — 30 \u002F 40 \u002F 30: передоплата, оплата після основної розробки та остаточний розрахунок після приймання.",[286,14446,14447,14450],{},[2333,14448,14449],{},"Гарантійний період"," на виправлення дефектів. У нас — 30 днів після запуску.",[286,14452,14453,14456,14457,306],{},[2333,14454,14455],{},"Підтримка після релізу",": що входить, скільки коштує, хто реагує на інциденти. Пакети підтримки розпочинаються від 8 000 грн на місяць, детальніше на сторінці ",[302,14458,14459],{"href":889},"підтримки сайтів",[273,14461,14462],{},"Дуже корисно прописати, що вважається прийняттям роботи: наприклад, відсутність критичних і серйозних дефектів зі списку тест-плану. Без цього «готово» означає різне для двох сторін.",[268,14464,14466],{"id":14465},"тривожні-сигнали-які-не-залежать-від-відповідей","Тривожні сигнали, які не залежать від відповідей",[273,14468,14469],{},"Іноді вже з поведінки підрядника на етапі переговорів видно, що буде далі. Звертайте увагу на такі ознаки:",[283,14471,14472,14478,14484,14490,14496,14502],{},[286,14473,14474,14477],{},[2333,14475,14476],{},"Ціна без розбивки і без розмови про вимоги."," Якщо кошторис прийшов після п'ятихвилинного дзвінка — це ціна «з повітря».",[286,14479,14480,14483],{},[2333,14481,14482],{},"Тиск часом."," «Знижка діє до п'ятниці» — майже завжди маркетинг, а не бізнес-логіка.",[286,14485,14486,14489],{},[2333,14487,14488],{},"Відсутність питань до вас."," Хороший виконавець задає багато питань про аудиторію, процеси продажів, наявні системи. Якщо питань немає, він не збирається вникати.",[286,14491,14492,14495],{},[2333,14493,14494],{},"Портфоліо без пояснень."," Скриншоти без опису задачі, ролі та результату. Попросіть показати, що саме робила команда і що змінилося для бізнесу.",[286,14497,14498,14501],{},[2333,14499,14500],{},"Відмова показати приклади коду або процесу."," Не обов'язково публікувати чужий код, але розповісти про підхід має бути можливо.",[286,14503,14504,14507],{},[2333,14505,14506],{},"Занадто низька ціна порівняно з ринком."," Якщо пропозиція вдвічі нижча за інші, десь прибрано тестування, дизайн або запас часу.",[268,14509,14511],{"id":14510},"як-порівнювати-пропозиції-на-практиці","Як порівнювати пропозиції на практиці",[273,14513,14514],{},"Збирайте щонайменше три пропозиції й зводьте їх у таблицю. Не порівнюйте лише підсумкову суму: порівнюйте склад.",[342,14516,14517,14532],{},[345,14518,14519],{},[348,14520,14521,14523,14526,14529],{},[351,14522,5610],{},[351,14524,14525],{},"Підрядник A",[351,14527,14528],{},"Підрядник B",[351,14530,14531],{},"Підрядник C",[358,14533,14534,14545,14556,14567,14578,14589,14599],{},[348,14535,14536,14539,14541,14543],{},[363,14537,14538],{},"Артефакти на етапах",[363,14540],{},[363,14542],{},[363,14544],{},[348,14546,14547,14550,14552,14554],{},[363,14548,14549],{},"Є незалежне тестування",[363,14551],{},[363,14553],{},[363,14555],{},[348,14557,14558,14561,14563,14565],{},[363,14559,14560],{},"Код і доступи на вас",[363,14562],{},[363,14564],{},[363,14566],{},[348,14568,14569,14572,14574,14576],{},[363,14570,14571],{},"Гарантія, підтримка",[363,14573],{},[363,14575],{},[363,14577],{},[348,14579,14580,14583,14585,14587],{},[363,14581,14582],{},"Метрики швидкості",[363,14584],{},[363,14586],{},[363,14588],{},[348,14590,14591,14593,14595,14597],{},[363,14592,14443],{},[363,14594],{},[363,14596],{},[363,14598],{},[348,14600,14601,14604,14606,14608],{},[363,14602,14603],{},"Ціна і що в неї не входить",[363,14605],{},[363,14607],{},[363,14609],{},[273,14611,14612],{},"Після заповнення стає видно, що дешевша пропозиція часто просто не містить рядків, які є в дорожчій. Якщо ви не впевнені, як оцінити технічні пункти, можна залучити зовнішнього спеціаліста на кілька годин: огляд пропозиції та технічного завдання коштує менше, ніж одна переробка.",[268,14614,14616],{"id":14615},"мініпроцес-вибору-за-тиждень","Мініпроцес вибору за тиждень",[273,14618,14619],{},"Щоб не розтягувати вибір на місяці, можна уклястися в п'ять кроків:",[1207,14621,14622,14630,14635,14640,14645],{},[286,14623,14624,14626,14627,306],{},[2333,14625,4908],{}," Сформулюйте коротке завдання: мета, аудиторія, обов'язкові функції, інтеграції, бажаний термін і бюджетна вилка. Для цього зручно користуватися ",[302,14628,14629],{"href":17},"брифом",[286,14631,14632,14634],{},[2333,14633,4914],{}," Надішліть завдання 3–4 кандидатам і попросіть відповісти на 12 питань письмово.",[286,14636,14637,14639],{},[2333,14638,4920],{}," Проведіть короткі дзвінки: перевірте, наскільки люди розуміють вашу задачу.",[286,14641,14642,14644],{},[2333,14643,4926],{}," Зведіть пропозиції в таблицю, перегляньте договір.",[286,14646,14647,14650],{},[2333,14648,14649],{},"Дні 6–7."," Попросіть невелику пробну роботу або оплачуваний дискавері-етап, перш ніж підписувати великий контракт.",[273,14652,14653],{},"Невеликий оплачуваний пілот — найкраща перевірка. За тиждень видно, як команда комунікує, дотримується термінів і реагує на зауваження.",[268,14655,8014],{"id":8013},[273,14657,14658],{},"Хороший підрядник не боїться жодного з цих 12 питань, бо в нього вже є відповіді: про артефакти, ціну, код, тестування, договір і підтримку. Погані відповіді не завжди означають нечесність, але вони означають ризик, який ви маєте усвідомлено прийняти або зняти до підписання договору.",[5825,14660,14661],{},[273,14662,14663,13430,14666,14668],{},[2333,14664,14665],{},"Хочете, щоб ми відповіли на ці 12 питань про ваш проєкт?",[302,14667,482],{"href":17}," — за 1 робочий день надішлемо оцінку з розбивкою по етапах, термінами та тим, що не входить у ціну.",{"title":14,"searchDepth":485,"depth":486,"links":14670},[14671,14672,14678,14683,14688,14692,14693,14694,14695],{"id":14246,"depth":485,"text":14247},{"id":14285,"depth":485,"text":14286,"children":14673},[14674,14675,14676,14677],{"id":14289,"depth":486,"text":14290},{"id":14296,"depth":486,"text":14297},{"id":14309,"depth":486,"text":14310},{"id":14319,"depth":486,"text":14320},{"id":14326,"depth":485,"text":14327,"children":14679},[14680,14681,14682],{"id":14330,"depth":486,"text":14331},{"id":14340,"depth":486,"text":14341},{"id":14354,"depth":486,"text":14355},{"id":14361,"depth":485,"text":14362,"children":14684},[14685,14686,14687],{"id":14365,"depth":486,"text":14366},{"id":14382,"depth":486,"text":14383},{"id":14392,"depth":486,"text":14393},{"id":14409,"depth":485,"text":14410,"children":14689},[14690,14691],{"id":14413,"depth":486,"text":14414},{"id":14426,"depth":486,"text":14427},{"id":14465,"depth":485,"text":14466},{"id":14510,"depth":485,"text":14511},{"id":14615,"depth":485,"text":14616},{"id":8013,"depth":485,"text":8014},"vendor.checklist",[14698,14700,14702,14704],{"marker":161,"text":14699},"код і доступи належать вам",{"marker":161,"text":14701},"етапи оплати прив'язані до приймання",{"marker":156,"text":14703},"«ціна залежить» без вилки",{"marker":153,"text":14705},"немає тестування перед релізом","12\u002F12",[14708,14711,14714,14717],{"q":14709,"a":14710},"Як вибрати підрядника на розробку сайту?","Порівнюйте не лише ціну, а й результат, процес, доступи, тестування та підтримку. Просіть кошторис з розбивкою за етапами, умови передачі коду й доступів. Поставте всім підрядникам однакові питання та порівняйте відповіді письмово. Це допомагає порівнювати пропозиції об'єктивно, а не за враженням.",{"q":14712,"a":14713},"Які тривожні сигнали у підрядника на етапі переговорів?","Ціна без розбивки та розмови про вимоги, тиск часом, відсутність питань до вас, портфоліо без пояснень і відмова розповісти про підхід. Також насторожує пропозиція вдвічі нижча за інші: найімовірніше, прибрано тестування, дизайн або запас часу.",{"q":14715,"a":14716},"Чи варто обирати найдешевшу пропозицію на розробку сайту?","Зазвичай ні. Низька ціна часто означає, що в неї не входять тестування, підтримка чи частина функцій, які згодом оплачуються окремо. Порівнюйте склад робіт: дві пропозиції з однаковою сумою можуть містити зовсім різне. Це допомагає не переплатити пізніше за виправлення.",{"q":14718,"a":14719},"Скільки коштує розробка сайту в студії Tochno?","Лендінг від 25 000 грн (2–3 тижні), корпоративний сайт від 60 000 грн (5–7 тижнів), інтернет-магазин від 150 000 грн (10–14 тижнів), MVP від $5 000. Підтримка сайту стартує від 8 000 грн на місяць. Точну суму рахуємо після брифу.",{},"\u002Fuk\u002Fblog\u002Fyak-obraty-pidriadnyka-na-rozrobku-saitu",{"title":14235,"description":14240},"Як обрати підрядника на розробку сайту чи магазину: 12 питань про код, договір, тестування і ціну та сигнали, що мають вас насторожити.","Як обрати підрядника на розробку сайту — Tochno.","uk\u002Fblog\u002Fyak-obraty-pidriadnyka-na-rozrobku-saitu",[6042],"OG_TEG5iVWvDG8URXxFxMiLEkgrasnA-CA1RXmMhRco",1794139964121]