Works04 / 05

One stylist’s hours turned into a product: a paid Telegram funnel that takes the money and the photos, a brand site that stops the scroll, and a subscription club.

la-abramova.com

The LA Abramova home page hero
The first screen: a stylist’s voice, and one route into Telegram.
Client
LA Abramova, a personal stylist in Riga
Scope
Telegram bot, admin panel, website, club pages
Period
May 2024 – October 2026
Stack
PHP, Symfony, PostgreSQL, Stripe, S3, Telegram Bot API, Next.js, Tailwind
Live
la-abramova.com

A stylist sells hours, and hours run out. The audience lives on social media and in Telegram, not on a booking page. So there were three jobs: make one service sell itself, give the brand a page that can stop someone scrolling, and build income that does not depend on a calendar.

It took two and a half years and three products, and the most important change was not technical. The first version let a model choose a client’s colour type. The product that shipped put the expert back in the decision.

  1. 01

    A paid funnel inside Telegram

    @FauvismBot walks a customer from “what’s your name” through a tour of the seasons to a guess at their own colour type, then to Stripe Checkout. Money comes first: the photo handler will not run without a completed payment. Then 15–20 photos, stored per customer.

  2. 02

    The stylist’s desk

    An admin panel for one person: open the order, see the photos inline, pick one of 24 colour types, add a comment if needed, click Fulfill. The bot delivers the result. Payments are read-only and orders cannot be deleted.

  3. 03

    A site with a voice

    Four services with prices, a lookbook and one route into Telegram. The key word of the hero writes itself on in lipstick, through an SVG turbulence filter; a mouse spotlight lifts the photo; a lips cursor works over anything clickable. Next.js static export, no server, no CMS.

  4. 04

    A club that was bought, not built

    The first version ran on a hosted course platform and a Telegram group. No custom LMS was written, deliberately. In September 2026 the site was rebuilt around House of Image, a monthly club with a second host, and it opened on 24 October.

How it fits together

  1. Attention

    • Social media
    • Brand siteone route into Telegram
  2. Funnel

    • Telegram boteducation, then a guess
    • Stripe Checkoutwebhook, not redirect
  3. Material

    • 15–20 photosonly after payment
    • S3per customer
  4. Expert

    • Stylist’s deskone of 24 types
    • Result in Telegramwithin 2 days
The House of Image club page on the LA Abramova site
House of Image, opened by a one-line commit.

The part that never makes it into a portfolio. All of it happened, and all of it is in the commit history.

  1. Fault 01

    The AI that was probably never shown the photo

    Symptom
    The first prototype worked. Send a selfie, get a confident answer: a season, named colour swatches, advice on clothes and make-up.
    Cause
    Reading that code again for this page: it uploads the selfie to Imgur, then pastes the URL into a plain text prompt. There is no image part in the call, and the API does not fetch links out of text. So the model most likely never saw a face and answered from the words alone. I have not re-run it; this is a reading of the code.
    Fix
    The rewrite did not repair the call. It took the model out of the decision: 15–20 photos, and an expert choosing among 24 types where the prototype had four. The product got better by adding a human. A confident JSON answer is not proof that a model looked at anything.
  2. Fault 02

    The bot that took every message and said nothing

    Symptom
    After the move to Heroku, /start apparently got no reply. Reconstructed from the commit log: on the night of 3 April 2025, firewalls at 01:44, seven log lines at 02:09.
    Cause
    Incoming updates were routed to an async queue, and the deployment was one web process. Nothing consumed the queue. The webhook accepted each update and it waited forever. A silent success is the worst failure mode there is.
    Fix
    A worker was added at 02:18:55 and removed 2 minutes 7 seconds later, and messages moved to sync. One word in a config file. The debug logs were deleted at 02:22.
  3. Fault 03

    Fourteen numbered fixes, then one line

    Symptom
    Deploying one Telegram bot to AWS took 17 commits in March 2025: “fix deploy github” through number 14, a Dockerfile, nginx, ECR, EC2 over SSH, RDS. The env file’s permissions walked 600, 644, 600, 777, 640.
    Cause
    The infrastructure was far heavier than the workload: one low-traffic webhook app. More than half of all backend commits, 27 of 52, went on getting it into production.
    Fix
    A one-line Procfile on 2 April, and two minutes later “Remove docker stuff”: 12 files, −511 lines. The fix was deleting the system.
  4. Fault 04

    Two prices, one product

    Symptom
    May 2025, a commit titled “Fix Old hardcoded priceID”. A price had moved and the bot was still charging the old one.
    Cause
    The Stripe price ID was hard-coded in PHP, while the product record was editable in the admin. Two sources of truth for one number.
    Fix
    The ID moved to configuration. The honest part: the admin’s price still feeds only the internal record, and the card is charged what Stripe says. Any “edit prices in admin” feature in front of a hosted checkout has this trap.
  5. Fault 05

    Launching behind construction tape

    Symptom
    The rebuilt site had to go live while the club was not ready, and its pages could not show prices or links.
    Cause
    The club touches the nav, the hero, a teaser, a whole page and whether search engines may index it. Five places to forget one.
    Fix
    One constant, CLUB_OPEN, drives all of it; closed means yellow tape and “in development”. It carries an explicit boolean type on purpose, or TypeScript infers the literal and calls the open branch unreachable. Opening the club, 32 days later, was a one-line commit.

  • commits over 29 monthsthree repositories, one author
  • colour typesthe prototype’s seasons against the stylist’s subtypes
  • photos per ordercollected by the bot, after payment
  • commits on the website’s first day15 April 2025, 00:32 to 14:24
  • lines removed by the fixDocker and EC2 gone, one Procfile line in
  • line to open the club32 days after launch behind tape

Commit pulse

Every commit in the project’s repositories, on one line. The taller the bar, the hotter the stretch.

May 2024Oct 2026
  1. GPT prototype: 286 lines of Python
  2. Rewrite in Symfony reaches Stripe
  3. Docker and EC2 out, one Procfile in
  4. The website, in one sitting
  5. First club and its page
  6. The rebuild: new art direction, four services
  7. House of Image opens

A service business does not need a platform first. It needs one paid path that works end to end, with the expert still doing the part only they can do. Everything else can be bought, rented or added later. If you sell your own hours, that is where I would start.

Write a brief

I reply fast on WhatsApp and Telegram

Or ask the digital mind about it
Next caseArtForte