[{"data":1,"prerenderedAt":652},["ShallowReactive",2],{"site-en":3,"case-en-store-1c-nova-poshta-integration":131,"cases-en":219},{"id":4,"contacts":5,"cta":15,"extension":18,"footer":19,"meta":68,"nav":69,"serviceUi":84,"stem":129,"__hash__":130},"site_en\u002Fen\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","Mon–Fri 10:00–19:00, Kyiv time","Kyiv","https:\u002F\u002Fwww.linkedin.com\u002F","https:\u002F\u002Fgithub.com\u002F","",{"label":16,"to":17},"Discuss your project","\u002Fbryf","yml",[20,35,56],{"title":21,"links":22},"Services",[23,26,29,32],{"label":24,"to":25},"Website development","\u002Fposluhy\u002Fwebsite-development",{"label":27,"to":28},"E-commerce","\u002Fposluhy\u002Fecommerce-development",{"label":30,"to":31},"QA audit","\u002Fposluhy\u002Fecommerce-qa-audit",{"label":33,"to":34},"Tech Lead","\u002Fposluhy\u002Ftech-lead",{"title":36,"links":37},"Company",[38,41,44,47,50,53],{"label":39,"to":40},"About us","\u002Fpro-nas",{"label":42,"to":43},"Process","\u002Fproces",{"label":45,"to":46},"Cases","\u002Fkeisy",{"label":48,"to":49},"Blog","\u002Fblog",{"label":51,"to":52},"FAQ","\u002Ffaq",{"label":54,"to":55},"Glossary","\u002Fhlosarii",{"title":57,"links":58},"Legal",[59,62,65],{"label":60,"to":61},"Privacy Policy","\u002Fpolityka-konfidentsiinosti",{"label":63,"to":64},"Cookies","\u002Fcookies",{"label":66,"to":67},"Terms of Cooperation","\u002Fumovy",{},[70,72,75,78,79,80,81],{"label":21,"to":71},"\u002Fposluhy",{"label":73,"to":74},"Turnkey","\u002Fpid-kliuch",{"label":76,"to":77},"Pricing","\u002Ftsiny",{"label":45,"to":46},{"label":42,"to":43},{"label":48,"to":49},{"label":82,"to":83},"Contacts","\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":96,"seeAlsoPosts":97,"price":98,"crumbServices":21,"flagship":99,"ctaLead":117,"ctaSteps":118,"needs":122},"WHO IT'S FOR","WHAT'S INCLUDED","PRICING","Packages and pricing","All prices","SAMPLE RESULT","PROCESS","LEARN MORE","Questions about the service","OFTEN ORDERED TOGETHER","SEE ALSO","Case studies","Articles","price",{"crumb":30,"expressCheck":100,"badge":101,"discuss":102,"bookDays":103,"sampleAria":104,"reportTitle":105,"steps":106,"actual":107,"expected":108,"impact":109,"colAction":110,"colExpected":111,"colStatus":112,"top3":113,"screenshot":114,"faqTitle":115,"related":116},"Free express check","FLAGSHIP","Discuss","Book days","Sample","This is what the report you receive looks like","STEPS","ACTUAL","EXPECTED","IMPACT","ACTION","EXPECTED RESULT","STATUS","TOP 3 TO FIX","report screenshot","Questions about testing","AFTER AN AUDIT YOU USUALLY NEED","We reply within 2 business hours. An estimate with a price and timeline range follows within 1 day.",[119,120,121],"Reply within 2 hours","20-minute call","Estimate within 1 day",[123,124,30,125,33,126,127,128],"Turnkey website","Online store","Testing","Design","Developer for your team","Support","en\u002Fsite","yowiXCE5f_PBbMxOr-Cl8oFTSBoiVPGSthZ0C1HAFyQ",{"id":132,"title":133,"body":134,"client":141,"cover":142,"coverItems":143,"coverKind":151,"date":152,"description":14,"duration":153,"extension":154,"gallery":155,"industry":27,"key":156,"kpis":157,"kpisNote":166,"lead":167,"lessons":168,"limits":172,"liveUrl":177,"meta":178,"navigation":179,"note":180,"path":181,"problem":182,"repoUrl":177,"results":183,"seo":184,"seoDescription":185,"seoTitle":186,"service":187,"serviceLabel":188,"slug":189,"solution":190,"solutions":191,"stack":207,"stem":214,"tag":215,"team":216,"type":217,"__hash__":218},"cases_en\u002Fen\u002Fcases\u002Fstore-1c-nova-poshta-integration.md","Store Integration with 1C and Nova Poshta",{"type":135,"value":136,"toc":137},"minimark",[],{"title":14,"searchDepth":138,"depth":139,"links":140},2,3,[],"Under NDA","Integration diagram: store, queue, 1C and Nova Poshta (no client data)",[144,145,146,147,148,149,150],"Laravel store","Queue · Redis","1C","Nova Poshta","orders","stock","waybills and statuses","integration","2026-07-01","3 weeks","md",[],"intehratsiia-1s-nova-poshta",[158,162],{"label":159,"value":160,"note":161},"TIME SAVED","−6 h \u002F week","[PASS] manual export removed",{"label":163,"value":164,"note":165},"STOCK DISCREPANCIES","0","[PASS] after launch","Client data: managers' time estimate before and after launch, stock reconciliation over the first month.","Client under NDA. Stock and order status sync instead of manual exports.",[169,170,171],"We would start with the sync log: it helped most when sorting out disputed cases with managers.","We would agree on a test copy of 1C earlier: some scenarios were checked on the live database at night.","We would add Telegram alerts about sync failures in the first release, not the second.",[173,174,175,176],"1C stays the main accounting system: its logic is not changed","The store keeps running with no downtime during rollout","The 1C API responds slowly and is sometimes unavailable","Managers must see what was synced and when",null,{},true,"A real project with the client under NDA: no name, screenshots or client data. The cover diagram is generalised.","\u002Fen\u002Fcases\u002Fstore-1c-nova-poshta-integration","The client manually exported stock levels and order statuses between the store and 1C. It took hours every week and caused discrepancies: items were sold after they had run out in the warehouse, and managers copied delivery statuses from the Nova Poshta dashboard by hand.",[],{"title":133,"description":14},"Real project (client under NDA): stock and order status sync between a Laravel store and 1C instead of manual exports.","Online Store 1C and Nova Poshta Integration — Tochno.","laravel-development","Backend \u002F Laravel","store-1c-nova-poshta-integration","We built a queue-based sync of stock levels and order statuses between the Laravel store and 1C via API, with no manual export. Every operation is a separate queued job with retries, and delivery statuses are pulled from the Nova Poshta API automatically.",[192,196,200,203],{"icon":193,"title":194,"text":195},"refresh","Scheduled stock sync","A background job fetches stock changes from 1C and updates only the changed products.",{"icon":197,"title":198,"text":199},"arrows-exchange","Two-way statuses","A new order goes to 1C immediately; a status change in 1C comes back to the store.",{"icon":201,"title":147,"text":202},"truck-delivery","The waybill is created from the order, and the delivery status updates without a manager.",{"icon":204,"title":205,"text":206},"list-check","Log and retries","Every sync is logged; an API failure means a retry, not a lost order.",[208,209,210,211,212,213],"Laravel — store, integration API","Queues — background jobs, retries","Redis — queues","1C — accounting and stock","Nova Poshta API — waybills and statuses","PostgreSQL — sync log","en\u002Fcases\u002Fstore-1c-nova-poshta-integration","E-COMMERCE","Tech lead, backend developer, QA","real","K5iUpO9jWgshJQDZBIQ0G4cu8nZ0I1LTQSGovM-yySY",[220,312,397,418,496,573],{"id":221,"title":222,"body":223,"client":177,"cover":227,"coverItems":228,"coverKind":234,"date":235,"description":14,"duration":236,"extension":154,"gallery":237,"industry":27,"key":241,"kpis":242,"kpisNote":259,"lead":260,"lessons":261,"limits":265,"liveUrl":177,"meta":270,"navigation":179,"note":271,"path":272,"problem":273,"repoUrl":177,"results":274,"seo":275,"seoDescription":276,"seoTitle":277,"service":278,"serviceLabel":279,"slug":280,"solution":281,"solutions":282,"stack":299,"stem":308,"tag":215,"team":309,"type":310,"__hash__":311},"cases_en\u002Fen\u002Fcases\u002Fdemo-store-laravel-nuxt.md","Online Store on Laravel + Nuxt",{"type":135,"value":224,"toc":225},[],{"title":14,"searchDepth":138,"depth":139,"links":226},[],"Illustration: demo store catalog in a browser and the mobile checkout",[229,230,231,232,233],"demo-shop.tochnodev.com","UAH 1,290","Checkout","Nova Poshta · branch 12","Pay with LiqPay","shop","2026-09-01","6 weeks",[238,239,240],"main screenshot: catalog on desktop + mobile","screenshot: mobile checkout","screenshot: order admin panel","demo-internet-mahazyn-laravel-nuxt",[243,247,251,255],{"label":244,"value":245,"note":246},"LIGHTHOUSE MOBILE","96","[PASS] target 90+",{"label":248,"value":249,"note":250},"LCP","1.4 s","[PASS] threshold 2.5 s",{"label":252,"value":253,"note":254},"CLS","0.01","[PASS] threshold 0.1",{"label":256,"value":257,"note":258},"AUTOTESTS","24","[PASS] 24 \u002F 24","Measured with PageSpeed Insights, mobile profile, median of 5 runs. Date: 09.2026.","We show how we build a turnkey store: from a 2,000-product catalog to payment and delivery, with tests for every key scenario.",[262,263,264],"We would connect the real Nova Poshta API earlier instead of a mock: the integration took 3 days more than planned.","We would write checkout autotests from the first sprint, not the third: two regressions could have been avoided.","Fewer custom components in the admin panel: off-the-shelf Filament solutions would have covered 80% of the needs.",[266,267,268,269],"Time budget of 6 weeks, like a real small store","75%+ mobile traffic: checkout designed for phones first","Hosting on a regular $10\u002Fmonth VPS, no CDN magic","The admin panel must be manageable by a non-technical person",{},"This is a demo project: we built it ourselves to show our approach and code quality. There is no client and no sales; metrics were measured on test data.","\u002Fen\u002Fcases\u002Fdemo-store-laravel-nuxt","Build a store where a prospective client can check for themselves how we work: speed, mobile checkout, admin panel and code quality. The scenario is a home-goods store with a catalog of 2,000 items.",[],{"title":222,"description":14},"Open demo e-commerce build: 2,000-product catalog, LiqPay, Nova Poshta, admin panel. Lighthouse mobile 96, LCP 1.4 s.","Demo Online Store on Laravel + Nuxt — Tochno.","ecommerce-development","Turnkey store","demo-store-laravel-nuxt","We split the store into a Nuxt frontend with statically generated catalog pages and a Laravel API for the cart, orders and admin panel. Filters are cached at the database level, not in the frontend.",[283,287,291,295],{"icon":284,"title":285,"text":286},"bolt","Static catalog","Nuxt generates product pages; updates are triggered by a webhook from the admin panel.",{"icon":288,"title":289,"text":290},"filter","Instant filters","Aggregates in PostgreSQL, API response under 80 ms across 2,000 products.",{"icon":292,"title":293,"text":294},"credit-card","One-screen checkout","LiqPay and Nova Poshta with branch autocomplete.",{"icon":296,"title":297,"text":298},"test-pipe","Automated tests in CI","24 Playwright scenarios run before every deploy.",[300,301,302,303,304,305,306,307],"Laravel 11 — API, admin panel","Nuxt 3 — frontend","PostgreSQL — data","Redis — queues, cache","Playwright — automated tests","GitHub Actions — CI","Figma — design","VPS — hosting","en\u002Fcases\u002Fdemo-store-laravel-nuxt","Tech lead, QA, designer","demo","IlfiL90SFfd71pdlC-dagf2CcFVSWEQY5AuBdwjGKZs",{"id":313,"title":314,"body":315,"client":177,"cover":319,"coverItems":320,"coverKind":329,"date":330,"description":14,"duration":331,"extension":154,"gallery":332,"industry":333,"key":334,"kpis":335,"kpisNote":348,"lead":349,"lessons":350,"limits":354,"liveUrl":177,"meta":358,"navigation":179,"note":359,"path":360,"problem":361,"repoUrl":177,"results":362,"seo":363,"seoDescription":364,"seoTitle":365,"service":366,"serviceLabel":367,"slug":368,"solution":369,"solutions":370,"stack":386,"stem":392,"tag":393,"team":394,"type":395,"__hash__":396},"cases_en\u002Fen\u002Fcases\u002Ffashion-store-qa-audit.md","Fashion Store: 47 Bugs, 6 Critical",{"type":135,"value":316,"toc":317},[],{"title":14,"searchDepth":138,"depth":139,"links":318},[],"Illustration: a QA audit report page with bugs by priority",[321,322,323,324,325,326,327,328],"QA audit · fashion store","47 bugs · 4 days","CRIT|iOS Safari: “Pay” does nothing after changing delivery","CRIT|iOS: cart empties after returning from payment","MAJOR|Size filter resets on pagination","MAJOR|Promo code accepted twice","MINOR|Button label clipped at 320 px","PASS|Search and product page: no critical issues","qa-report","2026-08-01","4 days",[],"Fashion and apparel","qa-audyt-mahazynu-odiahu",[336,339,343,346],{"label":337,"value":338},"BUGS","47",{"label":340,"value":341,"note":342},"CRITICAL","6","all in iOS checkout",{"label":344,"value":345},"CHECKLIST ITEMS","150+",{"label":347,"value":331},"EFFORT","Priorities reflect impact on orders: a critical bug blocks a purchase or payment.","Demo QA audit of a public store. All critical bugs were in the iOS checkout.",[351,352,353],"We would start with the iOS checkout right away: all the critical risk was there, and we only got to it on day two.","We would record a video for every critical bug, not just screenshots: developers reproduce faster that way.","We would add a short re-test after fixes: without it the owner cannot see that bugs are really closed.",[355,356,357],"Public part of the site only, no access to the admin panel or code","No real payments: checkout was tested up to the payment step","4 working days for the whole audit and report",{},"A demonstration audit: the store was not our client and we do not publish its name. We checked only what a regular shopper sees, with no vulnerability scanning.","\u002Fen\u002Fcases\u002Ffashion-store-qa-audit","Test a public online clothing store for bugs, from catalog to payment, with a focus on mobile scenarios. Fashion shoppers place most orders on their phones, and that is also where they most often abandon the cart.",[],{"title":314,"description":14},"Demo QA audit of a public fashion store. All critical bugs were in the iOS checkout. Report delivered in 4 days.","Fashion E-commerce QA Audit: 47 Bugs — Tochno.","ecommerce-qa-audit","E-commerce QA audit","fashion-store-qa-audit","We ran a QA audit against a 150+ item checklist and found 47 bugs, 6 of them critical, all in the iOS checkout. Every bug comes with reproduction steps, expected and actual results, the device and a priority.",[371,374,378,382],{"icon":204,"title":372,"text":373},"150+ item checklist","Catalog, filters, product page, cart, checkout, forms, emails.",{"icon":375,"title":376,"text":377},"device-mobile","Real devices","iPhone and Android in real browsers, not just a DevTools emulator.",{"icon":379,"title":380,"text":381},"bug","Prioritised bug reports","Critical, major and minor: what to fix first and what can wait.",{"icon":383,"title":384,"text":385},"file-text","Report for the owner","A short business-language summary plus a detailed table for developers.",[387,388,389,390,391],"150+ item checklist — catalog, cart, checkout","iOS Safari, Android Chrome — real devices","Playwright — scenario replay","Lighthouse — speed and accessibility","Jira format — bug reports","en\u002Fcases\u002Ffashion-store-qa-audit","QA","QA engineer, tech lead (report review)","audit","o_LOPr4_4RzP3RwafIDxAW2eFgBnVaDAD7ZL0mAfzq0",{"id":132,"title":133,"body":398,"client":141,"cover":142,"coverItems":402,"coverKind":151,"date":152,"description":14,"duration":153,"extension":154,"gallery":403,"industry":27,"key":156,"kpis":404,"kpisNote":166,"lead":167,"lessons":407,"limits":408,"liveUrl":177,"meta":409,"navigation":179,"note":180,"path":181,"problem":182,"repoUrl":177,"results":410,"seo":411,"seoDescription":185,"seoTitle":186,"service":187,"serviceLabel":188,"slug":189,"solution":190,"solutions":412,"stack":417,"stem":214,"tag":215,"team":216,"type":217,"__hash__":218},{"type":135,"value":399,"toc":400},[],{"title":14,"searchDepth":138,"depth":139,"links":401},[],[144,145,146,147,148,149,150],[],[405,406],{"label":159,"value":160,"note":161},{"label":163,"value":164,"note":165},[169,170,171],[173,174,175,176],{},[],{"title":133,"description":14},[413,414,415,416],{"icon":193,"title":194,"text":195},{"icon":197,"title":198,"text":199},{"icon":201,"title":147,"text":202},{"icon":204,"title":205,"text":206},[208,209,210,211,212,213],{"id":419,"title":420,"body":421,"client":177,"cover":425,"coverItems":426,"coverKind":434,"date":435,"description":14,"duration":436,"extension":154,"gallery":437,"industry":438,"key":439,"kpis":440,"kpisNote":447,"lead":448,"lessons":449,"limits":453,"liveUrl":177,"meta":458,"navigation":179,"note":459,"path":460,"problem":461,"repoUrl":177,"results":462,"seo":463,"seoDescription":464,"seoTitle":465,"service":466,"serviceLabel":467,"slug":468,"solution":469,"solutions":470,"stack":487,"stem":492,"tag":493,"team":494,"type":434,"__hash__":495},"cases_en\u002Fen\u002Fcases\u002Fdental-clinic-redesign-concept.md","Dental Clinic Website Redesign",{"type":135,"value":422,"toc":423},[],{"title":14,"searchDepth":138,"depth":139,"links":424},[],"Illustration: the clinic homepage concept and booking form on a phone",[427,428,429,430,431,432,433],"Dentaline","Painless treatment, book online","Book now","1 · Service: hygiene","2 · Doctor and time","3 · Contacts","Confirm booking","concept","2026-06-01","2 weeks",[],"Healthcare \u002F dentistry","redyzain-saitu-stomatolohii",[441,444],{"label":442,"value":443},"STEPS TO BOOK","3",{"label":445,"value":446},"SCREENS","2","These are concept parameters, not measured results: conversion can only be assessed on a live site.","A concept for the first screen and appointment booking. Not a commission: a self-initiated project.",[450,451,452],"We would test the prototype with 5 real patients before the final UI: cheaper than reworking layouts.","We would think through the “no free slots” scenario earlier: in the first version it was a dead end.","We would build the UI kit alongside the layouts, not after them.",[454,455,456,457],"Self-initiated work, with no access to a real clinic's analytics","Mobile first: most patients look for a clinic on their phone","The booking form has at most 3 steps","Colors and contrast meet WCAG AA for older patients",{},"A design concept, not a commission: we made it ourselves to show our UX approach. The clinic name and copy are fictional examples.","\u002Fen\u002Fcases\u002Fdental-clinic-redesign-concept","Show how to simplify appointment booking on a dental clinic website: fewer steps, clearer on mobile. On typical clinic sites booking is a long form or just a phone number, and patients go to a competitor that lets them book online.",[],{"title":420,"description":14},"Concept for a dental clinic's first screen and appointment booking. A self-initiated project, not a client commission.","Dental Clinic Website Redesign Concept — Tochno.","ui-ux-design","UI\u002FUX design","dental-clinic-redesign-concept","We designed a homepage concept and a 3-step booking form across 2 screens, as a self-initiated project outside any commission. The first screen shows services with “from” prices and a booking button; then the patient picks a service, a doctor and a time.",[471,475,479,483],{"icon":472,"title":473,"text":474},"layout","First screen","What we treat, “from” prices, address and a booking button, no scrolling on a phone.",{"icon":476,"title":477,"text":478},"calendar","3-step booking","Service → doctor → free slot. The phone number is asked only at the last step.",{"icon":480,"title":481,"text":482},"accessible","Accessibility","Large touch targets, AA contrast, clear error states.",{"icon":484,"title":485,"text":486},"components","UI kit","Buttons, fields, doctor cards: ready for handoff to development.",[488,489,490,491],"Figma — layouts and prototype","Auto layout — responsive 360–1440 px","UI kit — buttons, forms, states","WCAG 2.2 AA — contrast and sizes","en\u002Fcases\u002Fdental-clinic-redesign-concept","UI\u002FUX","UI\u002FUX designer, tech lead","_gIv1BFyAEtTdxCSTJu7VjRUdTPHCjwMn3prqvEbYX4",{"id":497,"title":498,"body":499,"client":177,"cover":503,"coverItems":504,"coverKind":514,"date":515,"description":14,"duration":436,"extension":154,"gallery":516,"industry":517,"key":518,"kpis":519,"kpisNote":526,"lead":527,"lessons":528,"limits":532,"liveUrl":177,"meta":536,"navigation":179,"note":537,"path":538,"problem":539,"repoUrl":177,"results":540,"seo":541,"seoDescription":542,"seoTitle":543,"service":514,"serviceLabel":544,"slug":545,"solution":546,"solutions":547,"stack":563,"stem":569,"tag":570,"team":571,"type":395,"__hash__":572},"cases_en\u002Fen\u002Fcases\u002Flaravel-b2b-code-audit.md","Technical Audit of a Laravel B2B Project",{"type":135,"value":500,"toc":501},[],{"title":14,"searchDepth":138,"depth":139,"links":502},[],"Illustration: a code fragment with an N+1 query from the technical audit",[505,506,507,508,509,510,511,512,513],"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","tekhnichnyi-audyt-laravel-b2b",[520,523],{"label":521,"value":522},"N+1 QUERIES","312",{"label":524,"value":525},"RECOMMENDATIONS","14","N+1 is the number of redundant repeated queries found by profiling key pages.","Review of a contractor's code before renewing the contract: architecture, security, queries.",[529,530,531],"We would ask for production log access on day one: some slow scenarios only show up on real data.","We would meet the contractor at the start of the audit, not the end: some decisions had historical reasons.","We would give hour ranges for the recommendations in the first version of the report.",[533,534,535],"Access to the repository and a database copy only, no production servers","The verdict was needed before the contract renewal date","The report would be read by a non-technical owner: a jargon-free summary was required",{},"An audit under NDA: we do not publish the client name, code or screenshots. The code on the cover illustrates a typical issue; it is not the client's code.","\u002Fen\u002Fcases\u002Flaravel-b2b-code-audit","The client had to decide whether to renew the contract with their contractor, so we assessed the quality of the B2B project's Laravel code. The complaints were typical: report pages loaded slowly, new features broke old ones, and the contractor's estimates kept growing.",[],{"title":498,"description":14},"Review of contractor code before renewing a contract: architecture, security, 312 N+1 queries and 14 recommendations.","Laravel Code Audit for a B2B Project — Tochno.","Code audit","laravel-b2b-code-audit","We ran a technical audit covering architecture, security and query performance, found 312 N+1 queries and gave 14 recommendations. Each recommendation has a priority, an hours estimate and the risk of not doing it.",[548,552,556,560],{"icon":549,"title":550,"text":551},"sitemap","Architecture","Module structure, business logic in controllers, duplication, test coverage.",{"icon":553,"title":554,"text":555},"shield-lock","Security","Authorization, input validation, mass assignment, vulnerable dependencies.",{"icon":557,"title":558,"text":559},"database","Database queries","Profiling key pages: N+1, missing indexes, heavy reports.",{"icon":383,"title":561,"text":562},"A report to decide on","A summary for the owner and 14 prioritised recommendations for developers.",[564,565,566,567,568],"Laravel — project code","PostgreSQL — queries and indexes","Laravel Debugbar, Telescope — profiling","PHPStan — static analysis","composer audit — vulnerable dependencies","en\u002Fcases\u002Flaravel-b2b-code-audit","CODE AUDIT","Tech lead (PHP), QA","6mQGlz7MJR3TSqpVe_7cY6GaslmSqwd56p_nCD3kf0Y",{"id":574,"title":575,"body":576,"client":177,"cover":580,"coverItems":581,"coverKind":590,"date":591,"description":14,"duration":592,"extension":154,"gallery":593,"industry":594,"key":595,"kpis":596,"kpisNote":603,"lead":604,"lessons":605,"limits":609,"liveUrl":177,"meta":614,"navigation":179,"note":615,"path":616,"problem":617,"repoUrl":177,"results":618,"seo":619,"seoDescription":620,"seoTitle":621,"service":622,"serviceLabel":24,"slug":623,"solution":624,"solutions":625,"stack":641,"stem":648,"tag":649,"team":650,"type":310,"__hash__":651},"cases_en\u002Fen\u002Fcases\u002Fdemo-landing-telegram-crm.md","Landing Page with Telegram and CRM Form",{"type":135,"value":577,"toc":578},[],{"title":14,"searchDepth":138,"depth":139,"links":579},[],"Illustration: a landing page with a lead form and a Telegram bot message",[582,583,584,585,586,587,588,589],"landing.tochnodev.com","Turnkey apartment renovation","Your name","Phone or Telegram","Get a quote","tochno_leads_bot","New lead from the landing page","Olena · +380… · utm_source=google","landing","2026-04-01","1 week",[],"Landing pages","demo-lendinh-telegram-crm",[597,601],{"label":598,"value":599,"note":600},"ACCESSIBILITY","100","[PASS] target 95+",{"label":248,"value":602,"note":250},"0.9 s","Measured with Lighthouse, mobile profile, test deployment on Vercel.","A Nuxt landing page template: validated form, leads sent to a Telegram bot and CRM.",[606,607,608],"We would send leads to the CRM through a queue with retries from the start, not with a direct request from the form.","We would add a backup channel (email) from day one: a Telegram bot can be unavailable too.","We would wire up form event analytics before the ads launch, not after the first leads.",[610,611,612,613],"Launch in one week, as for a real ad campaign","No paid page builders or third-party form widgets","A lead must not be lost even if the CRM is temporarily down","Spam protection without a captcha that hurts conversion",{},"This is a demo project: we built it ourselves as a template for ad landing pages. There is no client; metrics were measured on a test deployment.","\u002Fen\u002Fcases\u002Fdemo-landing-telegram-crm","Show how quickly a landing page for ads can be built, with a form that instantly sends leads to Telegram and a CRM. A typical small-business pain: form leads land in an inbox, get noticed half a day later, and some end up in spam.",[],{"title":575,"description":14},"Nuxt landing page template: validated form, leads sent to a Telegram bot and CRM. Accessibility 100, LCP 0.9 s.","Demo Nuxt Landing Page with Telegram Form — Tochno.","website-development","demo-landing-telegram-crm","We built a static Nuxt landing page and a single server route for the form. The same validation rules run in the browser and on the server, and each lead goes to the Telegram bot and the CRM in parallel, so a failure in one channel does not block the other.",[626,629,633,637],{"icon":284,"title":627,"text":628},"Static landing page","The page is generated at build time: the first screen does not wait for a server.",{"icon":630,"title":631,"text":632},"forms","One validation schema","A Zod schema shared by browser and server: errors next to each field.",{"icon":634,"title":635,"text":636},"brand-telegram","Lead in seconds","A Telegram message with the contact, text and UTM source tags.",{"icon":638,"title":639,"text":640},"shield-check","Captcha-free anti-spam","Honeypot field, time trap and a per-IP request limit.",[642,643,644,645,646,647],"Nuxt — static landing page","Nitro — form server route","Zod — client and server validation","Telegram Bot API — notifications","CRM API — lead record","Vercel — hosting","en\u002Fcases\u002Fdemo-landing-telegram-crm","LANDING PAGE","Developer, designer, QA","GLYJRrKlhE7AGAknT4lmIdnH7eE-o-SNQlbI2Tdv98w",1794139962388]