Product
Flowery is a multi-tenant SaaS for small and mid-size flower shops. A florist signs up, gets a workspace on their own subdomain, and receives two things out of the box:
- A back office (the control panel at
/control) for running the shop: catalogue, procurement, perishable inventory, orders and delivery details. - A customer-facing storefront on the same subdomain where shoppers browse bouquets, compose their own and fill a cart.
The first market is Ukrainian and Eastern-European florists: the interface ships in Ukrainian (the default everywhere: control panel, server messages, storefronts) and English, the default currency is UAH and the flower dictionary is Ukrainian. Currency is configurable per workspace (USD, EUR, GBP, UAH, PLN, CAD, AUD, JPY, CNY, INR).
What is different
Section titled “What is different”- Flowers are perishable. Stock is tracked as dated supply batches with shelf life and expiry, and consumed first-expiring-first-out. A generic e-commerce template counts units; Flowery knows which stems die on Thursday.
- AI-assisted merchandising. With the platform’s keys, or their own OpenAI and Magnific (formerly Freepik) keys, shops generate product descriptions and studio-style bouquet images, including images composed from reference photos, directly from the product forms.
- Tenant isolation is structural. Every request resolves the shop from the hostname before anything else, every business record carries the workspace, and cross-tenant identifiers return 404 rather than leaking.
Who uses it
Section titled “Who uses it”| Actor | Where they work | What they do |
|---|---|---|
| Shop owner | root domain (sign-up, the shop step), then the control panel | Signs up with email or Google, names the shop and its web address, gives the shop details, starts with the demo shop or empty, follows Getting started, invites the team, reads Finance |
| Shop team (admin, manager, staff, viewer) | control panel | Join by invitation; maintain the catalogue, record supplies, create and progress orders. Roles are enforced server-side; see Roles and permissions |
| Customer | the shop’s website on its own address | Browse bouquets and flowers, build a custom bouquet, check out as a guest (pickup, the shop’s delivery or a Uklon courier; payment on receipt or by bank transfer) and follow the order on a private status page |
| Platform operator | command line, Forge | Seeds the AI providers and the flower dictionary, provides platform AI and Google keys, runs the storefront agent, reads onboarding:funnel, resets passwords; the scheduler purges carts, syncs Uklon and sends onboarding reminders |
Core flows
Section titled “Core flows”Onboarding (onboarding):
- The visitor arrives on the landing page (Ukrainian, or English at
/en/) and signs up with email and password, or with Google. - The email is confirmed; the confirm page continues by itself.
- One step names the shop and its web address.
- On the shop’s own address the owner gives the phone, address and opening hours, and starts with the removable demo shop or empty.
- “Getting started” leads through the rest: quick-add for flowers, quick bouquets, the first delivery, then one click to publish the website and one to turn on pickup ordering.
Owners who stall get one reminder email per step.
Team. The owner and managers invite people by email with a role below their own; admins and the owner change roles and remove members (roles).
Catalogue:
- Flower and bouquet categories.
- Flowers with price, cost, colour, SKU, seasonality window, shelf life and low-stock threshold.
- Bouquets composed of flowers with quantities and several images.
- Packaging options with their own price.
Descriptions and photos can be generated with AI from the same forms. Flowers can be added from the built-in list, and bouquets from ready recipes.
Procurement to inventory. Suppliers; a supply is one delivery containing batches, each of one flower with quantity, unit cost, batch number and expiry. Stock changes only through the inventory ledger; write-offs and supplier returns are recorded with a reason.
Orders. Staff create orders for walk-in, phone or messenger customers. Each order has:
- the sender and the recipient;
- a structured delivery address, a delivery date and a slot;
- card text, an occasion and consent to substitutions;
- the payment and a delivery fee.
Lines are flowers, catalogue bouquets or a custom bouquet; names and prices are snapshotted. Confirming reserves the stems from batches, first-expiring-first-out; assembly consumes them; every change is a recorded revision (order lifecycle).
Website. Astro themes (Bloom and Noir) on the public Storefront API:
- home sections;
- the catalogue, with categories and occasions;
- detail pages;
- a build-your-own bouquet page with a live price;
- a server-side cart;
- guest checkout with a private status page;
- the shop’s own domain (
yourshop.ua, with or withoutwww), connected from Settings → Domain with one DNS record per address, added for the shop in one click when its DNS is on Cloudflare; theflowery.com.uaaddress keeps working and sends visitors there (custom domains).
A shop with nothing to sell shows “opening soon” with its contacts.
Finance. Sales, costs and profit for any period, with the profit and loss statement, purchases and stock value, payments and what customers owe, and operating expenses (finance).
Features
Section titled “Features”What exists now. The changelog says when each arrived.
| Area | Status |
|---|---|
| Sign-up and sign-in | Done: email and password with confirmation, sign in with Google (ADR-019), two-factor, password reset; emails in Ukrainian or English |
| Onboarding | Done: three steps, Getting started checklist with one-click website and ordering, quick-add flowers, quick bouquets, reminder emails (ADR-020), onboarding:funnel |
| Demo shop | Done: loaded and removed in one click, takes test orders (ADR-016) |
| Team | Done: invitations by email, roles below one’s own, change role, remove (ADR-021). Ownership transfer is not built |
| Flowers, bouquets, categories, packaging | Done, with AI descriptions and images, quick-add and ready recipes |
| Suppliers, supplies, batches | Done: batches with expiry and freshness, write-offs and supplier returns, a supplier named on the delivery form |
| Stock | Done: inventory ledger, reservations on confirmation, consumption at assembly, reconciliation and the Attention page |
| Orders | Done: create and edit with revisions, custom bouquets, filters, status changes with their stock effects, offline payments with reversals |
| Costing | Done: estimated and actual material cost, margin and markup, unknown never zero |
| Finance | Done: period reports, profit and loss, purchases, stock value, payments, receivables, couriers, operating expenses, CSV (ADR-018) |
| Website (storefront) | Live on Astro: Bloom and Noir themes, versioned settings, an internal AI agent, catalogue, builder, side cart, checkout and status pages, “opening soon” |
| Checkout and payment | 3A complete (25 October 2026): guest checkout, pickup, delivery or a Uklon courier, offline payment, a runbook for switching it on and the golden scenarios as a CI gate. 3B (online payment) not built |
| Languages and look | Ukrainian by default, English selectable; the brand palette in light and dark |
| AI | Descriptions and bouquet photos on platform keys or the shop’s own (Magnific, OpenAI). Only the Seedream models collect results, and nothing records usage per shop yet |
| Dashboard | The Getting started checklist and the demo shop. Business widgets are not built; Finance has the figures |
| Billing and trial | Not enforced: the trial field exists and nothing restricts an expired shop |