Work / Websites

ai-bot.com.ua: a showcase site for our two Telegram bots that had to be cleaned up for a corporate reader

What it was

We had a consultant bot that has been answering shoppers in a real electronics store for a year, and a booking bot for nail and hair professionals. We needed a page to send people to from cold emails: what the bot does, what it costs and where to try it. Two products, at $1,200 and at $10 a month, must not blur into each other.

What we did

Built two self-contained HTML files with no framework, a 'For stores / For professionals' switch and a translation dictionary for both languages. We looked for the style through rejected mockups and found it through real references. A council of five AI advisors reviewed the disputed parts, three rounds. After the first corporate inquiry we reread the site as an auditor would and removed everything the product does not do.

What the client got

The site runs on the live domain, pricing is one path: a $200 pilot, full setup at $1,200, then $250 a month. The first corporate inquiry came through the site, the person took the contact from there. We did not measure conversion, there is no analytics on the pages, and we say so.

ClientOur own product: an AI consultant for online stores and a booking bot for beauty professionals
My roleStructure, UA/EN copy, design, markup, pricing, deployment, checks before and after each release
StatusLive at ai-bot.com.ua, the first corporate inquiry came through the site
Result1 path instead of three tiers and 'unlimited': a $200 pilot, $1,200 setup, then $250 a month · Open
Rejected: the first screen before the redesign. A blue 'neural network' from a generic AI template, the numbers '3-5 sec' and '100% of leads' that are no longer on the site. Rendered from a saved copy of the code
Rejected: the first screen before the redesign. A blue 'neural network' from a generic AI template, the numbers '3-5 sec' and '100% of leads' that are no longer on the site. Rendered from a saved copy of the code
Accepted: a dark background, a warm glow, a serif headline, a button to the live bot and four numbers, each backed by a year of work in a store
Accepted: a dark background, a warm glow, a serif headline, a button to the live bot and four numbers, each backed by a year of work in a store

The task

We already had a consultant bot that has been answering shoppers in a real electronics store for a year, and a second bot that handles bookings for nail and hair professionals. What we did not have was a page to send a person to from a cold email. A store owner or a beauty professional does not want to read about “AI”. They need a minute to understand three things: what the bot does, what it costs and where to try it.

One more condition: two very different products, a $1,200 bot for a store and a $10-a-month bot for a professional, must not mix on one page. Hence a hard switch at the top, “For stores / For professionals”, and two languages, Ukrainian by default and English.

Why, and what the idea was

Every page has a live button into the real bot, a sample dialogue and pricing without asterisks. For the store it is a conversation about a Bosch washing machine under 18,000 UAH with the objection “it is cheaper on Rozetka”. For the professional it is button-driven booking: service, day, time, confirmation, exactly the way the real bot works.

The style took a while. Dark Tech, Minimalism, Bento, Neobrutalism, Editorial, Neon Glass: every mockup was rejected because it looked like a generic AI template. The direction came only from real references: the editorial serifs of Kove, the colored cards of Cargoscope, the warm glow on a dark background in the Obsidian landing on Saaspo. That became Premium Dark Editorial: a near-black background, an orange glowing orb that breathes through a CSS animation and follows the mouse, Fraunces headlines, Inter body text, muted cards. A later 3D redesign with an underwater world was rejected too.

The second idea came later and turned out to be the main one: the site must promise exactly what the product does. A corporate reader catches contradictions at once, and any number that cannot be shown in the logs works against us in a meeting.

How it went

When What happened
Stage 1 Pricing: a “Purchase / Subscription” switch, a comparison of three models, about 70 new keys in the translation dictionary, a site icon
Stage 2, a week later Council on pricing: a client could not see the difference between an $89 subscription and a $1,200 purchase. A “Priority” tier with clear differences added
Stage 3, ten days later Redesign. Several rounds of mockups rejected, the style found through references. We replaced the style block entirely and left the 770 lines of content and the dictionaries as they were
Stage 3, the same day New /masters page. Three council rounds on a preview link, then release to the live domain
Stage 4, the next day Clean URLs without .html and a fix for the site looking “cut off” on wide monitors
Stage 5, six weeks later Promises the product does not keep removed: unlimited, “3 stores in one bot”, CRM, Enterprise with code handover
Stage 6, a month after that A client found a dead demo, fixed the same day. Then a big cleanup by council: pricing into one path, the “Security” block made truthful, the broken English fixed

How decisions were made. On disputed parts we convened a council: five AI advisors (a skeptic, an architect, a visionary, an outsider, a pragmatist) review the work independently, then review each other. The redesign took three rounds. The first found 7 problems: the product switch was too small, on /masters a single pricing card hung in empty space, the orb on the first screen was dead, the reveal animations did not work, the pricing cards had different heights. In the second round 4 of 5 said “satisfied” at once, the fifth could not verify that the orb follows the mouse. We checked by hand with dispatchEvent('mousemove'): it works, that was a limitation of the tool. The third round went by direct remarks.

Tools and method

No framework. Each page is one self-contained HTML file with the markup, styles, scripts and translation dictionaries inside, plus a shared styles.css. The home page is about 100 KB, the professionals page about 41 KB. Every label lives in two places: in the HTML and in the window.__i18n dictionary with uk and en keys, elements are marked with data-i18n, and on load the dictionary overwrites the HTML.

Hosting on Vercel, own domain, released with vercel --prod from the folder. vercel.json turns on clean URLs, .vercelignore keeps backups and drafts out of the release. There are no keys and no money on the site: it is a showcase, no API calls from the page, every button leads to Telegram or to the contacts.

Checks before a release: the page scripts are extracted and run through node --check, tags are checked for pairing. After a release: curl of the live domain and a count against a list of phrases, the new ones appeared, the old ones are gone, backups return 404. Separately we checked that both bots are alive: the service runs, getMe answers, the queue is empty.

Result

Home page, for stores. First screen: “An AI consultant that sells instead of you, 24/7”, a button into the live bot and four numbers: a reply in 10-20 seconds, 24/7, 0 human operators, 1 year in a live store. Then: why stores lose customers, what the bot can do, a sample dialogue, how setup goes, security, pricing, what the price is made of, bot versus human operator, FAQ, contacts.

Store pricing after the cleanup: one path, no choice to make. A $200 pilot for 14 days on the store’s own catalogue, up to 300 dialogues. If it works for you, a $1,000 top-up to full setup, then $250 a month. If the pilot did not work out, you pay nothing more. Below it, a transparent breakdown of where the money goes: Claude API, server, setup, support.

The page for professionals. The professional’s pain (calls at 11 pm, missed bookings), what the bot does, setup in 5 minutes, how it looks in Telegram, $10 a month and the first month free. Next to it a card “A salon with several professionals?” with an honest “format in development”.

What it brought. The first corporate inquiry came through the site: the person received an email, opened the page, took the contact from there and asked questions of substance: for what period, by what criteria, is there an API for dialogue history. Later they replied that they were studying the materials in detail.

What we do not know and what is still undone. We did not measure the site’s conversion, there is no analytics on the pages, we did not count inquiries from the site. Paying clients from the professionals page so far: zero, the bot’s database has 5 professionals and 0 payments. The home page’s first screen still promises “a widget on your site”, although the widget was removed from the promises, the decision is the owner’s. On a phone the first-screen subtitle sits on the bright glow and the contrast is weak.

Mistakes and what we took from them

For three weeks the main button led to a dead bot, and a client found it."Try the demo" and the link in the contacts led to the demo bot of another project of ours, frozen together with its server. The bot existed in Telegram but stayed silent. Fixed the same day: compared the local file with the live one by md5, made a backup, replaced the link with the bot that works in the store, checked the domain with curl. Rule: when a project stops, check where links to it still stand.
The English version did not work at all, and nobody knew for how long.The dictionary had strings like "Обов'язкова умова" and "we'll calculate". The apostrophe closed the string early, the script failed with a SyntaxError, the EN button did nothing. Ukrainian looked fine because HTML renders without JS. We found four such fragments. Rule: after any text edit, run the scripts through node --check before release.
Backups went into the release and were public.The index.html.bak file was served at a direct link with code 200, so the old version with the removed promises ($89 and $179 tiers, a GDPR claim, a control panel that did not exist) was open to anyone. We added masks to .vercelignore, and after every release we check that such an address returns 404.
Our own edit silently deleted lines we needed.Together with the pricing comparison table, three things edited specifically for the client disappeared: the line about 1C, the line about the SLA and the definition of the word "dialogue". Caught only by checking the live site against a list of mandatory phrases. Rule: write the "what must stay" list before the edit and run it against the live site after.
The site promised more than the product can do.A dash under SLA in the table, and a paragraph below, an SLA with penalties; a cheap unlimited tier better than an expensive limited one; two "Most popular" badges; a tier in the FAQ that did not exist in the pricing; "ROI x3-10" on the site and an honest "we did not measure conversion" in the email to the client. We removed every number that cannot be shown in the logs. In their place, a method: we measure on the pilot from day one, the numbers will be yours.
The booking demo was invented at first.On /masters we drew a free-form chat with the bot. The real bot works only with buttons and without AI in the booking dialogue, a deliberate decision so the bot does not invent services and prices. We rebuilt the demo around the real button path and fixed the technology block, which said booking runs through Claude.
A promise on the page was ahead of the code.The professionals page promises "no double bookings" three times, and the bot was not checking it: a second client could be booked into a taken hour. The hole was closed in the bot's code the same day, with tests: a free-slot check, a unique index in the database, race handling.
The site looked "cut off" on a wide monitor.The first screen and the sections were squeezed into 1180 pixels, the glowing orb did not reach the edge. The first screen became full width, sections widened to 1520 pixels, and text lines stayed narrow on purpose, for readability.
Not every "bug" in a screenshot is a bug.An advisor saw "a black screen on scroll", and it was a rendering glitch of the screenshot tool itself in a long-lived tab. We checked the DOM: the content was there, opacity 1. Verify with facts, not by eye.
An edit before a meeting looks like covering tracks.All five reviewers said the same thing independently: the client had already seen the old version, a silent edit looks bad. Before editing we saved a snapshot of what the client had seen, so that at the meeting we could say "this is what was there, this is what I fixed and why".

Tools

HTML, CSS, vanilla JSUA/EN translation dictionariesGoogle Fonts: Fraunces, InterVercelPlaywrightcurl and node --checkCouncil of 5 AI advisorsClaude Code