VelvetCake
A website, catalog and CRM for a Lviv confectionery: orders from the site, Instagram and Telegram in one place
About the brand
VelvetCake is a confectionery from Lviv: custom cakes, bento cakes, cupcakes, candy bars, desserts and bento-decorating master classes. Visually the brand rests on a dark-luxury mood: a dark palette, restrained typography, the dessert itself carrying the frame
Desserts here are bought with the eyes, so the showcase works exactly as well as it looks. But behind the showcase there is a second half of the business the customer never sees: orders arriving every day from three different channels
The task
Orders in a confectionery come from everywhere: someone writes on Instagram, someone on Telegram, someone wants to order right on the site. While all of that lives in chat threads, things get lost and the picture of the day is kept in someone's head
They needed a site that carries the brand mood and takes orders, and at the same time a workplace for the pastry chef where every request lands and where she can change the menu, prices and master classes herself, without a developer
The solution
Not a landing page with a "message us" button, but an application with two entrances: a public site for customers and a private CRM for the team at /admin
The site is a dessert catalog, a dedicated page for every dessert, master classes and an FAQ. A request from any form on the site instantly becomes a card in the CRM. Orders from Instagram and Telegram go into the same pipeline by hand, so every customer is visible in one list
Menu, prices, photos and master-class themes are edited in the CRM: change it in the panel and the site updates
Catalog
Five categories: cakes, bento, cupcakes, candy bars, desserts. Search by name and a category filter on top
CategoriesThe entry point for someone who doesn't know yet what they want and is simply browsing the showcase
SearchFor those who came for a specific dessert or are picking one for an occasion
Dessert pagePhotos, weight, portions, allergens, a "from" price. Every dessert gets its own page, not a line in a list
FAQLead times, delivery across Lviv in branded packaging or pickup, multi-tier cakes of 8-12 kg, a design from a reference or from the portfolio
Questions about ingredients, allergens and lead times are the most common ones a confectionery gets. When the page answers them instead of a chat thread, far more orders make it to the end
Ordering
The dessert page has one button: "Leave a request". A short form opens: name and phone, no registration, no cart. After sending, the customer sees that they will be contacted within an hour during working hours
Master classesA dedicated page with decorating themes, price, number of seats and the steps of the session. Booking uses the same short form plus the number of seats
Instagram and TelegramStay fully working channels: the contacts are in the header, on the menu page and in the footer. Those orders the pastry chef enters into the CRM by hand so the pipeline is complete
Every request from the site is saved with a mark of where it came from: the dessert page or the master-class page. The CRM shows it right away
CRM
The panel lives on the same domain at /admin, login with email and password. Four sections
RequestsEvery form from the site lands here. Status counters sit on top: new, in progress, done, cancelled; below them a search by name, phone or product. Each request is a card with its type (order or master class), date, contact, dessert and the customer's note, and the status changes right on the card. The pastry chef takes an order from the first call to handover and always sees what is in progress right now
MenuProducts, prices, descriptions, photos and visibility in the catalog. A product can be hidden from the site with one switch, without deleting it
Master classesDecorating themes: names, duration, number of seats, prices and visibility
For the developerService actions: reset the menu or master classes to the base state from code, load demo requests for a showcase
Everything changed in the CRM is stored in Firestore and shows up on the site without a rebuild and without a developer
Technically
- A React application built with Vite; pages load as separate chunks, so the CRM costs a regular visitor nothing
- Firebase: Auth for the CRM login, Firestore for requests, menu and master classes, Storage for product photos
- Real-time updates: a new request appears in the CRM without a reload
- Catalog with categories and search, a dedicated route per dessert
- The base menu and master classes are seeded in code and CRM edits are layered on top: there is always something to roll back to
- Lenis smooth scroll, GSAP and Motion animations, responsive for phone, meta tags and canonical on every page
The result
The confectionery got a system, not just a site: the showcase takes requests around the clock, and every order, from the site, Instagram and Telegram, is collected in one CRM with statuses
Menu, prices, photos and master classes are managed by the team themselves. A developer is no longer needed to add a cake or change a price
Screens
