Key case studies from the last year and a half, ordered by business impact. The numbers are my own measurements and team data. Company code stays private.
+50%Conversion+50%
Marketing site: +50% traffic to sign-up
BotHelp · 2026
- Problem
- Turn blog traffic into product sign-ups without losing attribution on the way from the site to the app.
- Solution
- Built WordPress CTA blocks and an article sidebar that pass ref and UTM along, plus a mega menu and a CRM-integration landing page. Moved Yandex Metrica to the new tag so the page view is guaranteed to fire before the redirect, set up cross-domain cookie sync for the affiliate network, and removed duplicate Amplitude events.
- Result
- Site-to-sign-up traffic grew by 50%, and traffic sources are attributed correctly.
WordPressUTMYandex MetricaAmplitude
≈30%Revenue≈30%
Billing: ≈30% of paying customers use plan add-ons
BotHelp · May 2025 — Jul 2026
- Problem
- The product needed paid and free add-ons on top of plans that behave correctly across trial, expiry, cancellation and downgrade.
- Solution
- Built the billing frontend: add-ons, extra storage and tokens, limits, downgrade validation, subscription edge states, a mobile version. Integrated FastSpring, Robokassa, YooMoney and one more provider.
- Result
- About 30% of paying customers use add-ons. Subscription edge cases went through more than six QA iterations.
FastSpringRobokassaYooMoney
1–2 daysDelivery speed1–2 days
A new tool in 1–2 days instead of a week
BotHelp · Aug 2026
- Problem
- About ten subscriber growth tools (widgets, landing pages, links, comment auto-replies) were copies of each other. Adding a new one took a week.
- Solution
- Consolidated them into a definition registry with a unified CRUD contract, NGXS state and form-adapter factories, and base components. Routes are generated from the registry, NgModules are gone, components are standalone.
- Result
- A new tool is now a registry definition. Along the way I deleted 7.6k lines of legacy and replaced snapshot tests with specs.
NGXSStandaloneJest
20+ modulesArchitecture20+ modules
Frontend architecture: the refactoring plan became the team standard
BotHelp · Sep 2025 — Aug 2026
- Problem
- A large Angular app in an Nx monorepo grew without clear boundaries: features pulled each other in through shared layers, the bundle chunked poorly, and new work kept getting more expensive.
- Solution
- Audited the codebase and wrote a phased refactoring plan that the team adopted as a standard. Following it, rebuilt the layers (shared → core → features), moved 20+ modules’ code to their owners, and enforced boundaries with ESLint rules in CI. Migrated every form to Typed Forms and panels and menus to Signals.
- Result
- Five frontend engineers work to one standard. Module boundary violations dropped from 99 to 15, chunking improved, and the third-party forms library is gone.
NxESLintTyped FormsSignals
smoke E2ETeam toolingsmoke E2E
Test automation on stable data-testids
BotHelp · Jun — Aug 2026
- Problem
- E2E tests relied on brittle selectors, and placing data-testids by hand across hundreds of templates wasn’t realistic.
- Solution
- Wrote a Node.js template scanner, a rule-based name generator and a registry. Added a CI check, a pre-commit hook and a custom ESLint rule.
- Result
- testIds are generated automatically and checked in CI. The team built smoke test automation on top of them.
Node.jsESLintCIE2E
−85%Speed−85%
Bot builder: 85% less time to open
BotHelp · Apr 2026
- Problem
- The GoJS-based visual scenario builder is the product’s main screen. A large scenario took about 13 seconds to open, and the page component had grown into a monolith.
- Solution
- Moved diagram model conversion to a Web Worker, split the page into services, rewrote rendering and model loading, and closed canvas sync races after WebSocket reconnects.
- Result
- A large scenario opens in 2 seconds instead of 13. I shipped the main-screen optimization in stages, with a fast rollback path.
GoJSWeb WorkersWebSocket
3 messengersStability3 messengers
Stable formatting across Telegram, VK and MAX
BotHelp · Jan — Jun 2026
- Problem
- One message goes to three messengers, each with its own markup and limits. Conversion broke links, macros and line breaks, and customers complained to support.
- Solution
- Wrote AST-level HTML ↔ Markdown conversion with link and macro escaping, length counters, previews and a converter for legacy Telegram messages. I cover edge cases with tests before merging.
- Result
- Formatting works the same in all three messengers, and formatting-related support requests went down.
mdastMarkdownRich text
5 agentsAI in development5 agents
An agent squad: architect, analyst, engineer, reviewer, debugger
BotHelp · 2026
- Problem
- The team used AI tools inconsistently, and results depended on who was at the keyboard.
- Solution
- Built a squad of five agents with separate roles in Claude Code and Cursor: the architect maps the impact, the analyst splits work into groups with acceptance criteria, the engineer writes code and tests, the reviewer issues a verdict on the diff, the debugger hunts the root cause. Wrote project rules, agent memory and hook-based gates that verify real lint and test runs. Ran meetups.
- Result
- The squad moves with me to any project: agents, rules and hooks are set up in 30 minutes. Decisions are still mine.
Claude CodeCursorHooks
Svelte 5Embeddable codeSvelte 5
AI-agent chat widget in Svelte 5
BotHelp · May — Sep 2026
- Problem
- Customers needed an AI-agent widget for their sites that doesn’t clash with the host page and doesn’t add unnecessary load.
- Solution
- Shadow DOM isolation, UTM tracking, branding, and a WebSocket connection only after the widget opens. Built a pnpm + Turborepo monorepo for public frontends and moved deploys to Shipit.
- Result
- Operators no longer get an empty dialog for every site visitor, and static deploys got stage, prod and rollback.
Svelte 5Shadow DOMTurborepo